VIYUH BDR — Feature Test Handbook
For the testing team. One file: every implemented feature, what it does, *when it fires* (use case), and *how to test it*. Extension v0.9.103.
- What's implemented: ~85 features across 6 live categories (Phishing, Web-Based Attacks, File Analysis, Extensions, In-Browser DLP & Shadow-AI, Insider Threat & Last-Mile) + Threat Extraction (CDR). Roadmap categories (ITDR, Isolation, SOC integrations, Cloud Email) are not yet built — see §9, don't test those.
- How to read a row: *What it does* = the detection. *Use case* = the real attack/behavior it catches. *How to test* = the concrete action to trigger it.
0 · Setup (once)
Services — all must be up:
for p in 4004 4005 3000 8090; do curl -s -o /dev/null -w ":$p %{http_code}\n" http://localhost:$p/; done
# 4004 backend · 4005 test range · 3000 dashboard · 8090 file host
Load the extension: chrome://extensions → VIYUH BDR → ↻ Reload (must read v0.9.103). If content scripts look stale after a manifest change, Remove + Load unpacked ~/Downloads/bdr-extension-unpacked.
Where to see a detection (any of these):
- Dashboard (primary):
http://localhost:3000/bdr— each detection is a row; click for detail. - Terminal:
curl -s "http://localhost:4004/api/detections?limit=15" | jq '.items[] | {feature,headline,severity}' - On page: a block page, a proceed-able warn, or a top-right notification, depending on tier.
- Service-worker log:
chrome://extensions→ VIYUH BDR → *service worker* → Console (DETECTION […]lines).
Response tiers (precision-first — most are WARN, not block):
| Tier | What you see | Meaning |
|---|---|---|
| block | full-page block / download cancelled | near-zero-FP structural signal |
| warn | dismissible interstitial ("Proceed") | medium confidence |
| banner / notify | top-right toast | heads-up only |
Test hosts — this Mac is 192.168.1.11; the *.192-168-1-11.nip.io hosts resolve to it. If the LAN IP changes (DHCP), re-point the test hosts + re-seed (ask the dev).
1 · Fast lane — prove every detection core (2 min, no browser)
cd /Users/resecsystems/Documents/viyuh-soar-backend_local for t in bdr/tests/*.test.mjs bdr/tests/*-verify.mjs; do printf "%-40s " "$(basename "$t")"; node "$t" 2>&1 | grep -iE '[0-9]+ passed' | tail -1 done
Expect every line N passed, 0 failed except credreuse-range-verify.mjs (1 pre-existing cosmetic label). If any other file fails, a core regressed. This proves the *logic*; the sections below prove the *live wiring*.
2 · Phishing & AiTM / Token Theft (9 live)
Live range: http://localhost:4005/phishing/ · cores: node bdr/tests/{brandimp,homograph,aitm}-range-verify.mjs
| Feature | What it does | Use case (fires when…) | How to test |
|---|---|---|---|
| homograph | Look-alike / typosquat domain | user lands on paypa1.com, gооgle.com (Cyrillic) | open a look-alike host on the phishing range → block/warn |
| brand-impersonation | Brand login on a non-brand domain (+ S5 brand-as-subdomain) | fake Microsoft/PayPal login on a random domain | http://paypal.evil.192-168-1-11.nip.io:4005/iframe-login/inner-login.html → brand-subdomain WARN; okta.evil.* → silent |
| aitm | Reverse-proxy (Evilginx) credential relay | a look-alike page harvesting the password same-origin | node bdr/tests/aitm-range-verify.mjs (26/0); live needs a combosquat /etc/hosts entry |
| sso-clone | Brand SSO rendered as an image to defeat text scanners (OCR) | a screenshot-of-a-login phishing page | open an sso-clone fixture on the phishing range |
| bitb | Browser-in-the-Browser fake popup window | a fake "Sign in with Google" OS-window overlay | open the BITB fixture |
| qr-quishing | Malicious QR in page/email/attachment | a QR linking to a phishing/scheme URL | see §6 (Malicious QR) |
| credential-reuse | Same password reused across sites | user types a known corporate password on an external site | type a password on site A, then the same on site B |
| password-strength | Weak-password nudge | user sets a weak password | submit a weak password on a signup form |
| webmail-response | Threat response inside Gmail/Outlook | a phishing indicator inside webmail | open a seeded phishing message in Gmail |
| S1 — iframe-login | Credential form inside a cross-origin iframe | phishing login embedded in an iframe to dodge top-frame scanners | http://192.168.1.11:4005/iframe-login/ → Card 1 fires; Card 2 (localhost) silent |
3 · Web-Based Attacks / Malicious Websites (19 live)
Live range: http://localhost:4005/web-attacks/ · core: node bdr/tests/cat2-webattacks.test.mjs (155/0)
| Feature | What it does | Use case | How to test |
|---|---|---|---|
| phish-reputation | Known-bad site (threat-feed / lake) | user opens a URL in the malicious IOC lake | navigate to a seeded lake domain → block/warn |
| suspicious-redirects | Malicious cross-domain redirect chain | ad/link bounces you through hops to a bad terminus | multi-hop redirect fixture; note: search-result clicks are excluded (no FP) |
| newly-registered-domain | Domain registered < 30 days | phishing on a fresh throwaway domain | open an NRD fixture (corroborated with a clone → block) |
| free-hosted-site-isolation | Brand-cue page on vercel/netlify/github.io | paypal-login.weebly.com | free-host fixture with brand cue |
| geo-blocking | Site in a high-risk country (admin policy) | connection to a blocked-country host | set a geo policy + open a host resolving there |
| social-referrer-isolation | Risky site reached from social media | link opened from LinkedIn/Twitter to a bad site | navigate with a social referrer |
| etld-typosquat | TLD/suffix typosquat (.co vs .com) | company.co impersonating company.com | typosquat fixture |
| unicode-domain-policy | IDN / mixed-script look-alike | аpple.com (Cyrillic) | IDN fixture → isolate/warn |
| canvas-content-filter | Page-content / rendered-text filtering | scam text rendered on the page | content fixture |
| content-category-filter | Gambling / adult / etc. category | user opens a gambling site | open a known gambling/adult host → policyBlock |
| legit-service-phishing | Phishing via hijacked SharePoint/Forms/Canva | a phishing form hosted on forms.office.com | legit-service fixture |
| multi-hop-phishing | Navigation-path phishing chain | several hops ending at a credential page | multi-hop fixture |
| malicious-script-driveby | Drive-by download / malicious script | auto-download of an exe on page load | drive-by fixture |
| magecart-formjacking | Card skimmer (script-host + live exfil) | checkout page exfiltrating the card to a 3rd party | http://localhost:4005/magecart-exfil/ → skimmer buttons fire; same-origin/order-id stay silent |
| clickjacking-frame | Invisible cross-origin overlay | a transparent iframe hijacking clicks | clickjacking fixture |
| malvertising | Tech-support scam / fake alert page | "your PC is infected, call this number" page | malvertising fixture |
| *(policy)* isolate-free-hosted / isolate-all-idn / block-logins-from-trusted-services | blunt admin-opt-in isolations/blocks | admin turns them on | enable in policy, then the matching fixture |
4 · Malicious File Analysis (12 live)
Live range: http://localhost:4005/file-analysis/ · core: node bdr/tests/file-analysis.test.mjs (46/0) · downloads via :8090
| Feature | What it does | Use case | How to test |
|---|---|---|---|
| file-download-hook | In-browser download inspection engine | any download is sniffed (magic bytes/macro/hash) | download any office/exe file |
| file-type-mismatch | Extension ≠ real magic bytes (#17) | evil.exe renamed update.pdf | download a renamed executable → disguised-executable |
| macro-office-scan / vba-macro-detection | Macro-enabled Office doc | a .docm with an auto-run macro | download the macro sample from the file range |
| file-size-filter | Oversize hard-cap (#19 dangerous → block even in warn-only) | 600 MB .iso over the cap | set cap=400 on /bdr/file-analysis, download :8090/big.iso → blocked; big.pdf → warn+delivered |
| encrypted-file-policy | Password-protected archive | an encrypted .zip that can't be inspected | download an encrypted zip |
| file-threat-feed | Known-bad file hash | a file whose SHA-256 is in the lake | download a seeded-hash file |
| static-maldoc-triage | RTF/OLE exploit-class doc (#37) | equation-editor exploit RTF | download the maldoc-RTF sample |
| archive-polyglot-inspection | QR/exploit inside an archive; polyglot | a zip bundling a malicious image/doc | download an archive sample |
| multi-engine-av / async-detonation | Multiscan + sandbox (backend) | admin escalates a suspicious hash | trigger from the file-analysis dashboard |
| inline-cdr (Threat Extraction) | Rebuild a clean doc, strip active content | a PDF/Office with macros/JS | download :8090/disguised-invoice.pdf (needs the CDR engine on :8000 to actually disarm — see §8) |
5 · Malicious & Risky Browser Extensions (13 live)
Core (definitive): node bdr/tests/extensions-detect.test.mjs (10/0) · live via /bdr/extensions → Test tab (dev build only)
| Feature | What it does | Use case | How to test |
|---|---|---|---|
| extension-inventory | Full installed-extension list + perms | admin posture view | dashboard shows the inventory |
| permission-risk-analysis | Scores dangerous permission combos | an ext with debugger/proxy/<all_urls>+cookies | Test tab → "risky" scenario |
| permission-creep | Update silently adds risky perms (30-min re-scan) | a benign ext turns malicious in an update | Test tab → creep1 then creep2 |
| sideload-prevention | Off-store install (admin opt-in block) | a sideloaded .crx | Test tab → "sideload"; set sideloaded:block to hard-block |
| ai-impersonation-extension | Name poses as ChatGPT/Claude (#42 vendor-prefix can't launder) | "ChatGPT Login Stealer" | in the self-test: SecurePay: ChatGPT…+risky perms → flagged |
| extension-clone-impersonation | Counterfeit of a popular ext (homoglyph) | uBlоck (Cyrillic) cloning uBlock Origin | Test tab → "clone" |
| extension-blocklist / allowlist | Admin block/allow by ID | force-remove a known-bad ID | add an ID to the blocklist |
| extension-reputation | Known-malicious IOC feed | ext ID in the campaign feed | Test tab → "reputation" |
| ai-extension-data-theft | AITOPIA-class data-theft family | a known data-theft extension | Test tab → "aitopia" |
| negative-review-filter / unpopular-extension-block | Low rating / low installs | a sketchy 180-install ext | Test tab → "negreview" / "unpopular" |
| #5 broad-host+unpopular | <all_urls> on an unpopular, non-reputable ext | content-script data-stealer surface | self-test: unpopular <all_urls> → WARN; uBlock-class silent |
| #51 test-scenario prod-gate | Synthetic injection only on DEV build | prevents a stray write blinding the scanner | on a packed build the Test tab is inert |
6 · Malicious QR Codes (4 live)
Live range: http://localhost:4005/qr/ · core: node bdr/tests/malicious-qr.test.mjs (25/0)
| Feature | What it does | Use case | How to test |
|---|---|---|---|
| dangerous-scheme QR (#38) | javascript: / data: / etc. QR | a QR that runs a scheme payload | scan qr-scheme-js on the QR range → flagged |
| short-link unfurl (#39) | Expands shortened QR targets | QR → bit.ly/… hiding a bad URL | scan the shortener QR → unfurled + judged |
| open-redirect (#40) | Resolves ?url= even on good hosts | QR → google.com/url?q=evil | scan the open-redirect QR |
| rotation-tolerant (#41) | Decodes 90/180/270°-rotated QRs | attacker rotates the QR to dodge the decoder | http://localhost:4005/qr/rot.html → rotated QR still fires |
7 · In-Browser DLP & Shadow-AI (~45 live)
Live range: http://localhost:4005/dlp/ · admin console: http://localhost:3000/bdr/dlp · core: node bdr/tests/dlp.test.mjs (129/0) · full case list: bdr/testing/dlp/DLP_TEST_CASES.md
Too many to list per-row; the headline ones the testing team should hit:
| Feature | What it does | Use case | How to test |
|---|---|---|---|
| paste/upload DLP + anti-evasion (#1) | Blocks secrets (cards/SSN/AWS keys) leaving to AI/webmail — incl. base64/hex/split/homoglyph evasion | user pastes an AWS key into ChatGPT (even encoded) | paste a real/encoded AWS key into a GenAI box → blocked |
| force-block completed secret (#7) | A full vendor key hard-blocks regardless of policy mode | copy 19 chars, type the 20th → still blocks | build a full AKIA… key across paste+type → blocked |
| ClickFix / paste-to-run (#47a) | Page writes a shell command to the clipboard | "copy this, press Win+R" malware lure | http://localhost:4005/dlp/clickfix/ → heads-up |
| identity-aware upload (#47b) | File → a personal (non-corporate) cloud account | uploading to a personal Drive | http://localhost:4005/dlp/id-upload.html → JUSTIFY |
| sensitive-file download (#47c) | Credential/config file downloaded | grabbing .pem/.env/.sql | download :8090/secrets.env, /id_rsa.pem → WARN; report.csv → silent |
| magic-byte upload (#9) | Renamed binary upload caught by content | secrets.zip → data.dat upload | rename + upload a zip → blocked |
| beacon/WebSocket exfil (#10) | Non-form exfil channels | data smuggled via sendBeacon/WS | exfil during a block window |
Enforcement mode + sanctioned/corporate/restricted host lists are all set on /bdr/dlp.
8 · Insider Threat & Last-Mile Control (5 live)
Admin console: http://localhost:3000/bdr/insider · cores: node bdr/tests/{last-mile,jit-access,ueba}.test.mjs (18/14/9). Demo policy is live: sensitive app sensitive-app.192-168-1-11.nip.io, JIT app jit-app.192-168-1-11.nip.io.
| Feature | What it does | Use case | How to test |
|---|---|---|---|
| watermarking | Tiled identity overlay on sensitive screens | deter screenshot/screen-share of confidential data | http://localhost:4005/dlp/watermark/ → overlay in ~1–3 s |
| last-mile-controls | Block copy/cut/paste/print/right-click/save/drag/save-as/download on designated sensitive apps | insider copying/printing/exfiltrating from an internal app | http://sensitive-app.192-168-1-11.nip.io:4005/insider/lastmile/ → each action blocked + toast |
| jit-access | Reason interstitial + timed grant on protected apps | force a justification before opening payroll/vault | http://jit-app.192-168-1-11.nip.io:4005/insider/jit/ → enter reason to proceed (clear bdr_jit_grants to re-trigger) |
| session-recording | Privacy-safe activity timeline (metadata only) | forensic "who did what, when" trail | SW console: chrome.storage.local.get('bdr_session_timeline').then(console.log) |
| ueba | Exfil-burst / last-mile-burst anomalies | departing/compromised user grabbing everything fast | download 6+ files from :8090 in a minute → "Exfil-burst" on /bdr |
Configure all of the above (sensitive apps, per-action mode, JIT hosts, UEBA thresholds, watermark) from /bdr/insider.
Known limits (honest — for the testing team's report): last-mile controls & the JIT/watermark overlays are *client-side*, so a determined insider with DevTools can remove an overlay or use a channel not yet hooked (async clipboard API from the console, view-source, disabling JS, a second browser). UEBA's burst detector catches *fast* exfil; a patient "low-and-slow" drip below the threshold needs the cloud-baseline tier (roadmap). These are architectural limits of any browser-extension control — true enforcement needs the endpoint agent / managed policy.
8b · Threat Extraction (CDR) — inline-cdr
Downloads of Office/PDF/email/archives are intercepted and rebuilt clean (active content stripped).
- Test: download
:8090/disguised-invoice.pdf(a PDF carrying JavaScript + a Launch action). - CDR engine UP (:8000): "Disarming…" → "Disarmed — removed javascript", a clean file lands.
- CDR engine DOWN: ONE "CDR unavailable" (auto-clears), file delivered as-is; after 2, the circuit-breaker pauses — no notification storm (fixed).
9 · Roadmap — NOT yet implemented (do not test)
These catalog categories are planned but not built — no detections will fire:
- SaaS & Identity (ITDR) — SSO enforcement, MFA-gap, OAuth-scope, device-code phishing, etc.
- Browser & File Isolation — RBI, disposable cloud browser, cloud file isolation.
- Agentic AI Security — prompt-injection, agent action confirmation, MCP abuse (only
ai-dlp-promptsis live). - SOC Telemetry & Integrations — SIEM/SOAR/STIX/EDR/CASB.
- Cloud Email Security (inbound + internal) — mailbox analysis, BEC, mass-forwarding, ATO.
10 · Regression tripwires (run after any change)
Precision-first = no new false positives. These must stay green:
node bdr/tests/legit-domains-fp.test.mjs # 66/0 — real brands never flagged node bdr/tests/brandimp-range-verify.mjs # 29/0 — incl. S5 okta/github SILENT node bdr/tests/extensions-detect.test.mjs # 10/0 — uBlock-class silent node bdr/tests/dlp.test.mjs # 129/0 — prose/UUID clean
Full suite: for t in bdr/tests/*.mjs; do node "$t"; done → all green except the 1 known credreuse cosmetic label.
*Companion docs: LOOPHOLE_TEST_GUIDE.md (52-loophole one-by-one) · LOOPHOLE_FIXES.md (fix catalog) · the live launcher http://localhost:4005/ links every test page.*