GoogleはOSS向けファジングサービス「OSS-Fuzz」の事例を発表した。「TinyGLTF」プロジェクトの重大な脆弱性を発見できた。これまで以上に広範な脆弱性を発見する能力がファジングツールにあるのだという。
この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。
Googleは2022年9月8日(米国時間)、オープンソースソフトウェア(OSS)向けファジングサービス「OSS-Fuzz」の事例を発表した。「TinyGLTF」プロジェクトの重大な脆弱(ぜいじゃく)性(CVE-2022-3008)を発見したことだ。ファジングツールにはこれまで以上に広範な脆弱性を発見する能力があるのだという。
ファジングとは、ソースコードを直接解析するのではなく、極端に長い文字列や不正な形式の値などさまざまな入力データを与えてコードを実行し、意図的に予期せぬ動作やクラッシュを引き起こすテスト手法だ。
OSS-Fuzzはオープンソースプロジェクト向けにファジングツール(ファザー)を実行し、検出されたバグを非公開で開発者に知らせる無償サービスだ。約700の重要なオープンソースプロジェクトにバグがないかどうか、定期的にチェックしている。Googleが開発し、オープンソースコミュニティーと共に提供している。
TinyGLTFは「C++」で書かれたヘッダのみの「glTF 2.0」ライブラリだ。
OSS-Fuzzが発見したCVE-2022-3008の脆弱性は、TinyGLTFを依存関係として使用するプロジェクトに問題を起こしかねなかった。悪意あるコードを実行するために攻撃者に悪用される恐れがあるからだ。なお、この脆弱性に対してはすぐにパッチが公開された。
Googleによれば、TinyGLTFの脆弱性の発見には今までとは異なる意義があるという。OSS-Fuzzがコマンドインジェクションの脆弱性を発見したからだ。
「かつて、ファジングツールは主に『C/C++』コードについて、メモリ破壊タイプの脆弱性を検出することで知られていた。だが、今回の発見はファジングツールがより広いタイプの脆弱性できることを示している」と、Googleは述べている。
TinyGLTFライブラリはC++で書かれている。だがこの脆弱性は全てのプログラミング言語に容易に応用でき、ファジングが全てのソフトウェアプロジェクトに有益かつ必要なテスト手法であることを裏付けていると、Googleは説明している。
OSS-Fuzzがリリースされた2016年当時、ファジングツールはまだ普及しておらず、開発者がテストしようとすると手作業が多く、ファジングは面倒な手法だった。OSS-Fuzzの開発はこうした問題の改善を目的としていた。
OSS-Fuzzは現在、オープンソースコミュニティーにとって重要なサービスになっており、オープンソースプロジェクトにおける8000以上のセキュリティ脆弱性と、2万6000以上のその他のバグを修正するのに役立ってきた。C/C++にとどまらず、「Go」「Rust」「Python」など、メモリセーフな言語の問題をも検出できるほどに進化している。
2021年12月には、「サニタイザー」と呼ばれるOSS-Fuzzのバグ検出器を改良して、より多くのタイプの脆弱性を発見することを目指す取り組みが発表された。手始めに、ファジングによって「Apache Log4j」の脆弱性「Log4Shell」の脆弱性を発見できることが示された。
今回取り上げたTinyGLTFの脆弱性は、こうして作成された新しいサニタイザーの一つである「SystemSan」を用いて発見されたものだ。SystemSanは、あらゆるプログラミング言語で任意のコマンドを実行するために悪用可能なバグを発見する目的で開発された。
今回の脆弱性は入力された「glTFファイルフォーマット」にバックティック(バッククオート)を注入し、解析中にコマンドを実行させることが可能だったことを示している。
# Craft an input that exploits the vulnerability to insert a string to poc $ echo '{"images":[{"uri":"a`echo iamhere > poc`"}], "asset":{"version":""}}' > payload.gltf # Execute the vulnerable program with the input $ ./loader_exampler payload.gltf # The string was inserted to poc, proving the vulnerability was successfully exploited $ cat poc iamhere
SystemSanはシステムコールの「ptrace」を使用しており、言語に依存せず、拡張性の高い方法で構築されているため、新しいサイニタイザーを簡単に追加できる。例えば、OSS-Fuzzチームは、「JavaScript」や「Python」についてライブラリの問題を検出するための概念実証コードを作成しており、外部のコントリビューターも、パストラバーサルなどによる任意のファイルアクセスの検出サポートを追加した。
OSS-FuzzチームはセキュリティベンダーのCode Intelligenceと協力し、Javaファジングの改善にも取り組んでいる。50以上のJavaプロジェクトをOSS-Fuzzに統合した他、デシリアライズやLDAP(Lightweight Directory Access Protocol)インジェクションの脆弱性など、Java固有の問題を検出するサニタイザーの開発を続けている。こうした脆弱性が既に多数発見されており、開示待ちの段階にある。
Copyright © ITmedia, Inc. All Rights Reserved.