CVE-2026-39987: Marimo Exploited in 9 Hours and 41 Minutes — When Public Disclosure Becomes the Starting Gun for a Global Exploit Race
On April 10, 2026, the Marimo development team — an emerging open-source Python notebook, a modern Jupyter alternative particularly appreciated by the data science community for its responsiveness and reactive cell execution — published a security advisory for CVE-2026-39987. A pre-authentication remote code execution with CVSS 9.3 score, classified as critical, affecting all versions from 0.0.1 to 0.20.4 inclusive. The fix was available in version 0.23.0, released alongside the disclosure. Standard responsible disclosure procedure, properly executed.
Nine hours and forty-one minutes later, Sysdig Threat Research Team's honeypot nodes — Marimo instances deliberately deployed vulnerable across multiple cloud providers to measure weaponization speed — recorded the first real-world exploit attempt. Not an academic proof-of-concept. Not an exploratory scan. A working exploit, launched by an attacker who had read the advisory, understood the bug, written the payload, identified targets, and activated the attack — all within a single night. This is the new operational reality of cybersecurity in 2026: the window between disclosure and exploitation is now measured in hours, not days or weeks.
What Marimo Is and Why It Matters
Marimo is an open-source Python notebook born as a modern alternative to Jupyter Notebook. Its technical pitch is interesting: unlike Jupyter, where cells execute in arbitrary order and kernel state can diverge from visible code, Marimo implements a reactive model where modifying a cell automatically updates all dependent cells. Marimo is also a web application: the notebook is served by a local (or remote) Python server accessible via browser. To enable advanced features like opening an interactive terminal inside the notebook, Marimo exposes WebSocket endpoints. Among these, /terminal/ws provides terminal access. And that is where the problem began.
Vulnerability Anatomy: The Missing validate_auth
CVE-2026-39987 is the kind of vulnerability that hurts because it's simple. Marimo's code, like any well-designed web application, has an internal function called validate_auth() that verifies whether incoming requests are authorized. For most WebSocket endpoints — including /ws, the notebook's main endpoint — validate_auth() is called correctly: without authentication, the connection is rejected.
For /terminal/ws, however, validate_auth() was never called. The endpoint handler only checked two things: that the current Marimo execution mode supported the terminal and that the underlying platform allowed it. No identity verification. No token check. No session validation. Once these two environmental checks were satisfied, the endpoint accepted the connection and provided a complete PTY (pseudo-terminal) shell to the caller, with all privileges of the Marimo process.
CVE-2026-39987 — CVSS 9.3 — Pre-authentication Remote Code Execution. Vulnerable versions: all Marimo versions from 0.0.1 to 0.20.4. Fixed version: 0.23.0. Vulnerable endpoint: /terminal/ws. Time from disclosure to first recorded exploit: 9 hours and 41 minutes.
Exploitation in Practice: A Single WebSocket Request
Exploitation of CVE-2026-39987 is disarmingly trivial. An attacker identifying a vulnerable Marimo instance exposed on the Internet only needs to open a WebSocket connection to the /terminal/ws endpoint. No token, no cookie, no authentication. Once the connection is established, the attacker receives an interactive PTY terminal and can execute any command. Endor Labs released a detailed analysis describing the exploitation as "root in one request" — a single WebSocket request transforms an anonymous Internet attacker into a user with complete shell access in the Marimo process context.
- Vulnerable endpoint: /terminal/ws (WebSocket terminal)
- Missing function: validate_auth() — authentication check absent
- Present checks: only execution mode and platform support
- Exploitation result: complete PTY shell with Marimo process privileges
- Attack vector: network (any attacker able to reach the instance)
- Privileges required: none (pre-authentication)
- User interaction: none
- Impact: confidentiality + integrity + availability (all high)
9 Hours 41 Minutes: The New Weaponization Speed Standard
The most important data point of this case is not the vulnerability itself — it's attacker reaction time. To contextualize: in 2015, average time between disclosure and first mass exploit for a critical vulnerability was on the order of weeks. By 2020 it was already days. By 2024 it was measured in hours. In 2026, with CVE-2026-39987, we're under 10 hours. The trajectory is clear and implacable: the patch window is collapsing.
This radically changes the operational assumptions underlying most enterprise vulnerability management programs. Mental models like "we have 30 days to apply a critical patch" or "we patch during the weekend maintenance window" are now obsolete. For critical vulnerabilities with public exploits, the useful response window before being hit is measured in hours, not days.
Evolution of average time from disclosure to first public exploit: 2015 = weeks → 2020 = days → 2024 = hours → 2026 = under 10 hours. The trajectory suggests that within a few years this time will be measured in minutes, with automated tools monitoring CVE feeds and generating exploits in real time.
Why It Happened: Open-Source Under Pressure
CVE-2026-39987 is not a case of incompetent development. Marimo is a high-quality open-source project with a competent development team, an active community, and a well-managed disclosure process. Yet this vulnerability existed for over two years in the codebase before being identified. The /terminal/ws case is exactly what you'd expect when a project grows quickly: the interactive terminal feature was added at a moment when it seemed like a small notebook extension. The developer who implemented it probably thought "the notebook already requires authentication, so the terminal is automatically protected," without realizing the new WebSocket endpoint was completely separate from the main notebook authentication flow.
Implications for Security Teams and Developers
The Marimo case offers concrete lessons at multiple levels. For web application developers, the main lesson is treating every new endpoint as a potential attack surface — code review checklists must explicitly include the question "does this new endpoint call validate_auth (or equivalent)?". For security teams, the lesson is even more urgent: traditional vulnerability management programs based on 7-30 day patching SLAs for critical vulnerabilities are now inadequate. For data scientists and developers using tools like Marimo or Jupyter, the lesson is operational hygiene: these tools should never be directly exposed on the Internet.
Operational Recommendations
- 1.Immediate Marimo update to 0.23.0: no previous version is safe.
- 2.Audit exposed Marimo instances: use Shodan or internal scanners to identify which instances are reachable from Internet.
- 3.Network isolation: every Python notebook must be isolated at network level. Access only via VPN, SSH tunnel, or authenticated reverse proxy.
- 4.Log monitoring for exploitation patterns: search for /terminal/ws WebSocket connections from unknown IPs.
- 5.Credential rotation: if a Marimo instance was publicly exposed, consider all credentials accessible to the Marimo process potentially compromised.
- 6.WAF with virtual patching rules: implement WAF rules blocking unauthorized WebSocket connections to /terminal/ws.
- 7.Threat model review for development tools: all dev tools exposing network interfaces must be in vulnerability management programs.
- 8.Subscription to priority CVE feeds: set automated alerts for new CVEs affecting your tech stack.
Conclusion: Disclosure Is No Longer a Warning, It's a Starting Gun
CVE-2026-39987 and its 9 hours and 41 minutes of exploitation time are an alarm bell professional cybersecurity can no longer ignore. The traditional mental model — "a vulnerability is disclosed, we have a few days to apply the patch before attackers notice" — is dead. Today, public disclosure of a critical vulnerability is a starting gun: the fastest attackers are operational the same day, automated mass scanners launch in the following hours, and within a week every publicly exposed instance will have been at least attempted. The question is no longer "have we applied all critical patches from last month?" but "do we have a system that lets us respond to a new critical CVE in a few hours?".
Primary sources: The Hacker News — Marimo RCE Flaw CVE-2026-39987 Exploited Within 10 Hours of Disclosure (April 10, 2026), Endor Labs — Root in One Request: Marimo's Critical Pre-Auth RCE, Sysdig Threat Research Team — Honeypot exploitation timing analysis, NVD CVE-2026-39987, GHSA-2679-6mx9-h9xc, marimo-team/marimo GitHub Releases (version 0.23.0), Lufsec Blog.