サプライチェーン攻撃が注目を集めています。2025年には、オープンソースのマルウェアの検知件数が73%急増しました。 この1年間で、debugおよびchalkパッケージにバックドアが仕込まれ、GitHub Actionの「tj-actions」が侵害されて数千のパイプラインに悪意のあるコードが組み込まれ、axiosのメンテナーアカウントが乗っ取られてRATの配布に悪用されました。また、Zapier、ENS Domains、PostHog、Bitwarden CLIでも悪意のあるリリースが確認されています。
これらの攻撃はすべて、当時利用可能だった対策があれば防ぐことができたはずだ。攻撃者の手口が成功したのは、ほとんどのチームが、インストール層やパイプライン、あるいは開発者のマシン上で適切な防御策を講じていなかったためである。
このチェックリストでは、そうした防御策が具体的にどのようなものかについて解説します。サプライチェーン攻撃に先手を打つことを目指すエンジニアリングチームの皆様に、ぜひご活用ください。
要約
サプライチェーンセキュリティチェックリストは、現在のサプライチェーン攻撃に対してシステムスタックを強化するための、実用的かつ優先順位付けされたタスクのセットです。各項目は「重大」、「高」、「中」の3段階で評価されており、どこに優先的に取り組むべきかが一目でわかります。このチェックリストでは、依存関係管理、アクセスおよびID制御、CI/CD 、コンテナセキュリティ、開発環境のロックダウン、エージェント型ツールチェーン、ならびに監視と対応について網羅しています。
内容紹介
このチェックリストは、上記のインシデントで悪用されたのと同じ攻撃対象領域に基づいています。各項目では、防御対象となる攻撃を明記し、具体的な設定変更やツールを提示するとともに、実務に携わるエンジニアが実際に変更権限を持つ範囲に限定されています。エンジニアリングチームを対象としていますが、セキュリティ責任者、プラットフォームエンジニア、およびSDLCの一部を担当するすべての関係者にとって、自身がリリースする製品に直接関連するセクションが見つかるはずです。
以下にいくつかのアイテムをピックアップしましたので、中身をご確認ください。
何かをインストールする前に、パッケージの有効期限に関するポリシーを適用する
axios、chalk、debug、Mastraなど、最近の多くの大規模な攻撃に見られる共通の傾向は、信頼されているパッケージの悪意あるリリースが、公開から数時間以内に実行され始めたという点です。インストール時の制御こそが、チームにそれを検知するための猶予期間をもたらすのです。

依存関係 紐付ける
サードパーティのアクションは、デフォルトでパイプラインが信頼するコードです。タグでそれらを参照する場合、その信頼関係はタグを管理する主体にまで及びますが、タグは移動される可能性があります。

MCPサーバーをサードパーティの依存関係として扱う
エージェント型ツールは、攻撃者による実験の最前線にあります。MCPサーバーは、スタックの中で特に信頼度の高い位置にあり、広範な権限を持ち、エージェントがユーザーに代わって処理するデータに直接アクセスできます。

AIを活用したパイプラインにおけるプロンプトの注入に注意する
CIパイプラインにAIエージェントを追加すると、リスクのある入力とみなされる範囲が広がります。以前はワークフローを何の問題もなく通過していた、イシューのタイトルやプルリクエストの説明といったコンテンツも、エージェントがそれをプロンプトとして読み込んだ瞬間に、実行可能な指示へと変わります。これは、ほとんどのチームが想定していたよりもはるかに広い範囲に及ぶ問題です。

レジストリの書き込み、CIの実行、およびトークンの使用状況に関する監査ログを収集する
今年発生した複数の侵害事案は、標準的な認証ログにはまったく記録されていませんでした。攻撃者は有効な認証情報を使ってアクティブなセッションから操作を行っており、唯一の有意義な兆候は、それらのセッションで実際に何が行われたかを記録した監査ログから得られたものでした。

サプライチェーン攻撃のチェックリストをダウンロードする
これらは30項目のうち5項目です。チェックリストの全項目には、ピン留めとロックファイルの適用、スコープ指定トークンとフィッシング対策機能を備えた多要素認証(MFA)、コンテナイメージの強化、IDE拡張機能およびブラウザプラグインの管理、エージェントの権限スコープ設定、そして万が一侵入された場合のインシデント対応プレイブックなどが含まれています。

