[{"data":1,"prerenderedAt":391},["ShallowReactive",2],{"content-/axios-supply-chain-attack-response":3,"all-pages-for-dir":389,"og-image-/axios-supply-chain-attack-response":390},{"id":4,"title":5,"body":6,"category":369,"description":370,"extension":371,"meta":372,"navigation":373,"ogImage":374,"path":375,"project_name":376,"published":377,"publishedAt":378,"seo":379,"stem":380,"tags":381,"todo":387,"unpublished":377,"updatedAt":374,"__hash__":388},"pages/2026-04/2026-03-31/axios-supply-chain-attack-response.md","npm axiosサプライチェーン攻撃への対応 - 全プロジェクトスキャンと依存パッケージ棚卸し",{"type":7,"value":8,"toc":353},"minimark",[9,13,18,26,29,40,43,48,55,59,69,111,117,120,123,152,155,168,171,175,178,181,203,206,209,230,233,236,239,242,256,259,262,269,272,275,346,349],[10,11,12],"p",{},"Claude Codeが「axiosに悪意あるパッケージが混入している」と警告を出した瞬間、最初に頭をよぎったのは「またプロンプトインジェクションか」だった。",[14,15,17],"h2",{"id":16},"発端-警告は本物か偽物か","発端: 警告は本物か偽物か",[10,19,20,21,25],{},"会計ソフトA連携のChrome拡張プロジェクトをClaude Codeで作業していたとき、axiosのサプライチェーン攻撃に関する警告が表示された。npm axios v1.14.1が ",[22,23,24],"code",{},"plain-crypto-js@4.2.1"," という、それまで存在しなかったパッケージを依存に取り込んでいる、という内容だった。",[10,27,28],{},"第一印象は「プロンプトインジェクション」。npmパッケージのREADMEやメタデータに悪意あるプロンプトを仕込んでAIを誘導する攻撃は知っていたし、過去にも偽の警告を見たことがある。LLMが外部テキストを読み込んだ結果、存在しない脅威をでっちあげるパターンだ。",[10,30,31,32,35,36,39],{},"しかし念のためニュースを調べた。すると、複数のセキュリティ系メディアが同じ事件を報じていた。",[22,33,34],{},"plain-crypto-js"," は ",[22,37,38],{},"crypto-js"," を装った悪意あるパッケージで、axios v1.14.1の依存ツリーに紛れ込んでいた。手が止まった。本物だった。",[14,41,42],{"id":42},"影響範囲の調査",[44,45,47],"h3",{"id":46},"chrome拡張プロジェクト-安全","Chrome拡張プロジェクト: 安全",[10,49,50,51,54],{},"まず目の前のプロジェクトを確認した。会計ソフトA連携のChrome拡張はaxiosを使っていない。HTTP通信はブラウザ標準のfetch APIで完結していた。依存にaxiosが含まれていないことを ",[22,52,53],{},"package-lock.json"," で裏取りし、この時点でプロジェクト単体の安全は確認できた。",[44,56,58],{"id":57},"pc全体スキャン-plain-crypto-jsの捜索","PC全体スキャン: plain-crypto-jsの捜索",[10,60,61,62,65,66,68],{},"ただし、ローカルの他プロジェクトが汚染されている可能性は残る。",[22,63,64],{},"C:\\Users\\numbe\\Git_repo"," 配下の全プロジェクトを対象に、",[22,67,34],{}," をgrepで横断検索した。",[70,71,76],"pre",{"className":72,"code":73,"language":74,"meta":75,"style":75},"language-bash shiki shiki-themes vitesse-light vitesse-light","# 全プロジェクトの node_modules と lock ファイルを横断検索\ngrep -r \"plain-crypto-js\" /c/Users/numbe/Git_repo/\n","bash","",[22,77,78,87],{"__ignoreMap":75},[79,80,83],"span",{"class":81,"line":82},"line",1,[79,84,86],{"class":85},"sxvE3","# 全プロジェクトの node_modules と lock ファイルを横断検索\n",[79,88,90,94,98,102,105,108],{"class":81,"line":89},2,[79,91,93],{"class":92},"senZ8","grep",[79,95,97],{"class":96},"snbK4"," -r",[79,99,101],{"class":100},"sMJiu"," \"",[79,103,34],{"class":104},"sdGka",[79,106,107],{"class":100},"\"",[79,109,110],{"class":104}," /c/Users/numbe/Git_repo/\n",[10,112,113,114,116],{},"結果: ヒットゼロ。",[22,115,34],{}," はどのプロジェクトにもインストールされていなかった。",[44,118,119],{"id":119},"axiosの所在を特定",[10,121,122],{},"次に、axiosそのものがどこに入っているかを洗い出した。",[70,124,126],{"className":72,"code":125,"language":74,"meta":75,"style":75},"find /c/Users/numbe/Git_repo/ -path \"*/node_modules/axios/package.json\" -type f\n",[22,127,128],{"__ignoreMap":75},[79,129,130,133,136,139,141,144,146,149],{"class":81,"line":82},[79,131,132],{"class":92},"find",[79,134,135],{"class":104}," /c/Users/numbe/Git_repo/",[79,137,138],{"class":96}," -path",[79,140,101],{"class":100},[79,142,143],{"class":104},"*/node_modules/axios/package.json",[79,145,107],{"class":100},[79,147,148],{"class":96}," -type",[79,150,151],{"class":104}," f\n",[10,153,154],{},"6プロジェクトにaxiosがインストールされていた。各プロジェクトの最終コミット日とフォルダ更新日を突き合わせた結果、6件とも以下の条件に該当した。",[156,157,158,162,165],"ul",{},[159,160,161],"li",{},"最終コミットが2025年以前",[159,163,164],{},"サンプル・テスト・他人のリポジトリのクローン",[159,166,167],{},"自分のGitHubリポジトリにpushしていない",[10,169,170],{},"要するに、学習目的で手元に置いていた古いプロジェクトだけだった。",[14,172,174],{"id":173},"対処-不要プロジェクトの削除","対処: 不要プロジェクトの削除",[10,176,177],{},"6件はいずれも実運用していない。手元に残す理由がないと判断し、フォルダごと削除した。",[10,179,180],{},"削除判断の基準はシンプルだった。",[182,183,184,191,197],"ol",{},[159,185,186,190],{},[187,188,189],"strong",{},"自分のGitHubにあるか"," -- ない。ローカルオンリー",[159,192,193,196],{},[187,194,195],{},"最近触ったか"," -- 2025年以前に放置",[159,198,199,202],{},[187,200,201],{},"参照する可能性があるか"," -- サンプルやチュートリアルの写経。必要になればまたcloneすればいい",[14,204,205],{"id":205},"npm側の事後確認",[10,207,208],{},"npm registryでの対応状況も確認した。",[156,210,211,221],{},[159,212,213,216,217,220],{},[187,214,215],{},"axios v1.14.1",": npm側で削除済み。",[22,218,219],{},"npm view axios versions"," で1.14.1が表示されないことを確認",[159,222,223,225,226,229],{},[187,224,24],{},": npmから削除済み。",[22,227,228],{},"npm view plain-crypto-js"," がnot foundを返す",[10,231,232],{},"攻撃に使われたバージョンはレジストリから除去されており、新規インストールで踏む危険はなくなっていた。",[14,234,235],{"id":235},"振り返り",[44,237,238],{"id":238},"プロンプトインジェクションとの区別",[10,240,241],{},"今回の教訓は「LLMの警告を疑いつつも、裏を取る」というプロセスを実際に踏めたこと。",[182,243,244,247,250,253],{},[159,245,246],{},"LLMが警告を出す",[159,248,249],{},"「プロンプトインジェクションでは？」と疑う",[159,251,252],{},"外部ソース（ニュースサイト、npm registry）で裏取り",[159,254,255],{},"本物と確認してから対処に移る",[10,257,258],{},"この順序を飛ばして「はいはいプロンプトインジェクションね」と流していたら、汚染されたパッケージを見過ごす可能性があった。逆に、裏取りせずにLLMの警告を鵜呑みにしていたら、存在しない脅威に時間を浪費する。どちらに倒れても損をする。",[44,260,261],{"id":261},"依存パッケージの衛生管理",[10,263,264,265,268],{},"ローカルに放置されたプロジェクトは、サプライチェーン攻撃の潜在的な経路になる。",[22,266,267],{},"node_modules"," の中身は定期的にインストールした時点の状態で凍結されるが、その「凍結された状態」自体が汚染されていたら意味がない。",[10,270,271],{},"今回は実害がなかったが、使っていないプロジェクトを定期的に棚卸しする習慣は持っておくべきだと思った。",[44,273,274],{"id":274},"対処のタイムライン",[276,277,278,291],"table",{},[279,280,281],"thead",{},[282,283,284,288],"tr",{},[285,286,287],"th",{},"時刻",[285,289,290],{},"内容",[292,293,294,303,311,319,330,338],"tbody",{},[282,295,296,300],{},[297,298,299],"td",{},"警告検出",[297,301,302],{},"Claude Codeがaxiosサプライチェーン攻撃を報告",[282,304,305,308],{},[297,306,307],{},"+5分",[297,309,310],{},"プロンプトインジェクションを疑い、ニュース検索で裏取り",[282,312,313,316],{},[297,314,315],{},"+10分",[297,317,318],{},"本物と確認、Chrome拡張プロジェクトにaxiosがないことを確認",[282,320,321,324],{},[297,322,323],{},"+20分",[297,325,326,327,329],{},"PC全体で ",[22,328,34],{}," を検索、ヒットなし",[282,331,332,335],{},[297,333,334],{},"+30分",[297,336,337],{},"axios入りの6プロジェクトを特定、全件の状態を調査",[282,339,340,343],{},[297,341,342],{},"+45分",[297,344,345],{},"6プロジェクトを削除、npm registryの対応状況を確認",[10,347,348],{},"全工程で約45分。プロンプトインジェクションとの判別に一番時間を使った。",[350,351,352],"style",{},"html pre.shiki code .sxvE3, html code.shiki .sxvE3{--shiki-default:#A0ADA0;--shiki-dark:#A0ADA0}html pre.shiki code .senZ8, html code.shiki .senZ8{--shiki-default:#59873A;--shiki-dark:#59873A}html pre.shiki code .snbK4, html code.shiki .snbK4{--shiki-default:#A65E2B;--shiki-dark:#A65E2B}html pre.shiki code .sMJiu, html code.shiki .sMJiu{--shiki-default:#B5695977;--shiki-dark:#B5695977}html pre.shiki code .sdGka, html code.shiki .sdGka{--shiki-default:#B56959;--shiki-dark:#B56959}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":75,"searchDepth":89,"depth":89,"links":354},[355,356,362,363,364],{"id":16,"depth":89,"text":17},{"id":42,"depth":89,"text":42,"children":357},[358,360,361],{"id":46,"depth":359,"text":47},3,{"id":57,"depth":359,"text":58},{"id":119,"depth":359,"text":119},{"id":173,"depth":89,"text":174},{"id":205,"depth":89,"text":205},{"id":235,"depth":89,"text":235,"children":365},[366,367,368],{"id":238,"depth":359,"text":238},{"id":261,"depth":359,"text":261},{"id":274,"depth":359,"text":274},"dev","npm axios v1.14.1が悪意あるパッケージplain-crypto-jsを取り込んでいたサプライチェーン攻撃に対し、ローカル全プロジェクトをスキャンして安全を確認した記録。プロンプトインジェクションとの誤判定から本物と確認するまでのプロセスも記載。","md",{},true,null,"/axios-supply-chain-attack-response","misc-dev",false,"2026-03-31T00:00:00.000Z",{"title":5,"description":370},"2026-04/2026-03-31/axios-supply-chain-attack-response",[382,383,384,385,386],"npm","axios","supply-chain-attack","security","dependency-audit","memo","WU3yw-7D41GZrBPzORqWgYOO31pudRNOxNtCtdQi3ug",[],"https://log.eurekapu.com/og/blog/axios-supply-chain-attack-response.png?v=2026-03-31T00%3A00%3A00.000Z&title=npm%20axios%E3%82%B5%E3%83%97%E3%83%A9%E3%82%A4%E3%83%81%E3%82%A7%E3%83%BC%E3%83%B3%E6%94%BB%E6%92%83%E3%81%B8%E3%81%AE%E5%AF%BE%E5%BF%9C%20-%20%E5%85%A8%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%B9%E3%82%AD%E3%83%A3%E3%83%B3%E3%81%A8%E4%BE%9D%E5%AD%98%E3%83%91%E3%83%83%E3%82%B1%E3%83%BC%E3%82%B8%E6%A3%9A%E5%8D%B8%E3%81%97&author=Kei%20Komatsu&sig=78077376dace844c",1782528822558]