Socketの研究者は、正規の.NETライブラリに時間差で発動する確率的なサボタージュルーチンを組み込んだ、9個の悪意あるNuGetパッケージによる高度なサプライチェーン攻撃キャンペーンを特定した。
このパッケージは、公開が明らかになるまでに9,488回ダウンロードされており、隠されたトリガーによってホストプロセスを強制終了し、1つのケースでは産業用制御システムの書き込み処理を破壊する。
ライブラリから賠償責任へ
悪意あるパッケージは、2023年から2024年にかけてエイリアスshanhai666の名義で公開された。
各悪意あるパッケージは、信頼を確立して簡単なレビューを回避するため、実際に動作する正規の機能を提供する一方、約20行の悪意あるコードを埋め込んでいる。
攻撃者はC#の拡張メソッド(データベースコマンド向けの.Exec()や、S7 PLCクライアント向けの.BeginTran())を悪用し、すべてのデータベースクエリやPLC操作で、注入されたロジックが暗黙的に実行されるようにしている。
ハードコードされた(または暗号化された)発動日を過ぎると、ペイロードは乱数を計算してProcess.GetCurrentProcess().Kill()を呼び出し、アプリケーションを突然終了させる。
発動日はずらされており、一部のパッケージは2027年または2028年に有効化されるため、検知される前に被害者を増やす攻撃者の活動期間が延びる。
このキャンペーンで最も危険なパッケージであるSharp7Extendは、2種類のサボタージュ手法を組み合わせている。
- すべてのPLC操作で直ちに確率的なプロセス終了を引き起こす(2028年6月6日まで有効)
- 30~90分の猶予期間後、最大80%の書き込み試行に対して失敗結果をひそかに返す、遅延型の書き込み失敗メカニズム
後者の挙動は、明確なエラーメッセージを出さずにPLCへの書き込みを破壊するため、アクチュエーターが応答しない、安全機構が作動しない、生産状態のずれが検知されないといったリスクを招く。こうした影響は、意図的な攻撃ではなく断続的なハードウェア障害に見える。
検知が難しい理由
これらのパッケージが検知しにくい理由はいくつかある。
- コードの大部分は正規かつ有用であるため、機能テストやコードレビューを通過してしまう。
- タイポスクワッティング(Sharp7 → Sharp7Extend)により、OT環境で誤ってインストールされる可能性が高まる。
- 正規ライブラリが同梱されているため、統合テストで明らかな危険信号が見えなくなる。
- ランダム化された確率的な発動により、体系的な干渉が偶発的な障害に見える。
- インストールから発動までの期間が長いため、影響が確認される頃にはフォレンジック調査の時間軸がつながらなくなる。
攻撃者は、自動化されたヒューリスティック検知を妨げるため、作成者メタデータを意図的に変え、署名アーティファクトを偽造していた。
サプライチェーンのレジリエンスを構築する
NuGetキャンペーンへの対策には、直ちに行動するとともに、長期的なサプライチェーンのレジリエンスを確保する必要がある。
- 依存関係を今すぐ監査:.NETパッケージを一覧化し、特定された9個のパッケージを直ちに削除または置き換える。
- 依存関係の衛生管理を徹底:検証済みの発行者メタデータを必須とし、タイポスクワッティングされた名前を拒否するとともに、パッケージソースを承認済みレジストリに限定する。
- ビルド時とマージ前にスキャン:CI/CDパイプラインにSBOMチェックと静的解析を組み込み、時間ベースのロジック、通常とは異なる拡張メソッド、難読化されたトリガーコードを検出する。
- 確率的・時間ベースのロジックを監視:日付チェック、ランダム化された制御フロー、依存関係におけるProcess.Kill()や拡張メソッドの通常とは異なる使用を検知したら警告する。
- ICSの完全性を検証:産業環境では、PLCコマンドの書き込み検証を実装し、PLCの成功率を基準値として設定するとともに、書き込み確認が突然低下していないか監視する。
- サプライチェーンポリシーを強化:パッケージのインストールに最小権限を適用し、サードパーティーライブラリのコードレビューを必須とするとともに、OTコンポーネントに厳格な変更管理を適用する。
これらの取り組みを組み合わせることで、組織はソフトウェアサプライチェーンを強化し、隠れた悪意あるロジックへのさらされるリスクを低減できる。
このキャンペーンは、サプライチェーン攻撃が信頼されたコードと時間差を兵器化し、検知を逃れながら破壊的な影響をもたらせることを示している。

