
ユーザーランドのバイナリ、クライアント、サーバーを調べるためのマルチプラットフォームファザー。
トップ企業やオープンソースの50以上のアプリとライブラリでバグを発見しています。
Linux、Mac、Windowsでファジングを始めるためのシンプルなセットアップ。
Litefuzzは目的を果たすために作られています。主要なすべてのプラットフォームでファジングとトリアージを行い、CLI/GUIアプリ、ネットワーククライアント、サーバーをサポートし、セキュリティ関連のバグを発見します。
このプロセスを簡素化し、いくつかの正直なトレードオフを行うだけで、さまざまなターゲットでプラットフォームをまたいでセキュリティバグを簡単に発見できるようにします。
速度やスケーラビリティのために作られたものではなく、学術的な賞を狙うものでもありません。さまざまな角度からシンプルなテクニックを適用して結果を出します。コンソールベースのファイルファジングには、おそらくAFLを使うべきでしょう。AFLは優れたパフォーマンス、インストルメンテーション機能(そしてより高速な非インストルメント実行)、スケール、そして無から freakin' jpegを作り出すことができます。ネットワークファジングについては、mutiny fuzzerもPCAPを再生する場合にうまく動作し、frizzerも有望そうです。しかし、これを試してみたいのであれば、単一のツールでプラットフォームをまたいでそれらの種類のターゲットをファジングできます。
./ そしてターゲットに... 軽いファズをかけてください。``` $ sudo apt install -y latex2rtf
$ ./litefuzz.py -l -c "latex2rtf FUZZ" -i input/tex -o crashes/latex2rtf -n 1000 -z --========================-- --======| litefuzz |======-- --========================--
[STATS] run id: 3516 cmdline: latex2rtf FUZZ crash dir: crashes/latex2rtf input dir: input/tex inputs: 1 iterations: 1000 mutator: random(mutators)
@ 1000/1000 (3 crashes, 127 duplicates, ~0:00:00 remaining)
[RESULTS]
completed (1000) iterations with (3) unique crashes and 127 dups
check crashes/latex2rtf for more details
これはAFL++が完全に処理できる単純なローカルターゲットであり、単なる例として簡単に示したものです。Litefuzzは、ネットワークやGUIファジングにおいてはるかに多くのことを行うように設計されており、詳しく見ていくとそれがわかるでしょう。
## なぜ
そう、また別のファザーです。しかも現在のトレンドや慣習にあまり沿っていないものです。特定の要件に対応するためにトレードオフが行われました。その要件とは、複数のプラットフォームでデフォルトで動作し、ローカルターゲットとネットワークターゲットの両方をファズでき、非常に使いやすいファザーであることです。何かを誰かに納得させようとしているわけではありませんが、背景を説明しましょう。一部のターゲットでは、AFLのようなファザーをビルドチェーンに統合するのに多大な労力が必要です。このファザーは計装を必要としないため、そのような問題はありません。計装による正確なカバレッジを犠牲にして、使いやすさと移植性を優先しています。また、AFLはそのままでネットワークファジングをサポートしておらず、それをサポートするAFLベースのプロジェクトも存在しますが、それらは決して簡単に使えるものではなく、動作させるためにより多くのコード修正やハーネスが必要になることがほとんどです([Libfuzzer](https://llvm.org/docs/LibFuzzer.html)も同様の状況です)。
並列ファジングは行わず、[パーシステントモード](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)が提供するような驚異的な速度向上もサポートしていないため、そのような機能を持つファザーに近いスケーラビリティはありません。繰り返しますが、これは最先端のファザーではありません。しかし、ソースコードやビルドの適切なセットアップ、特定のOS機能を必要としません。ネットワーククライアントのGUIやインタラクティブアプリケーションをファズすることもできます。多くの点で「Live off the Land」的であり、ミューテーターやミニマイゼーションなどの多くの機能はゼロから書かれています。
「そのまま動く」ように設計されており、必要なわずかな依存関係のセットアップとインストールを自動化するために努力が払われています。このファザーは目的を果たすために書かれており、さまざまなターゲットシナリオや環境で価値を提供し、最も重要なのは、すべてのファザーが最終的に評価されるべき点、つまりバグを見つける能力です。そして**実際に** [バグ](https://github.com/sec-tools/beta/blob/main/README.md#trophies) を見つけています。ターゲットのソースコードがあることを前提としていないため、クローズドソースソフトウェアでもかなりうまくカバーできます。自動化の一部としてほとんど修正なしで実行できますが、脆弱性研究者にとって楽しく使えるように作られています。ただし、完成品というよりも研究開発プロジェクトと考えるほうが有用です。また、複雑なセットアップは不要で、そのままで少し壊れていたり、最新のOSで動作させるためにさらに作業が必要ということはありません。
Ubuntu Linux、Mac、Windowsで動作確認済みで、ファジング準備完了の環境をセットアップするためのほぼすべてを自動化する完全なスクリプトが付属しています。
**セットアップスクリプトが完了すれば、さまざまなターゲットのファジングを開始するのにほんの数分しかかかりません。**
## 仕組み
**Litefuzzは、ローカル、クライアント、サーバーの3つの異なるモードをサポートしています。**
ローカルモードは、ローカルバイナリをターゲットにすることを意味します。Linux/Macでは、サブプロセス経由で起動され、クラッシュ時にそれぞれGDBとLLDBによる自動トリアージがサポートされ、Windowsでは[WinAppDbg](https://github.com/MarioVilas/winappdbg)を介して行われます。クラッシュはローカルのクラッシュディレクトリに書き込まれ、読み取り/書き込みAVやSIGABRT/SIGSEGVなどの障害タイプとファイルハッシュでソートされます。ファジング中にすべてのユニークなクラッシュがトリアージされ、このデータはターゲットの出力(利用可能な場合)とともにキャプチャされ、同じディレクトリにアーティファクトとして配置されます。また、`--replay`とクラッシュファイルを指定してクラッシュを再現することも可能です。`local`クライアントモードでは、入力ディレクトリにサーバーのグリーティング、レスポンス、またはクライアントがサーバーに接続する際に期待するデータを含める必要があります。
現時点では、ネットワークファジングのために複雑なセッションサポートなしで1回の「ショット」のみ実装されています。クライアントはコマンドラインから起動され、ファイルファジングと同じ方法でデバッグされます。このシナリオをサポートするためにリスナーがセットアップされます。はい、遅くてほぼ手動に近いですが、動作します。クラッシュが検出されると、gdbで再現されてトリアージの詳細が取得されます。`remote`クライアントモードでは、ローカルデバッグ/クラッシュトリアージがないことを除いて同じように動作します。*local*サーバーモードでは、ローカルクライアントモードと似ており、`remote`サーバーモードでは、指定されたターゲットに接続し、ユーザーが入力として指定した変異したサンプルクライアントデータを送信しますが、「まだ接続できるか、できなければ最後のデータでクラッシュした可能性が高い」という単純なトリアージのみ提供されます。
いくつかのミューテーション関数がゼロから書かれており、主に`-i`フラグで指定された入力のランダムな選択に対してランダムなミューテーションを行います。ファイルファジングの場合は、ローカルモードを選択し、アプリが解析するファイル名を期待する場所にFUZZを指定したターゲットコマンドライン(例:`tcpdump -r FUZZ`)と、ミューテーションする「良質なファイル」の入力ディレクトリを渡すだけです。ネットワーククライアントファジングの場合は、ローカルファジングと似ていますが、`-a`で接続詳細も指定します。サーバーをファズしたい場合は、サーバーモードにして、クライアントと同様に`protocol://address:port`を指定します。
ほとんどのCLIアプリケーションのように、ターゲットがデータを消費して終了する速度、またはローカル実行やネットワーク接続のタイムアウト前に必要と判断した時間だけ高速にファズします。これにより、かなり遅くなる可能性があります。派手なexecやカーネルトリックはありません。もちろん、入力を解析してすぐに終了するようなハーネスを書けば、ターゲットの特定の部分をカバーするのに役立ちます。しかし、その場合、ターゲットにそこまで近づけるのであれば、他のファザーが提供する[パーシステントモード](https://lcamtuf.blogspot.com/2015/06/new-in-afl-persistent-mode.html)や類似の機能を使ったほうがよいでしょう。
つまり...
### できること
- linux、windows、macで動作し、py2/py3をサポート
- ファイル/標準入力から読み取るCLI/GUIバイナリをファズ
- ネットワーククライアントとサーバー(オープンソースまたはプロプライエタリ)をファズし、ローカルまたはリモートでデバッグ可能
- クラッシュの差分、ミニマイゼーション、リプレイ、ソート、自動トリアージ
- TLSサポート、golangバイナリファジング、Mac用の追加機能などのその他
- さまざまな内蔵ミューテーターとpyradamsa(Linux)で入力を変異
### できないこと
- ネイティブ計装
- 並行ジョブでのスケーリング
- 複雑なセッションファジング
- リモートクライアントとサーバーの監視(接続などの基本的なチェックのみ)
## サポート
主に**Ubuntu Linux 20.04**(22.04と21.04は軽くテスト)、**Windows 10**、**Mac OS 11**(12は軽くテスト)でテストされています。ファザーとセットアップスクリプトは、これらのOSの少し古いバージョンや新しいバージョンでも動作する可能性がありますが、研究、テスト、開発の大部分はこれらの環境で行われました。Python3がサポートされており、[WinAppDbg](https://github.com/MarioVilas/winappdbg)を介してWindows上でファジングするために必要なPython2との互換性も確保するよう努められています。