An unknown actor exploited CVE‑2026‑39987 in publicly exposed Marimo notebooks. They used an LLM‑driven agent to harvest cloud credentials and SSH keys. The attacker then exfiltrated a PostgreSQL database in under two minutes.
| IOC Type | Value | Description | Relevant MITRE ATT&CK Techniques |
|---|---|---|---|
| Filepath |
~/.pgpass
|
File containing PostgreSQL password used by attacker to dump the database | T1083|T1003 |
| Filepath |
~/.ssh/id_ed25519
|
SSH private key extracted and used for bastion authentication | T1021.002|T1078 |
| Vulnerability | CVE-2026-39987 | Critical RCE vulnerability in Marimo reactive Python notebook | T1190 |
| Code | Title |
|---|---|
| T1059.002 | Command and Scripting Interpreter: Unix Shell |
| T1003 | Credential Access |
| T1078 | Valid Accounts |
| T1021.002 | Remote Services: SSH |
| T1190 | Exploit Public-Facing Application |
| T1083 | File and Directory Discovery |
| T1071.006 | Application Layer Protocol: SSH |
| Type | Value |
|---|---|
| Sector | Software development / Data science |
An unknown threat actor has been observed using a large language model (LLM) agent to conduct post-compromise actions after obtaining initial access following the exploitation of a publicly-accessible Marimo network using a recently disclosed vulnerability. "The attacker compromised an internet-reachable Marimo notebook via
Sysdig said it uncovered four indicators that an LLM agent was behind the activity. First, the attacker improvised a database dump without any prior knowledge of the schema. Second, a Chinese-language planning comment, "看还能做什么" translating to "See what else we can do" leaked directly in the command stream when executing a credential search. "The database hostname was opaque, with no application identifier on disk and no schema dump pre-staged, yet the chain still landed on a credential table within minutes," Sysdig said. "The attacker no longer needs to see your environment to operate inside it." The third sign is that every command is designed for machine consumption, with each command separated by a "---" delimiter, along with bounded output captures, disabling the "less" command, and discarding the error stream (stderr) to minimize noise. Lastly, the value handoffs are obtained from prior tool output. In other words, the manner in which certain values, say, database passwords, were extracted implies an AI agent feeding its own previous output -- running a cat command of the "
An agent reads the surprise, decides what to try next, and keeps going." To counter this threat, it's recommended that users update to the latest version of Marimo, audit environments for any publicly-accessible instances, and rotate credentials, API keys, and SSH keys.