Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
difuze — Linuxカーネルドライバ用ファザー | Kitploit
ツール/GitHubGitHub/ucsb-seclab/difuze
Androidセキュリティ脆弱性分析ファジングバイナリ解析
GitHubucsb-seclab/difuze

difuze

Linuxカーネルドライバ用ファザー

リポジトリを見る
38585584年前Kitploit レビュー済み

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

difuze: Linuxカーネルドライバ用ファザー

License

このリポジトリには、difuze をセットアップして実行するために必要なすべてのソース(セットアップスクリプトを含む)が含まれています。

テスト済み環境

Ubuntu >= 14.04.5 LTS

0. Dockerからdifuzeを実行する

詳細はreadmeを参照してください。

論文で説明されているように、difuze には2つの主要コンポーネントがあります:インターフェース回復 とファジングエンジン です。

1. インターフェース回復

インターフェース回復メカニズムはLLVM解析パスに基づいています。インターフェース回復の各ステップは個別のパスとして書かれています。以下の手順に従って、インターフェース回復 をセットアップしてください。

1.1 セットアップ

このステップでは、LLVM と c2xml をインストールします:

まず、libxml がインストールされていることを確認してください(c2xml に必要です):

sudo apt-get install libxml2-dev
sudo pip install lxml

次に、必要なツールをすべてダウンロードしてビルドする単一のスクリプトを作成しました。

cd helper_scripts
python setup_difuze.py --help
usage: setup_difuze.py [-h] [-b TARGET_BRANCH] [-o OUTPUT_FOLDER]

optional arguments:
  -h, --help        show this help message and exit
  -b TARGET_BRANCH  Branch (i.e. version) of the LLVM to setup. Default:
                    release_38 e.g., release_38
  -o OUTPUT_FOLDER  Folder where everything needs to be setup.

例:

python setup_difuze.py -o difuze_deps

セットアップを完了するには、ローカルの PATH 環境変数の変更も必要です。セットアップスクリプトは必要な変更内容を正確に教えてくれます。

1.2 ビルド

これはセットアップの正常な完了に依存します。 すべてをビルドする単一のスクリプトがあります。どうぞご利用ください。

cd InterfaceHandlers
./build.sh

1.3 実行

これはビルドの正常な完了に依存します。 インターフェース回復コンポーネントをカーネルドライバで実行するには、まずドライバをLLVMビットコードに変換する必要があります。

1.3.1 カーネルのビルド

まず、ビルド可能なカーネルが必要です。つまり、通常のビルドセットアップ(make)を使ってカーネルをコンパイルできる必要があります。 最初に make コマンドの出力を取得し、その出力から正確なコンパイルコマンドを抽出します。

1.3.1.1 makeの出力を生成
オプション1: Bearを使用(推奨)
  1. Bear をインストールします。
  2. Bear を使用して make を実行します:
    bear make <make へのすべてのオプション>
    
    例: bear make -j8

これにより、カレントディレクトリに compile_commands.json ファイルが生成されます。

オプション2

単に V=1 を渡して出力をファイルにリダイレクトします。 例:

make V=1 O=out ARCH=arm64 > makeout.txt 2>&1

注意: 複数プロセス(-j)を使用しないでください。マルチプロセッシングモードで実行すると、複数のプロセスが出力ファイルに書き込もうとするため、出力ファイルが乱れます。

以上です。次のステップでは、スクリプトが生成された makeout.txt を取得し、認識されたすべてのドライバに対してインターフェース回復を実行します。

1.3.2 インターフェース回復解析の実行

インターフェース回復のさまざまなステップは、すべて単一のスクリプト helper_scripts/run_all.py にまとめられています。 実行方法:

cd helper_scripts
python run_all.py --help

usage: run_all.py [-h] [-l LLVM_BC_OUT] [-a CHIPSET_NUM] [-m MAKEOUT]
                  [-c COMPJSON] [-g COMPILER_NAME] [-n ARCH_NUM] [-o OUT]
                  [-k KERNEL_SRC_DIR] [-isclang] [-clangp CLANG_PATH]
                  [-llvmlinkp LLVMLINK_PATH] [-skb] [-skl] [-skp] [-skP]
                  [-ske] [-skI] [-ski] [-skv] [-skd] [-f IOCTL_FINDER_OUT]

optional arguments:
  -h, --help            show this help message and exit
  -l LLVM_BC_OUT        Destination directory where all the generated bitcode
                        files should be stored.
  -a CHIPSET_NUM        Chipset number. Valid chipset numbers are:
                        1(mediatek)|2(qualcomm)|3(huawei)|4(samsung)
  -m MAKEOUT            Path to the makeout.txt file.
  -c COMPJSON           Path to the compile_commands_json generated by Bear.
  -g COMPILER_NAME      Name of the compiler used in the makeout.txt, This is
                        needed to filter out compilation commands. Ex: aarch64
                        -linux-android-gcc
  -n ARCH_NUM           Destination architecture, 32 bit (1) or 64 bit (2).
  -o OUT                Path to the out folder. This is the folder, which
                        could be used as output directory during compiling
                        some kernels.
  -k KERNEL_SRC_DIR     Base directory of the kernel sources.
  -isclang              flag to indicate that clang was used to built the
                        kernel
  -clangp CLANG_PATH    Absolute path to the clang binary (if not provided,
                        the one available in the path will be used)
  -llvmlinkp LLVMLINK_PATH
                        Absolute path to the llvm-link binary (if not
                        provided, the one available in the path will be used)
  -skb                  Skip LLVM Build (default: not skipped).
  -skl                  Skip Dr Linker (default: not skipped).
  -skp                  Skip Parsing Headers (default: not skipped).
  -skP                  Skip Generating Preprocessed files (default: not
                        skipped).
  -ske                  Skip Entry point identification (default: not
                        skipped).
  -skI                  Skip Generate Includes (default: not skipped).
  -ski                  Skip IoctlCmdParser run (default: not skipped).
  -skv                  Skip V4L2 ioctl processing (default: not skipped).
  -skd                  Skip Device name finder (default: not skipped).
  -f IOCTL_FINDER_OUT   Path to the output folder where the ioctl command
                        finder output should be stored.


