9. 一般的なUse-After-Free攻撃のアプローチ
struct socket
(freed)
ops->ioctl(…)
The image cannot be displayed. Your computer may not have enough
memory to open the image, or the image may have been corrupted.
Restart your computer, and then open the file again. If the red x still
appears, you may have to delete the image and then insert it again.
struct socket
(refilled)
ops->ioctl(…)
JOP ガジェット
• 攻撃目標のオブジェクトを開放する
• 解放されたオブジェクトにヒープ・スプレーもしくは
ret2dir による不正な形式のデータを書き込む
• 関数ポインタにカーネル内のROP/JOPガジェットを指し示
させる
• 任意のカーネルコードを実行させるため、カーネルにこの関
数ポインタを参照させる
ioctl(sockfd,…) kernel_sock_ioctl() JOP ガジェット
34. ········
Use-After-Freeを引き起こす、 2つの“A+0x20”の8バイト値を A+0x20のアドレスに書き込む
↓ 最初に解放されたオブジェクト, アドレスはA
解決策: Use-After-Freeを任意の読み書きに変換
↓ 2番目に解放されたオブジェクト,
アドレスは B = A + 0x400
iovec をヒープスプレーに使用
Freed Data Freed Data Freed Freed Data Freed Data ·········
base len base len base base len base len ···················
base len A + 0x20 A+0x20 base
··········
base len base len
バッファをパイプに書き込む、バッファは(A + 0x20) にコピーされる
·········
base len KADDR 8 KADDR ·········· KADDR 8 KADDR 8 ·········
バッファをパイプにもう一度コピーする,そうすると KADDR にコピーされる
KADDR はどんなアドレス値をも取り得る、つまり、任意のカーネルメモリ上書きを達成
1
2
3
4
5