Summary
Hackbrowser was blocked by Cloudflare bot detection (Turnstile) because it had zero anti-detection measures and used Playwright's bundled Chromium which has a distinct TLS fingerprint (JA3/JA4).
Problems
- No stealth at all — no
navigator.webdriver override, no launch args, hardcoded Chrome/120 UA
- Multi-cred path inconsistent — single-cred had partial inline stealth, multi-cred had none
- Playwright Chromium TLS fingerprint — network-level detection that JS patches can't fix
--disable-gpu flag — signals headless mode to CF
- No WebGL/Canvas fingerprint protection
- Hardcoded UA doesn't match actual browser version
Fix (6 commits)
Stealth module (packages/hackbrowser/src/stealth.ts)
2937d4e — Created centralized stealth module (launch args, dynamic UA, init script)
e429fe3 — Enhanced with WebGL/Canvas fingerprint, screen/timezone/locale, navigator.connection
Agent integration
9eb998a — Both launch paths (single-cred + multi-cred) use Stealth module
System Chrome detection (bypasses TLS fingerprinting)
bb7df03 — CDP support via --use-chrome flag
107745d — Attempted channel:'chrome' (failed — Playwright registry breaks under Bun --compile)
6966d52 — executablePath with direct path detection (macOS/Windows/Linux). Auto-detects system Chrome, falls back to Playwright Chromium if not installed.
Stealth init script covers
navigator.webdriver = false
- Chrome DevTools Protocol marker cleanup (
cdc_*)
- Realistic
navigator.plugins (3 entries vs empty)
navigator.languages, hardwareConcurrency, deviceMemory, maxTouchPoints
navigator.connection stub (4g/50ms)
- Screen dimensions (1920x1080 consistent)
- WebGL vendor/renderer spoofing (Intel Iris)
- Canvas fingerprint noise (toDataURL pixel mutation)
- Permissions.query notification fix
chrome.runtime stub
Browser selection priority
- System Chrome via
executablePath (real TLS fingerprint)
- Playwright Chromium fallback (if no Chrome installed)
- CDP connection via
--use-chrome <url> (connect to already-running Chrome)
Note
Cloudflare Turnstile with advanced TLS fingerprinting may still block even system Chrome under Playwright automation. For those cases, IP whitelisting in the pentest scope is the standard practice.
Summary
Hackbrowser was blocked by Cloudflare bot detection (Turnstile) because it had zero anti-detection measures and used Playwright's bundled Chromium which has a distinct TLS fingerprint (JA3/JA4).
Problems
navigator.webdriveroverride, no launch args, hardcoded Chrome/120 UA--disable-gpuflag — signals headless mode to CFFix (6 commits)
Stealth module (
packages/hackbrowser/src/stealth.ts)2937d4e— Created centralized stealth module (launch args, dynamic UA, init script)e429fe3— Enhanced with WebGL/Canvas fingerprint, screen/timezone/locale, navigator.connectionAgent integration
9eb998a— Both launch paths (single-cred + multi-cred) use Stealth moduleSystem Chrome detection (bypasses TLS fingerprinting)
bb7df03— CDP support via--use-chromeflag107745d— Attemptedchannel:'chrome'(failed — Playwright registry breaks under Bun --compile)6966d52—executablePathwith direct path detection (macOS/Windows/Linux). Auto-detects system Chrome, falls back to Playwright Chromium if not installed.Stealth init script covers
navigator.webdriver = falsecdc_*)navigator.plugins(3 entries vs empty)navigator.languages,hardwareConcurrency,deviceMemory,maxTouchPointsnavigator.connectionstub (4g/50ms)chrome.runtimestubBrowser selection priority
executablePath(real TLS fingerprint)--use-chrome <url>(connect to already-running Chrome)Note
Cloudflare Turnstile with advanced TLS fingerprinting may still block even system Chrome under Playwright automation. For those cases, IP whitelisting in the pentest scope is the standard practice.