NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests Cloud Credentials and AI API Keys via Langflow RCE (CVE-2026-33017)

NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests (TL-2026-0514), also tracked as KeyHunter Campaign, is a high-severity malware campaign scored CVSS 9.8, first published 2026-05-14. It has no confirmed attribution, affects Langflow (DataStax / IBM) Langflow, references 1 CVE (CVE-2026-33017), maps to 30 MITRE ATT&CK techniques (T1027, T1036, T1041), and is covered by 9 detection rules and 30 indicators of compromise.

Key facts for TL-2026-0514

Threat ID
TL-2026-0514
Also known as
KeyHunter Campaign, NATS-as-C2 Campaign, Sysdig TRT 2026-05-14 Disclosure
Severity
HIGH
CVSS
9.8 (CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H)
Status
ACTIVE
Category
MALWARE
First published
2026-05-14
Last reviewed
2026-05-14
Attribution confidence
NONE
Motivation
FINANCIAL
Target sectors
technology, ai-ml, cloud-native, fintech, saas, startups, media
Target regions
Global, North America, Europe, Asia
Detection rules
9
Indicators of compromise
30

Malware and tooling in NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

Malware and tooling: KeyHunter, DirtyCreds (CVE-2022-2588 family), DirtyPipe (CVE-2022-0847), NATS pub/sub (custom ACL-enforced)

Sysdig Threat Research Team (TRT) disclosed a novel command-and-control technique dubbed NATS-as-C2, in which an unattributed financially-motivated actor abuses an ACL-enforced NATS pub/sub messaging server (45.192.109.25:14222) as the coordination plane for a distributed credential-harvesting botnet. The operator pivots from DigitalOcean staging host 159.89.205.184 and deploys a Python/Go worker named KeyHunter via exploitation of CVE-2026-33017 (Langflow unauthenticated RCE, CISA KEV) at /api/v1/build_public_tmp/{flow}. KeyHunter scrapes cloud development environments (CodePen, JSFiddle, StackBlitz, CodeSandbox) and public web sources for AWS access keys and LLM provider API keys (OpenAI, Anthropic, AWS Bedrock), live-validates them against vendor APIs, and reports results back to NATS C2 subjects — primarily monetized through Bedrock LLMjacking and stolen-key resale. Container-escape exploits DirtyPipe and DirtyCreds were also observed.

How NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests works

OVERVIEW

On 2026-05-14 the Sysdig Threat Research Team (TRT) published the first documented case of an operator using NATS (a CNCF-graduated pub/sub messaging server) as a command-and-control (C2) plane for a distributed, multi-host credential-harvesting botnet. The campaign — internally tracked as the KeyHunter operation after the worker's Go module path github.com/keyhunter/worker — combines four notable elements: (1) abuse of a legitimate, ACL-enforced NATS deployment as covert C2, (2) automated exploitation of CVE-2026-33017 (Langflow unauthenticated RCE, added to CISA KEV) for initial access, (3) post-compromise harvesting of AWS keys and AI provider API keys for both LLMjacking and resale, and (4) container-escape exploitation chains (DirtyPipe, DirtyCreds) for breakout from compromised pods. Sysdig assesses the actor as financially motivated and currently unattributed.

INITIAL ACCESS — CVE-2026-33017 (LANGFLOW)

The operator scans the public IPv4 space for Langflow instances and exploits CVE-2026-33017, an unauthenticated remote code execution flaw in the /api/v1/build_public_tmp/{flow} endpoint. The endpoint accepts a flow specification that is rendered into a Jython script and executed server-side without authentication; arbitrary Python code passes directly into the runtime. The CVE was added to CISA KEV and is being actively exploited as of 2026-05-05. Sysdig's first telemetry hit (LMDeploy SSRF probes followed by Langflow exploitation) timestamps to 2026-05-05 04:13 UTC and 09:12 UTC respectively, originating from DigitalOcean IP 159.89.205.184 (the same host that subsequently served the KeyHunter staging payloads on port 8888).

POST-EXPLOITATION & STAGING