以下の簡単なフォームに必要事項を入力して、サプライチェーン攻撃チェックリストをダウンロードし、依存関係グラフに次のパッケージが表示される前に、そのチェックリストに沿って対応を進めましょう。
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "TechArticle",
"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist#article",
"headline": "The practical checklist for defending against supply chain attacks",
"description": "A practical checklist for engineering teams to defend against maintainer takeovers, poisoned actions, and malicious releases. Thirty prioritized practices graded by criticality.",
"url": "https://www.aikido.dev/blog/supply-chain-attacks-checklist",
"datePublished": "2026-07-14",
"dateModified": "2026-07-14",
"inLanguage": "en-US",
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist"
},
"author": {
"@id": "https://www.aikido.dev/authors/nicholas-thomson#person"
},
"publisher": {
"@id": "https://www.aikido.dev#organization"
},
"image": {
"@type": "ImageObject",
"url": "https://www.aikido.dev/blog/supply-chain-attacks-checklist/og-image.png",
"width": 1200,
"height": 630
},
"keywords": [
"supply chain attacks",
"software supply chain security",
"npm supply chain attack",
"maintainer account takeover",
"package age policy",
"commit SHA pinning",
"GitHub Actions security",
"CI/CD security",
"MCP server security",
"prompt injection",
"phishing-resistant MFA",
"FIDO2",
"audit logging",
"malicious npm packages",
"postinstall hooks",
"dependency confusion",
"typosquatting",
"Aikido Intel",
"Aikido Safe Chain",
"developer machine security"
],
"about": [
{"@type": "Thing", "name": "Software Supply Chain Security"},
{"@type": "Thing", "name": "Open Source Security"},
{"@type": "Thing", "name": "CI/CD Pipeline Security"},
{"@type": "Thing", "name": "npm Security"},
{"@type": "Thing", "name": "Agentic AI Security"}
],
"mentions": [
{"@type": "SoftwareApplication", "name": "axios", "applicationCategory": "npm package"},
{"@type": "SoftwareApplication", "name": "chalk", "applicationCategory": "npm package"},
{"@type": "SoftwareApplication", "name": "debug", "applicationCategory": "npm package"},
{"@type": "SoftwareApplication", "name": "tj-actions/changed-files", "applicationCategory": "GitHub Action"},
{"@type": "SoftwareApplication", "name": "Mastra", "applicationCategory": "npm package"},
{"@type": "SoftwareApplication", "name": "postmark-mcp", "applicationCategory": "MCP server"},
{"@type": "SoftwareApplication", "name": "Bitwarden CLI", "applicationCategory": "CLI tool"},
{"@type": "SoftwareApplication", "name": "Aikido Intel", "url": "https://intel.aikido.dev/"},
{"@type": "SoftwareApplication", "name": "Aikido Safe Chain", "url": "https://www.aikido.dev/protect/safe-chain"},
{"@type": "SoftwareApplication", "name": "Aikido Device Protection", "url": "https://www.aikido.dev/protect/device-protection"},
{"@type": "SoftwareApplication", "name": "Aikido Libraries", "url": "https://help.aikido.dev/autofix-and-remediation/aikido-libraries-overview"},
{"@type": "SoftwareApplication", "name": "Aikido Images", "url": "https://www.aikido.dev/cloud/hardened-images"},
{"@type": "Thing", "name": "Shai-Hulud campaign"},
{"@type": "Thing", "name": "PromptPwnd"},
{"@type": "Thing", "name": "Model Context Protocol (MCP)"},
{"@type": "Thing", "name": "FIDO2"},
{"@type": "Thing", "name": "Passkeys"},
{"@type": "Thing", "name": "OIDC"},
{"@type": "Thing", "name": "SBOM"},
{"@type": "Thing", "name": "CVE-2025-30066"}
],
"articleSection": [
"Dependency management",
"Access and identity controls",
"CI/CD hardening",
"Container security",
"Developer environments",
"Agentic toolchain",
"Monitoring and response"
],
"speakable": {
"@type": "SpeakableSpecification",
"cssSelector": ["h1", "h2", ".tldr"]
},
"timeRequired": "PT8M",
"isAccessibleForFree": true,
"citation": [
{
"@type": "CreativeWork",
"name": "ReversingLabs Software Supply Chain Security Report 2026",
"url": "https://www.reversinglabs.com/blog/sscs-report-2026-guidance-timeline"
},
{
"@type": "CreativeWork",
"name": "npm debug and chalk packages compromised",
"url": "https://www.aikido.dev/blog/npm-debug-and-chalk-packages-compromised"
},
{
"@type": "CreativeWork",
"name": "tj-actions/changed-files supply chain attack",
"url": "https://www.aikido.dev/blog/get-the-tl-dr-tj-actions-changed-files-supply-chain-attack"
},
{
"@type": "CreativeWork",
"name": "axios npm compromised: maintainer hijacked with RAT",
"url": "https://www.aikido.dev/blog/axios-npm-compromised-maintainer-hijacked-rat"
},
{
"@type": "CreativeWork",
"name": "Shai-Hulud strikes again: hitting Zapier, ENS Domains, PostHog",
"url": "https://www.aikido.dev/blog/shai-hulud-strikes-again-hitting-zapier-ensdomains"
},
{
"@type": "CreativeWork",
"name": "Shai-Hulud npm Bitwarden CLI compromise",
"url": "https://www.aikido.dev/blog/shai-hulud-npm-bitwarden-cli-compromise"
}
]
},
{
"@type": "WebPage",
"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist",
"url": "https://www.aikido.dev/blog/supply-chain-attacks-checklist",
"name": "The practical checklist for defending against supply chain attacks",
"description": "A practical checklist for engineering teams to defend against maintainer takeovers, poisoned actions, and malicious releases.",
"inLanguage": "en-US",
"isPartOf": {
"@id": "https://www.aikido.dev#website"
},
"primaryImageOfPage": {
"@type": "ImageObject",
"url": "https://www.aikido.dev/blog/supply-chain-attacks-checklist/og-image.png"
},
"breadcrumb": {
"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist#breadcrumb"
},
"about": {"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist#article"}
},
{
"@type": "BreadcrumbList",
"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://www.aikido.dev"
},
{
"@type": "ListItem",
"position": 2,
"name": "Blog",
"item": "https://www.aikido.dev/blog"
},
{
"@type": "ListItem",
"position": 3,
"name": "Guides & Best Practices",
"item": "https://www.aikido.dev/category/guides-best-practices"
},
{
"@type": "ListItem",
"position": 4,
"name": "The practical checklist for defending against supply chain attacks",
"item": "https://www.aikido.dev/blog/supply-chain-attacks-checklist"
}
]
},
{
"@type": "ItemList",
"@id": "https://www.aikido.dev/blog/supply-chain-attacks-checklist#itemlist",
"name": "Featured checklist items",
"itemListOrder": "https://schema.org/ItemListOrderAscending",
"numberOfItems": 5,
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Enforce a package age policy before anything installs",
"description": "A 48-hour minimum age policy blocks same-day typosquatting and fast-moving malware campaigns before they reach your developers."
},
{
"@type": "ListItem",
"position": 2,
"name": "Pin pipeline dependencies to commit SHAs",
"description": "Third-party actions are code your pipeline trusts by default. Pin every action to an immutable commit SHA rather than a mutable tag."
},
{
"@type": "ListItem",
"position": 3,
"name": "Treat MCP servers as third-party dependencies",
"description": "MCP servers carry the same supply chain risks as any other dependency. Pin them, verify the publisher, and scope their permissions."
},
{
"@type": "ListItem",
"position": 4,
"name": "Guard against prompt injection in AI-powered pipelines",
"description": "As AI agents gain elevated access to CI pipelines, prompt injection becomes a live attack surface for anyone who can open a PR."
},
{
"@type": "ListItem",
"position": 5,
"name": "Capture audit logs for registry pushes, CI runs, and token usage",
"description": "Audit logs give you the timeline to reconstruct what happened, confirm the blast radius, and decide what to rotate."
}
]
},
{
"@type": "Person",
"@id": "https://www.aikido.dev/authors/nicholas-thomson#person",
"name": "Nicholas Thomson",
"jobTitle": "Senior SEO & Growth Lead",
"url": "https://www.aikido.dev/authors/nicholas-thomson",
"worksFor": {
"@id": "https://www.aikido.dev#organization"
},
"sameAs": [
"https://www.linkedin.com/",
"https://x.com/"
]
},
{
"@type": "Organization",
"@id": "https://www.aikido.dev#organization",
"name": "Aikido Security",
"url": "https://www.aikido.dev",
"logo": {
"@type": "ImageObject",
"url": "https://www.aikido.dev/logo.png"
},
"sameAs": [
"https://www.linkedin.com/company/aikido-security/",
"https://x.com/AikidoSecurity",
"https://www.youtube.com/@aikidosecurity"
]
},
{
"@type": "WebSite",
"@id": "https://www.aikido.dev#website",
"url": "https://www.aikido.dev",
"name": "Aikido Security",
"publisher": {
"@id": "https://www.aikido.dev#organization"
},
"inLanguage": "en-US"
}
]
}
</script>

