Simple Science

最先端の科学をわかりやすく解説

# コンピューターサイエンス# ソフトウェア工学# 機械学習

ソフトウェアのファジングに新しいアプローチ

大規模言語モデルを使った多用途のファuzzerを紹介するよ。ソフトウェアテストがもっと良くなるんだ。

― 1 分で読む


革新的なファジング手法が明革新的なファジング手法が明らかにされたた。り、重要なソフトウェアのバグを明らかにし新しいファuzzerが従来のツールを上回
目次

ファジングはソフトウェアのバグやセキュリティ問題を見つけるための方法だよ。ランダムまたは半ランダムな入力を生成して、プログラムの挙動を見てみるの。プログラムがクラッシュしたり、予想外の挙動を示したりしたら、それは解決すべき潜在的な問題があるってこと。いろんなソフトウェアでこの方法は成功してるんだ。

コンパイラやランタイムエンジンみたいなソフトウェアは開発に欠かせない部分。これらのツールはコードをコンピュータが理解できる機械語に変換して、開発者が作ったプログラムを実行できるようにしてくれる。でも、多くのファザーは特定のプログラミング言語やバージョンに特化してるから、他の言語や同じ言語の別バージョンをテストするのが簡単じゃないんだ。この制限があると、アップデートで追加された新機能や異なるプログラミングスタイルに関連するバグを見つけられないかもしれない。

この記事では、さまざまな言語やその特徴に対応できる新しいファザーを紹介するよ。このファザーは、大きな言語モデルを使って、関連するプログラミング言語の多様で現実的な入力を生成するから目立つんだ。この方法の鍵は独自のプロンプトシステムにある。このアプローチはファジング用のプロンプトを作成し、それを継続的に更新して新しい入力を生成する。

この新しいファザーを、C、C++、Java、Go、Pythonなど、6つの異なるプログラミング言語に対応したさまざまなソフトウェアでテストした結果、従来のファザーよりもコードカバレッジの面で優れた結果を出したよ。さらに、このファザーは、開発者が広く使っているコンパイラツールやライブラリを含む主要なソフトウェアシステムで重要なバグを特定したんだ。

従来のファザーは、生成ベースとミューテーションベースの2つの主なタイプに分けられる。生成ベースのファザーは、ターゲット言語の文法に基づいて完全なコードスニペットを作成する。ミューテーションベースのファザーは、高品質の既存コードスニペットに変更を加えて新しいファジング入力を作成する。

それぞれのアプローチには課題があるよ。たとえば、従来のファザーは特定のプログラミング言語やシステムに密接に関連しているため、他の言語に適応させるのが難しい。また、ファザーを作成するのは時間がかかるし、1つの言語に投資した努力を別の言語に転用するのは難しい。さらに、プログラミング言語は新機能で常に進化しているから、以前は効果的だったファザーが新しいバージョンではうまく機能しないこともある。

新しいファザーは、大きな言語モデルを使ってこれらの課題に対処しているよ。これらのモデルは、さまざまなプログラミング言語からの膨大なデータを使って訓練されているから、さまざまなプログラミング構造をしっかりと理解できるようになってる。ファザーは、ユーザーが提供したドキュメント、たとえばドキュメントやサンプルコードを出発点として、入力を生成する。

プロセスを効率的にするために、ファザーには革新的なオートプロンプト機能があるよ。ユーザーに手動でプロンプトを作成させるのではなく、提供された情報を自動的に要約して、テスト入力を生成するのに適した簡潔なプロンプトにするんだ。一度初期プロンプトを持つと、ファザーはそれを反復的に変更して新しい多様な入力を生成するループを使う。

ファザーの広範な評価は、複数の言語を受け入れるさまざまなシステムで行われた。その結果、従来のツールと比較して一貫してより高いカバレッジを達成したことが示され、効果的であることが確認された。このファザーは、開発者によってこれまで見逃されていた人気のあるシステムの重要なバグを特定できたんだ。

ファジングは、自動化されたテスト手法で、ソフトウェアシステムの予期しない動作を暴露するのに役立つ。入力を生成して、通常のテストでは出てこないかもしれない問題、たとえばクラッシュやエラーを引き起こすんだ。さまざまな実用的なファジングツールが存在するけれど、従来のファザーはしばしば大きな制限に直面する。

1つの制限は、特定のプログラミング言語と密接に結びついていること。従来のファザーは特定の言語で動作するように設計されているから、他の言語に適応させるのが難しいんだ。たとえば、C/C++コンパイラ用のファザーを作るのに時間がかかり、何千行ものコードが必要になることもある。また、ある言語に対して効果的に機能する戦略が、別の言語には役に立たないこともある。

