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

QEMUを用いた自動バイナリ防御機構の開発_公開版.pdf

 QEMUを用いた自動バイナリ防御機構の開発_公開版.pdf

happynote3966

March 08, 2019
Tweet

More Decks by happynote3966

Other Decks in Technology

Transcript

  1. QEMUを用いた
    自動バイナリ防御機構の開発
    開発駆動コース / 坂井ゼミ / 宮口誠

    View full-size slide

  2. SeQEMU
    Secure QEMU

    View full-size slide

  3. 4
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  4. 6
    提案アイディア
    稼働しているサービスが攻撃を受けるのは困る
    Attack!
    Service Cracker

    View full-size slide

  5. 提案アイディア
    [ 攻撃を受けても動作を継続 | 被害前に停止 ] する仕組みを作る
    7
    Attack!
    Service Cracker

    View full-size slide

  6. 提案アイディア
    [ 攻撃を受けても動作を継続 | 被害前に停止 ] する仕組みを作る
    8
    Attack!
    Service Cracker
    キーワード:緩和
    (Mitigation)

    View full-size slide

  7. よくわからんという方へ
    「いじめ」を想像してください
    いじめる側(攻撃者)は
    相手(稼働サービス)の
    反応が楽しくてやっている
    9

    View full-size slide

  8. よくわからんという方へ
    「いじめ」を想像してください
    いじめる側(攻撃者)は
    相手(稼働サービス)の
    反応が楽しくてやっている
    →無視・無反応を貫く
    (=挙動から脆弱性を悟られない)
    10
    ※いじめに対しこのような対応を推奨するものではありません、悪しからず

    View full-size slide

  9. 11
    Function Overview

    View full-size slide

  10. 12
    実装概要
    オープンソースのエミュレータ
    オリジナルの3.0.0を元に改造

    View full-size slide

  11. QEMUの動作の仕組み
    13
    実行したい
    プログラム
    TCG
    (中間表現)
    実行可能
    コード

    View full-size slide

  12. QEMUの動作の仕組み
    14
    実行したい
    プログラム
    TCG
    (中間表現)
    実行可能
    コード
    この途中で動作を変更するのは難しい
    (開発コストが高い)

    View full-size slide

  13. TCGへの変換とその「隙間」
    15
    プログラム

    View full-size slide

  14. TCGへの変換とその「隙間」
    16
    プログラム
    call、jmp命令など

    View full-size slide

  15. TCGへの変換とその「隙間」
    17
    プログラム
    call、jmp命令など
    TCG
    変換

    View full-size slide

  16. TCGへの変換とその「隙間」
    18
    プログラム
    call、jmp命令など
    TCG
    変換

    View full-size slide

  17. TCGへの変換とその「隙間」
    19
    プログラム
    TCG
    call、jmp命令など
    TCG
    変換
    変換

    View full-size slide

  18. TCGへの変換とその「隙間」
    20
    プログラム
    TCG
    call、jmp命令など
    TCG
    変換
    変換
    開発コストを抑えて
    実装したい機能を実現

    View full-size slide

  19. 21
    緩和の仕組み
    .plt section
    printf (jmp to library)
    .text section
    (...)
    call printf (jmp to .plt)
    (...)

    View full-size slide

  20. 緩和の仕組み
    22
    .plt section
    printf (jmp to library)
    .text section
    (...)
    call printf (jmp to .plt)
    (...)

    View full-size slide

  21. 緩和の仕組み
    23
    .plt section
    printf (jmp to library)
    .text section
    (...)
    call printf (jmp to .plt)
    (...)
    HOOOOOOK!

    View full-size slide

  22. 緩和の仕組み
    24
    .plt section
    printf (jmp to library)
    .text section
    (...)
    call printf (jmp to .plt)
    (...)
    in Context
    Register
    ESP EBP EIP EAX
    Memory
    Stack
    Heap

    View full-size slide

  23. 25
    Function Detail

    View full-size slide

  24. 26
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  25. 27
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  26. 28
    1. Filtering Dangerous Function
    危険な関数(getsなど)をバイナリの中から探し出す
    printf
    gets
    scanf
    Functions
    !!!
    Overview

    View full-size slide

  27. 1. Filtering Dangerous Function (Detail)
    29
    ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得
    Elf32_Rel
    ...
    Proposal

    View full-size slide

  28. 1. Filtering Dangerous Function (Detail)
    30
    ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得
    ②Elf32_Sym構造体のst_nameから対応する.dynstrへのインデックスを取得
    Elf32_Rel
    Elf32_Sym
    Elf32_Sym
    Elf32_Sym
    ...
    ①r_info
    Proposal

    View full-size slide

  29. 1. Filtering Dangerous Function (Detail)
    31
    ①Elf32_Rel構造体のr_infoから対応するElf32_Sym構造体へのインデックスを取得
    ②Elf32_Sym構造体のst_nameから対応する.dynstrへのインデックスを取得
    ③.dynstrセクションから指定されたインデックスの文字列を調べる
    Elf32_Rel
    Elf32_Sym
    Elf32_Sym
    Elf32_Sym
    ...
    t f \0 g e t s \0
    ①r_info
    ②st_name
    Proposal

    View full-size slide

  30. 1. Filtering Dangerous Function (Detail)
    32
    関数の名前を探しているだけ
    Elf32_Rel
    Elf32_Sym
    Elf32_Sym
    Elf32_Sym
    ...
    t f \0 g e t s \0
    ①r_info
    ②st_name
    Proposal

    View full-size slide

  31. 実験
    33
    gets関数の使用
    (危険な関数を使っている)
    ※C11でなくなった関数

    View full-size slide

  32. 結果
    実行しないようにできた
    34

    View full-size slide

  33. 2. Implementation of Self-NX
    No Excute (NX bit)の機能を擬似的に再現する
    35
    r w x p
    Overview

    View full-size slide

  34. 2. Implementation of Self-NX (Detail)
    36
    data
    code
    heap
    stack
    EIP
    Proposal

    View full-size slide

  35. 2. Implementation of Self-NX (Detail)
    37
    data
    heap
    stack
    EIP
    Proposal
    code

    View full-size slide

  36. 2. Implementation of Self-NX (Detail)
    38
    data
    code
    heap
    stack
    EIP
    Proposal

    View full-size slide

  37. 実験
    39
    /bin/shが立ち上がる
    シェルコードがある
    (今回はそれを実行する)

    View full-size slide

  38. 結果
    /bin/shが実行されることなく終了している
    40

    View full-size slide

  39. 3. Detecting Use After Free
    freeしたメモリが使われるのを防止する
    41
    free-ed
    memory
    !!! DO NOT USE !!!
    Overview

    View full-size slide

  40. 3. Detecting Use After Free (Detail)
    42
    function.txt
    Proposal

    View full-size slide

  41. 3. Detecting Use After Free (Detail)
    43
    function.txt
    Proposal
    fgets(0x12345678,0x20,stdin)

    View full-size slide

  42. 3. Detecting Use After Free (Detail)
    44
    function.txt
    Proposal
    fgets(0x12345678,0x20,stdin)

    View full-size slide

  43. 3. Detecting Use After Free (Detail)
    45
    function.txt
    Proposal
    fgets(0x12345678,0x20,stdin)
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed

    View full-size slide

  44. 3. Detecting Use After Free (Detail)
    46
    function.txt
    Proposal
    fgets(0x12345678,0x20,stdin)
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed

    View full-size slide

  45. 3. Detecting Use After Free (Detail)
    47
    function.txt
    fgets(0x12345678,0x20,stdin) !!!
    !!!
    Proposal
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed

    View full-size slide

  46. 実験
    48
    freeしたメモリを
    再度使おうとしている

    View full-size slide

  47. 結果
    Use After Freeが発動する前に動作を停止することができた
    49

    View full-size slide

  48. 4. Filtering System Call
    システムコールのフィルタリングを作成する
    50
    User-mode Kernel-mode
    open(“data.txt”)
    open(“flag.txt”)
    open(“data.txt”)
    Filter
    Overview

    View full-size slide

  49. 4. Filtering System Call (Detail)
    51
    filter.txt
    Proposal

    View full-size slide

  50. 4. Filtering System Call (Detail)
    52
    filter.txt
    Proposal
    filter.txt
    5 (open), 1, (“flag.txt”)
    5 (open), 2, (O_RDONLY)

    View full-size slide

  51. 4. Filtering System Call (Detail)
    53
    filter.txt
    Proposal
    filter.txt
    5 (open), 1, (“flag.txt”)
    5 (open), 2, (O_RDONLY)
    EAX
    EBX
    ECX
    EDX
    ...

    View full-size slide

  52. 4. Filtering System Call (Detail)
    54
    filter.txt
    EAX
    EBX
    ECX
    EDX
    ...
    5 (open), 1, (“flag.txt”)
    5 (open), 2, (O_RDONLY)
    Proposal

    View full-size slide

  53. 実験
    55
    フィルタルールに設定した
    flag.txtを開こうとしている

    View full-size slide

  54. 結果
    flag.txtがオープンされる前に終了することができた
    56

    View full-size slide

  55. 5. Collection of Function Argument
    関数で使われたバッファなどの中身を収集する
    57
    123456
    iloveyou
    football
    1234567
    letmein
    123456789
    12345
    qwerty
    122345678
    password
    2017年のパスワードTop 10 https://news.mynavi.jp/article/20171220-559970/
    Overview

    View full-size slide

  56. 5. Collection of Function Argument (Detail)
    58
    function_list.txt
    Proposal

    View full-size slide

  57. 5. Collection of Function Argument (Detail)
    59
    function_list.txt
    Proposal
    “fgets,1”
    “gets,1”

    View full-size slide

  58. 5. Collection of Function Argument (Detail)
    60
    function_list.txt
    Proposal
    “fgets,1”
    “gets,1”
    fgets(buf,sizeof(buf),stdin)

    View full-size slide

  59. 5. Collection of Function Argument (Detail)
    61
    function_list.txt
    Proposal
    “fgets,1”
    “gets,1”
    fgets(buf,sizeof(buf),stdin)
    “I’ll be back” “SecHack365 Returns”

    View full-size slide

  60. 5. Collection of Function Argument (Detail)
    62
    function_list.txt
    Proposal
    “fgets,1”
    “gets,1”
    fgets(buf,sizeof(buf),stdin)
    “I’ll be back” “SecHack365 Returns”
    honeypot.log

    View full-size slide

  61. 5. Collection of Function Argument (Detail)
    63
    function_list.txt honeypot.log
    fgets(buf,sizeof(buf),stdin)
    “I’ll be back”
    “I’ll be back”
    “SecHack365 Returns”
    “fgets,1”
    “gets,1”
    “SecHack365 Returns”
    Proposal

    View full-size slide

  62. 実験
    64
    今回はこのfgets関数の
    入力されたデータを
    ハニポログとして収集する

    View full-size slide

  63. 結果
    入力した内容を時刻付きでログに収めることができた
    65

    View full-size slide

  64. 66
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  65. 67
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  66. 6. Restricting the Format String
    書式文字列の中から%n指定子を探し出して置き換える
    68
    %c%s%d%u%o%x%f%e
    %g%ld%lu%n%lo%lx%lf
    %c%s%d%u%o%x%f%e
    %g%ld%luxx%lo%lx%lf
    Overwrite!
    Overview

    View full-size slide

  67. 書式文字列と引数の関係(x86の場合)
    69
    printf(“%d%s%x”,int,str,hex)
    Problem

    View full-size slide

  68. 書式文字列と引数の関係(x86の場合)
    70
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    Problem

    View full-size slide

  69. 書式文字列と引数の関係(x86の場合)
    71
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    Problem

    View full-size slide

  70. 書式文字列と引数の関係(x86の場合)
    72
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    Problem

    View full-size slide

  71. 書式文字列と引数の関係(x86の場合)
    73
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    Problem

    View full-size slide

  72. 書式文字列と引数の関係(x86の場合)
    74
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    printf(“%n%n%n”)
    Problem

    View full-size slide

  73. 書式文字列と引数の関係(x86の場合)
    75
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    printf(“%n%n%n”)
    “%n%n%n”
    スタック
    ???
    ???
    ???
    Problem

    View full-size slide

  74. 書式文字列と引数の関係(x86の場合)
    76
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    printf(“%n%n%n”)
    “%n%n%n”
    スタック
    ???
    ???
    ???
    参照
    Problem

    View full-size slide

  75. 書式文字列と引数の関係(x86の場合)
    77
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    printf(“%n%n%n”)
    “%n%n%n”
    スタック
    上書きアドレス
    上書きアドレス
    上書きアドレス
    参照
    Problem

    View full-size slide

  76. 書式文字列と引数の関係(x86の場合)
    78
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    printf(“%n%n%n”)
    “%n%n%n”
    スタック
    上書きアドレス
    上書きアドレス
    上書きアドレス
    参照
    データ上書き
    Problem

    View full-size slide

  77. 書式文字列と引数の関係(x86の場合)
    79
    printf(“%d%s%x”,int,str,hex)
    “%d%s%x”
    数値
    文字列
    数値
    スタック
    参照
    printf(“%n%n%n”)
    “%n%n%n”
    スタック
    上書きアドレス
    上書きアドレス
    上書きアドレス
    参照
    データ上書き
    %n指定子を使われると
    データ上書きをされてしまう
    Problem

    View full-size slide

  78. 6. Restricting the Format String (Detail)
    80
    "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn]
    Regular Expression
    Proposal

    View full-size slide

  79. 6. Restricting the Format String (Detail)
    81
    "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn]
    Regular Expression
    “%3$n”
    “%n”
    Proposal

    View full-size slide

  80. 6. Restricting the Format String (Detail)
    82
    "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn]
    Regular Expression
    “%3$n”
    “%n”
    ‘x’
    Proposal

    View full-size slide

  81. 6. Restricting the Format String (Detail)
    83
    "%[ ,#+-]?([1-9][0-9]*|[\*])?(([.]([1-9][0-9]*)|[*$]))?([hlLFN])?[diuXxoqbpscSCfeEgGn]
    Regular Expression
    “%3$n”
    “%n”
    ‘x’
    “xxxx”
    “xx”
    Proposal

    View full-size slide

  82. 実験
    84
    危険な書式指定子
    (%nや%3$n)の使用
    →攻撃に使われる

    View full-size slide

  83. 結果
    危険な書式指定子を置き換えることができた
    (引数も対応している)
    85
    %x %n %x
    1
    2
    3
    %x xx %x
    1
    3
    3

    View full-size slide

  84. 7. Protecting the Return Address
    リターンアドレスを保護し、書き換えられると元の値に戻す
    86
    Argument
    Return Address
    Buffer
    Overview

    View full-size slide

  85. バッファオーバーフローとは?
    87
    下位アドレス
    (数字が小さい)
    上位アドレス
    (数字が大きい)
    バッファ
    (入力データの場所)
    ローカル変数など
    スタック
    引数
    [リターンアドレス]
    Problem

    View full-size slide

  86. バッファオーバーフローとは?
    88
    下位アドレス
    (数字が小さい)
    上位アドレス
    (数字が大きい)
    バッファ
    (入力データの場所)
    ローカル変数など
    スタック
    引数
    [リターンアドレス]
    入力後
    バッファ
    (入力データの場所)
    Variable
    引数
    Return Address
    入力
    データ
    スタック
    Problem

    View full-size slide

  87. バッファオーバーフローとは?
    89
    下位アドレス
    (数字が小さい)
    上位アドレス
    (数字が大きい)
    バッファ
    (入力データの場所)
    ローカル変数など
    スタック
    引数
    [リターンアドレス]
    入力後
    バッファ
    (入力データの場所)
    Variable
    引数
    Return Address
    入力
    データ
    この部分が
    上書きされる
    スタック
    Problem

    View full-size slide

  88. バッファオーバーフローとは?
    90
    下位アドレス
    (数字が小さい)
    上位アドレス
    (数字が大きい)
    バッファ
    (入力データの場所)
    ローカル変数など
    スタック
    引数
    [リターンアドレス]
    入力後
    バッファ
    (入力データの場所)
    Variable
    引数
    Return Address
    入力
    データ
    この部分が
    上書きされる
    スタック
    リターンアドレスが書き換わると
    プログラムの流れも変わる
    Problem

    View full-size slide

  89. 7. Protecting the Return Address (Detail)
    91
    Argument
    EBP
    Return Address
    Buffer
    Before Call Func
    Proposal

    View full-size slide

  90. 7. Protecting the Return Address (Detail)
    92
    Argument
    EBP
    Return Address
    Buffer
    EBP
    Return Address
    Before Call Func
    Proposal
    Saved Area

    View full-size slide

  91. 7. Protecting the Return Address (Detail)
    93
    Argument
    EBP
    Return Address
    Buffer
    EBP
    Return Address
    Before Call Func
    (Overwrite)
    (Overwrite)
    (Overwrite)
    Buffer
    After Call Func
    Proposal
    Saved Area

    View full-size slide

  92. 7. Protecting the Return Address (Detail)
    94
    Argument
    EBP
    Return Address
    Buffer
    EBP
    Return Address
    Before Call Func
    (Overwrite)
    (Overwrite)
    (Overwrite)
    Buffer
    After Call Func
    Proposal
    Saved Area

    View full-size slide

  93. 7. Protecting the Return Address (Detail)
    95
    Argument
    EBP
    Return Address
    Buffer
    EBP
    Return Address
    Before Call Func
    (Overwrite)
    Buffer
    After Call Func
    EBP
    Return Address
    Proposal
    Saved Area

    View full-size slide

  94. 実験
    96
    バッファの大きさを超えて
    入力することができる
    (≒Return Addressを
    上書きできる)

    View full-size slide

  95. 結果
    上書きされたリターンアドレスを元に戻すことができた
    97

    View full-size slide

  96. 8. Detection of Double Free
    同じアドレスが2回freeされる(=Double Free)のを防ぐ
    98
    free(address) × 2 =
    Overview

    View full-size slide

  97. 2度freeすると困ること
    99
    Problem
    ヒープ
    必要に応じて
    割り当てるメモリ

    View full-size slide

  98. 2度freeすると困ること
    100
    ヒープ
    チャンク1
    チャンク2
    Problem

    View full-size slide

  99. 2度freeすると困ること
    101
    ヒープ
    チャンク1
    チャンク2
    free
    リスト
    チャンク1
    チャンク2
    Problem

    View full-size slide

  100. 2度freeすると困ること
    102
    ヒープ
    プログラムA
    プログラムB
    チャンク1
    チャンク2
    free
    リスト
    チャンク1
    チャンク2
    Problem

    View full-size slide

  101. 2度freeすると困ること
    103
    ヒープ
    プログラムA
    プログラムB
    チャンク1
    free
    リスト
    チャンク1
    チャンク2
    チャンク1
    チャンク2
    freeリストの
    最初が割当て
    Problem

    View full-size slide

  102. 2度freeすると困ること
    104
    プログラムA
    プログラムB
    free
    リスト
    malloc
    チャンク1
    チャンク2
    malloc-ed
    ヒープ
    チャンク1
    チャンク2
    Problem

    View full-size slide

  103. 2度freeすると困ること
    105
    プログラムA
    プログラムB
    free
    リスト
    チャンク2
    ヒープ
    チャンク1
    チャンク2
    Problem

    View full-size slide

  104. 2度freeすると困ること
    106
    プログラムA
    プログラムB
    free
    リスト
    malloc
    チャンク2
    malloc-ed
    ヒープ
    チャンク1
    チャンク2
    Problem

    View full-size slide

  105. 2度freeすると困ること
    107
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    Problem

    View full-size slide

  106. 2度freeすると困ること
    108
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    free
    Problem

    View full-size slide

  107. 2度freeすると困ること
    109
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    free
    Problem

    View full-size slide

  108. 2度freeすると困ること
    110
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク1
    free-ed
    Problem

    View full-size slide

  109. 2度freeすると困ること
    111
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク1
    free
    Problem

    View full-size slide

  110. 2度freeすると困ること
    112
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク1
    free
    Problem

    View full-size slide

  111. 2度freeすると困ること
    113
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク2
    チャンク1
    free-ed
    Problem

    View full-size slide

  112. 2度freeすると困ること
    114
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク2
    チャンク1
    Double Free
    Problem

    View full-size slide

  113. 2度freeすると困ること
    115
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    Double Free
    チャンク2
    チャンク2
    チャンク1
    free-ed
    Problem

    View full-size slide

  114. 2度freeすると困ること
    116
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク2
    チャンク2
    チャンク1
    同じチャンクが
    連続している
    Problem

    View full-size slide

  115. 2度freeすると困ること
    117
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク2
    チャンク2
    チャンク1
    malloc
    malloc-ed
    Problem

    View full-size slide

  116. 2度freeすると困ること
    118
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク2
    チャンク1
    Problem

    View full-size slide

  117. 2度freeすると困ること
    119
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク2
    チャンク1
    malloc-ed
    malloc
    Problem

    View full-size slide

  118. 2度freeすると困ること
    120
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク1
    Problem

    View full-size slide

  119. 2度freeすると困ること
    121
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク1
    2つのプログラムが
    同じチャンクを共有
    Problem

    View full-size slide

  120. 2度freeすると困ること
    122
    プログラムA
    プログラムB
    free
    リスト
    ヒープ
    チャンク1
    チャンク2
    チャンク1
    2つのプログラムが
    同じチャンクを共有
    同じチャンク(アドレス)が
    2回freeされるとまずい
    Problem

    View full-size slide

  121. 8. Detection of Double Free (Detail)
    123
    0xdeadbeef
    0xcafebabe
    0xdefec8ed
    0xbaadf00d
    0xbeadface
    malloc-ed
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed
    malloc()
    free()
    Proposal

    View full-size slide

  122. 8. Detection of Double Free (Detail)
    124
    0xdeadbeef
    0xcafebabe
    0xdefec8ed
    0xbaadf00d
    0xbeadface
    malloc-ed
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed
    malloc()
    free()
    free(0x12345678)
    Proposal

    View full-size slide

  123. 8. Detection of Double Free (Detail)
    125
    0xdeadbeef
    0xcafebabe
    0xdefec8ed
    0xbaadf00d
    0xbeadface
    malloc-ed
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed
    malloc()
    free()
    free(0x12345678)
    Proposal

    View full-size slide

  124. 8. Detection of Double Free (Detail)
    126
    0xdeadbeef
    0xcafebabe
    0xdefec8ed
    0xbaadf00d
    0xbeadface
    malloc-ed
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed
    malloc()
    free()
    free(0x12345678)
    !!!
    Proposal

    View full-size slide

  125. 8. Detection of Double Free (Detail)
    127
    0xdeadbeef
    0xcafebabe
    0xdefec8ed
    0xbaadf00d
    0xbeadface
    malloc-ed
    0xabadbabe
    0xbaddcafe
    0x12345678
    0xfacefeed
    0xfee1dead
    free-ed
    malloc()
    free()
    free(0x12345678)
    !!!
    free(0x0)
    Proposal

    View full-size slide

  126. 実験
    128
    同じアドレスを
    2回freeしようとしている
    (Double Free)

    View full-size slide

  127. 結果
    129
    glibcのDouble Free検知機能を使うこと無く終了した

    View full-size slide

  128. 9. Protecting the Global Offset Table
    GOTの不正な書き換えを検知して元の値に戻す
    130
    PLT
    Library
    Evil Code
    GOT
    Overview

    View full-size slide

  129. Global Offset Tableの仕組みと書換え
    131
    Problem
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    PLT
    GOT

    View full-size slide

  130. Global Offset Tableの仕組みと書換え
    132
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    初回呼び出し

    View full-size slide

  131. Global Offset Tableの仕組みと書換え
    133
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    初回呼び出し

    View full-size slide

  132. Global Offset Tableの仕組みと書換え
    134
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    初回呼び出し

    View full-size slide

  133. Global Offset Tableの仕組みと書換え
    135
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    初回呼び出し

    View full-size slide

  134. Global Offset Tableの仕組みと書換え
    136
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    初回呼び出し

    View full-size slide

  135. Global Offset Tableの仕組みと書換え
    137
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    2回目以降

    View full-size slide

  136. Global Offset Tableの仕組みと書換え
    138
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    2回目以降

    View full-size slide

  137. Global Offset Tableの仕組みと書換え
    139
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード
    攻撃時

    View full-size slide

  138. Global Offset Tableの仕組みと書換え
    140
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード 攻撃
    攻撃時

    View full-size slide

  139. Global Offset Tableの仕組みと書換え
    141
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード 攻撃
    攻撃時

    View full-size slide

  140. Global Offset Tableの仕組みと書換え
    142
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード
    攻撃時

    View full-size slide

  141. Global Offset Tableの仕組みと書換え
    143
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード
    攻撃時

    View full-size slide

  142. Global Offset Tableの仕組みと書換え
    144
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード
    攻撃時

    View full-size slide

  143. Global Offset Tableの仕組みと書換え
    145
    Problem
    PLT
    GOT
    プログラム
    (printf関数呼び出し)
    ライブラリ
    (printf関数の本体)
    悪意あるコード
    GOTが書き換えられると
    コントロールが奪われてしまう
    攻撃時

    View full-size slide

  144. 9. Protecting the Global Offset Table (Detail)
    146
    GOT of func1
    Saved GOT
    status
    GOT of func2
    GOT of func3
    GOT of func1
    GOT of func2
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  145. 9. Protecting the Global Offset Table (Detail)
    147
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    GOT of func3
    Overwrite
    GOT of func2
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  146. 9. Protecting the Global Offset Table (Detail)
    148
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    GOT of func3
    Overwrite
    GOT of func2
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  147. 9. Protecting the Global Offset Table (Detail)
    149
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    GOT of func3
    GOT of func1
    GOT of func2
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  148. 9. Protecting the Global Offset Table (Detail)
    150
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    Calling...
    GOT of func3
    GOT of func1
    Overwrite
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  149. 9. Protecting the Global Offset Table (Detail)
    151
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    Calling...
    GOT of func3
    GOT of func1
    Overwrite
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  150. 9. Protecting the Global Offset Table (Detail)
    152
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    Calling...
    GOT of func3
    GOT of func1
    Overwrited
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  151. 9. Protecting the Global Offset Table (Detail)
    153
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    Calling...
    GOT of func3
    Called
    GOT of func1
    Overwrited
    Overwrite
    GOT in Memory
    Proposal

    View full-size slide

  152. 9. Protecting the Global Offset Table (Detail)
    154
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    Calling...
    GOT of func3
    Called
    GOT of func1
    Overwrited
    Overwrite
    GOT in Memory
    Proposal

    View full-size slide

  153. 9. Protecting the Global Offset Table (Detail)
    155
    GOT of func1
    Not Called
    Saved GOT
    status
    GOT of func2
    Calling...
    GOT of func3
    Called
    GOT of func1
    Overwrited
    GOT of func3
    GOT in Memory
    Proposal

    View full-size slide

  154. 実験
    156
    既存のputs関数のGOTを
    書き換えようとしている
    (GOT Overwrite)

    View full-size slide

  155. 結果
    GOT Overwriteを検知して元のアドレスに戻すことができた
    157

    View full-size slide

  156. 159
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  157. デモのルールは…
    _人人人人人人人人人人人人人_
    > core dumpedが無ければ勝ち <
     ̄Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^Y^ ̄
    160

    View full-size slide

  158. 161
    Epilogue
    (後少しです)

    View full-size slide

  159. 残された課題
    1. [Dangerous] 関数の検出の際、RELROが適用済みのものには対応できない
    2. [FSA]書式文字列がRead Onlyな場所に位置すると書き換えできない
    3. [Buffer]関数起点のStack-BOFしか防げない
    4. [Heap]callocやreallocには対応していない
    5. [NX] ヒープ領域に実行可能領域を作られても正常に動作できない
    6. [SystemCall]機能や使い方がまだ貧弱、単純なルールでしか動作しない
    7. [UAF]関数起点のUAFしか防げない
    8. [Honeypot]RELROに対応しなければあまり意味が無い
    (実際のサービスに使えない)
    162

    View full-size slide

  160. 残された課題
    1. [Dangerous] 関数の検出の際、RELROが適用済みのものには対応できない
    2. [FSA]書式文字列がRead Onlyな場所に位置すると書き換えできない
    3. [Buffer]関数起点のStack-BOFしか防げない
    4. [Heap]callocやreallocには対応していない
    5. [NX] ヒープ領域に実行可能領域を作られても正常に動作できない
    6. [SystemCall]機能や使い方がまだ貧弱、単純なルールでしか動作しない
    7. [UAF]関数起点のUAFしか防げない
    8. [Honeypot]RELROに対応しなければあまり意味が無い
    (実際のサービスに使えない)
    163
    実用段階に向けて改良していく

    View full-size slide

  161. 今後の目標
    ・RELRO適用済みのバイナリに対応したものを作る
    →実際のサービスに関数ハニーポットを適用できる
    164
    ・ヒープ領域のさらなる堅牢化を行う
    →割り当てたメモリサイズやフリーリストの状況などから防御する
    ・TCGを改造してcall命令が実行された際にフックできるようにする
    →リターンアドレス書き換えに対する防御が
     関数起点じゃなくてもよくなる

    View full-size slide

  162. 作りたいものが増えた
    ・今回の開発で作った機能を
    ptraceシステムコールを使って一から再現するものを作りたい
    165
    ・ネットワークに興味が出てきたので
    OpenGLか何かでネットワークの可視化をするものを作りたい
    ・などなど、開発の意欲が湧いてきていて
    モチベーションが高めなのでとても嬉しい
    (一時期これからどうしようか本当に悩んだ)

    View full-size slide

  163. 感想
    ・やる気を出すために「小さなこと」から少しずつやるのを心がけた
    →「やる気は存在しない」ということを意識した
    166
    ・細かいタスク(開発に関係のないこと)は先に済ませておくか
    紙にメモして脳から追い出してやる
    →気が散りやすかったのが、集中しやすくなった
    ・寝る時間を管理して良質な睡眠を心がけた
    →しっかり寝るのは翌日の開発に繋がる。寝るのって大切!

    View full-size slide

  164. SeQEMU
    Secure QEMU

    View full-size slide

  165. 169
    Buffer
    Overflow
    Format
    String
    RELRO
    Double
    Free
    Mitigation
    Detection
    System
    Call
    Use After
    Free
    No
    Execute
    Dangerous
    Function
    Collection
    Function
    Argument
    9 Function

    View full-size slide

  166. 課題や展望のまとめ
    170
    ①緩和に主眼を置いた
     セキュリティ機構を作成した
    ②ハニーポットなど
     別の用途の可能性を見出した
    ③SecHack365に参加することで
     開発のモチベーションが出てきた

    View full-size slide

  167. Thank you for your attention!
    SeQEMU Logo Illustration by Kanna Mizuguchi
    https://github.com/happynote3966/SeQEMU
    @happynote3966

    View full-size slide