RustGo: Fairly Directed Greybox Fuzzing for Enforcing Rust Memory Safety
RustGoは、Rust特有の静的解析を活用して潜在的なメモリバグのターゲットを自動的に特定し、無関係な実行パスを削減することで、既存の手法と比較して、unsafe Rustコードにおける未知の脆弱性の発見およびファジング効率を大幅に向上させる新しい指向型グレーボックスファザです。
原論文は CC BY 4.0 (http://creativecommons.org/licenses/by/4.0/) でライセンスされています。 これは以下の論文のAI生成解説です。著者が執筆または承認したものではありません。技術的な正確性については原論文を参照してください。 免責事項の全文を読む
あなたは、巨大で賑やかな都市の中で、たった一つの極めて小さな欠陥を探そうとしている探偵だと想像してください。コンピュータソフトウェアの世界において、この都市はプログラムであり、その欠陥は「メモリバグ」です。これは、プログラムが本来触れてはいけないデータにアクセスしたり、使用したり、破棄しようとしたりすることで発生するミスであり、クラッシュやハッキングの原因となります。何十年もの間、これらのバグを見つけるための最も一般的な方法は「ファジング(fuzzing)」でした。ファジングを、「都市の壁に向かって何百万ものランダムで混沌とした雪玉を投げつけ、どの雪玉が窓を割るかを確認すること」と考えてみてください。通常、古い言語であればこれでうまく機能しますが、一つ問題があります。それは非常に効率が悪いということです。頑丈で壊れない正面ドアに99個の雪玉を投げても、裏路地のたった一つの弱い窓を見つけられないことがあるのです。
そこで登場するのがRustです。Rustは現代的なプログラミング言語であり、超厳格なセキュリティガードのように振る舞います。Rustのルールがあまりにも優れているため、それが構築する都市の90%は実質的に難攻不落です。ガードマンによって、ほとんどの「窓」(メモリ領域)はデフォルトでしっかりとロックされています。しかし、特定の複雑なものを構築するために、開発者は「unsafeコード」と呼ばれる小さく特別なゲートを開けることが許されています。ここが唯一、厳格なルールが緩和される場所であり、メモリバグが潜むことができる唯一の場所なのです。問題は、既存の「雪玉投げ」ツールがこれを知らないことです。彼らはすでに安全であるはずの90%の都市に対して雪玉を投げ続け、時間とエネルギーを浪費している一方で、あの特別なゲートの背後にある危険なスポットを見逃してしまいます。本論文では、どこに雪玉を投げるべきかを正確に把握する、新しい探偵ツールであるRustGoを紹介します。
スマートな探偵:RustGo
高麗大学校およびその他の機関のチームによる研究者たちは、Rustプログラムに対してランダムに雪玉を投げることは、干し草全体を焼き払うことで針を探すようなものであることに気づきました。Rustはそのコードの大部分に対して安全性を保証しているのだから、「なぜ安全な部分までテストする必要があるのか?」と彼らは問いかけました。そして、盲目のまま岩を投げつける人ではなく、地図と拡大鏡を持った探偵として機能する「指向型グレーボックス・ファザー」であるRustGoを構築しました。
RustGoは、バグを効率的に狩り出すために、3つの巧妙なステップで作動します。
1. 正しいターゲットを見つける(地図)
まず、RustGoはコードをスキャンして、バグが隠れうる「unsafe」ゾーンを見つけ出します。しかし、単に推測するのではありません。データの流れがどのようにプログラム内を流れるかを分析するために、特殊な種類の解析を使用します。例えば、街には多くの路地がありますが、中には行き止まりであったり、現実には決して起こらないループであったりするものもあります。RustGoはこれらを排除します。メモリバグを引き起こす可能性のある特定の位置を特定し、似たような箇所を統合します。もしコード内の異なる二つの経路が全く同じ危険な結果につながる場合、RustGoはそれらを一つのターゲットとして扱い、同じことを二度チェックするという無駄を防ぎます。テストにおいて、このステップにより調査すべきターゲットの数を約**84%**削減でき、真に疑わしいエリアだけに集中することができました。
2. 行き止まりを切り落とす(拡大鏡)
RustGoがどこを見るべきかを理解したら、次は残りの都市を無視する必要があります。古いファズツールにおける都市の「地図」には、(Rustが使用する事前構築済みのツール群である)標準ライブラリが含まれていることが多く、これは膨大かつ、到達可能に見えて実際には到達できないパスで満たされています。これがツールを混乱させ、無益な領域の探索へと駆り立てていました。RustGoは、「ターゲット特化型のパス・プルーニング(枝刈り)」という新しいトリックを導入しました。これは、現在調査している特定のターゲットに繋がらないパスを一瞬にして消し去る魔法のフェンスのようなものです。もし探偵がパン屋のバグを探しているのであれば、たとえ技術的には存在していたとしても、図書館や公園への道をブロックしてしまうのです。これにより、RustGoは他のツールが時間を浪費してしまうような無関係なパスの**78.49%**を削ぎ落すことができました。
3. 公平にプレイする(ラウンドロビン戦略)
ここで最後の、決定的なひねりが加わります。複数の容疑者(ターゲット)を調べる際、古いツールはしばれた到達しやすい容疑者に執着し、難しいものを無視してしまうことがあります。RustGoは「ダイナミック・フェア・トギング(動的公平切り替え)」システムを使用しています。これは、完璧な回転で探偵の注意を容疑者の間で切り替える審判のようなものです。もし探偵が容疑者Aに時間を使いすぎたら、審判は直ちに容疑者Bへと注意を切り替え、すべての容疑者が公平な注目を得られるようにします。RustGoは、各ターゲットに独自の「キュー(待ち行列)」と進捗を追跡するための「スコアカード」を与えることでこれを実現しています。これにより、少し到達しにくいという理由だけで、危険な場所が見逃されることがないようになっています。
結果:より速く、よりスマートに
チームは、ウェブサーバーからデータ処理ツールに至るまでの13の実世界のRustアプリケーションを用いて、RustGoのテストを行いました。彼らは有名なAFL++を含む最高峰の既存ツールや、いくつかの専門的な「指向型」ファザーと比較しました。結果は驚くべきものでした。
RustGoは、安全なコードの90%に時間を浪費することを止め、純粋に危険な10%だけに焦点を当てたため、他のツールよりも2.09倍から5.08倍早く脆弱性を見つけ出しました。gimliアプリケーションのようなケースでは、10倍以上高速でした。視点を変えると、もし古いツールがバグを見つけるのに10時間かかったとしたら、RustGoは1時間足らずで見つけたことになります。
しかし、勝利はスピードだけではありません。チームは実験室の中だけでなく、野生の環境でもバグを狩るためにRustGoを使用しました。彼らは実世界のソフトウェアの中から、これまで知られていなかった13個のメモリバグを発見しました。このうち、10個がソフトウェア開発者によって確認され、8個はすでに修正済みです。さらに印象的なことに、6個のバグには公式のセキュリティID(RUSTSEC)が付与され、1つには重大なセキュリティ上の欠陥を追跡するための世界標準であるCVE IDが付与されました。これは、RustGoが単なる理論的なアイデアではなく、ソフトウェアをより安全にするための実践的なツールであることを証明しています。
ななぜこれが重要なのか
この論文は、単にRustGoが良いアイデアであることを示唆しているのではなく、それを測定し、有効性を証明し、他が見逃したものを見つける様子を示しています。また、「安全になるためには全ての行のコードをテストしなければならない」という従来の考え方に明確に異議を唱えています。代わりに、Rustのユニークなルールを理解することで、より賢く、より速く、より効果的になれることを示しています。
研究者たちは共通の懸念事項についても対処しています。「安全な部分を無視することでバグを見逃すのではないか?」という点です。彼らは、Rustの安全性ルールが非常に厳格であるため、空間的なメモリバグ(誤ったメモリアドレスへのアクセスなど)は、安全なコードの部分では決して起こり得ないと説明しています。したがって、それらを無視することは死角を作るのではなく、ノイズを取り除く作業に過ぎません。テンポラル(時系列)バグ(解放された後のメモリの使用)については、RustGoはあらゆるものを捉えられるよう十分に広いセーフティネットを維持する「保守的」なアプローチを用いることで、バグにつながる可能性のあるパスを誤って削除しないよう細心の注意を払っています。
結局のところ、RustGoはスペシャリズム(専門化)の力を示す証左です。熟練のシェフがクルミを割るためにハンマーを使わないのと同様に、現代のファザーも、Rustのような洗練された言語に対して鈍器を使うべきではありません。言語固有の強みと弱みに合わせてアプローチを作り変えることで、著者たちは、より速いだけでなく、より公正で、コード内のあらゆる潜在的な危険に対し適切な注意を向けることができるツールを生み出したのです。
自分の分野の論文に埋もれていませんか?
研究キーワードに一致する最新の論文のダイジェストを毎日受け取りましょう——技術要約付き、あなたの言語で。