Malicious JetBrains Marketplace AI Plugins — Supply-Chain AI Key Theft

15 DeepSeek-themed IDE plugins covertly exfiltrate developer OpenAI / DeepSeek / SiliconFlow API keys to a plaintext-HTTP C2. ~70,000 installs.
Threat
JetBrains Marketplace AI-Plugin Supply-Chain Campaign
Severity
ACTIVE ITW
Type
Software Supply-Chain · Credential Theft
Access
Developer endpoint (IDE plugin)
Version
v0.2 · 2026-06-20
Author
HuntPack
Confidence
High (vendor-attributed)
01

Executive Summary

A coordinated software supply-chain campaign placed 15 malicious plugins on the official JetBrains Marketplace, all masquerading as AI coding assistants (DeepSeek-themed: AI chat, code review, bug detection, commit-message and unit-test generation). The plugins function as advertised — which is precisely what keeps them resident — while covertly harvesting the AI-provider API keys the developer pastes into them. Targeted credentials are OpenAI, DeepSeek, and SiliconFlow API keys.

Stolen keys are exfiltrated in plaintext over HTTP to a single command-and-control server, 39.107.60[.]51. The operation includes an illicit resale twist: after victims paid through the plugins' integrated donation systems, the plugins returned other victims' stolen keys — i.e. a key-resale racket running on top of the theft.

Scale and timeline: roughly 70,000 installs; campaign active since late October 2025, with the newest malicious plugin published 2026-06-10. Aikido Security reported the activity; JetBrains received reports on 2026-06-16 and publicized the takedown on 2026-06-17 — removing the plugins, blocking the publisher accounts, and remotely disabling the plugins in already-installed IDEs via its backend.

A related Chrome "Prompt Poaching" angle pairs with this campaign: two ad-blocker extensions (Smart Adblocker and Adblock for Browser) captured AI chatbot conversations (ChatGPT, Claude, Gemini, Copilot, Perplexity, DeepSeek, Grok, Meta AI) via a custom interception engine — a parallel AI-data-theft vector worth hunting alongside the IDE plugins.

Defender priority: The single highest-value detection is any outbound connection from a JetBrains IDE process (or its bundled JBR java runtime) to 39.107.60.51, especially plaintext HTTP POSTs. Treat any hit as confirmed AI-key exfiltration: rotate every OpenAI / DeepSeek / SiliconFlow key entered on that host, then enumerate installed plugins for the 15 named directories.

02

Source Review & Web Hunter Notes

SourceTierPulledNote
Aikido Security — original researchPrimary15 plugin names, C2 IP, resale behavior, install countDiscovering vendor; published technical detail and plugin list.
JetBrains Platform BlogVendorTakedown actions, disclosure timeline (06-16 report / 06-17 public)Confirms removal, account blocks, remote plugin disablement.
The Hacker NewsCorroboratingTargeted key types, plaintext-HTTP exfil, Chrome "Prompt Poaching" linkIndependent corroboration of C2 + behavior.
BleepingComputerCorroborating~70,000 installs, campaign timeline, developer-targeting framingIndependent corroboration.
Infosecurity MagazineCorroboratingCampaign scale, resale-of-keys angleSecondary corroboration.

Decision: C2 39.107.60.51 and the 15 plugin names are treated as published, high-confidence IOCs. No file hashes or additional C2 infrastructure were published at time of writing — hash IOCs in the appendix use REPLACE_WITH_… placeholders pending sandbox/tenant confirmation. Chrome extension IDs were not published; hunt by extension name.

03

Hunt Brief & Attack Chain

Hunt hypotheses

  • H1 — A JetBrains IDE process or its JBR java runtime on a developer endpoint establishes outbound connections to 39.107.60.51 (direct AI-key exfiltration).
  • H2 — One or more of the 15 named malicious plugin directories exist under the JetBrains config/plugins path on managed developer hosts.
  • H3 — A JetBrains IDE / JBR runtime makes plaintext-HTTP POSTs or beacons to rare external IPs not seen across the fleet (unknown exfil endpoints beyond the known C2).
  • H4 — Chrome carries Smart Adblocker or Adblock for Browser (AI-conversation interception, "Prompt Poaching").

