BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース GoogleがPython用ファジーテストツールAtherisをオープンソースとして公開

GoogleがPython用ファジーテストツールAtherisをオープンソースとして公開

原文(投稿日:2021/01/03)へのリンク

Googleは先頃、Python用の新しいファジーテストエンジンをオープンソースとして公開すると発表した。 新たなファザー(fuzzer)のAtherisは、PythonコードとPython 2.7およびPython 3.3以降のネイティブエクステンション内のバグを検出する。メモリ破壊バグや未定義動作(バッファオーバーフロー、ポインタのアライメント不正、nullポインタなど)の検出ツールであるAddress SanitizerUndefined Behavior Sanitizerと組み合わせて使用することも可能だ。

現在のファジーテストエンジンの世界においてAntherisが新たに実現しようとしている価値を、Googleは次のように説明している。

ファズテスト(fuzz testing)は、プログラミングエラーを発見するテクニックとして広く認知されています。検出されるエラーの多くは、セキュリティ上、大きな意味を持つものです。Googleでは、このテクニックを使って、何千もの脆弱性や他のバグを発見しています。ファジング(fuzzing)は、CやC++といったネイティブ言語では以前から使われていますが、私たちは昨年、新たにPython用のファジングエンジンを開発しました。

AtherisはPythonコード(Python 2.7およPython 3.3以降に対応、Python 3.8以降がコードカバレッジサポートの面で強く推奨されている)と、CPython用に記述されたネイティブエクステンションで使用することができる。ネイティブコードで使用する場合、ClangAddress SanitizerUndefined Behavior Sanitizerとの併用により、さらに多くのバグをキャッチすることが可能だ。

Pythonコードでのファジングの例を以下に示す。

import atheris  
import sys
  
def TestOneInput(data):  
if data == b"bad":  
raise RuntimeError("Badness!")
  
atheris.Setup(sys.argv, TestOneInput)  
atheris.Fuzz()

TestOneInPutがテスト対象の関数である。テストされる関数はAtherisが自動生成したインプットによって、クラッシュするか例外が発生するまで繰り返しコールされる。

この関数はバイトコンテナのインプットひとつ(data)を受け入れるが、Atherisはさまざまな入力形式によるファジングをサポートする(文字列、リスト、整数、浮動小数、インターバルなど)FuzzedDataProviderを提供している。さらにAtherisは、プロパティベースのテストツールであるHypothesisを使ってファズハーネスを記述し、入力を縮小して、再現性の低い障害ケースの機能不良を発生させることができる。Hypothesisはまた、高度なインプット生成ストラテジ(Eメール、ディクショナリ、日付、正規表現)を提供することで、Atherisのファズデータプロバイダを補強する。

Atherisはカバレッジを指標とする(グレーボックス形式の)ファジングエンジンである。ClangのlibFuzzerを活用してテスト対象のコードを導入し、カバレッジ情報の収集を行う。その上で、前回のインプットシーケンスによって生成されたカバレッジを向上するインプットの動的な生成を試みるのだ。

Atherisはテストケース生成とテストの実行を行うが、テスト対象関数の誤った動作を認識するのはプログラマの責任である。このために用いられるのが、クロスリファレンス・オラクル(cross-referencing oracles)(差分ファジング)と呼ばれるものだ。この手法では、一般的なメタモルフィックテストと同様、同じ仕様の2つの実装を同じ入力に対して実行し、結果の差異を選び出して解析する。

テストオラクルやメタモルフィックプロパティが使用できなくても、ファジングを使って機能不良を見つけることは可能である。特にテスト対象の関数が予期しない例外を発したり、障害検出メカニズムが失敗している場合にはこれが有効だ。

予期しない例外をチェックすることの有用性を示すために、Googleは以下のような例を用意している。

例えば、私たちがAtherisでテストしたあるYAML解析ライブラリでは、単にYAMLErrorが発生するのみでした。ですが、yaml_fuzzer.pyを使うことで、"-_"を整数として解釈しようとしたことによるValueErrorや、リストをdictのキーとして使用した時のTypeErrorなど、その他のさまざまな例外を検出することができたのです。(バグレポート) これはパーザに問題があることを示しています。

差分ファジングとファズテストは強力な自動テストテクニックであり、既存のソフトウェア — CコンパイラやJava逆コンパイラ、アンチウィルスソフトウェアなどのバグを多数見つけ出している。Nick Fitzgerald氏は、生成テストを使うことによって、他の方法では検出が難しいバグの検出が可能になることを、先日のInfoQとのインタビューの中で説明してくれた

固定的な入力を記述して、プログラムが期待されたアウトプットを生成することを検証する、という基本的なユニットテストでは、見つけられないことが山のようにあります。コードパスを見落としているかも知れませんし、特定のプログラムステータスの実現に失敗しているかも知れません。[…]

疑似ランダム入力によるテストを実施し、システムに"予期しない"入力を与えることで、先入観を回避することが可能になります。整数値のオーバーフローや、(信頼できない、悪意を持っているかも知れない)ユーザがメモリ不足バグやタイムアウトを発生させてサービス拒否攻撃に利用できるような極端な入力値を見つけることができるのです。

Fitzgerald氏はwasmparserクレートのバリデータのバグを見つけて報告している。Googleは先日、GoogleのOSSインターンシップイニシアティブに参加した50名のインターンが、150以上のセキュリティ脆弱性と750の機能的なバグを報告した、と発表している。

AtherisはApache 2.0ライセンス下で公開されたオープンソースプロジェクトで、Linux(32bitおよび64bit)とMac OS Xをサポートする。コントリビューションは適切なガイドラインに従うことを条件に歓迎されている。

この記事に星をつける

おすすめ度
スタイル

BT