powered by TechFeed
表示モード
Microsoft

MicrosoftのAIが「安全な言語」Rustの標準ライブラリで11年間見逃されていたバグを発見 — AIは人間が気づけなかった領域に踏み込んでいる

11月10日、InfoWorldが「Microsoft's AI bug hunter finds Rust flaw that went undetected for nearly 11 years」と題した記事を公開した。MicrosoftのAI脆弱性スキャンシステムが、メモリ安全性で定評のあるRustの標準ライブラリに約11年間にわたって誰も気づかなかったバグを発見したという内容だ。「安全な言語」とされるRustの標準ライブラリでさえ、AIによる解析が入って初めて浮かび上がる脆弱性が潜んでいたという事実は、静的解析や人間によるコードレビューの限界を改めて示すものといえる。

11月10日、InfoWorldが「Microsoft's AI bug hunter finds Rust flaw that went undetected for nearly 11 years」と題した記事を公開した。MicrosoftのAI脆弱性スキャンシステムが、メモリ安全性で定評のあるRustの標準ライブラリに約11年間にわたって誰も気づかなかったバグを発見したという内容だ。「安全な言語」とされるRustの標準ライブラリでさえ、AIによる解析が入って初めて浮かび上がる脆弱性が潜んでいたという事実は、静的解析や人間によるコードレビューの限界を改めて示すものといえる。


11年間誰も気づかなかったバグをAIが発見

MicrosoftのFORGE Lab(セキュリティ研究部門)は、Rustの標準ライブラリに存在する複数のメモリ安全性バグを発見した。中でも注目されるのが、**process::exit関数に潜んでいた約11年間未発見のバグ**だ。

具体的には、子スレッドからprocess::exitを呼び出した際、メインスレッドがまだ実行中であるにもかかわらず、メインスレッドの代替シグナルスタック(alternate signal stack)が削除される可能性があるというものだ。その後メインスレッドでスタックオーバーフローが発生した場合、OSがシグナルを正常に配送できず、Rustが本来提供すべきスタックオーバーフロー処理の代わりにセグメンテーション違反(segfault)が発生する。

Microsoftの研究者たちは「このバグは約11年間、標準ライブラリに存在し続けた」とブログで述べている。ただし、実際に悪用できる経路は確認されておらず、実用的な悪用の可能性は低いと評価されている。

Rustは所有権(ownership)モデルによってコンパイル時にメモリ安全性を保証する設計であり、一般的なuse-after-freeやバッファオーバーフローの大部分を原理的に排除できる。しかし、OSやCライブラリとの低レベルな相互作用が必要な箇所ではunsafeブロックを使用せざるを得ず、所有権モデルによる保護がそのブロック内では無効化される。今回発見されたバグの多くはこのunsafeコードに潜んでおり、コンパイラが検出できない領域を人間のレビューだけで完全にカバーすることの難しさを示している。


発見を支えたAIシステム「Hyenas」

今回の調査には、FORGE Labが開発したAI搭載の脆弱性スキャンシステム「Hyenas」が使用された。HyenasはMicrosoftが開発する脆弱性発見システム「MDASH」(元記事においてコードネームとして言及されており、正式名称か開発コード名かは元記事の記述範囲では明記されていない)の研究版に位置づけられる。

研究者はHyenasを用いてRust標準ライブラリのunsafeコードを調査し、AIが示唆した結果をもとにコードを精査、問題を再現し、セキュリティへの影響を評価した上でRustメンテナーに報告するという流れで作業を進めた。Hyenas自体がどのようなモデルアーキテクチャや解析手法を採用しているかについては、元記事の範囲では詳細は公開されていない。


発見された脆弱性の分類

Microsoftは今回の発見を3つのカテゴリに整理している。

1. パニック安全性の問題

MapWindows::cloneの実装に関するバグだ。バッファを作成した後、内容を初期化する前にユーザー提供のclone操作を呼び出す設計になっており、その操作がパニックを起こした場合、Rustのアンワインド機構がバッファのデストラクタを呼び出し、未初期化メモリにアクセスする可能性があった。報告を受けた修正では、初期化完了前にバッファが破棄されないよう対処された。

Rustにおける「パニック安全性(panic safety)」とは、パニック発生時にアンワインド処理が走ってもデータ構造の整合性が保たれることを指す。標準ライブラリのような広く使われるコードでこの性質が崩れていると、利用側のコードが想定外の状態に陥るリスクが生じる。

2. ユーザー提供実装への信頼に起因する問題

str::replace関数では、nightly(開発版)のPatternトレイトのカスタム実装が、コードがASCII文字を期待する箇所に非ASCIIバイトを渡した場合、無効なUTF-8データが生成されうることが判明した。その後の文字列操作で未定義動作が引き起こされる可能性がある。

3. OSやCライブラリとの相互作用に起因する問題

CommandExt::execにおいて、プロセス全体で共有される環境変数配列を読み取りロック保持中に変更する可能性が見つかった。並行処理のタイミング次第では、環境変数ポインタが解放済みメモリを参照する状態になりうる。この問題と前述のprocess::exitのバグはいずれも安定版(stable)のRustに影響する。

なお、パニック安全性やユーザー提供実装の信頼に関する問題カテゴリは、2021年にGeorgia Tech研究チームが発表した静的解析ツール「Rudra」でも研究対象になっていた分野だ(2021年という年次およびRudraの研究領域については元記事に基づく記述である)。Rudraの公開当時から標準ライブラリのパニック安全性は継続的に対処が続けられているにもかかわらず、今回も類似の問題が浮かび上がってきたという事実は、この領域の根本的な難しさを示している。


実用上のリスクと今後の位置づけ

Microsoftは実際のリスクは限定的だとしている。各バグはいずれも特殊な条件下でのみ発生し、「実際のプログラムがそのようなAPIの使い方に到達した場合にのみ深刻な脆弱性になる」と研究者たちは説明する。AIが人間のレビューを「上回った」というより、AIが継続的に広範なコードベースをスキャンし続けることで、稀な条件の組み合わせを見落とさない体制を築けることの実証と捉えるのが適切だろう。

今回の発見は、Microsoft Defenderへのエージェント型脆弱性発見を組み込む「MDASH」の改善にも活用される。さらに、マルチエージェントセキュリティシステム「Microsoft Perception」においても、WebアプリのペンテストエージェントがMDASHの発見を活用して悪用可能性の評価や修正支援を行う用途が想定されている。

研究者たちは「目標は単純にバグを多く見つけることではなく、開発者や組織が依存する基盤的なソフトウェアの安全性を向上させることだ」と述べている。

詳細はMicrosoft's AI bug hunter finds Rust flaw that went undetected for nearly 11 yearsを参照していただきたい。