Attack chain

#StageBehaviorATT&CK
1Initial AccessDeveloper installs a DeepSeek-themed AI plugin from the trusted JetBrains Marketplace.T1195.002
2ExecutionPlugin runs inside the IDE / JBR runtime, providing genuine AI features as cover.T1059.007 / T1059
3Credential AccessDeveloper-entered OpenAI / DeepSeek / SiliconFlow API keys captured from plugin config.T1552.001
4ExfiltrationKeys sent in plaintext HTTP to C2 39.107.60.51.T1041 / T1567 / T1071.001
5MonetizationResale — plugins return other victims' stolen keys after donation-system payment.T1657 (Financial Theft)
04

Consolidated IOC Table

TypeValueConfidenceActionContext
IPv4 (C2)39.107.60[.]51highdetectPlaintext-HTTP exfil endpoint for stolen AI keys.
Plugin nameDeepSeek Junit TesthighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek Git CommithighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek FindBugshighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek AI ChathighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek Dev AIhighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek AI CodinghighhuntMalicious JetBrains Marketplace plugin.
Plugin nameAI FindBugshighhuntMalicious JetBrains Marketplace plugin.
Plugin nameAI Git CommitorhighhuntMalicious JetBrains Marketplace plugin.
Plugin nameAI Coder ReviewhighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek Coder AIhighhuntMalicious JetBrains Marketplace plugin.
Plugin nameAI Coder AssistanthighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek Code ReviewhighhuntMalicious JetBrains Marketplace plugin.
Plugin nameCodeGPT AI AssistanthighhuntMalicious JetBrains Marketplace plugin.
Plugin nameDeepSeek AI AssisthighhuntMalicious JetBrains Marketplace plugin.
Plugin nameCoding Simple ToolhighhuntMalicious JetBrains Marketplace plugin.
Chrome ext nameSmart Adblockermediumhunt"Prompt Poaching" — captures AI chatbot conversations.
Chrome ext nameAdblock for Browsermediumhunt"Prompt Poaching" — captures AI chatbot conversations.
SHA256 (payload)REPLACE_WITH_SHA256pendingdetectPlugin JAR hash — confirm in tenant/sandbox before blocking.
05

Affected Surface & Telemetry Matrix

SurfaceTelemetryPriorityGap
Developer endpoints running JetBrains IDEs (idea64, pycharm64, webstorm64, goland64, clion64, rider64, phpstorm64, rubymine64)NetworkConnectIP4 / ProcessRollup2CriticalNone — primary surface.
JBR (JetBrains Runtime) java process under the IDE installNetworkConnectIP4 / DnsRequestCriticalProcess attribution to IDE may require parent lineage.
JetBrains plugins directory (per-OS paths)File write / directory creation eventsHighSome IDEs store plugins per-project; broaden path glob.
DNS / HTTP egressDnsRequest / proxy logsMediumC2 is a bare IP — DNS may not fire; rely on IP-level telemetry.
Chrome browser (managed workstations)Extension inventory / file events under Extensions pathMediumExtension IDs unpublished; match by name/manifest.
06

ATT&CK Mapping