もう1つの課題は、進化するシステムへのサポートが不足していること。多くのソフトウェアプログラムは定期的に新機能を追加するけど、既存のファザーはそれに追いつけないことが多い。たとえば、特定の言語バージョンに対して限られた機能セットしかサポートしないファザーもあるし、プログラミング言語が進化するにつれて、適応しなかったファザーは新しいバグを見つけられなくなるかもしれない。

私たちの新しいファザーは、これら2つの制限に対処しているよ。大きな言語モデルを入力とミューテーションを生成するためのユニバーサルエンジンとして使ってるんだ。これらのモデルはさまざまな言語の重要なコード例を使って訓練されているから、どんなソフトウェアシステムに対してもよりニュアンスがあり関連性のある入力を生成できる。

このファザーの独自のアプローチは、ユーザー提供のドキュメントから入力を受け取り、有意義なプロンプトを生成することを可能にしている。ただし、長い入力を直接プロンプトとして使用するのは効果的ではないかもしれない。代わりに、オートプロンプト機能はユーザー入力を簡潔なプロンプトに要約して、ファジングプロセスを導くんだ。

ファザーが入力の生成を始めたら、それらの入力が多様であり続けることを確認しなきゃならない。そのために、元のプロンプトを継続的に更新する。以前生成した入力を新しい例やミューテーションの指示と組み合わせることで、テスト用の新しい入力セットを作成するんだ。

私たちの評価には、6つのプログラミング言語を基にした9つの異なるシステムが含まれてた。各システムは、その要件に合ったテーラーメイドの入力を受け取って、他の最先端ファザーとの直接比較を可能にした。その結果、私たちのファザーは競合を一貫して上回り、より高いコードカバレッジを達成し、多数の重要なバグを特定したことが示された。

ファザーは、C、C++、Go、SMT2、Java、Pythonのような言語でテストされた。結果は素晴らしく、他のファザーを超えただけでなく、著名なソフトウェアシステムで以前は知られていなかったバグを見つける能力も示した。これには、以前のツールが特定できなかった広く使用されているコンパイラやライブラリの問題を検出することも含まれる。

要約すると、私たちは大きな言語モデルを効果的に活用するユニバーサルファザーを紹介するよ。このファザーは、一般的なファジングとターゲットを絞ったファジングの両方ができるから、ソフトウェアテストのための柔軟なツールなんだ。オートプロンプトや動的入力生成といった高度な技術を使うことで、ファジングプロセスを大幅に向上させている。評価結果は、カバレッジを改善し、重要なバグを特定する能力を示していて、実際のアプリケーションでもその効果が確認されたんだ。

オリジナルソース

タイトル: Fuzz4All: Universal Fuzzing with Large Language Models

概要: Fuzzing has achieved tremendous success in discovering bugs and vulnerabilities in various software systems. Systems under test (SUTs) that take in programming or formal language as inputs, e.g., compilers, runtime engines, constraint solvers, and software libraries with accessible APIs, are especially important as they are fundamental building blocks of software development. However, existing fuzzers for such systems often target a specific language, and thus cannot be easily applied to other languages or even other versions of the same language. Moreover, the inputs generated by existing fuzzers are often limited to specific features of the input language, and thus can hardly reveal bugs related to other or new features. This paper presents Fuzz4All, the first fuzzer that is universal in the sense that it can target many different input languages and many different features of these languages. The key idea behind Fuzz4All is to leverage large language models (LLMs) as an input generation and mutation engine, which enables the approach to produce diverse and realistic inputs for any practically relevant language. To realize this potential, we present a novel autoprompting technique, which creates LLM prompts that are wellsuited for fuzzing, and a novel LLM-powered fuzzing loop, which iteratively updates the prompt to create new fuzzing inputs. We evaluate Fuzz4All on nine systems under test that take in six different languages (C, C++, Go, SMT2, Java and Python) as inputs. The evaluation shows, across all six languages, that universal fuzzing achieves higher coverage than existing, language-specific fuzzers. Furthermore, Fuzz4All has identified 98 bugs in widely used systems, such as GCC, Clang, Z3, CVC5, OpenJDK, and the Qiskit quantum computing platform, with 64 bugs already confirmed by developers as previously unknown.

著者: Chunqiu Steven Xia, Matteo Paltenghi, Jia Le Tian, Michael Pradel, Lingming Zhang

最終更新: 2024-12-09 00:00:00

言語: English

ソースURL: https://arxiv.org/abs/2308.04748

ソースPDF: https://arxiv.org/pdf/2308.04748

ライセンス: https://creativecommons.org/licenses/by/4.0/

変更点: この要約はAIの助けを借りて作成されており、不正確な場合があります。正確な情報については、ここにリンクされている元のソース文書を参照してください。

オープンアクセスの相互運用性を利用させていただいた arxiv に感謝します。

著者たちからもっと読む

類似の記事