Skip to content

Add domino module: confirmed DOM-based / client-side vulnerability detection - #3183

Draft
liquidsec wants to merge 26 commits into
devfrom
domino
Draft

Add domino module: confirmed DOM-based / client-side vulnerability detection#3183
liquidsec wants to merge 26 commits into
devfrom
domino

Conversation

@liquidsec

@liquidsec liquidsec commented Jun 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

Adds the domino module, wrapping DOMino (Chromium/Playwright) to detect confirmed client-side / DOM-based web vulnerabilities. The module watches URL events, drives a headless browser per URL, and emits FINDING events for confirmed DOM XSS, HTML injection, prototype pollution, unsafe eval/jQuery, PostMessage issues, remote script includes, and reflected GET-parameter sinks.

What it detects

DOM XSS (basic, onclick/getparam, onclick/hash, referer, window.name, PostMessage, direct JS), DOM-based HTML injection, prototype pollution, unsafe eval, unsafe jQuery, PostMessage sinks, remote JavaScript includes, hash decoding, and GET-parameter reflection/discovery/transformation. Rules are opt-in per scan; None runs all.

Changes

  • bbot/modules/domino.py: new active/safe module. Watches URL, produces FINDING. One headless Chromium per URL, 120s per-URL timeout, DominoError and fatal-exception handling that sets errored instead of crashing the scan. Only scans URLs tagged status-200 (filter_event).
  • bbot/modules/http.py + bbot/core/event/base.py: expose body_sha256 from the httpx response as a new http_body_hash event property, used by domino's _incoming_dedup_hash so identical response bodies on the same host are only browsed once (avoids launching Chromium against N URLs that render the same page).
  • bbot/presets/web/domino-light.yml, domino.yml, domino-heavy.yml: three tiers from "confirmed-only, minimal rules" to "all rules + spider + wayback".
  • bbot/presets/kitchen-sink.yml: includes domino-heavy.

Config

  • rules (list, default None = all): rule set to run.
  • browser_instances (int, default 2): concurrent Chromium instances. Each uses ~800-1600 MB under load; drives module_threads.
  • suppress_parameter_discovery_reports (bool, default true): let parameter discovery feed rules without emitting a FINDING for the discovery itself.

Open items

  • deps_pip lists d0m1n0. Confirm the intended release is published to PyPI before merge, or CI/fresh installs will fail dependency resolution.
  • No test_module_domino.py yet. A mocked-target module test would keep this covered in CI, since it is browser-driven.
  • domino-heavy is memory-heavy (2x Chromium by default) and is pulled into kitchen-sink; confirm that is intended for the everything preset.
  • bbot/presets/web/domino.yml lists remote-include and remote-include-get-parameters twice and is missing a trailing newline.

Resolve baddns conflicts by taking dev's versions wholesale.
Domino-specific files (domino.py, presets) preserved.
- Migrate options/options_desc to Pydantic Config class
- Use event.url instead of event.data (now a dict)
- Emit all findings as FINDING with severity/confidence/name
- Remove redundant log property override
- Rename domino-medium preset to domino (standard naming)
- Update presets: httpx -> http
Replace single shared browser with a pool of dedicated browser instances
(one per thread) to prevent deadlocking under concurrent load. Add 120s
timeout per URL that kills and replaces hung browsers. Make instance
count configurable via browser_instances config option (default 2) with
memory usage warning on startup. Add domino-heavy to kitchen-sink preset.
…ent hash

Attach body_mmh3 hash to URL events in HTTP module so downstream
consumers can access it. Use it in domino's _incoming_dedup_hash to
skip URLs with identical response bodies on the same host, avoiding
redundant scans of templated pages (e.g. product listings).
@liquidsec
liquidsec marked this pull request as draft June 14, 2026 21:07
@github-actions

github-actions Bot commented Jun 14, 2026

Copy link
Copy Markdown
Contributor

📊 Performance Benchmark Report

Comparing dev (baseline) vs domino (current)

📈 Detailed Results (All Benchmarks)

📋 Complete results for all benchmarks - includes both significant and insignificant changes