TacticTechniqueBehaviorQuery / Control
Initial AccessT1195.002 — Supply Chain Compromise: Software Supply ChainTrojanized AI plugin from trusted Marketplace.Q3 (plugin dir), S12 hardening
ExecutionT1059.007 / T1059 — Script execution within IDEPlugin code runs in IDE / JBR runtime.Q2, Q3
Credential AccessT1552.001 — Credentials in Files / Unsecured CredentialsCaptures AI provider API keys from plugin config.S12 hardening, Q3
ExfiltrationT1041 — Exfiltration Over C2 ChannelKeys sent to C2 39.107.60.51.Q1, Q4
ExfiltrationT1567 — Exfiltration Over Web ServicePlaintext HTTP POST of stolen keys.Q1, Q4
Command & ControlT1071.001 — Application Layer Protocol: Web ProtocolsHTTP to C2.Q1, Q4
ImpactT1657 — Financial TheftResale of other victims' stolen keys via donation system.Investigation / S14
07

Native Audit-Log Hunts

Endpoint / filesystem (no EDR required)

  • Windows: Enumerate %APPDATA%\JetBrains\<Product>\plugins\ for any of the 15 named directories. PowerShell: Get-ChildItem "$env:APPDATA\JetBrains\*\plugins" -Directory and match against the IOC plugin list.
  • macOS: Inspect ~/Library/Application Support/JetBrains/<Product>/plugins/.
  • Linux: Inspect ~/.local/share/JetBrains/<Product>/plugins/.
  • Chrome: Inventory installed extensions; flag Smart Adblocker and Adblock for Browser. Check Default\Extensions\ manifests for those names.

Network / proxy

  • Search firewall / proxy / NetFlow for any traffic to 39.107.60.51 (any port; HTTP/80 most likely).
  • Hunt for cleartext-HTTP POSTs originating from developer subnets toward newly-seen Chinese-hosted IPs.

JetBrains IDE

  • Review IDE notification log for JetBrains' remote "plugin disabled" events (06-17 onward) — these mark hosts that had a malicious plugin installed.
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · Outbound connection to C2 39.107.60.51
CONF HIGHFP LOWCOST LOW

Looks for: Any host connecting to the published exfil C2. Highest-fidelity detection — any hit is treated as confirmed AI-key exfiltration. FP: effectively none; the IP is a campaign-specific exfil endpoint, not shared infrastructure.

// HUNT: Endpoint network connection to JetBrains AI-plugin C2 39.107.60.51
// MITRE: T1041, T1567, T1071.001  |  CONF: high  FP: low  COST: low
// REQUIRES: NetworkConnectIP4 telemetry (Falcon Insight)
// FALSE POSITIVES: none expected; bare campaign exfil IP
// TUNING: none needed; promote straight to alert
#event_simpleName=NetworkConnectIP4 RemoteAddressIP4="39.107.60.51"
| table([@timestamp, aid, ComputerName, ContextBaseFileName, RemoteAddressIP4, RemotePort, Protocol_decimal], limit=200)
Q2 · JetBrains IDE / JBR java making external connections to rare IPs
CONF MEDFP MEDCOST MED

Looks for: JetBrains IDE binaries (or the bundled JBR java) reaching out to external IPs seen on very few hosts across the fleet — an exfil-endpoint discovery hunt beyond the known C2. FP: legitimate plugin update/telemetry servers and AI provider API endpoints; exclude known-good AI/CDN ranges and high-prevalence destinations.

// HUNT: JetBrains IDE / JBR runtime egress to rare external IPs (unknown exfil)
// MITRE: T1041, T1071.001  |  CONF: medium  FP: medium  COST: medium
// REQUIRES: NetworkConnectIP4 with ContextBaseFileName attribution
// FALSE POSITIVES: plugin/marketplace update servers, AI API endpoints, CDNs
// TUNING: raise host-count threshold; allowlist known AI/CDN ranges
#event_simpleName=NetworkConnectIP4
| ContextBaseFileName=/^(idea64|pycharm64|webstorm64|goland64|clion64|rider64|phpstorm64|rubymine64|java)\.exe$/i
| !cidr(RemoteAddressIP4, subnet=["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16","127.0.0.0/8"])
| groupBy([RemoteAddressIP4], function=([count(aid, distinct=true, as=host_count), collect([ComputerName, ContextBaseFileName, RemotePort])]))
| host_count<=3
| sort(host_count, order=asc)
Q3 · Named malicious plugin directory created / present
CONF HIGHFP LOWCOST MED

