Malicious JetBrains Marketplace AI Plugins — Supply-Chain AI Key Theft
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.
Source Review & Web Hunter Notes
| Source | Tier | Pulled | Note |
|---|---|---|---|
| Aikido Security — original research | Primary | 15 plugin names, C2 IP, resale behavior, install count | Discovering vendor; published technical detail and plugin list. |
| JetBrains Platform Blog | Vendor | Takedown actions, disclosure timeline (06-16 report / 06-17 public) | Confirms removal, account blocks, remote plugin disablement. |
| The Hacker News | Corroborating | Targeted key types, plaintext-HTTP exfil, Chrome "Prompt Poaching" link | Independent corroboration of C2 + behavior. |
| BleepingComputer | Corroborating | ~70,000 installs, campaign timeline, developer-targeting framing | Independent corroboration. |
| Infosecurity Magazine | Corroborating | Campaign scale, resale-of-keys angle | Secondary 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.
Hunt Brief & Attack Chain
Hunt hypotheses
- H1 — A JetBrains IDE process or its JBR
javaruntime on a developer endpoint establishes outbound connections to39.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
| # | Stage | Behavior | ATT&CK |
|---|---|---|---|
| 1 | Initial Access | Developer installs a DeepSeek-themed AI plugin from the trusted JetBrains Marketplace. | T1195.002 |
| 2 | Execution | Plugin runs inside the IDE / JBR runtime, providing genuine AI features as cover. | T1059.007 / T1059 |
| 3 | Credential Access | Developer-entered OpenAI / DeepSeek / SiliconFlow API keys captured from plugin config. | T1552.001 |
| 4 | Exfiltration | Keys sent in plaintext HTTP to C2 39.107.60.51. | T1041 / T1567 / T1071.001 |
| 5 | Monetization | Resale — plugins return other victims' stolen keys after donation-system payment. | T1657 (Financial Theft) |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context |
|---|---|---|---|---|
| IPv4 (C2) | 39.107.60[.]51 | high | detect | Plaintext-HTTP exfil endpoint for stolen AI keys. |
| Plugin name | DeepSeek Junit Test | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek Git Commit | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek FindBugs | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek AI Chat | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek Dev AI | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek AI Coding | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | AI FindBugs | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | AI Git Commitor | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | AI Coder Review | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek Coder AI | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | AI Coder Assistant | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek Code Review | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | CodeGPT AI Assistant | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | DeepSeek AI Assist | high | hunt | Malicious JetBrains Marketplace plugin. |
| Plugin name | Coding Simple Tool | high | hunt | Malicious JetBrains Marketplace plugin. |
| Chrome ext name | Smart Adblocker | medium | hunt | "Prompt Poaching" — captures AI chatbot conversations. |
| Chrome ext name | Adblock for Browser | medium | hunt | "Prompt Poaching" — captures AI chatbot conversations. |
| SHA256 (payload) | REPLACE_WITH_SHA256 | pending | detect | Plugin JAR hash — confirm in tenant/sandbox before blocking. |
Affected Surface & Telemetry Matrix
| Surface | Telemetry | Priority | Gap |
|---|---|---|---|
| Developer endpoints running JetBrains IDEs (idea64, pycharm64, webstorm64, goland64, clion64, rider64, phpstorm64, rubymine64) | NetworkConnectIP4 / ProcessRollup2 | Critical | None — primary surface. |
JBR (JetBrains Runtime) java process under the IDE install | NetworkConnectIP4 / DnsRequest | Critical | Process attribution to IDE may require parent lineage. |
| JetBrains plugins directory (per-OS paths) | File write / directory creation events | High | Some IDEs store plugins per-project; broaden path glob. |
| DNS / HTTP egress | DnsRequest / proxy logs | Medium | C2 is a bare IP — DNS may not fire; rely on IP-level telemetry. |
| Chrome browser (managed workstations) | Extension inventory / file events under Extensions path | Medium | Extension IDs unpublished; match by name/manifest. |
ATT&CK Mapping
| Tactic | Technique | Behavior | Query / Control |
|---|---|---|---|
| Initial Access | T1195.002 — Supply Chain Compromise: Software Supply Chain | Trojanized AI plugin from trusted Marketplace. | Q3 (plugin dir), S12 hardening |
| Execution | T1059.007 / T1059 — Script execution within IDE | Plugin code runs in IDE / JBR runtime. | Q2, Q3 |
| Credential Access | T1552.001 — Credentials in Files / Unsecured Credentials | Captures AI provider API keys from plugin config. | S12 hardening, Q3 |
| Exfiltration | T1041 — Exfiltration Over C2 Channel | Keys sent to C2 39.107.60.51. | Q1, Q4 |
| Exfiltration | T1567 — Exfiltration Over Web Service | Plaintext HTTP POST of stolen keys. | Q1, Q4 |
| Command & Control | T1071.001 — Application Layer Protocol: Web Protocols | HTTP to C2. | Q1, Q4 |
| Impact | T1657 — Financial Theft | Resale of other victims' stolen keys via donation system. | Investigation / S14 |
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" -Directoryand 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.
CrowdStrike LogScale CQL Hunt Queries
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)
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)
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)
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)
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)
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.
Custom IOA Recommendations
| IOA Name | Pattern | Exclusions | Deployment |
|---|---|---|---|
| JetBrains IDE → C2 39.107.60.51 | Network IOA: any process → RemoteIP 39.107.60.51 | None | Network IOA, all developer host groups, action=Detect+Block |
| JBR java cleartext exfil | Process java under JetBrains path + outbound HTTP to non-allowlisted external IP | Allowlist AI provider API ranges, plugin update servers | Custom IOA, Block w/ monitoring window first |
| Malicious plugin dir write | File-write IOA on JetBrains plugins\ path matching the 15 names | Legitimate "CodeGPT" plugin name | Custom 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.
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.
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
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 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 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
Detection Validation Gates
| Gate | Check | Pass criteria |
|---|---|---|
| Telemetry ready | NetworkConnectIP4 + DnsRequest + File-write present from developer host group | Events visible in last 24h across >90% of dev hosts |
| Benign baseline | Run Q2 over 7d; characterize JetBrains egress destinations | Known AI/CDN/update ranges identified and allowlisted |
| Positive test | From a test host, curl http://39.107.60.51 (lab only) and confirm Q1 fires | Q1 returns the test connection within search window |
| Promotion | Q1 + Q4 → scheduled alert; Q2/Q3/Q5/Q6 → hunt dashboards | Alert wired with rotation runbook (S14) |
Hardening — Tiered
- Block
39.107.60.51at 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.
- 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.
- 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.
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
Containment Runbook
| Phase | Actions | Owner | Evidence |
|---|---|---|---|
| Detect | Q1/Q4 alert fires, or plugin sweep returns a match. | SOC | NetworkConnectIP4 hit / plugin dir path |
| Contain | Network-contain affected host; block C2 at egress; disable the plugin. | SOC / IR | Containment log, IOA action record |
| Eradicate | Uninstall plugin, clear cached config/keys, remove plugin dir. | Endpoint / Dev | Plugin removal confirmation |
| Credential reset | Rotate all OpenAI / DeepSeek / SiliconFlow keys used on the host; revoke old keys at provider. | Dev / Cloud team | Provider key-rotation audit |
| Recover | Reinstall only vetted plugins from internal repo; re-baseline egress. | Endpoint | Approved plugin manifest |
| Lessons learned | Add plugin allowlist policy; assess scope of exposed keys / API usage. | IR lead | Post-incident report |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1041 / T1567 / T1071.001 | Exfil to C2 39.107.60.51 | Q1, Q4 | Yes | Good |
| T1041 (unknown endpoint) | IDE egress to rare external IPs | Q2 | Partial | Partial |
| T1195.002 / T1059.007 | Malicious plugin dir present | Q3 | Yes | Good |
| T1552.001 | API-key capture from plugin config | — | No | GAP |
| T1176 (Prompt Poaching) | Chrome ad-blocker AI interception | Q5 | No | Partial |
| T1059 | IDE-spawned network children | Q6 | No | Partial |
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.
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
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 | Access Date |
|---|---|---|---|
| Primary | Aikido Security — Multiple JetBrains IDE plugins caught stealing AI keys | Plugin list, C2 IP, resale behavior | 2026-06-20 |
| Vendor | JetBrains — Marketplace ecosystem security update | Takedown actions, disclosure timeline | 2026-06-20 |
| Corroborating | The Hacker News — Malicious JetBrains plugins steal AI keys | Targeted keys, plaintext exfil, Prompt Poaching | 2026-06-20 |
| Corroborating | BleepingComputer — Malicious JetBrains Marketplace plugins steal AI API keys | Install count, timeline | 2026-06-20 |