Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ファジングツールAFLが ターゲットに入力を送る方法 公開版v2

msymt
August 08, 2022

ファジングツールAFLが ターゲットに入力を送る方法 公開版v2

セキュリティ・キャンプ全国大会2022 オンライン LT大会 公開版
#seccamp #AFL #Fuzzing #ファジング

GitHub
https://github.com/msymt/afl-fuzz-to-target

msymt

August 08, 2022
Tweet

More Decks by msymt

Other Decks in Education

Transcript

  1. ファジングツールAFLが
    ターゲットに入力を送る方法
    MsY(@py65criz)
    1

    View full-size slide

  2. まえおき
    ソースコード:https://github.com/msymt/afl-fuzz-to-target
    ● ファジングツールは、AFL(American Fuzzy Lop)を前提とする
    ● 主にLinuxのプロセスやファイルディスクリプタ(fd)に関する話
    ● AFLが分かる人向け: forkserverは今回考慮しない
    2

    View full-size slide

  3. ファジング
    ● 自動テスト手法の1種
    ● テスト対象のシステムに対して大量のデータを入力し、バグを検出する手法
    入力値の生成
    テスト対象の
    システム
    入力値の送信
    システムの状態の監視
    送信
    応答
    ターゲット
    図:ipa, ファジング活用の手引き , p6, 図 2.1-1をもとに作成 3

    View full-size slide

  4. ファジング
    ● 自動テスト手法の1種
    ● テスト対象のシステムに対して大量のデータを入力し、バグを検出する手法
    入力値の生成
    テスト対象の
    システム
    入力値の送信
    システムの状態の監視
    送信
    ここどうなってんの?
    -> 抽出してみよう
    応答
    図:ipa, ファジング活用の手引き , p6, 図 2.1-1をもとに作成 4

    View full-size slide

  5. ファイルディスクリプタ(file descriptor, fd)
    5
    ● システムコールopen(2)の使用時、
    そのファイルを示す非負整数のfdを返す
    ● 予約番号
    ○ 0: 標準入力
    ○ 1: 標準出力
    ○ 2: 標準エラー出力
    ● ファイルへの読み書きや位置決めは、fdを使用
    プロセス
    fd:1(標準出力)
    fd:2(標準エラー出力)
    fd:0(標準入力)
    プロセス
    fd:3
    ファイルA
    int open(const char *pathname, int flags);
    int open(const char *pathname, int flags, mode_t mode);
    例:ファイルAを読みモードで開いた

    View full-size slide

  6. 構成要素
    ● afl-fuzz: ファジングツールAFLのメインから書き込み部分を抽出
    ● .cur_input: ファズ(入力値)の書き込み先のファイル
    ● target: テスト対象のプログラム
    ○ プログラムの内容:標準入力から受け取った文字列をファイルに書き込む
    6

    View full-size slide

  7. ワークフロー
    1. afl-fuzzを起動
    2. afl-fuzz:用意したファズ(入力値)を.cur_inputに書き込む
    3. afl-fuzz:子プロセスを生成
    4. afl-fuzz(子プロセス):ターゲットプログラム(target)を起動
    a. target:標準入力から文字列を受取
    b. target:受け取った文字列をファイルに書き込み、終了
    5. afl-fuzz: 子プロセスの終了を待機
    7

    View full-size slide

  8. 子プロセス
    afl-fuzz(親プロセス)
    target
    .cur_inputにファズを
    書き込む
    .cur_inputの
    読み書き位置を
    先頭に戻す
    子プロセスを生成
    子プロセスの終了を待機
    標準入力のfd(0)を
    .cur_inputのfdで上書き
    標準入力の受取・コー
    ド実行
    targetの起動
    終了
    lseek
    dup2
    execv
    .cur_inputを開く
    ワークフロー
    fd = open(O_RDWR)
    8

    View full-size slide

  9. 子プロセス
    afl-fuzz(親プロセス)
    target
    .cur_inputにファズを
    書き込む
    .cur_inputの
    読み書き位置を
    先頭に戻す
    子プロセスを生成
    子プロセスの終了を待機
    標準入力のfd(0)を
    .cur_inputのfdで上書き
    標準入力の受取・コー
    ド実行
    targetの起動
    終了
    lseek
    dup2
    execv
    .cur_inputを開く
    ワークフロー
    fd = open(O_RDWR)
    9

    View full-size slide

  10. 子プロセス
    afl-fuzz(親プロセス)
    target
    .cur_inputにファズを
    書き込む
    .cur_inputの
    読み書き位置を
    先頭に戻す
    子プロセスを生成
    子プロセスの終了を待機
    標準入力のfd(0)を
    .cur_inputのfdで上書き
    標準入力の受取・コー
    ド実行
    targetの起動
    終了
    lseek
    dup2
    execv
    .cur_inputを開く
    ワークフロー
    fd = open(O_RDWR)
    10
    execv後も有効

    View full-size slide

  11. 子プロセス
    afl-fuzz(親プロセス)
    target
    .cur_inputにファズを
    書き込む
    .cur_inputの
    読み書き位置を
    先頭に戻す
    子プロセスを生成
    子プロセスの終了を待機
    標準入力のfd(0)を
    .cur_inputのfdで上書き
    標準入力の受取・コー
    ド実行
    targetの起動
    終了
    lseek
    dup2
    execv
    .cur_inputを開く
    ワークフロー
    fd = open(O_RDWR)
    11
    .cur_inputを
    読み込む

    View full-size slide

  12. 子プロセス
    afl-fuzz(親プロセス)
    target
    .cur_inputにファズを
    書き込む
    .cur_inputの
    読み書き位置を
    先頭に戻す
    子プロセスを生成
    子プロセスの終了を待機
    標準入力のfd(0)を
    .cur_inputのfdで上書き
    標準入力の受取・コー
    ド実行
    targetの起動
    終了
    lseek
    dup2
    execv
    .cur_inputを開く
    ワークフロー(プログラム)
    fd = open(O_RDWR)
    12

    View full-size slide

  13. 子プロセス
    afl-fuzz(親プロセス)
    target
    .cur_inputにファズを
    書き込む
    .cur_inputの
    読み書き位置を
    先頭に戻す
    子プロセスを生成
    子プロセスの終了を待機
    標準入力のfd(0)を
    .cur_inputのfdで上書き
    標準入力の受取・コー
    ド実行
    targetの起動
    終了
    lseek
    dup2
    execv
    .cur_inputを開く
    ワークフロー(プログラム)
    fd = open(O_RDWR)
    13

    View full-size slide

  14. afl-fuzz
    ワークフロー(図版)
    out_fd
    14
    out_fd = open(O_RDWR,…)
    により生成
    .cur_input

    View full-size slide

  15. afl-fuzz
    ワークフロー(図版)
    out_fd
    15
    forkによりfdは継承
    .cur_input
    子プロセス
    (target)
    out_fd
    子プロセス
    (target)
    out_fd
    int dup2(int oldfd, int newfd);
    ファイルディスクリプタ oldfd を newfd でも使えるようにする

    View full-size slide

  16. afl-fuzz
    ワークフロー(図版)
    out_fd
    16
    dup2(out_fd, 0);
    .cur_input
    子プロセス
    (target)
    out_fd
    子プロセス
    (target)
    fd:0(標準入力)
    out_fd
    target.c
    int dup2(int oldfd, int newfd);
    ファイルディスクリプタ oldfd を newfd でも使えるようにする

    View full-size slide

  17. afl-fuzz
    ワークフロー(図版)
    out_fd
    17
    .cur_input
    子プロセス
    (target)
    out_fd
    子プロセス
    (target)
    fd:0(標準入力)
    out_fd
    target.c
    int dup2(int oldfd, int newfd);
    ファイルディスクリプタ oldfd を newfd でも使えるようにする
    “Hello, World!”
    をファズとする

    View full-size slide

  18. afl-fuzz
    ワークフロー(図版)
    out_fd
    18
    .cur_input
    子プロセス
    (target)
    out_fd
    子プロセス
    (target)
    fd:0(標準入力)
    out_fd
    target.c
    int dup2(int oldfd, int newfd);
    ファイルディスクリプタ oldfd を newfd でも使えるようにする
    “Hello, World!”
    をファズとする
    out.txtに
    “Hello, World!”
    が渡る

    View full-size slide

  19. 実行結果
    ファズ(入力値)
    targetに渡せた
    19

    View full-size slide

  20. 抽出した感想・今後
    20
    ● 学部のシステムプログラミングの復習になり、勉強になった
    ● afl-fuzzのソースコード多すぎ・マクロ多すぎで辛い
    今後
    ● forkserverありの場合も図解していきたい
    ○ 確かafl-fuzz(親)とforkserver(子)とターゲット(孫)間を今回のように
    dup2によって渡していたような。。。

    View full-size slide

  21. 参考文献
    21
    ● ipa, ファジング活用の手引き, https://www.ipa.go.jp/files/000057652.pdfZ
    ● 冨永 和人, 権藤 克彦, 例解UNIX/Linuxプログラミング教室: システムコールを使
    いこなすための12講
    ● 田浦健次朗, ファイルディスクリプタと擬似ファイル 副題: Unix的な考え方(全てが
    ファイル),
    https://www.eidos.ic.i.u-tokyo.ac.jp/~tau/lecture/operating_systems/slides/pdf/
    07_everything_is_file.pdf

    View full-size slide