powered by TechFeed
表示モード
Google

GoogleがAIでCライブラリをRustへ自動移植 — 2億回のテストで挙動差ゼロ、CVE公開前に構造的免疫を獲得

9月27日、InfoQが「Google Rewrites Critical C Dependencies to Rust Using AI and Differential Fuzzing」と題した記事を公開した。GoogleセキュリティチームがGeminiと差分ファジングを組み合わせてC言語ライブラリ「giflib」をRustへ自動移行した手法を詳しく紹介している。特筆すべきは、移行完了後に外部研究者が発見したヒープ書き込み境界外バグ(**CVE-2026-26740**)に対して、Googleの本番環境がすでに構造的な免疫を持っていた点だ。AIによるC→Rust変換、実運用で何が起きたかメモリ破壊バグはC/C++スタックにおける深刻なセキュリティ脆弱性の約70%を占める。GoogleのソフトウェアエンジニアBastian KerstingとMax Hilsは、この問題に対して「多年にわたる手動変換」でも「ランタイム境界チェックへの依存」でもない第三の道を選んだ。GeminiとAIによる差分ファジングを組み合わせた3段階の自動移行プロセスだ。対象となったのはgiflib——約3,00...

9月27日、InfoQが「Google Rewrites Critical C Dependencies to Rust Using AI and Differential Fuzzing」と題した記事を公開した。GoogleセキュリティチームがGeminiと差分ファジングを組み合わせてC言語ライブラリ「giflib」をRustへ自動移行した手法を詳しく紹介している。特筆すべきは、移行完了後に外部研究者が発見したヒープ書き込み境界外バグ(**CVE-2026-26740**)に対して、Googleの本番環境がすでに構造的な免疫を持っていた点だ。

AIによるC→Rust変換、実運用で何が起きたか

メモリ破壊バグはC/C++スタックにおける深刻なセキュリティ脆弱性の約70%を占める。GoogleのソフトウェアエンジニアBastian KerstingとMax Hilsは、この問題に対して「多年にわたる手動変換」でも「ランタイム境界チェックへの依存」でもない第三の道を選んだ。GeminiとAIによる差分ファジングを組み合わせた3段階の自動移行プロセスだ。

対象となったのはgiflib——約3,000行のGIF画像処理ライブラリで、サンドボックスなしに非信頼ユーザー入力を処理するケースが多く、攻撃面として長年懸念されていた存在だ。

3段階の移行プロセス

第1段階:Geminiによるワンショット変換

Geminiへの単一プロンプトで、CライブラリのロジックをRustへ一括移植した。既存の共有ライブラリをダウンストリームの呼び出し元を壊さずに置き換えるため、元のエクスポートシンボルと構造体定義はそのまま保持している。

第2段階:FFI境界の人手による修正

FFI(Foreign Function Interface)とは、異なるプログラミング言語間でコードを相互に呼び出すための仕組みだ。C境界を越えてポインタを渡す際の未定義動作を防ぐため、FFIラッパーが生ポインタから安全なRustハンドルを再構築する。初期実装では生ポインタのセマンティクスが unsafe になるケースが生じ、ポインタの所有権とライフタイム不変条件の検査・修正に人手が必要だった。

以下のコードは、その修正が完了した後のFFIラッパーの最終形だ。Box::from_raw で生ポインタの所有権をRust側に取り戻し、close() の結果に応じてGIF_OK/GIF_ERRORを返す典型的なパターンとなっている。

#[no_mangle]
pub unsafe extern "C" fn DGifCloseFile(
    gif_file: *mut GifFileType,
    error_code: *mut c_int,
) -> c_int {
    if gif_file.is_null() {
        return GIF_ERROR;
    }
    let mut handle = Box::from_raw(gif_file as *mut GifFilePrivate);
    match handle.close() {
        Ok(_) => GIF_OK,
        Err(e) => {
            if !error_code.is_null() {
                *error_code = e.to_raw();
            }
            GIF_ERROR
        }
    }
}

第3段階:差分ファジングによる自動検証

自動差分テストエンジンがCとRustの両実装を並走させ続け、挙動の乖離を検出してその失敗トレースをモデルへフィードバックする反復パッチ合成ループを構成した。差分テストとは、同一入力を複数の実装に与えて出力を比較することで、どちらか一方にのみ存在するバグを浮き彫りにする手法だ。

検証の規模と「棚ぼた」の脆弱性発見

生成コードをミッションクリティカルなインフラへ投入するため、検証パイプラインは相当な規模で組まれた。

  • 3,000万件超の実世界GIFアセットを使ったリグレッションデコードで、ビット単位のレンダリング一致を確認
  • 差分ファジングを6日間連続で実行し、2億イテレーションで機能的な逸脱ゼロ

さらに、LZW(Lempel–Ziv–Welch)デコンプレッサ内の未処理エッジケースと、元のCソースへの過去のパッチが導入していた内部の境界外書き込みを検出している。LZWはGIFフォーマットが採用している可逆圧縮アルゴリズムだ。

そして最大の成果はステージング中に現れた。外部セキュリティ研究者がアップストリームのgiflibにヒープ書き込み境界外バグを発見し、**CVE-2026-26740**として登録された。Googleの本番ノードはすでにRust実装へ移行済みだったため、公開開示前の段階でこの脆弱性に対して構造的に免疫を持っていた。

パフォーマンスは?サンドボックスも撤廃

Rustの必須境界チェックによるオーバーヘッドへの懸念に対し、本番テレメトリは元のCバイナリと同等のランタイムパフォーマンスを示した。それだけでなく、メモリ安全性の保証が型システムに移ったことで、画像デコードタスクを隔離するために必要だったOSサンドボックスを撤廃できた。このプロセス分離境界の除去により、p99テールレイテンシに明確な低下が観測された。

限界と今後の課題

著者らはAI変換がそのまま使える万能策ではないと強調している。CのアップストリームリポジトリにRustのforkを持つことは、上流が新機能や設計変更をリリースするたびに継続的な保守上の乖離を生む。FFIラッパーについても、ライフタイムリークの防止やスレッド安全性の不変条件の維持には依然として人手の専門知識が必要だ。

コミュニティの反応も複雑だ。r/rustやHacker Newsでは差分ファジングのフレームワーク——Googleの自社Cパッチが導入していた境界外書き込みまで検出した点——を評価する声がある一方、ワンショット変換アプローチへの批判も多い。

「微妙なセマンティクスのリグレッションを監査し、unsoundなC FFI境界を修正するための人的コストは、コード生成そのものをはるかに上回ることが多い」——あるHacker Newsユーザー

こうした意見から、**c2rustのような決定論的なトランスパイラで変換したうえでAIによるリファクタリングを施すアプローチ**の方が、giflibのような自己完結型の小規模ターゲットを超えてスケールする場合は信頼性が高いのではないかという議論も起きている。

Googleは成果物をオープンソースプロジェクト**giflib-rs**として公開しており、基盤的なユーティリティの自動言語移行を検討するチームのリファレンス実装として位置づけている。

詳細はGoogle Rewrites Critical C Dependencies to Rust Using AI and Differential Fuzzingを参照していただきたい。