Looks for: File-write events landing inside a JetBrains plugins path whose folder name matches one of the 15 malicious plugins. FP: low — names are campaign-specific; only "CodeGPT" warrants a glance since a legitimate "CodeGPT" plugin exists (the malicious one is "CodeGPT AI Assistant").

// HUNT: Creation/presence of a named malicious JetBrains plugin directory
// MITRE: T1195.002, T1059.007  |  CONF: high  FP: low  COST: medium
// REQUIRES: File write telemetry (TargetFileName)
// FALSE POSITIVES: legitimate "CodeGPT" plugin (verify exact name)
// TUNING: scope to JetBrains plugins paths only to cut volume
#event_simpleName=/^(NewExecutableWritten|PeFileWritten|FileWritten|RansomwareOpenFile)$/
| TargetFileName=/[\\\/](\.local[\\\/]share[\\\/]JetBrains|Application Support[\\\/]JetBrains|JetBrains)[\\\/][^\\\/]+[\\\/]plugins[\\\/]/i
| TargetFileName=/(DeepSeek (Junit Test|Git Commit|FindBugs|AI Chat|Dev AI|AI Coding|Coder AI|Code Review|AI Assist)|AI (FindBugs|Git Commitor|Coder Review|Coder Assistant)|CodeGPT AI Assistant|Coding Simple Tool)/i
| table([@timestamp, aid, ComputerName, UserName, TargetFileName], limit=200)
Q4 · DNS / HTTP activity referencing the C2 IP
CONF HIGHFP LOWCOST LOW

Looks for: DNS lookups that resolve to, or directly reference, the C2 IP — catches any future domain fronting the bare IP. FP: low; matches the campaign exfil address.

// HUNT: DNS request resolving to / referencing C2 39.107.60.51
// MITRE: T1071.001, T1041  |  CONF: high  FP: low  COST: low
// REQUIRES: DnsRequest telemetry
// FALSE POSITIVES: low; bare campaign exfil IP
// TUNING: pair with Q1 for IP-level confirmation
#event_simpleName=DnsRequest
| IP4Records="39.107.60.51" OR DomainName=/39\.107\.60\.51/
| table([@timestamp, aid, ComputerName, ContextBaseFileName, DomainName, IP4Records], limit=200)
Q5 · Chrome "Prompt Poaching" ad-blocker extensions present
CONF MEDFP MEDCOST MED

Looks for: File activity under Chrome's Extensions path tied to the two named ad-blocker extensions that intercept AI chatbot conversations. FP: medium — extension display names live in manifest/locale files; benign ad-blockers with similar names exist, so confirm against the published manifest before acting.

// HUNT: Chrome "Prompt Poaching" ad-blocker extension artifacts on disk
// MITRE: T1176 (Browser Extensions), T1555  |  CONF: medium  FP: medium  COST: medium
// REQUIRES: File write telemetry on browser profile paths
// FALSE POSITIVES: legitimately-named ad-blockers; confirm manifest
// TUNING: pivot to extension ID once published; verify name in manifest.json
#event_simpleName=/^(FileWritten|NewExecutableWritten|PeFileWritten)$/
| TargetFileName=/[\\\/](Google[\\\/]Chrome|Chromium)[\\\/].*[\\\/]Extensions[\\\/]/i
| TargetFileName=/(Smart\s*Adblocker|Adblock\s*for\s*Browser)/i
| table([@timestamp, aid, ComputerName, UserName, TargetFileName], limit=200)
Q6 · JetBrains IDE process spawning unexpected network children
CONF MEDFP MEDCOST MED

Looks for: JetBrains IDEs spawning curl / wget / powershell / cmd children that themselves make external connections — an alternative exfil path if the plugin shells out rather than using the JVM HTTP stack. FP: medium — build tools and terminal plugins legitimately spawn shells; correlate with external egress and rare destinations.

// HUNT: JetBrains IDE spawning network-capable child processes
// MITRE: T1059, T1041  |  CONF: medium  FP: medium  COST: medium
// REQUIRES: ProcessRollup2 with parent lineage
// FALSE POSITIVES: build/terminal plugins shelling out; developer CLI use
// TUNING: correlate child egress with Q1/Q2; baseline per-developer shell use
#event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/
| ParentBaseFileName=/^(idea64|pycharm64|webstorm64|goland64|clion64|rider64|phpstorm64|rubymine64)\.exe$/i
| ImageFileName=/[\\\/](curl|wget|powershell|pwsh|cmd|bitsadmin|certutil)\.exe$/i
| table([@timestamp, aid, ComputerName, UserName, ParentBaseFileName, ImageFileName, CommandLine], limit=200)

Field note: IP4Records in Q4 is the resolved-address field on DnsRequest events; validate the exact field name in your tenant's DNS schema. All other fields are standard Falcon data-model names.

09

Custom IOA Recommendations

IOA NamePatternExclusionsDeployment
JetBrains IDE → C2 39.107.60.51Network IOA: any process → RemoteIP 39.107.60.51NoneNetwork IOA, all developer host groups, action=Detect+Block
JBR java cleartext exfilProcess java under JetBrains path + outbound HTTP to non-allowlisted external IPAllowlist AI provider API ranges, plugin update serversCustom IOA, Block w/ monitoring window first
Malicious plugin dir writeFile-write IOA on JetBrains plugins\ path matching the 15 namesLegitimate "CodeGPT" plugin nameCustom IOA, Detect, dev host groups

IOA deployment path: Falcon console → Endpoint security → Custom IOA Rule Groups → create platform-specific group (Windows/Mac/Linux) → add rules above → assign to developer-workstation prevention policy.

10

Machine-Readable IOC Appendix

Grouped quick-copy blocks for bulk ingestion. Atomic IOCs not yet published use REPLACE_WITH_… placeholders — confirm in tenant/sandbox before promoting to prevent.

Falcon IOC Management CSVbulk import
type,value,action,severity,expiration,description,tags
ipv4,39.107.60.51,detect,critical,2026-12-20,JetBrains AI-plugin exfil C2 (plaintext HTTP),campaign:JetBrainsAIPluginSupplyChain
sha256,REPLACE_WITH_SHA256,detect,high,2026-12-20,Malicious plugin JAR (confirm in tenant),campaign:JetBrainsAIPluginSupplyChain
Malicious plugin nameshunt list
DeepSeek Junit Test
DeepSeek Git Commit
DeepSeek FindBugs
DeepSeek AI Chat
DeepSeek Dev AI
DeepSeek AI Coding
AI FindBugs
AI Git Commitor
AI Coder Review
DeepSeek Coder AI
AI Coder Assistant
DeepSeek Code Review
CodeGPT AI Assistant
DeepSeek AI Assist
Coding Simple Tool
Behavioral signatureshunt logic
# Behavioral signatures
- JetBrains IDE / JBR java -> outbound to 39.107.60.51 (any port)
- Plaintext HTTP POST of API-key-shaped data from developer subnet
- Named malicious plugin dir under JetBrains plugins/ path
- Chrome ext: "Smart Adblocker" / "Adblock for Browser" intercepting AI chats
- IDE-spawned curl/wget/powershell making external connections
Chrome "Prompt Poaching" + auditbrowser / response
# Chrome extension hunt (match by name in manifest/locale)
Smart Adblocker
Adblock for Browser

# Response audit checklist
- Rotate ALL OpenAI / DeepSeek / SiliconFlow keys entered on affected hosts
- Inventory JetBrains plugins on every developer endpoint
- Confirm JetBrains backend plugin-disable notification fired (06-17+)
- Block 39.107.60.51 at egress proxy/firewall
11