このスクリプトは、認識されたすべてのドライバに対してインターフェース回復をビルド、リンク、実行するため、かなりの時間(45分~90分) を要する可能性があります。

上記のスクリプトは、すべてのCPUコアを活用するためにマルチプロセッサモードで以下のタスクを実行します:

1.3.2.1 LLVMビルド
  • デフォルトで有効。

生成されたすべてのビットコードファイルは、-l 引数で指定されたフォルダに配置されます。 このステップは、コア数によってかなりの時間がかかります。 したがって、このステップを既に実行している場合は、-skb を渡してスキップできます。

1.3.2.2 すべてのドライバビットコードファイルを統合ビットコードファイルにリンク
  • デフォルトで有効。

これはリンクを実行し、すべてのビットコードファイルを調べて、リンクする必要がある関連ビットコードファイルを特定し、それらを(llvm-link を使用して)統合ビットコードファイル(対応するビットコードファイルと並べて保存されます)にリンクします。

上記のステップと同様に、-skl を渡してこのステップをスキップできます。

1.3.2.3 ヘッダーを解析してエントリ関数フィールドを特定
  • デフォルトで有効。

このステップでは、ヘッダーファイル内のエントリポイント宣言を探し、その構成を LLVM ビルドディレクトリの hdr_file_config.txt ファイルに保存します。

スキップするには: -skp

1.3.2.4 すべての統合ビットコードファイル内のエントリポイントを特定
  • デフォルトで有効。

このステップでは、すべてのドライバ統合ビットコードファイルにわたってすべてのエントリポイントを特定します。 出力は LLVM ビルドディレクトリの entry_point_out.txt ファイルに保存されます。

entry_point_out.txt ファイルの内容例:

IOCTL:msm_lsm_ioctl:/home/difuze/kernels/pixel/msm/sound/soc/msm/qdsp6v2/msm-lsm-client.c:msm_lsm_ioctl.txt:/home/difuze/pixel/llvm_out/sound/soc/msm/qdsp6v2/llvm_link_final/final_to_check.bc
IOCTL:msm_pcm_ioctl:/home/difuze/kernels/pixel/msm/sound/soc/msm/qdsp6v2/msm-pcm-lpa-v2.c:msm_pcm_ioctl.txt:/home/difuze/pixel/llvm_out/sound/soc/msm/qdsp6v2/llvm_link_final/final_to_check.bc

スキップするには: -ske

1.3.2.5 特定されたすべてのエントリポイントに対してIoctl Cmd Finderを実行
  • デフォルトで有効。

このステップでは、主要なインターフェース回復コンポーネント(IoctlCmdParser)を entry_point_out.txt ファイル内のすべてのエントリポイントに対して実行します。各エントリポイントの出力は、-f オプションで指定されたフォルダに保存されます。

スキップするには: -ski

1.4 例:

ここで、カーネルソースがある時点からインターフェース回復結果を得るまでの例を示します。

mediatek カーネル 33.2.A.3.123.tar.bz2 をアップロードしています。 まず、上記のファイルをダウンロードして展開してください。

展開したファイルが ~/mediatek_kernel というフォルダにあると仮定します。

1.4.1 ビルド

Bear をインストールし、以下の手順に従ってください:

cd ~/mediatek_kernel
source ./env.sh
cd kernel-3.18
# 以下の手順はカーネルによっては不要な場合があります
mkdir out
make O=out ARCH=arm64 tubads_defconfig
# compile_commands.json を生成
bear make -j8 O=out ARCH=arm64

1.4.2 インターフェース回復の実行

cd <repo_path>/helper_scripts

python run_all.py -l ~/mediatek_kernel/llvm_bitcode_out -a 1 -c ~/mediatek_kernel/kernel-3.18/compile_commands.json -n 2 -o ~/mediatek_kernel/kernel-3.18/out -k ~/mediatek_kernel/kernel-3.18 -f ~/mediatek_kernel/ioctl_finder_out

上記のコマンドはかなり時間(30分~1時間) がかかります。

1.4.3 出力の理解

まず、すべての解析結果はフォルダ ~/mediatek_kernel/ioctl_finder_out (-f オプションに指定した引数) に格納されます。各エントリポイントに対して .txt ファイルが作成され、回復されたインターフェースに関するすべての情報が含まれます。

インターフェースのみの情報に興味があり、他のことは気にしない場合は、parse_interface_output.py スクリプトを使用することをお勧めします。このスクリプトは、インターフェース回復パスの複雑な出力を、クリーンで一貫性のある形式のJSONファイルに変換します。

ツールをダウンロード