🧪 Test Name 📏 Base 📏 Current 📈 Change 🎯 Status
Bloom Filter Dns Mutation Tracking Performance 4.30ms 4.35ms +1.1%
Bloom Filter Large Scale Dns Brute Force 18.25ms 18.78ms +2.9%
Large Closest Match Lookup 360.41ms 362.61ms +0.6%
Realistic Closest Match Workload 194.70ms 194.36ms -0.2%
Event Memory Medium Scan 1402 B/event 1402 B/event -0.0%
Event Memory Large Scan 1527 B/event 1527 B/event +0.0%
Event Validation Full Scan Startup Small Batch 413.48ms 435.58ms +5.3%
Event Validation Full Scan Startup Large Batch 557.44ms 569.12ms +2.1%
Make Event Autodetection Small 26.91ms 26.90ms -0.1%
Make Event Autodetection Large 272.74ms 273.78ms +0.4%
Make Event Explicit Types 12.07ms 11.93ms -1.2%
Excavate Single Thread Small 4.289s 4.234s -1.3%
Excavate Single Thread Large 10.091s 10.283s +1.9%
Excavate Parallel Tasks Small 4.549s 4.482s -1.5%
Excavate Parallel Tasks Large 6.666s 6.647s -0.3%
Intercept Throughput Small 908.80ms 889.50ms -2.1%
Intercept Throughput Medium 901.06ms 960.63ms +6.6%
Dns Throughput Quiet 2.888s 2.793s -3.3%
Dns Throughput Loaded 1.886s 2.014s +6.8%
Dns Throughput Inherited 2.526s 2.414s -4.4%
Is Ip Performance 2.35ms 2.34ms -0.1%
Make Ip Type Performance 244.18µs 249.16µs +2.0%
Mixed Ip Operations 2.42ms 2.42ms +0.0%
Memory Use Web Crawl 1.0 MB 1.0 MB +0.0%
Memory Use Subdomain Enum 28.3 MB 28.3 MB +0.0%
Memory Use Deep Chain 5.0 MB 5.0 MB +0.0%
Memory Use Parallel Chains 10.9 MB 12.1 MB +10.9% 🟡🟡 ⚠️
Scan Throughput 100 2.993s 2.912s -2.7%
Scan Throughput 1000 22.472s 22.418s -0.2%
Typical Queue Shuffle 5.45µs 5.41µs -0.8%
Priority Queue Shuffle 26.19µs 26.56µs +1.4%

🎯 Performance Summary

! 1 regression ⚠️
  30 unchanged ✅

🔍 Significant Changes (>10%)

  • Memory Use Parallel Chains: 10.9% 🐌 more memory

🐍 Python Version 3.11.15

@liquidsec liquidsec mentioned this pull request Jun 15, 2026
28 tasks
@singlerider

singlerider commented Aug 5, 2026

Copy link
Copy Markdown
Collaborator

Ran an A/B to gauge the resource cost. Same bounded scan both arms against ginandjuice.shop (-p web spider -m gowitness paramminer_getparams reflected_parameters hunt), domino arm just adds -m domino. Sampled RSS and CPU across the whole process tree at 1s. Default config, so browser_instances=2.

Metric dev domino Delta
Peak RSS 4,862 MB 7,078 MB +2,216 MB (+46%)
Avg RSS 1,144 MB 3,247 MB +2,103 MB (+184%)
Peak procs 33 56 +23
Avg CPU 16.6% 102.4% +~1 core sustained

The RAM tracks domino activity rather than sitting resident. setup() only starts the Playwright driver; the browsers launch per URL in handle_event (up to 2 concurrent) and close after. Timeline: ~90 MB at start, spikes to 6.4 GB / 55 procs around t=21s when the first batch of URLs lands and browsers launch together, oscillates 2.7-4 GB while it works, then drops back once the queue drains. On a real spider-fed crawl that looks sustained for the duration since URLs keep coming. Peak is really a thundering herd of simultaneous Chromium launches, so browser_instances=1 would flatten it.

Functionally it delivered: 6 CONFIRMED findings the rest of the pipeline can't produce, including prototype pollution via __proto__[D0m1n01]=1 and several DOM reflection hits, each with a full interaction trace.

The 6 findings below came only from the domino arm. The dev arm produced zero client-side findings, since nothing else in the pipeline exercises the DOM:

Severity Rule Detection URL
MEDIUM Prototype pollution /blog?__proto__[D0m1n01]=1
MEDIUM Prototype pollution /blog/?__proto__[D0m1n01]=1
INFO DOM reflection /blog/?search=...&back=/blog/
INFO DOM reflection /blog/?search=...&back=/blog/
INFO DOM reflection /catalog?searchTerm=...
INFO DOM reflection /catalog?searchTerm=...

Pros

  • Finds real client-side vulns (DOM XSS, prototype pollution) nothing else in bbot detects.
  • CONFIRMED confidence with reproduction details, low noise.
  • Body-hash dedup avoids re-scanning identical DOMs.

Cons

  • Roughly triples sustained RAM (1.1 GB to 3.2 GB avg) and adds ~1 core at the default 2 instances. browser_instances=1 should roughly halve the memory add and flatten the launch spike.
  • deps_pip points at d0m1n0, which isn't on PyPI, so a clean install currently fails. Needs a published package or a git dependency.
  • No tests yet.
  • Adding domino-heavy to kitchen-sink makes every kitchen-sink run pay this cost by default. Worth reconsidering given the footprint.

Note: web-focused preset, not full kitchen-sink, to isolate the domino delta. Happy to share the sampler and CSVs.

@singlerider singlerider changed the title Domino Add domino module: confirmed DOM-based / client-side vulnerability detection Aug 10, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants