OSのセキュリティ機構について
@fmirx0723
2021/5/12
Rits Security Team 1
はじめに (1/2)
Binary Exploit に関する有名な攻撃手法に対して,様々
なセキュリティ機構がOSレベルで実装されている
本スライドでは,シナリオを設定しそのときのLinuxに
おけるセキュリティ機構に関して解説する
2021/5/12
Rits Security Team
2
はじめに (2/2)
また,与えられたバイナリファイルに対してどのような
セキュリティ機構が働いているかを確かめるためには,
checksecを使う
2021/5/12
Rits Security Team
3
目次
1. シナリオ
2. ASLR
3. PIE
4. Canary
5. NX bit
6. ASCII Armor
7. RERLO
2021/5/12
Rits Security Team
4
目次
1. シナリオ
2. ASLR
3. PIE
4. Canary
5. NX bit
6. ASCII Armor
7. RERLO
2021/5/12
Rits Security Team
5
後期の講習会ではそんなに問題にならない
シナリオ
2021/5/12
Rits Security Team 6
脆弱プログラム
セキュリティ機構は全て無効
2021/5/12
Rits Security Team
7
buffのアドレスは表示
されるのでわかってる
想定される攻撃手順として…
1. buffにシェルコードを送り込む
2. リターンアドレスまでを,nop命令(x90)で埋める
3. BOFからvulnのリターンアドレスを書き換える
4. 書き換える値をbuffのアドレス(既知)にする
5. eipがbuffに移り,送り込んだシェルコードが実行できる
2021/5/12
Rits Security Team
8
シナリオのイメージ図
2021/5/12
Rits Security Team
9
リターン
stack
buff
ret addr
local
stack
shellcode
addr of buff
local
リターン
ペイロード
buff_size はbuffからeipまでのオフセット
asm(shellcraft.sh()) はシェルコード
2021/5/12
Rits Security Team
10
buffのアドレスは表示
されるのでわかってる
ASLR
(Address Space Layout
Randomization)
2021/5/12
Rits Security Team 11
ASLR 概要
ヒープ・共有ライブラリ・スタック領域のベースアドレスを,実行毎に
ランダム化
2021/5/12
Rits Security Team
12
code
data
heap
libc
stack
code
data
heap
libc
stack
code
data
heap
libc
stack
ASLRを有効にする
$ sudo sysctl –w kernel.randomize_va_space=2
2021/5/12
Rits Security Team
13
buffのアドレスが毎回変わっ
ていることがわかる
なぜ困るか
2021/5/12
Rits Security Team
14
stack
shellcode
x90x90…
0xffffcc30
buff
Return
address
stack
shellcode
x90x90…
0xffffcc30
シナリオでは,buff
のアドレスが既知
だったので,送った
シェルコードにリ
ターンできた
ASLRがあるとbuff
のアドレスが実行毎
に変化するのでわか
らない
PIE
(Position Independent
Executable)
2021/5/12
Rits Security Team 15
概要
 コード内においてjump命令などで指定するアドレスが,相対アドレスで表現されている
→コード領域がどこに配置されても正常にプログラムが動く
 PIE形式のELFファイルは,ASLR有効時にコード・データ領域のアドレスもランダム化
2021/5/12
Rits Security Team
16
code
data
heap
libc
stack
code
data
heap
libc
stack
code
data
heap
libc
stack
PIEを有効にする
PIEはデフォルトで有効
コンパイラのオプションで指定する
-fno-pie –no-pie を付与すると無効になる
2021/5/12
Rits Security Team
17
何が困るのか
コード領域のアドレスが固定であることを利用した攻撃が
困難
ret2plt
ROP
2021/5/12
Rits Security Team
18
canary
2021/5/12
Rits Security Team 19
概要
関数呼び出し時に,その関数のリターンアドレスの真上にcanaryと呼ば
れるランダム値を配置する
Canaryが書き換えられると,OSがそのことを検知しプロセスをkillする
2021/5/12
Rits Security Team
20
Stack
local
ret addr
canary
buff
Canaryを有効にする
Canaryはデフォルトで有効
コンパイル時のオプションで指定する
-fno-stack-protector を付与で無効になる
2021/5/12
Rits Security Team
21
なぜ困るか
2021/5/12
Rits Security Team
22
stack
buff
ret addr
local
stack
addr of buff
local
canary
shellcode
x90x90…Canaryの書き換え
検知
→ プロセスをkill
リターンアドレスを書き換えるためには,canaryを書
き換えることを避けられない
x90x90…
NX bit
2021/5/12
Rits Security Team 23
概要
 データ領域やスタック領域に機械語を配置してそれを実行するようにことは通常しない
 NX bitが立っているときこのような領域には実行不可属性を与える
 実行不可属性の領域に格納された機械語を実行しようとしたとき,OSがそれを検知しプロセ
スをkillする
 NX bitが立っている状態のことをDEPが有効というときもある(正確ではないが伝わるので
OK)
2021/5/12
Rits Security Team
24
code
data
heap
libc
stack
実行不可属性
DEPを有効にする
デフォルトでDEPは有効
コンパイラのオプションで指定する
-z execstack を付与するとDEP有効
2021/5/12
Rits Security Team
25
なぜ困るか
2021/5/12
Rits Security Team
26
stack
shellcode
x90x90…
0xffffcc30
code
data
heap
libc
stack local
実行不可
スタックに格納されるbuffに送り込んだシェルコードが実行
できない
ASCII Armor
2021/5/12
Rits Security Team 27
概要
Cent OS などのExec-Shieldというセキュリティモジュールが実装され
ているOSにはASCII Armorと呼ばれるセキュリティ機構が存在する
共有ライブラリが格納されるアドレスを0x00XXXXXXといった小さいア
ドレスに設定
ライブラリ関数のアドレスにヌル文字を含むため,それを含むペイロー
ドを送ることが困難になる
2021/5/12
Rits Security Team
28
RELRO
(Relocation ReadOnly)
2021/5/12
Rits Security Team 29
概要
RELROは数種類のレベルに分けられる
No RELRO
Partial RELRO
Full RELRO
Full RELROのときGOT Overwriteが不可能
あんまり詳しくないのでこの辺で
2021/5/12
Rits Security Team
30

Linux Security