The Obscura project takes security seriously. Obscura runs real, untrusted JavaScript from arbitrary web pages through V8, so we appreciate your efforts to responsibly disclose what you find and will work with you to address it.
Please do not report security issues through public GitHub issues, pull requests, or discussions.
Report a vulnerability privately through GitHub: go to the repository's Security tab and click Report a vulnerability to open a private advisory.
If you cannot use GitHub advisories, email hello@obscura.sh with "security" in the subject line.
To help us triage quickly, please provide as much of the following as you can:
- Type of issue (SSRF, hang or crash / denial of service, memory safety, cross-session data exposure, etc.).
- The obscura version or commit, plus OS and architecture.
- The location of the affected code (file path and commit, or a direct link).
- Any special configuration or flags required to reproduce.
- Step-by-step instructions: a page,
--evalsnippet, or CDP sequence that triggers it. - Proof-of-concept code if you have it, and the impact you think it has.
We will send a response indicating the next steps in handling your report, normally within 3 business days. We will keep you informed of progress toward a fix, and may ask for additional information. We practice coordinated disclosure: please give us a reasonable window to ship a fix before any public writeup, and we will credit you in the advisory unless you ask us not to.
If you do not receive an acknowledgement within 6 business days, please follow up by email to make sure we received the report.
Obscura is a powerful tool for browser automation, scraping, and inspection. It is the responsibility of the calling code and the operator to use it safely. The security boundaries Obscura is meant to hold, and which are in scope:
- Egress / SSRF control. Page content reaching loopback, RFC 1918, or
link-local addresses without
--allow-private-networkbeing set. - Availability. A page, script, or DOM structure that defeats the V8 termination watchdog, the CLI hard deadline, or the panic guards and so hangs or aborts the process.
- Memory safety in Obscura's own
unsafeRust or in an op that bridges JS to Rust. - Process and data integrity. A page that escapes the intended op surface, corrupts another page's state, or reads data across origins or sessions it should not (cookies, storage, response bodies).
- TLS / identity correctness issues that weaken or misrepresent a connection in a way the user did not request.
The following are not vulnerabilities. We welcome feedback on them as feature requests, but they will not be treated as security issues:
- Stealth / anti-fingerprinting behavior. Presenting a normal, consistent browser fingerprint is the intended, privacy-first design of stealth mode. Requests to add detection-evasion for abusive purposes are out of scope.
- Anything behind an explicit opt-in, such as reaching a private address
when
--allow-private-network(orOBSCURA_ALLOW_PRIVATE_NETWORK=1) is set, or behavior that requires local access to the machine running Obscura. - Resource use from a page you chose to load that stays within the watchdog and deadline limits. Slow pages are not a vulnerability.
- Findings against the companion benchmark repo fixtures rather than the engine itself.
Report vulnerabilities in third-party crates to their respective maintainers (or
the RustSec advisory database). The workspace is gated
by cargo deny via deny.toml. If a dependency advisory affects Obscura's own
behavior, let us know so we can pin or patch.
Obscura executes untrusted page JavaScript in process through V8. Its in-process hardening reduces blast radius but is not a substitute for operating system isolation:
- The V8 termination watchdog terminates the isolate from a separate thread
when synchronous script work overruns, because
tokiotimeouts only cancel at await points. - The CLI process-level hard deadline is an absolute backstop for a hang
inside a Rust op that neither
tokionorterminate_executioncan interrupt. - Panic safety: ops are wrapped so a panic degrades to a null result instead
of aborting the process inside V8's FFI frame;
panic = "unwind"is pinned in the release profile. - The default network egress policy blocks private and loopback ranges.
These measures protect availability and limit egress. They do not claim to contain a hostile page that achieves native code execution through a V8 exploit. If you run Obscura against untrusted or adversarial input at scale, run it under OS-level isolation (a container or VM) with a restricted network, the same way you would run headless Chrome. Per-user container isolation is planned for the hosted service so that one session cannot affect another.
Security fixes land on main and ship in the next release. Please test reports
against the latest release or main.