Detection Validation Gates

GateCheckPass criteria
Telemetry readyNetworkConnectIP4 + DnsRequest + File-write present from developer host groupEvents visible in last 24h across >90% of dev hosts
Benign baselineRun Q2 over 7d; characterize JetBrains egress destinationsKnown AI/CDN/update ranges identified and allowlisted
Positive testFrom a test host, curl http://39.107.60.51 (lab only) and confirm Q1 firesQ1 returns the test connection within search window
PromotionQ1 + Q4 → scheduled alert; Q2/Q3/Q5/Q6 → hunt dashboardsAlert wired with rotation runbook (S14)
12

Hardening — Tiered

Immediate (0–48h)
  • Block 39.107.60.51 at egress proxy/firewall and add as a Falcon network IOA (Detect+Block).
  • Push an inventory sweep for the 15 plugin names across all developer endpoints; uninstall any matches.
  • Rotate every OpenAI / DeepSeek / SiliconFlow API key entered on any host that ran a flagged plugin — assume compromise.
  • Confirm JetBrains' remote plugin-disable took effect; do not rely on it alone — remove the plugin and clear cached keys.
Near term (1–4 weeks)
  • Enforce a JetBrains Marketplace allowlist via IDE Settings Sync / org policy; restrict plugin installs to a vetted internal repository.
  • Move AI provider keys out of plugin config into a secrets manager / short-lived scoped tokens with usage caps and anomaly alerts.
  • Deploy a Chrome extension allowlist policy (ExtensionInstallAllowlist) and block Smart Adblocker / Adblock for Browser.
  • Egress-filter developer subnets; require HTTP(S) through an inspecting proxy to surface cleartext exfil.
Strategic
  • Establish a plugin/extension vetting pipeline (publisher reputation, permission review, traffic analysis) before fleet-wide approval.
  • Adopt provider-side controls: per-developer scoped AI keys, IP allowlisting at the AI provider, and automated rotation.
  • Developer security awareness: treat pasted secrets in IDE plugins as a credential-exposure event.
13

Deployable Playbooks

1 · Windows — enumerate JetBrains plugins for the 15 names

$names = @('DeepSeek Junit Test','DeepSeek Git Commit','DeepSeek FindBugs','DeepSeek AI Chat',
  'DeepSeek Dev AI','DeepSeek AI Coding','AI FindBugs','AI Git Commitor','AI Coder Review',
  'DeepSeek Coder AI','AI Coder Assistant','DeepSeek Code Review','CodeGPT AI Assistant',
  'DeepSeek AI Assist','Coding Simple Tool')
Get-ChildItem "$env:APPDATA\JetBrains\*\plugins" -Directory -ErrorAction SilentlyContinue |
  Where-Object { $n=$_.Name; $names | Where-Object { $n -like "*$_*" } } |
  Select-Object FullName

2 · macOS / Linux — same sweep

for d in "$HOME/Library/Application Support/JetBrains"/*/plugins \
         "$HOME/.local/share/JetBrains"/*/plugins; do
  [ -d "$d" ] && ls -1 "$d" | grep -Ei 'DeepSeek (Junit Test|Git Commit|FindBugs|AI Chat|Dev AI|AI Coding|Coder AI|Code Review|AI Assist)|AI (FindBugs|Git Commitor|Coder Review|Coder Assistant)|CodeGPT AI Assistant|Coding Simple Tool' \
    && echo "  ^ in $d"
done

3 · Chrome — enforce extension allowlist (managed policy registry)

# HKLM\SOFTWARE\Policies\Google\Chrome\ExtensionInstallBlocklist = *
# then allowlist only approved IDs in ExtensionInstallAllowlist.
# Removes Smart Adblocker / Adblock for Browser unless explicitly approved.