After RCE, the worker pulls four staged artifacts from http://159.89.205.184:8888/: worker-linux-amd64 (the Go-compiled worker), keyhunter_worker.py (Python orchestrator), deploy.sh (installer that drops the worker as a daemon or container), and worker.yaml (a Kubernetes manifest used when the operator detects a kubelet/API server reachable from the compromised host). Build artifact strings recovered from the binary leak Windows developer paths D:/Program Files/Go/ and /AyuGram Desktop/KeyHunter-Distributed/worker/, suggesting the operator cross-compiles from a Windows workstation. The codebase is heavily inspired by — though not identical to — the public open-source project fadidevv/keyhunter on GitHub.

NATS-AS-C2 ARCHITECTURE

The novel C2 layer is a vanilla NATS server reachable at 45.192.109.25:14222 (note: not the default NATS port 4222 — port 14222 is used to evade naive port-based detection). The operator enforces NATS subject-level ACLs so that the worker role can only publish/subscribe to a constrained set of subjects, preventing rogue subscribers from enumerating all traffic. The observed worker-role subjects are:

task.scan_cde — operator -> worker: scan a given CDE platform for code snippets task.scan_web — operator -> worker: scrape a target URL for embedded keys task.validate_aws — operator -> worker: validate an AWS access key task.validate_ai — operator -> worker: validate an LLM provider API key heartbeat.worker — worker -> operator: liveness beacon worker.hb — worker -> operator: alternate liveness subject worker.heartbeat — worker -> operator: alternate liveness subject workers.heartbeat — worker -> operator: alternate liveness subject result.scan — worker -> operator: scan result scan.result — worker -> operator: alternate result subject worker.result — worker -> operator: alternate result subject kh.result — worker -> operator: KeyHunter result subject keyhunter.result — worker -> operator: alternate KeyHunter result subject

The multiplicity of heartbeat/result subjects indicates iteration during development — the worker codebase contains historical naming variants. From a defender's standpoint NATS-as-C2 is attractive to the adversary because (a) the NATS protocol is a plaintext line-based protocol that resembles legitimate microservice traffic, (b) NATS message-broker traffic does not appear in typical EDR/network detection content, and (c) ACL enforcement means a passive subscriber cannot enumerate the bot population.

KEYHUNTER WORKER — CAPABILITIES

KeyHunter is multi-tenant. On task receipt it dispatches to one of four scanners:

scan_cde — Iterates pages of CodePen, JSFiddle, StackBlitz, and CodeSandbox via each platform's public listing/search APIs and scrapes the resulting code snippets for embedded credentials using regex packs. Pages of interest include user-pinned snippets and recently-updated public projects.

scan_web — Generic URL scraper for arbitrary HTTP(S) endpoints fed by the operator. Extracts both inline credentials and credentials referenced from linked JavaScript bundles.

validate_aws — Performs live validation of AWS access keys using STS GetCallerIdentity, then probes a fixed set of services to enrich the credential record: bedrock (the primary LLMjacking target), sts, s3, ec2, ce (Cost Explorer — to gauge account value), lambda, logs, ecs, sagemaker, sso, and iam. Bedrock model listing is the explicit monetization target; SageMaker is probed for compute access; Cost Explorer is queried to pre-qualify high-spend accounts.

validate_ai — Live validates OpenAI, Anthropic, and AWS Bedrock keys against their respective vendor APIs with a minimal, low-cost call to confirm liveness without burning quota.

Results are JSON-serialized and published back to one of the result subjects above. The worker also emits periodic heartbeats so the operator can maintain an accurate bot count.

CONTAINER ESCAPE & PRIVILEGE ESCALATION

Where Langflow is deployed inside a container (the typical deployment topology), the worker attempts breakout using two well-known Linux kernel/cgroup primitives: DirtyPipe (CVE-2022-0847) and DirtyCreds (CVE-2022-2588 / 2022-2602 family). Successful breakout grants the operator host-level access, enabling lateral movement and credential harvesting from the host filesystem (e.g., ~/.aws/credentials, ~/.config/gcloud/credentials.db, mounted secret material).

MONETIZATION

Three paths are observed: (1) LLMjacking — abusing stolen AWS keys to run Bedrock inference on the victim's account, bypassing the actor's own LLM bill; (2) Direct resale of validated AI provider keys on credential-resale marketplaces; (3) Generalized cloud-account abuse where harvested AWS keys grant access to S3 buckets, EC2 instances, and Lambda.

