研究・分析 / RESEARCH / KERNEL SECURITY
Linuxカーネルのレース条件を再現可能に — Google Project Zeroがメモリアクセス追跡と遅延注入ツール「MAccConc」を公開
Google Project ZeroのJann Horn氏は2026年9月8日、Linuxカーネルのレース条件を再現・検証するためのツール群「MAccConc」を公開したと報告した。ASAN計装とKCOVを組み合わせてメモリアクセスを追跡し、スタックベースの遅延注入で任意の実行順序を強制することで、手動発見した脆弱性候補の検証や回帰テスト、将来のファジング活用を可能にする。
Google Project ZeroのJann Horn氏は2026年9月8日、Linuxカーネルのレース条件(競合状態)を再現・検証するためのツール群「MAccConc(Memory Access Concurrency)」を公開した。同氏は、手動のコードレビューで見つけた脆弱性候補を確実に検証したり、修正後の回帰テストを安定して実行したりすることが従来は困難だったと説明し、メモリアクセスの追跡とスタックベースの遅延注入を組み合わせることで任意の実行順序を強制できる仕組みを示した。ツールはGitHubで公開されている。
Linuxは日本国内でもサーバーや組み込み、クラウド基盤で広く利用されている。レース条件は特権昇格やUse after freeなど重大な脆弱性につながることがあり、再現性を高める手法は開発者と防御側の双方にとって実用的だ。
なぜレース条件の再現は難しいのか
Project Zeroによれば、レース条件の脆弱性は複数のスレッドが特定の順序(interleaving)で実行されたときにのみ顕在化する。そのため、次の場面で課題が生じるという。
- 脆弱性候補の確認: 手動や静的解析で見つけた候補を、テストケースで確実に再現するのが難しい
- 回帰テスト: 修正後にテストスイートで再発を検出する安定した方法がない
- ファジング: ファザーが並行操作の多様な順序を網羅したり、競合時にのみ通るコードパスに到達したりするのが困難
従来、Horn氏はスレッド名を条件にmdelay()によるスピンループをカーネルへ挿入して再コンパイルする手法や、macOSやWindowsでDTraceのchill()を用いる手法を使ってきたが、試行錯誤に時間がかかり、インライン関数や任意の命令単位での制御には限界があった。
MAccConc — メモリアクセス追跡と遅延注入の組み合わせ
Horn氏が公開したMAccConcは、次の3つの要素で構成される。
- メモリアクセスの追跡: ASAN(AddressSanitizer)のアウトライン計装(asan-instrumentation-with-call-threshold=0、CONFIG_KASAN_OUTLINE)でメモリアクセスごとにヘルパー呼び出しを生成し、KCOV経由でユーザー空間へ記録する。重なり合うメモリアクセス(少なくとも一方が書き込み)のペアをcommunication pointsとして抽出し、競合し得る実行順序を特定する。
- カウント増強スタックトレースによる安定識別: データアドレスや命令アドレスだけでは割り当てごとに変動するため、「各スタックフレームで何回目の呼び出しをスキップするか」というカウントを付与したスタックトレースでメモリアクセスを識別する。これにより、異なる実行でも同一の論理的位置を安定して指し示せる。KCOVへ関数出入り情報を渡すため、LLVM 23.1.0で追加されたSanitizerCoverageの機能を用いている。
- 遅延注入による順序強制: 新設のioctl KCOV_SET_DIで、特定のカウント増強スタックトレース上のアクセス前後で**DI_STACK_WAKE_PRE(事前にフラグを立てる)、DI_STACK_WAIT(フラグが立つまで待機)、DI_STACK_WAKE_POST(事後にフラグを立てる)のいずれかを実行する。共有フラグ配列を使い、ユーザー空間が制約型(A-happens-before-B)と完全順序指定(コンテキストスイッチ型)**の両方式で任意の順序を強制できる。
カーネル側での実装とした理由について、Horn氏はロック取得・解放などの高レベル情報を将来的に扱えることや、仮想マシンに限らずベアメタルでも理論上テスト可能であることを挙げている。
自動テストとGUI — dup/closeの競合で動作を実証
Horn氏は、並行するdup(5)とclose(5)のテストケースで自動検証を実証した。
test_fd = open("/", O_PATH);
// thread1: dup_res = dup(test_fd);
// thread2: close(test_fd);
通常はdupが6を返すが、MAccConcの自動A-B-Aテストがさまざまな順序を試すことで、dupが-1(Bad file descriptor)や5を返すケースを再現した。ログではreorderedが4回、wait-timeoutが7回など、注入の成否も記録された。
手動探索用のGUIとターミナルUIでは、2つのスレッドの関数呼び出しグラフを色分けして表示し、communication pointsを青色で強調、重なるアクセスを黄色でハイライトする。フィルタを有効にすることで、読み書きやkfree(書き込みとして扱う)の通信点を絞り込み、クリックで順序制約を追加できる。Project Zeroは、カーネル側はファジングでの発見にも利用できる設計だが、ユーザー空間のファジング連携は今後の実装が必要だとしている。
Horn氏によれば、本ツールは先行研究のSKI(QEMUのTCGモードをパッチしてvCPUスケジューリングを制御する方式)やNed Williamson氏のsockfuzzerの議論に着想を得たものだ。SKIがQEMUパッチとVMスナップショットに依存するのに対し、MAccConcはASAN計装とKCOVという既存のカーネル機構を活用する点が異なるという。コードはGitHubのMAccConcリポジトリで公開され、READMEに導入方法が記されている。
出典
- Google Project Zero「Testing race conditions with memory access tracing and stack-based delay injection」(2026年9月8日、Jann Horn氏)
https://projectzero.google/2026/09/maccconc-race-condition.html
この記事は、公開情報と編集部の調査・知見をもとに構成しています。内容は公開時点の情報に基づく解説であり、個別の環境への診断・対応を保証するものではありません。重要な判断では、記事内の出典や各提供元の最新情報もご確認ください。