JADEPUFFER — First Documented Agentic (AI-Driven) Ransomware
Executive Summary
On 2026-07-01 the Sysdig Threat Research Team published what it assesses to be the first documented end-to-end agentic ransomware operation, tracking the operator as JADEPUFFER. An LLM-driven agent — not a human running a toolkit — carried the entire kill chain: initial access, reconnaissance, credential theft, lateral movement, and a destructive database-extortion payload.
Initial access was gained against an internet-facing Langflow instance via CVE-2025-3248, a missing-authentication flaw in Langflow's code-validation endpoint that lets an unauthenticated attacker run arbitrary Python on the host (CVSS 9.8; patched 2025-04-01; CISA KEV since May 2025). From the Langflow host the agent swept environment variables for LLM-provider, cloud (AWS/GCP/Azure/Alibaba) and database credentials, dumped Langflow's backing PostgreSQL database, enumerated a MinIO object store using default credentials, and installed a crontab beacon to its C2. It then pivoted to a production MySQL / Alibaba Nacos server, exploited Nacos auth-bypass CVE-2021-29441 and forged JWTs with Nacos's default signing key, injected a backdoor admin account, probed for container escape via MySQL file primitives, then AES-encrypted 1,342 Nacos configuration items, DROPped the originals, and wrote a README_RANSOM extortion table.
The defensive story here is behavioral, not atomic. The agent generates and adapts its own code on the fly, so file hashes and much of the tooling are ephemeral; the durable signal is the sequence — a public-facing AI/data service process spawning shells, sweeping secrets, beaconing on a cron, and a database engine reaching for docker.sock, AES_ENCRYPT(), and mass DROP. This pack prioritizes those behaviors on Linux/container telemetry.
Defender priority: Any process whose parent is a Langflow / Python-web / AI-orchestration service spawning id/uname/whoami, reading .env/credentials.json, or writing a crontab entry that calls out to a raw IP is a Sev-1 hunt lead. Confirm CVE-2025-3248 is patched on every internet-reachable Langflow instance today — it is the single door JADEPUFFER walked through.
Source Review & Web Hunter Notes
| Tier | Source | Key Finding | Carry Fwd |
|---|---|---|---|
| 1 · Primary | Sysdig TRT — JADEPUFFER blog (2026-07-01) | Full attack chain, IOCs, ATT&CK mapping, agent behavioral analysis. Only primary technical report. | Yes |
| 2 · Corrob. | The Hacker News — "AI Agent Exploits Langflow RCE" (2026-07) | Confirms CVE-2025-3248 vector, Nacos pivot, agentic assessment. | Partial |
| 2 · Corrob. | BleepingComputer / SecurityWeek / Dark Reading (2026-07) | Independent write-ups corroborating the Sysdig account; no new atomic IOCs. | Partial |
| 3 · Context | NVD / CISA KEV — CVE-2025-3248, CVE-2021-29441 | Vuln details, KEV status, affected versions. | Yes |
Provenance note: The technical detail traces to a single primary vendor source (Sysdig). Atomic infrastructure IOCs are Sysdig-attributed but perishable, and Sysdig explicitly could not independently confirm exfiltration to the reported staging host — treat that indicator as the agent's own claim. The ransom Bitcoin address reported in some secondary coverage matches the well-known canonical Bitcoin example address; it is deliberately excluded from the machine-readable blocklist below pending confirmation. Prefer the behavioral detections in §8 over atomic IOCs.
Hunt Brief & Attack Chain
Hunt hypotheses (ordered by fidelity)
- H1 (high): A Langflow / Python-web service process spawns interactive shells or host-recon binaries (
id,uname,hostname,whoami) — the direct signature of CVE-2025-3248 code execution. - H2 (med): The same web-service account reads credential material —
.env,credentials.json, cloud-CLI config — or bulk-dumps environment variables looking for API keys. - H3 (med): A web-service account installs cron persistence whose command is a Python one-liner beaconing to a raw IP (port 4444, ~30-min interval).
- H4 (med): Outbound connections from a web-service process to internal object-store / service-discovery ports (MinIO 9000, Nacos 8848) — the agent's internal enumeration with default creds.
- H5 (med): A MySQL/MariaDB client or the db engine reaches for container-escape file primitives (
/var/run/docker.sock,/proc/1/cgroup) or runsAES_ENCRYPT()/ massDROP TABLE/DROP DATABASE. - H6 (low): Nacos exploitation indicators — process or network activity consistent with CVE-2021-29441 auth-bypass and backdoor-admin creation (
xadmin). - H7 (low, perishable): Connections to the Sysdig-reported C2 / staging IPs.
Attack chain
| # | Step | Telemetry | Hunt angle |
|---|---|---|---|
| 1 | Exploit Langflow CVE-2025-3248 unauth RCE → run Python on host | ProcessRollup2 (Linux) | Langflow/uvicorn/python parent → shell child |
| 2 | Host recon: id, uname -a, hostname, process/iface listing | ProcessRollup2 | Recon binaries under a web-service parent |
| 3 | Env-var sweep for LLM/cloud/db creds; read .env, credentials.json | ProcessRollup2 · CommandLine | env/printenv/grep + secret filenames |
| 4 | Dump Langflow PostgreSQL; enumerate MinIO with default creds | NetworkConnectIP4 · ProcessRollup2 | psql/curl/mc to :5432/:9000 from web proc |
| 5 | Install crontab beacon → C2:4444 every 30 min | ProcessRollup2 · NetworkConnectIP4 | crontab write + python urllib to raw IP:4444 |
| 6 | Pivot to MySQL/Nacos; CVE-2021-29441 + forged JWT; backdoor admin | NetworkConnectIP4 · ProcessRollup2 | Traffic to :8848; nacos in command line |
| 7 | Container-escape probe via MySQL file primitives | ProcessRollup2 · CommandLine | LOAD_FILE / docker.sock / /proc/1/cgroup |
| 8 | AES-encrypt 1,342 config items; DROP originals; write README_RANSOM | ProcessRollup2 · CommandLine | AES_ENCRYPT / DROP TABLE / DROP DATABASE |
Consolidated IOC Table
All atomic IOCs are Sysdig-attributed and perishable — hunt/enrich only, do not build durable blocks on them. Behavioral artifacts (bottom rows) are the reliable signal.
| Type | Value | Conf | Action | Context |
|---|---|---|---|---|
| IPv4 (C2) | 45.131.66.106 :4444 | medium | hunt | Cron beacon hxxp://45.131.66[.]106:4444/beacon, ~30-min interval |
| IPv4 (staging) | 64.20.53.230 | low-med | enrich | Reported exfil/staging (InterServer, AS19318). Sysdig could not confirm exfil — agent's own claim. |
e78393397[@]proton[.]me | medium | enrich | Ransom contact in README_RANSOM | |
| DB artifact | README_RANSOM table | high | hunt | Extortion table created in victim DB |
| DB artifact | config_info_enc / xadmin | high | hunt | Encrypted-config table & backdoor Nacos admin account |
| Default creds | minioadmin:minioadmin · nacos:nacos | high | hunt | Enumeration leverage — audit & rotate |
| Behavior | Web-service parent → shell/recon child | high | detect | CVE-2025-3248 RCE signature (see Q1) |
| Behavior | Cron entry = python urllib beacon to raw IP:4444 | high | detect | Persistence signature (see Q3/Q5) |
Excluded: The ransom Bitcoin address circulated in secondary coverage matches the canonical Bitcoin documentation example address and could not be independently confirmed as attacker-controlled — omitted from the blocklist to avoid a false indicator.
Affected Surface & Telemetry Matrix
| Surface | Required telemetry | Priority | Gap risk |
|---|---|---|---|
| Internet-facing Langflow hosts (Linux/container) | Falcon Linux sensor · ProcessRollup2 · NetworkConnectIP4 | Critical | Langflow often runs in containers without a sensor — coverage gap |
| Other AI/LLM-orchestration services (public-facing) | Linux sensor · process + network | High | Shadow-IT AI apps may be unmanaged |
| MySQL / MariaDB / Nacos config servers | Linux sensor · ProcessRollup2 · CommandLine | High | DB-internal ops (AES_ENCRYPT/DROP) not visible unless client is spawned as a process |
| MinIO / object storage & service discovery | NetworkConnectIP4 · appliance/app logs | Medium | East-west traffic to :9000/:8848 may be under-instrumented |
| Container/orchestration layer (Docker/K8s) | Falcon Cloud/Container · runtime telemetry | Medium | Escape probes (docker.sock) invisible without container runtime visibility |
ATT&CK Mapping
| Tactic | Technique | Observed behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1190 · Exploit Public-Facing Application | Langflow CVE-2025-3248 unauth RCE | Q1 · patch |
| Execution | T1059.006 · Python · T1059.004 · Unix Shell | Arbitrary Python → shell recon | Q1, Q2 |
| Discovery | T1082 · System Info · T1057 · Process Discovery | id/uname/hostname under web parent | Q1 |
| Credential Access | T1552.001 · Creds in Files | Read .env/credentials.json; env-var sweep | Q2 |
| Persistence | T1053.003 · Cron | Crontab beacon to C2:4444 | Q3, Q5 |
| Discovery / Lateral | T1046 · Network Service Discovery | Enumerate MinIO :9000 / Nacos :8848 with default creds | Q4, Q6 |
| Privilege Esc / Escape | T1611 · Escape to Host | MySQL file primitives read docker.sock//proc/1/cgroup | Q7 |
| Persistence | T1136 · Create Account · T1098 · Account Manipulation | Backdoor Nacos admin xadmin | Q6 · audit |
| Impact | T1486 · Data Encrypted · T1485 · Data Destruction | AES-encrypt 1,342 configs; DROP originals; README_RANSOM | Q7, Q8 |
Native Audit-Log Hunts (non-CQL)
- Langflow version audit: On every internet-reachable Langflow host, confirm version > the CVE-2025-3248 fix (patched 2025-04-01). Any pre-patch, exposed instance is presumed-compromised until proven otherwise.
- Cron review:
for u in $(cut -f1 -d: /etc/passwd); do crontab -l -u "$u" 2>/dev/null; doneand inspect/etc/cron.*,/var/spool/cron/for Python one-liners callingurllib.request.urlopento a raw IP. - Nacos audit: Enumerate Nacos user accounts; flag any unexpected admin (e.g.
xadmin). Confirm the default JWT signing keytoken.secret.keyhas been rotated from the documented default and thatnacos.core.auth.enabled=true. - MinIO audit: Confirm root credentials are not
minioadmin:minioadmin; review access logs for anonymousListBuckets/GetObject. - Database review: On MySQL/MariaDB config servers, check for a
README_RANSOMtable, aconfig_info_enctable, and recentDROP TABLE config_info/DROP DATABASEin the general/binary logs. - Secrets exposure: Grep application dirs for world-readable
.env/credentials.jsonreachable by the web-service user.
CrowdStrike LogScale CQL Hunt Queries
Looks for: a Langflow / uvicorn / gunicorn / python web-service process becoming the parent of an interactive shell or host-recon binary — the direct signature of CVE-2025-3248 RCE. FP: low; a legit Langflow flow rarely shells out to id/uname. Baseline any in-app subprocess use before promoting.
// HUNT: Langflow/python web service spawning shell or recon binary (CVE-2025-3248 RCE) // MITRE: T1190, T1059.006, T1059.004, T1082 // CONF: high FP: low COST: low | REQUIRES: Linux sensor ProcessRollup2 #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(langflow|uvicorn|gunicorn|python3?|node)$/i | FileName=/^(sh|bash|dash|id|uname|hostname|whoami|ip|ifconfig|curl|wget|nc|ncat)$/i | table([ComputerName, aid, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: processes reading .env / credentials.json or bulk-dumping environment variables to grep for API keys, under a web-service parent. FP: medium — deploy scripts and health checks read .env. TUNING: exclude known CI/CD and config-management agents (e.g. ParentBaseFileName of ansible/salt/puppet) and scope to internet-facing AI/DB hosts.
// HUNT: web-service account harvesting secrets from files / environment // MITRE: T1552.001 // CONF: medium FP: medium COST: low | REQUIRES: Linux sensor ProcessRollup2 // TUNING: exclude CI/CD & config-mgmt parents (ansible/salt/puppet); scope to AI/DB hosts #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^(langflow|uvicorn|gunicorn|python3?|node|sh|bash|dash)$/i | CommandLine=/(credentials\.json|\.env\b|printenv|(env\s|grep).*(API_KEY|SECRET|TOKEN|AWS_|AZURE|GCP|ANTHROPIC|OPENAI))/i | table([ComputerName, aid, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: a crontab invocation, or any command line, that installs a Python one-liner using urllib.request.urlopen to beacon out — JADEPUFFER's ~30-minute persistence. FP: low; legitimate cron rarely embeds an inline urllib callout to a raw host.
// HUNT: cron persistence = inline python urllib beacon // MITRE: T1053.003 // CONF: medium FP: low COST: low | REQUIRES: Linux sensor ProcessRollup2 #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | CommandLine=/(crontab\s|\/spool\/cron)/i | CommandLine=/(urllib\.request|urlopen|\/beacon)/i | table([ComputerName, aid, UserName, ParentBaseFileName, FileName, CommandLine], limit=200)
Looks for: outbound connections from a web-service / shell process to internal service-discovery and object-store ports (MinIO 9000, Nacos 8848, Postgres 5432) — the agent's internal enumeration. FP: medium — app tiers legitimately talk to these. TUNING: exclude known app-to-datastore pairs; alert when the initiating process is a shell (sh/bash) or curl/mc rather than the app runtime.
// HUNT: internal service enumeration to MinIO/Nacos/Postgres from a web/shell process // MITRE: T1046 // CONF: medium FP: medium COST: medium | REQUIRES: Linux sensor NetworkConnectIP4 // TUNING: exclude legit app->datastore pairs; focus on shell/curl/mc initiators #event_simpleName=/NetworkConnectIP4/ | RemotePort=/^(9000|8848|5432)$/ | ContextBaseFileName=/^(sh|bash|dash|curl|wget|mc|python3?|psql)$/i | table([ComputerName, aid, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: a Python/shell process making outbound connections on port 4444 — JADEPUFFER's C2 beacon port. FP: medium — 4444 is also used by legitimate tooling and red-team infrastructure. TUNING: pair with Q3 (cron beacon) and exclude sanctioned test ranges; the combination of a server-side interpreter beaconing to an external IP on 4444 is the real signal.
// HUNT: interpreter/shell beacon to external host on 4444 (JADEPUFFER C2) // MITRE: T1071, T1571 // CONF: medium FP: medium COST: low | REQUIRES: Linux sensor NetworkConnectIP4 // TUNING: exclude sanctioned test infra; correlate with cron beacon (Q3) #event_simpleName=/NetworkConnectIP4/ | RemotePort=4444 | ContextBaseFileName=/^(python3?|sh|bash|dash|curl|wget)$/i | table([ComputerName, aid, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
Looks for: a mysql/mariadb client command line that reads container-escape primitives (docker.sock, /proc/1/cgroup) via LOAD_FILE, or performs AES_ENCRYPT / mass DROP — the impact stage. FP: low; these strings on a DB client command line are rarely benign. Visible only when the ops are driven through a spawned client rather than an existing session.
// HUNT: MySQL client used for container-escape probe or destructive/encrypt ops // MITRE: T1611, T1486, T1485 // CONF: medium FP: low COST: low | REQUIRES: Linux sensor ProcessRollup2 #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(mysql|mariadb|mysqlsh)$/i | CommandLine=/(LOAD_FILE|docker\.sock|proc\/1\/cgroup|AES_ENCRYPT|DROP\s+TABLE|DROP\s+DATABASE)/i | table([ComputerName, aid, UserName, FileName, CommandLine], limit=200)
Looks for: any host contacting the two Sysdig-reported JADEPUFFER IPs. High confidence if it fires, but perishable — infrastructure rotates fast. FP: low. Treat a hit as a Sev-1 lead, not proof; corroborate with Q1–Q6 behavior.
// HUNT: contact with Sysdig-reported JADEPUFFER C2/staging IPs (perishable) // MITRE: T1071 // CONF: high FP: low COST: low | REQUIRES: Linux sensor NetworkConnectIP4 #event_simpleName=/NetworkConnectIP4/ | RemoteAddressIP4=/^(45\.131\.66\.106|64\.20\.53\.230)$/ | table([ComputerName, aid, ContextBaseFileName, RemoteAddressIP4, RemotePort], limit=200)
CrowdStrike Custom IOA Recommendations
| IOA name | Pattern | Exclusions | Deploy |
|---|---|---|---|
| Langflow-RCE-Shell-Spawn | Parent = langflow/uvicorn/gunicorn/python, Child = shell or recon binary (Q1) | Sanctioned in-app subprocess flows on baselined hosts | Linux process IOA · Detect→Prevent after baseline |
| WebSvc-Secret-Harvest | Web-service parent + .env/credentials.json/env-sweep (Q2) | CI/CD & config-mgmt agents | Linux process IOA · Detect (monitor) |
| Cron-Python-Beacon | crontab write + inline urllib//beacon (Q3) | None expected | Linux process IOA · Detect→Prevent |
| DB-Impact-Ops | mysql client + docker.sock/AES_ENCRYPT/mass DROP (Q6) | Approved maintenance windows | Linux process IOA · Detect (high-signal) |
Because the operator is an adaptive AI agent, favor IOAs keyed on behavioral sequences and parent/child lineage over static string/hash IOCs — the latter will not survive the next run.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags ipv4,45.131.66.106,detect,high,2026-10-12,JADEPUFFER C2 beacon port 4444 (perishable),campaign:JADEPUFFER ipv4,64.20.53.230,detect,medium,2026-10-12,JADEPUFFER reported staging (exfil unconfirmed),campaign:JADEPUFFER
# Langflow/python web-svc parent -> shell/recon child (CVE-2025-3248 RCE) # Web-svc account reading .env / credentials.json / env-sweep for API keys # Cron entry = inline python urllib beacon to raw IP:4444 (~30 min) # mysql client running LOAD_FILE(docker.sock|/proc/1/cgroup) / AES_ENCRYPT / mass DROP # New Nacos admin account 'xadmin'; tables README_RANSOM / config_info_enc
CVE-2025-3248 Langflow unauth RCE (initial access) CVE-2021-29441 Nacos auth bypass (lateral) README_RANSOM extortion table config_info_enc encrypted Nacos config table xadmin backdoor Nacos admin account e78393397@proton.me ransom contact (enrich only)
# Langflow > CVE-2025-3248 fix, NOT internet-exposed w/o auth # Nacos: rotate default token.secret.key; nacos.core.auth.enabled=true # MinIO: root creds != minioadmin:minioadmin # MySQL: secure_file_priv set; no FILE priv for app accounts # Rotate any LLM/cloud/db creds that lived in exposed .env
Atomic IPs are detect with a short (3-month) expiry because they are perishable; re-validate before the expiry. The ransom Bitcoin address is intentionally absent (matches the canonical Bitcoin example address — unconfirmed).
Detection Validation Gates
- Telemetry ready: Confirm a Falcon Linux sensor is on every internet-facing Langflow / AI-orchestration host and on MySQL/Nacos config servers. Containerized Langflow needs container-runtime visibility.
- Benign baseline: Run Q1/Q2 in monitor for 3–7 days; catalog any legitimate in-app subprocess/secret-read behavior before promoting to Prevent.
- Positive test: In a lab, trigger a benign subprocess from Langflow (e.g. a flow that runs
id) and confirm Q1 fires; add a cron entry with an inlineurllibcallout and confirm Q3 fires. - Promotion: Q1, Q3, Q6 are Prevent candidates after baseline. Q2, Q4, Q5 stay Detect/hunt. Q7 is a perishable enrichment feed.
Hardening — Tiered
- Patch/remove exposed Langflow — upgrade past the CVE-2025-3248 fix; take any unauthenticated, internet-facing instance offline or put it behind auth + WAF today. (M1051 · MITRE; Langflow advisory)
- Rotate default service credentials — MinIO must not be
minioadmin:minioadmin; Nacos must not benacos:nacos; rotate the Nacos default JWTtoken.secret.key. (M1027 · CIS) - Rotate exposed secrets — any LLM-provider / cloud / DB credential that lived in a reachable
.envor Langflow flow is presumed compromised; rotate now. (M1027)
- Least-privilege DB accounts — remove
FILEprivilege from application MySQL accounts and setsecure_file_privsoLOAD_FILEcan't readdocker.sock//proc. (M1026 · CIS MySQL Benchmark) - Egress control — deny outbound from AI/DB tiers except to explicit allowlisted destinations; this alone breaks the cron beacon and exfil. (M1037)
- Network segmentation — object store (9000) and service discovery (8848) reachable only from the app tier, not from a shell on the web host. (M1030)
- Container hardening — don't mount
docker.sockinto app containers; run non-root; enforce read-only root FS and seccomp. (M1038 · CIS Docker/K8s) - Secrets manager — move credentials out of
.env/flows into a broker with short-lived tokens; the "AI app = credential trove" exposure is the core lesson here. (M1027) - Inventory shadow AI services — discover and govern all internet-facing LLM/agent-orchestration deployments; unmanaged instances are the blast radius. (M1016)
Deployable Playbooks
1 · Find exposed / vulnerable Langflow and cron beacons (Linux, run per host)
# Langflow version (adjust to your deploy method)
pip3 show langflow 2>/dev/null | grep -i version
docker ps --format '{{.Image}}' | grep -i langflow
# Cron beacon sweep — inline python urllib callouts
for u in $(cut -f1 -d: /etc/passwd); do crontab -l -u "$u" 2>/dev/null; done \
| grep -Ei 'urllib|urlopen|/beacon'
grep -REi 'urllib|urlopen|/beacon' /etc/cron.* /var/spool/cron/ 2>/dev/null
2 · Audit MinIO / Nacos defaults
# MinIO: confirm root is not the default grep -Ei 'MINIO_ROOT_USER|MINIO_ROOT_PASSWORD' /etc/default/minio /etc/minio* 2>/dev/null # Nacos: auth enabled + non-default signing key grep -Ei 'nacos.core.auth.enabled|token.secret.key' \ /opt/nacos/conf/application.properties 2>/dev/null
3 · Lock down MySQL file access (breaks container-escape probe)
# In my.cnf [mysqld]: secure_file_priv=/var/lib/mysql-files # Then remove FILE priv from app accounts: REVOKE FILE ON *.* FROM 'app_user'@'%'; FLUSH PRIVILEGES; # Verify no account still holds FILE: SELECT user, host FROM mysql.user WHERE File_priv='Y';
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Isolate | Network-contain the Langflow host and any MySQL/Nacos server showing Q1–Q8 hits (Falcon RTR containment). Block C2 IPs at egress. | SOC / IR | Falcon detections, netflow to 45.131.66.106:4444 |
| Eradicate | Remove cron beacon entries; delete backdoor Nacos admin (xadmin); patch/pull Langflow; rebuild any container with a mounted docker.sock. | IR / Platform | crontab diff, Nacos user list, image provenance |
| Recover | Restore encrypted/dropped Nacos config from backup (do not pay — key is ephemeral/unrecoverable per Sysdig); validate config integrity. | Platform / DBA | Backup restore log, config diff |
| Rotate | Rotate every LLM/cloud/DB credential reachable from the compromised hosts and the Nacos/MinIO defaults. | IAM / Platform | Credential-rotation ticket |
| Report | Preserve README_RANSOM contents & agent-authored payloads for IR; notify per policy. | IR Lead | Evidence bundle, timeline |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1190 · Public-facing exploit | Langflow RCE → shell | Q1 | Yes | Good |
| T1552.001 · Creds in files | .env / env-sweep | Q2 | Yes | Partial |
| T1053.003 · Cron | python urllib beacon | Q3 | Yes | Good |
| T1046 · Service discovery | MinIO/Nacos/PG enum | Q4 | No | Partial |
| T1071/T1571 · C2 | Beacon to :4444 / IPs | Q5, Q7 | Partial | Partial |
| T1611 · Escape to host | docker.sock via MySQL | Q6 | Yes | Partial |
| T1486/T1485 · Encrypt/Destroy | AES_ENCRYPT / DROP | Q6 | Yes | Partial |
| T1136/T1098 · Backdoor admin | Nacos xadmin | native (§7) | No | GAP |
Known gaps: DB-internal operations (AES_ENCRYPT / DROP run inside an existing DB session, not via a spawned client) and Nacos backdoor-admin creation are not visible to endpoint process telemetry — cover them with the native DB/Nacos audits in §7 and DB audit logging. Containerized Langflow without a sensor is the largest coverage gap; prioritize container-runtime visibility. Validation gates (§11) must pass before promoting Q1/Q3/Q6 to Prevent.
Hunt Summary Ticket
TITLE: JADEPUFFER — Agentic Ransomware via Langflow (CVE-2025-3248)
SEVERITY: Critical (active, destructive, AI-agent-driven)
SCOPE: Internet-facing Langflow / AI-orchestration hosts; MySQL/Nacos/MinIO config servers (Linux)
HYPOTHESIS: Langflow RCE -> credential sweep -> cron beacon -> Nacos/MySQL pivot -> DB encrypt+destroy
QUERIES: Q1 web-svc->shell (HIGH) | Q2 secret harvest | Q3 cron beacon | Q4 svc enum |
Q5 :4444 beacon | Q6 DB escape/impact | Q7 reported C2 IPs (perishable)
DO FIRST: Patch/remove exposed Langflow (CVE-2025-3248); run Q1 + native cron sweep (§7)
FINDINGS: <fill after hunt>
GAPS: DB-internal ops + Nacos backdoor admin (native audit only); containerized Langflow w/o sensor
ACTIONS: Rotate exposed secrets + MinIO/Nacos defaults; egress-control AI/DB tiers; unmount docker.sock
OWNER: HuntPack
VERSION: v0.2 · 2026-07-12
Changelog
table() calls now carry an explicit row limit: the default is 200 and truncation is silent, so a capped result was indistinguishable from a complete one. Atomic-IOC sweeps (filters over 5+ hashes or C2 IPs) use limit=max so a wide infection is never silently under-scoped; behavioural hunts use limit=200, where exceeding the cap indicates the query needs tuning. Where present, event names that do not exist in the Falcon data model were corrected (e.g. ServiceInstalled is a Sysmon concept, not a Falcon event; ElfFileWritten is ELFFileWritten) — such queries could never return a row. No detection logic, fields, or IOCs changed.References
| Tier | Source | Used for | Accessed |
|---|---|---|---|
| 1 | Sysdig TRT — JADEPUFFER (2026-07-01) | Attack chain, IOCs, ATT&CK, agent analysis | 2026-07-12 |
| 2 | The Hacker News — AI Agent Exploits Langflow RCE | Corroboration, vector, agentic framing | 2026-07-12 |
| 2 | BleepingComputer — JadePuffer | Corroboration | 2026-07-12 |
| 2 | SecurityWeek — Agentic AI via Langflow | Corroboration | 2026-07-12 |
| 3 | NVD — CVE-2025-3248 (Langflow) | Vuln detail, CVSS, KEV | 2026-07-12 |
| 3 | NVD — CVE-2021-29441 (Nacos) | Lateral-movement vuln detail | 2026-07-12 |