4 · Egress block (firewall pseudo-rule)

deny outbound any -> 39.107.60.51 any   # JetBrains AI-plugin exfil C2
log  outbound dev-subnet -> any :80      # surface cleartext HTTP for review
14

Containment Runbook

PhaseActionsOwnerEvidence
DetectQ1/Q4 alert fires, or plugin sweep returns a match.SOCNetworkConnectIP4 hit / plugin dir path
ContainNetwork-contain affected host; block C2 at egress; disable the plugin.SOC / IRContainment log, IOA action record
EradicateUninstall plugin, clear cached config/keys, remove plugin dir.Endpoint / DevPlugin removal confirmation
Credential resetRotate all OpenAI / DeepSeek / SiliconFlow keys used on the host; revoke old keys at provider.Dev / Cloud teamProvider key-rotation audit
RecoverReinstall only vetted plugins from internal repo; re-baseline egress.EndpointApproved plugin manifest
Lessons learnedAdd plugin allowlist policy; assess scope of exposed keys / API usage.IR leadPost-incident report
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1041 / T1567 / T1071.001Exfil to C2 39.107.60.51Q1, Q4YesGood
T1041 (unknown endpoint)IDE egress to rare external IPsQ2PartialPartial
T1195.002 / T1059.007Malicious plugin dir presentQ3YesGood
T1552.001API-key capture from plugin configNoGAP
T1176 (Prompt Poaching)Chrome ad-blocker AI interceptionQ5NoPartial
T1059IDE-spawned network childrenQ6NoPartial

Gaps: The credential-capture step (T1552.001) has no direct telemetry — the theft happens in-memory inside the plugin. Coverage relies on detecting the downstream exfil (Q1/Q4) and the plugin's presence (Q3). Validation gates (S11) must confirm Q1/Q4 fire on a lab connection before promotion.

16

Hunt Summary Ticket

TITLE:      Malicious JetBrains Marketplace AI Plugins — Supply-Chain AI Key Theft
SEVERITY:   Critical — active in the wild, ~70,000 installs
SCOPE:      Developer endpoints running JetBrains IDEs; managed Chrome browsers
HYPOTHESIS: A trojanized AI plugin exfiltrates OpenAI/DeepSeek/SiliconFlow keys
            to C2 39.107.60.51 over plaintext HTTP
QUERIES:    Q1 C2 connection | Q2 rare IDE egress | Q3 plugin dir | Q4 DNS/C2
            Q5 Chrome Prompt-Poaching | Q6 IDE-spawned net children
DO FIRST:   Run Q1 + Q3 fleet-wide; block 39.107.60.51 at egress
FINDINGS:   <fill in>
GAPS:       In-memory key capture (T1552.001) not directly observable
ACTIONS:    Uninstall plugin; rotate ALL AI provider keys on affected hosts
OWNER:      HuntPack
VERSION:    v0.2 · 2026-06-20
17

Changelog

v0.22026-07-24CQL correctness pass. All 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.
v0.12026-06-20Initial HuntPack. 6 CQL queries (C2 connection, rare IDE egress, plugin-dir presence, DNS/C2, Chrome Prompt-Poaching, IDE-spawned net children). IOCs: C2 39.107.60.51 + 15 plugin names + 2 Chrome extension names. Tiered hardening, playbooks, containment runbook.
18

References

TierSourceUsed ForAccess Date
PrimaryAikido Security — Multiple JetBrains IDE plugins caught stealing AI keysPlugin list, C2 IP, resale behavior2026-06-20
VendorJetBrains — Marketplace ecosystem security updateTakedown actions, disclosure timeline2026-06-20
CorroboratingThe Hacker News — Malicious JetBrains plugins steal AI keysTargeted keys, plaintext exfil, Prompt Poaching2026-06-20
CorroboratingBleepingComputer — Malicious JetBrains Marketplace plugins steal AI API keysInstall count, timeline2026-06-20