セキュリティメモ (バイナリ) - Internet Research Lab.

セキュリティメモ (バイナリ)
Last Update: 2015 05/07
Contact: [email protected]
Author: Ryoma Kawaguchi (B2, Keio University)
Jun Murai Lab., ARCH(Internet Architecture Research Team) @ Delta North.
バッファオーバーフローとカーネルでの対策
バッファオーバーフロー(Buffer Oveflow)攻撃とは、 strcpy や gets などの脆弱性を持つ関数が呼び出されているプログラムによって発生する
脆弱性であり、確保されたバッファのサイズを上回って書き込む事によってCPUスタック上に確保されていた戻りアドレスを書き換え、シェル
コードなどの任意のコードを実行させるための古典的な攻撃手法だ。
このバッファオーバーフロー攻撃に対抗する措置としてDEP(Exec-Shield)が挙げられる。これはNX-bitをx86系アーキテクチャでエミュレート
するためのもので、スタックのデータ領域に置かれた不正コードが実行されているかどうかをカーネルが監視して実行をストップさせるセキュ
リティ機構だ。これは以下のようなコマンドによって参照でき、0が無効、1が有効になっている。
ryoma@ryoma-ThinkPad-Edge-E130:~$ cat /proc/sys/kernel/exec-shield
1 (Enabled)
これによってシェルコードの実行を困難にさせ、セキュリティを向上させる狙いがある。もう一つはASLR(Address Space Layout
Randomization)だ。
ryoma@ryoma-ThinkPad-Edge-E130:~$ cat
08048000-08053000 r-xp 00000000 fc:00
08053000-08054000 r--p 0000a000 fc:00
08054000-08055000 rw-p 0000b000 fc:00
09f00000-09f21000 rw-p 00000000 00:00
b722f000-b731e000 r--p 00858000 fc:00
b731e000-b751e000 r--p 00000000 fc:00
b751e000-b751f000 rw-p 00000000 00:00
b751f000-b76c8000 r-xp 00000000 fc:00
b76c8000-b76c9000 ---p 001a9000 fc:00
b76c9000-b76cb000 r--p 001a9000 fc:00
b76cb000-b76cc000 rw-p 001ab000 fc:00
b76cc000-b76cf000 rw-p 00000000 00:00
b76e9000-b76eb000 rw-p 00000000 00:00
b76eb000-b76ec000 r-xp 00000000 00:00
b76ec000-b770c000 r-xp 00000000 fc:00
b770c000-b770d000 r--p 0001f000 fc:00
b770d000-b770e000 rw-p 00020000 fc:00
bf975000-bf996000 rw-p 00000000 00:00
/proc/self/maps
1835031
/bin/cat
1835031
/bin/cat
1835031
/bin/cat
0
[heap]
14950561
/usr/lib/locale/locale-archive
14950561
/usr/lib/locale/locale-archive
0
7864416
/lib/i386-linux-gnu/libc-2.19.so
7864416
/lib/i386-linux-gnu/libc-2.19.so
7864416
/lib/i386-linux-gnu/libc-2.19.so
7864416
/lib/i386-linux-gnu/libc-2.19.so
0
0
0
[vdso]
7864425
/lib/i386-linux-gnu/ld-2.19.so
7864425
/lib/i386-linux-gnu/ld-2.19.so
7864425
/lib/i386-linux-gnu/ld-2.19.so
0
[stack]
ryoma@ryoma-ThinkPad-Edge-E130:~$ cat
08048000-08053000 r-xp 00000000 fc:00
08053000-08054000 r--p 0000a000 fc:00
08054000-08055000 rw-p 0000b000 fc:00
08f99000-08fba000 rw-p 00000000 00:00
b72f6000-b73e5000 r--p 00858000 fc:00
b73e5000-b75e5000 r--p 00000000 fc:00
b75e5000-b75e6000 rw-p 00000000 00:00
b75e6000-b778f000 r-xp 00000000 fc:00
b778f000-b7790000 ---p 001a9000 fc:00
b7790000-b7792000 r--p 001a9000 fc:00
b7792000-b7793000 rw-p 001ab000 fc:00
b7793000-b7796000 rw-p 00000000 00:00
b77b0000-b77b2000 rw-p 00000000 00:00
b77b2000-b77b3000 r-xp 00000000 00:00
b77b3000-b77d3000 r-xp 00000000 fc:00
b77d3000-b77d4000 r--p 0001f000 fc:00
b77d4000-b77d5000 rw-p 00020000 fc:00
bf9ba000-bf9db000 rw-p 00000000 00:00
ryoma@ryoma-ThinkPad-Edge-E130:~$
/proc/self/maps
1835031
/bin/cat
1835031
/bin/cat
1835031
/bin/cat
0
[heap]
14950561
/usr/lib/locale/locale-archive
14950561
/usr/lib/locale/locale-archive
0
7864416
/lib/i386-linux-gnu/libc-2.19.so
7864416
/lib/i386-linux-gnu/libc-2.19.so
7864416
/lib/i386-linux-gnu/libc-2.19.so
7864416
/lib/i386-linux-gnu/libc-2.19.so
0
0
0
[vdso]
7864425
/lib/i386-linux-gnu/ld-2.19.so
7864425
/lib/i386-linux-gnu/ld-2.19.so
7864425
/lib/i386-linux-gnu/ld-2.19.so
0
[stack]
Return-to-libcによるDEP回避
ryoma@ryoma-ThinkPad-Edge-E130:~$ cat /proc/sys/kernel/randomize_va_space
2
ryoma@ryoma-ThinkPad-Edge-E130:~$ sudo sysctl -w kernel.randomize_va_space=0
[sudo] password for ryoma:
kernel.randomize_va_space = 0
ryoma@ryoma-ThinkPad-Edge-E130:~$ cat /proc/sys/kernel/randomize_va_space
0
ryoma@ryoma-ThinkPad-Edge-E130:~$
ROP+Return-to-libcによるDEP+ASLR回避
書式文字列攻撃
GOT Overwrite attackと対策
80484ae:
80484b3:
80484b6:
80484b9:
80484bb:
80484bf:
80484c3:
80484c6:
80484cb:
80484cf:
80484d2:
e8
8b
83
8b
89
8d
89
e8
8d
89
e8
7d
45
c0
00
44
44
04
75
44
04
79
fe ff ff
0c
04
24
24
24
fe
24
24
fe
04
14
ff ff
14
ff ff
call
mov
add
mov
mov
lea
mov
call
lea
mov
call
8048330 <printf@plt>
eax,DWORD PTR [ebp+0xc]
eax,0x4
eax,DWORD PTR [eax]
DWORD PTR [esp+0x4],eax
eax,[esp+0x14]
DWORD PTR [esp],eax
8048340 <strcpy@plt>
eax,[esp+0x14]
DWORD PTR [esp],eax
8048350 <puts@plt>
Disassembly of section .plt:
08048320 <printf@plt-0x10>:
8048320:
ff 35 04 a0 04 08
8048326:
ff 25 08 a0 04 08
804832c:
00 00
...
push
jmp
add
DWORD PTR ds:0x804a004
DWORD PTR ds:0x804a008
BYTE PTR [eax],al
08048330 <printf@plt>:
8048330:
ff 25 0c a0 04 08
8048336:
68 00 00 00 00
804833b:
e9 e0 ff ff ff
jmp
push
jmp
DWORD PTR ds:0x804a00c
0x0
8048320 <_init+0x2c>
08048340 <strcpy@plt>:
8048340:
ff 25 10 a0 04 08
8048346:
68 08 00 00 00
804834b:
e9 d0 ff ff ff
jmp
push
jmp
DWORD PTR ds:0x804a010
0x8
8048320 <_init+0x2c>
08048350 <puts@plt>:
8048350:
ff 25 14 a0 04 08
8048356:
68 10 00 00 00
804835b:
e9 c0 ff ff ff
jmp
push
jmp
DWORD PTR ds:0x804a014
0x10
8048320 <_init+0x2c>
08048360 <__gmon_start__@plt>:
8048360:
ff 25 18 a0 04 08
8048366:
68 18 00 00 00
804836b:
e9 b0 ff ff ff
jmp
push
jmp
DWORD PTR ds:0x804a018
0x18
8048320 <_init+0x2c>
08048370 <__libc_start_main@plt>:
8048370:
ff 25 1c a0 04 08
8048376:
68 20 00 00 00
804837b:
e9 a0 ff ff ff
jmp
push
jmp
DWORD PTR ds:0x804a01c
0x20
8048320 <_init+0x2c>
Disassembly of section .got:
08049ffc <.got>:
8049ffc:
00 00
...
add
BYTE PTR [eax],al
adc
add
al,0x9f
al,0x8
Disassembly of section .got.plt:
0804a000 <_GLOBAL_OFFSET_TABLE_>:
804a000:
14 9f
804a002:
04 08
...
804a00c:
36 83 04 08 46
804a011:
83 04 08 56
804a015:
83 04 08 66
804a019:
83 04 08 76
804a01d:
83
804a01e:
04 08
add
DWORD PTR
add
DWORD PTR
add
DWORD PTR
add
DWORD PTR
.byte 0x83
add
al,0x8
ss:[eax+ecx*1],0x46
[eax+ecx*1],0x56
[eax+ecx*1],0x66
[eax+ecx*1],0x76
ryoma@ryoma-ThinkPad-Edge-E130:~$ readelf -S ~/Desktop/a.out | grep
[22] .got
PROGBITS
08049ffc 000ffc 000004 04
[23] .got.plt
PROGBITS
0804a000 001000 000020 04
ryoma@ryoma-ThinkPad-Edge-E130:~$ readelf -S ~/Desktop/a.out | grep
[10] .rel.plt
REL
080482cc 0002cc 000028 08
[12] .plt
PROGBITS
08048320 000320 000060 04
[23] .got.plt
PROGBITS
0804a000 001000 000020 04
ryoma@ryoma-ThinkPad-Edge-E130:~$
".got"
WA 0
0 4
WA 0
0 4
".plt"
A 5 12 4
AX 0
0 16
WA 0
0 4