ATTRIBUTION

Sysdig does not attribute the operator to a named group. Telemetry indicators (Windows build paths, AyuGram Desktop folder, references to a public Russian-speaking developer's GitHub project fadidevv/keyhunter) are circumstantial. Attribution confidence: LOW. Motivation: FINANCIAL.

DEFENSIVE GUIDANCE

Patch Langflow to the fixed release for CVE-2026-33017 immediately. Block egress to 45.192.109.25 (NATS C2) and 159.89.205.184 (staging). Deny NATS protocol egress from production workloads by default. Inspect Langflow pods for the worker artifacts listed above. Rotate any AWS or LLM provider keys that have been exposed in public CDE snippets — assume harvested.

MITRE ATT&CK techniques used in TL-2026-0514

Defense Evasion

T1027 Obfuscated Files or Information; T1036 Masquerading; T1070 Indicator Removal

Exfiltration

T1041 Exfiltration Over C2 Channel

Execution

T1059 Command and Scripting Interpreter; T1610 Deploy Container

Privilege Escalation

T1068 Exploitation for Privilege Escalation; T1611 Escape to Host

Command and Control

T1071 Application Layer Protocol; T1102 Web Service; T1105 Ingress Tool Transfer; T1571 Non-Standard Port

Initial Access

T1078 Valid Accounts; T1190 Exploit Public-Facing Application

Discovery

T1087 Account Discovery; T1526 Cloud Service Discovery; T1580 Cloud Infrastructure Discovery

Collection

T1119 Automated Collection; T1213 Data from Information Repositories

Impact

T1496 Resource Hijacking; T1657 Financial Theft

Persistence

T1525 Implant Internal Image; T1543 Create or Modify System Process

Credential Access

T1528 Steal Application Access Token; T1552 Unsecured Credentials

Lateral Movement

T1550 Use Alternate Authentication Material

Resource Development

T1583 Acquire Infrastructure; T1587 Develop Capabilities; T1588 Obtain Capabilities

Reconnaissance

T1595 Active Scanning

Affected products and versions in NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

  • Langflow (DataStax / IBM) — Langflow
    Vulnerable versions: <= 1.3.x (pre-CVE-2026-33017 fix)
    Fixed in: Per vendor advisory for CVE-2026-33017
  • Amazon Web Services — Bedrock (downstream abuse via stolen IAM keys)
    Vulnerable versions: All — LLMjacking is account-level abuse, not a Bedrock vulnerability
  • OpenAI — OpenAI API (key resale downstream)
    Vulnerable versions: All — exposed API keys are abused
  • Anthropic — Anthropic API (key resale downstream)
    Vulnerable versions: All — exposed API keys are abused
  • Linux kernel — Linux kernel (container escape surface)
    Vulnerable versions: < 5.16.11 / < 5.15.25 / < 5.10.102 (DirtyPipe); pre-DirtyCreds-fix kernels
    Fixed in: >= 5.16.11, >= 5.15.25, >= 5.10.102 + DirtyCreds backports

Remediation for NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

Patches

  • Langflow CVE-2026-33017 fix release (see vendor advisory) — disables unauthenticated execution of public flows
  • Linux kernel >= 5.16.11 / 5.15.25 / 5.10.102 (DirtyPipe)
  • Linux kernel patches for DirtyCreds family (5.18+ and backports)

Immediate actions

  • Patch all Langflow instances to fixed release addressing CVE-2026-33017 — endpoint /api/v1/build_public_tmp/{flow} must not accept unauthenticated flow execution
  • Block egress to NATS C2 45.192.109.25 (TCP/14222) and staging server 159.89.205.184 (TCP/8888) at perimeter and east-west firewalls
  • Audit Langflow pods/containers for presence of worker-linux-amd64, keyhunter_worker.py, deploy.sh, worker.yaml — quarantine if present
  • Rotate any AWS access keys or LLM provider API keys (OpenAI, Anthropic, AWS Bedrock) that have ever been committed to public CodePen, JSFiddle, StackBlitz, or CodeSandbox snippets
  • Enable AWS CloudTrail bedrock:InvokeModel monitoring; alert on anomalous invocation from new source IPs
  • Deny NATS protocol (default 4222 and observed 14222) egress from production workloads by default; allow only from explicitly-permitted service identities

Workarounds

  • Remove /api/v1/build_public_tmp/* from external exposure via reverse proxy ACL until patch applied
  • Run Langflow with a non-root user and read-only root filesystem; drop all Linux capabilities
  • Block outbound TCP from Langflow pods to non-allowlisted destinations via NetworkPolicy / service-mesh egress controls

Longer-term hardening

  • Adopt short-lived AWS credentials via IAM Identity Center / IAM Roles Anywhere; eliminate long-lived programmatic access keys in CDE-friendly environments
  • Deploy secret-scanning at CDE upload time (CodePen/JSFiddle integrations) to prevent inadvertent key publication
  • Patch Linux kernels against DirtyPipe (CVE-2022-0847) and DirtyCreds (CVE-2022-2588 / 2602) where any 5.8+/5.10+ kernels are still in fleet
  • Implement network egress allow-listing for all containerized AI/ML platforms (Langflow, LMDeploy, vLLM, Ollama)
  • Deploy LLMjacking-specific detection: rate-of-Bedrock-invocation from a single principal, foreign-region Bedrock invocation, unusual model-listing calls
  • Subscribe to NATS-protocol-aware DPI signatures (Suricata/Zeek) — see Detector phase output for rule pack

CVEs associated with NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

CVE-2026-33017

Weaknesses (CWE) in NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

CWE-94, CWE-78, CWE-306, CWE-918, CWE-552, CWE-200, CWE-269

Timeline of NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

  • CVE-2022-0847 (DirtyPipe) disclosed — later reused by KeyHunter operator for container escape from compromised Langflow pods
  • CVE-2022-2588 (DirtyCreds family) disclosed — second container-escape primitive observed in KeyHunter operator's toolkit
  • Sysdig publishes original LLMjacking research documenting AWS Bedrock abuse via stolen credentials — establishes the monetization model later operationalized by KeyHunter
  • CVE-2026-33017 published — Langflow unauthenticated RCE in /api/v1/build_public_tmp/{flow} via Jython script execution
  • CVE-2026-33017 added to CISA Known Exploited Vulnerabilities catalog
  • KeyHunter worker deployment attempt observed at 14:03 UTC — staging pull from 159.89.205.184:8888 followed by NATS connect-back to 45.192.109.25:14222
  • First AWS STS GetCallerIdentity call from compromised host at 09:21 UTC — operator validating that the compromised pod has IAM credentials
  • Langflow CVE-2026-33017 exploitation observed at 09:12 UTC from 159.89.205.184 against Sysdig honeypot
  • First Sysdig telemetry hit at 04:13 UTC — LMDeploy SSRF probes from 159.89.205.184
  • Threadlinqs Intelligence ingests Sysdig disclosure as TL-2026-0514 — Researcher analysis, Detector ruleset, and Pentester simulation chain initiated
  • Sysdig Threat Research Team publishes NATS-as-C2 disclosure blog documenting KeyHunter campaign, novel C2 technique, and full IOC set
  • As of 2026-05-29, this remains an active concern: CVE-2026-33017 (Langflow RCE) is CISA-KEV-listed and mass-exploited within ~20h of disclosure, and the financially-motivated KeyHunter/NATS-as-C2 credential-harvesting botnet is ongoing with no reported takedown. A patch exists (Langflow 1.9.0+), but unpatched instances are still being actively exploited.

Sources cited for NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

Threats related to NATS-as-C2: KeyHunter Distributed Worker Botnet Harvests

Detection coverage for TL-2026-0514

As of 2026-05-14, Threadlinqs Intelligence publishes 9 detection rule(s) for TL-2026-0514 across Splunk SPL, Microsoft KQL and Sigma, covering 30 indicator(s) of compromise. The whole corpus is readable without an account; a free account unlocks full detection query text in Splunk SPL, Microsoft KQL and Sigma; paid tiers add raw indicator values, correlation and the MCP server. Threadlinqs MCP server · View plans.

Threadlinqs Intelligence — Real-Time Threat Detection Platform

[ 0 threats ] [ 0 det ] [ CRIT: 0 ] [ HIGH: 0 ]
// threat_feed
$ sort --newest
Showing all threats

Latest Threats