flawopen.com/Incidents/xz-utils-backdoor-march-2024
●
Xz · CVE-2024-3094 · March 2024 · CVSS 10.0 · 緊急
セキュリティ研究 · FlawOpen
XZ Utils サプライチェーン侵害(CVE-2024-3094)
CVE-2024-3094 は XZ Utils 5.6.0/5.6.1 に影響。影響はディストリビューションのビルド条件に依存するため、該当パッケージを特定して置き換えてください。[1], [3], [4], [5], [6]
💡 わかりやすい解説 (ELI5)
ソースリポジトリを公開されたレシピ、リリースアーカイブを封をした食材箱だと考えてください。レシピが正しく見えても、厨房は箱の封印と納品書を確認します。同じ料理名が書かれているだけで、箱をそのまま調理台に載せてはいけません。別の信頼できる経路で認証したマニフェストは箱のすり替えを検出できますが、有効な提供元の署名でも、正規に承認された箱が安全だとは証明できません。侵害された XZ の箱も公式リリースでした。対象パッケージはディストリビューションの案内に従って置き換え、マニフェスト検証はすり替え対策としてのみ別に使ってください。[5], [6]
主要な概念と専門用語
リリースアーカイブ- インストールまたはパッケージ化のために配布されるソースコードのアーカイブです。リポジトリから取得したファイルと異なる場合があるため、別個の成果物として検証します。[3], [4], [6]
成果物検証(artifact verification)- 成果物をビルドや公開に使う前に、ハッシュまたは署名を、独立した信頼経路で入手した期待値と照合することです。
フレームワーク対応
- このガイドで説明する弱点の CWE 参照: CWE-506
インシデントのタイムライン
2024年3月29日より前
2024年3月29日
Andres Freund が問題を公開報告しました。[5]
ステップ・バイ・ステップの攻撃フロー
ステップ 1
ステップ 2
ステップ 3
異常が調査の端緒になった
Andres Freund は SSH プロセスの異常な CPU 使用率と Valgrind のエラーを報告しました。観測可能な異常が、調査と公開につながりました。[5]
ソースコード比較:脆弱 vs 堅牢化
脆弱な実装
# ダウンロードしたビルド入力を、その身元を証明せずに受け入れる。
from pathlib import Path
def stage_release(artifact: Path, build_inputs: Path) -> None:
build_inputs.joinpath(artifact.name).write_bytes(artifact.read_bytes())
# コピーが成功しても、そのアーカイブがレビュー済みの
# リリースまたは信頼できるマニフェストに対応するとは証明できない。堅牢化されたセキュアパッチ
# 教育用のゲート: 信頼できるマニフェストの期待 SHA-256 を検証する。
import hashlib
import hmac
from pathlib import Path
def verify_release(artifact: Path, expected_sha256: str) -> None:
digest = hashlib.sha256(artifact.read_bytes()).hexdigest()
if not hmac.compare_digest(digest, expected_sha256.lower()):
raise ValueError("リリース成果物が信頼できるマニフェストと一致しません")
# expected_sha256 は別途認証された公開経路から入手し、
# アーカイブをビルド入力にする前に verify_release を呼び出す。
# これはすり替えを検出しますが、正規に承認された悪意あるリリースは検出できません。対象パッケージは提供元の案内に従ってください。エンジニアリング&システム堅牢化チェックリスト
- ✓ダウンロードしたリリースアーカイブは、別途認証された経路で得たハッシュまたは署名と照合し、「取得できた」ことを出所の証明にしない。[1], [6]
- ✓再現可能ビルドには、ソースのリビジョン、ビルド環境、成果物のハッシュを記録し、重要な依存関係を更新する際には独立したビルド結果を比較する。
- ✓ビルドスクリプト、パッケージ化規則、テスト成果物をアプリケーションコードと同じ厳格さでレビューし、説明できないバイナリテストデータの出所と完全性を記録する。
- ✓リリースツール、CI 設定、パッケージ化手順の変更には少なくとも二人の保守担当者の承認を求め、追跡可能な記録を残す。[5], [6]
- ✓ベンダーとディストリビューションの告知で実際に影響を受けたパッケージと版を確認し、置換後にも出所を再検証する。
- ✓ビルドまたはサービスの原因不明な CPU 使用率、性能低下、メモリ検査エラーを調査手順に入れ、確認可能な証拠を保存する。[5]