Rust サプライチェーン攻撃が arrayref、internment、append-only-vec を標的に
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
巧妙なサプライチェーン攻撃がRustエコシステムをターゲットにし、正当なメインテイナーのアカウントを乗っ取ってタイプスクワッティングを利用して悪意のあるビルド時の依存関係を注入しました。攻撃者は3つの広く使用されるクレート、 arrayref, internment、および append-only-vecに毒を盛り、Cargoビルドプロセス中にリモートコード実行ドロッパーを実行しました。これにより、通常のコンパイル中に開発者の作業ステーションやCI/CDパイプラインで静かなコード実行が可能になりました。
調査
研究者はHarden-Runnerを使用して攻撃を分析し、ポート9089を介してペイロードサーバーへのアウトバウンド接続を試みる悪意のあるビルドスクリプトをキャプチャしました。 crates.io-index のGit履歴の法医学的レビューにより、悪意のある依存関係を狙った挿入と、開発者を危険なバージョンに誘導するためにヤンクおよびアップグレードの誘いが明らかになりました。また、研究者は影響を受けたユーザーによって報告された二次的な持続メカニズムおよびC2の振る舞いも特定しました。
緩和策
即時の緩和策には、安全性が検証されたバージョンに正当なクレートを固定し、 Cargo.lock ファイルを監査して危険な依存関係のリリースを確認することが含まれます。組織はローカルおよびCI/CDキャッシュ、特に ~/.cargo/registry/cacheをクリアして悪意のある .crate ファイルを削除する必要があります。ビルド環境からの異常なアウトバウンド接続のためのエグレスフィルタリングと、厳密なロックファイルの方針も長期的な防御策として重要です。
対応策
ロックファイルに影響を受けたバージョンが見つかった場合、ビルド環境は危険にさらされているとみなされ、SSHキー、クラウドトークン、CI/CDシークレットを含む全てのアクセス可能な資格情報をローテーションする必要があります。開発者のシステムは、無許可のsystemdサービスや構成ディレクトリ内の疑わしいファイルなどの持続化の痕跡を調べる必要があります。露出期間中に作成されたソフトウェア成果物は、クリーンで検証されたソースから再構築されるべきです。
攻撃の流れ
検出事項
考えられる持続ポイント [ASEPs – Software/NTUSER Hive] (via registry_event)
通常でないポートを使用したHTTP経由の直接IPへの考えられるC2通信 (via proxy)
Linuxホストで隠しファイルが作成されました (via file_event)
Rustサプライチェーン攻撃を検出するためのIOCs (HashSha256): arrayref, internment, およびappend-only-vec がproc-macro1ビルドタイムドロッパーによって毒された
Rustサプライチェーン攻撃を検出するためのIOCs (SourceIP): arrayref, internment, およびappend-only-vec がproc-macro1ビルドタイムドロッパーによって毒された
Rustサプライチェーン攻撃を検出するためのIOCs (DestinationIP): arrayref, internment, およびappend-only-vec がproc-macro1ビルドタイムドロッパーによって毒された
異常なアウトバウンドネットワーク接続の検出 [Windows Network Connection]
Rustサプライチェーン攻撃での悪意のあるPowerShellおよびVBScriptの実行 [Windows Powershell]
Unix一時ディレクトリ内での疑わしいビルドプロセスの実行 [Linux Process Creation]
シミュレーションの実行
前提条件: テレメトリーとベースラインのプレフライトチェックが合格している必要があります。
根拠: このセクションでは、検出ルールをトリガーするために設計された敵対者技術 (TTP) の正確な実行を詳述します。コマンドとナラティブはTTPで特定されたものを直接反映し、検出論理によって期待される正確なテレメトリーを生成することを目的とすべきです。抽象的または無関係な例は誤診を招きます。
-
攻撃の説明 & コマンド: 敵対者は成功裏に悪意のあるクレートをRustプロジェクトに挿入しました。ビルドプロセスが開始されると、
build.rsスクリプトはバックグラウンドスレッドを実行し、ペイロードを取得するためにポート9089でリモートC2サーバーへの接続を試みます。これはルールで記述された「異常なアウトバウンドネットワーク接続」をシミュレートします。目的は、特定のポートにアクセスすることでファイアウォール/ネットワークログのアラートをトリガーすることです9089. -
回帰テストスクリプト:
# ポート9089でのC2サーバーへの接続を試みるビルドタイムドロッパーをシミュレートします # ネットワーク接続試行をシミュレートするためにTCPクライアントを使用します。 $C2_IP = "127.0.0.1" # テスト中に実際の外部トラフィックを回避するためlocalhostを使用 $C2_PORT = 9089 Write-Host "ビルドプロセスのネットワーク活動をシミュレートしています..." -ForegroundColor Cyan try { $client = New-Object System.Net.Sockets.TcpClient $beginConnect = $client.BeginConnect($C2_IP, $C2_PORT, $null, $null) $success = $beginConnect.AsyncWaitHandle.WaitOne(1000, $false) if ($success) { Write-Host "接続成功!テレメトリーが生成されるはずです。" -ForegroundColor Green $client.EndConnect($beginConnect) } else { Write-Host "接続に失敗しました(リスナーがアクティブでない場合は予想される)ですが、テレメトリーは依然として試行を示すはずです。" -ForegroundColor Yellow } $client.Close() } catch { Write-Host "シミュレーション中のエラー: $($_.Exception.Message)" -ForegroundColor Red } -
クリーンアップコマンド:
# スクリプトによって永続的な変更は行われませんでしたが、ローカルのリスナーが停止していることを確認します。 # テストのためにリスナーが開始された場合、次を使用します: Stop-Process -Name "nc" -ErrorAction SilentlyContinue Write-Host "クリーンアップ完了。" -ForegroundColor Green