Table of Contents
์ง๋ 5์ ์ธํ CPU์ ์๋ก์ด ๋ณด์ ์ทจ์ฝ์ ์ด ๋ณด๊ณ ๋๋ค. MDS(Microarchitectural Data Sampling)๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ด ์ทจ์ฝ์ ์ 2018๋ ์ด ๋ณด๊ณ ๋ ๋ฉํธ๋ค์ด(Meltdown), ์คํํฐ(Spectre) ์ทจ์ฝ์ ๊ณผ ๋ฌ๋ฆฌ CPU ๋ด๋ถ 3๊ฐ์ ๋ฒํผ(Line Fill Buffers, Load Ports, Store Buffers)๋ก๋ถํฐ ์ฌ์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ถํ ์ ์๋ค. MDS์ ๋ํด ๊ณต๋ถํ๊ธฐ ์ (๋ค๋ฆ๊ฒ) ๋ฉํธ๋ค์ด๊ณผ ์คํํฐ์ ๋ํด ์์๋ณด๊ธฐ๋ก ํ๋ค.
Meltdown
๋ฉํธ๋ค์ด์ ์ธํ ํ๋ก์ธ์์์ ๋ฐ๊ฒฌ๋ ์ทจ์ฝ์ ์ด๋ค. ๊ณต๊ฒฉ์๋ ๋น์์ฐจ์ ๋ช ๋ น ์คํ(Out of Order Execution)์ ๋งน์ ์ ์ด์ฉํด ์ ๊ทผํ ์๋, ์ ๊ทผํด์๋ ์๋๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ๊ณ , ์บ์์ ๊ฐ์ ์ฌ์ด๋ ์ฑ๋์ ํตํด ์ ๋ณด๋ฅผ ์์๋ธ๋ค.
Background
๋น์์ฐจ์ ๋ช ๋ น ์คํ์ ๋ํด ๋ค๋ฃจ๊ธฐ ์ ์ ํ์ดํ๋ผ์ธ(Pipeline)์ ๋ํด ๊ฐ๋จํ ์ดํดํด์ผ ํ๋ค. ์ฐ์ ํ๋ก์ธ์๊ฐ ๋ช ๋ น์ ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ ๋ค์ฏ ๋ถ๋ถ์ผ๋ก ๋๋ ์ ์๋ค.
- IF (Instruction Fetch): ๋ฐ์ด๋๋ฆฌ ํ์์ ๋ช ๋ น์ ๋ฉ๋ชจ๋ฆฌ์์ CPU๋ก ๊ฐ์ ธ์จ๋ค.
- ID (Instruction Decode): ๋ช ๋ น์ ์ข ๋ฅ๋ฅผ ์์๋ด๊ณ ๋ ์ง์คํฐ์ ์ ๋ ฅํ๋ค.
- EX (Execute): ๋ช ๋ น์ ๋ฐ์ดํฐ๋ฅผ ์ฐ์ฐํ๋ค.
- MEM (Memeory): ํ์ํ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๋ค.
- WB (Write Back): ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ ์ง์คํฐ์ ์ ๋ ฅํ๋ค.
ํ๋์จ์ด ๋ ๋ฒจ์์ ํ๋ก์ธ์์ ๋ฐ์ดํฐํจ์ค(Datapath)๋ฅผ ๋์ํํ๋ฉด ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๋๋ค:
๋ฉ๋ชจ๋ฆฌ์์ ํ๋ก์ธ์๋ก ๋ฐ์ด๋๋ฆฌ ํ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ ๋ช ๋ น์ ์ข ๋ฅ๋ฅผ ์์๋ด๊ณ , ๊ฐ์ ์ ์ ํ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค. (์ปดํจํฐ๊ฐ ์ฝ๋๋ฅผ ์ฝ๋ ์์ฃผ ๊ตฌ์ฒด์ ์ธ ์๋ฆฌ์์ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๋ฐฉ์์ ๊ฐ๋จํ ๋ค๋ค๋ค.) ๋ช ๋ น์ด ์กฐ๊ฑด๋ฌธ์ด๋ผ๋ฉด ๋ ์ง์คํฐ์ ๊ฐ์ด ์ฐธ์ธ์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ค๋ฅธ ์ฝ๋๋ก ์ ํํ๊ณ , ์กฐ๊ฑด๋ฌธ์ด ์๋๋ผ๋ฉด ALU(Arithmetic Logic Unit)๊ฐ ์ฐ์ฐ์ ์ํํ๋ค. ์ด์ด์ ๋ช ๋ น์ ๋ฐ๋ผ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋, ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ค. ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ํ์๊ฐ ์๋ ๋ช ๋ น์ด๋ผ๋ฉด ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ ์ง์คํฐ์ ์ ์ฅํ๋ค.
๋ง์ฝ ํ ๋ช ๋ น์ด ID ๋จ๊ณ์ ์๋ค๋ฉด ๋ ์ง์คํฐ๋ง ๋์ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ๋ ALU๊ฐ์ ์์๋ค์ ์ฌ์ฉ๋์ง ์์ ๊ฒ์ด๋ค. ํ๋ก์ธ์์ ์ผ๋ถ๋ง ์ฌ์ฉํ๋ ๊ฒ์ ๋นํจ์จ์ ์ด๋ค. ํ ๋ช ๋ น์ด ID ๋จ๊ณ์ ์์ ๋ ๋ค๋ฅธ ๋ช ๋ น์ IF, ๋ ๋ค๋ฅธ ๋ช ๋ น์ EX ๋จ๊ณ๋ฅผ ๊ฑฐ์น ์ ์๋ค. ์ด๋ ๊ฒ ๋ณ๋ ฌ์ ์ผ๋ก ๋ช ๋ น์ ์คํํ ์ ์๋๋ก ๋ง๋ ๊ฒ์ด ํ์ดํ๋ผ์ธ(Pipeline)์ด๋ฉฐ, ์ ๊ทธ๋ฆผ์์๋ 4๊ฐ์ ๋ น์ ๋ง๋๋ก ํํ๋์๋ค. ํ์ดํ๋ผ์ธ์ ๋ณ๋ ฌ์ ์ผ๋ก ์คํ๋๊ณ ์๋ ๊ฐ ๋จ๊ณ์ ๋ช ๋ น๋ค์ด ์๋ก ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ์ ์๋๋ก ํด์ค๋ค.
ํ์ดํ๋ผ์ธ ๋๋ถ์ ํ๋ก์ธ์๋ ํ ํด๋ญ ์ฌ์ดํด(Clock cycle)์ ์ต๋ 5๊ฐ ๋ช ๋ น์ ๋์์ ์คํํ ์ ์๋ค.
+---+------+------+------+------+------+------+------+------+------+
| 1 | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+
| 2 | | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+
| 3 | | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+
| 4 | | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+
| 5 | | IF | ID | EX | MEM | WB |
+---+------+------+------+------+------+------+------+------+------+
๋ค์ฏ ๋ฒ์งธ ํด๋ญ ์ฌ์ดํด์์ ๋ช ๋ น1์ด WB ๋จ๊ณ์ ์์ ๋ ๋ช ๋ น2๋ MEM, ๋ช ๋ น3์ EX, ๋ช ๋ น4๋ ID, ๋ช ๋ น5๋ IF ๋จ๊ณ๋ฅผ ๊ฑฐ์น๋ค. ์ด๊ฒ๋ง์ผ๋ก ์๋นํ ํจ์จ์ ์ด์ง๋ง, ์ฑ๋ฅ์ด ์ ํ๋๋ ์ํฉ๋ ์๋ค.
1: lw $t0, 0($sp)
2: lw $t1, 4($sp)
3: and $s1, $t0, $t1
4: add $s2, $t0, $s1
5: addi $s3, $t0, 20
๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ $t0
๋ ์ง์คํฐ์ ์ ์ฅํ๋ ๋ช
๋ น1๊ณผ $t0
๋ฅผ ์ด์ฉํด ๋ง์
์ ํ๋ ๋ช
๋ น3, ๋ช
๋ น4, ๋ช
๋ น5๋ ๋ชจ๋ ์์กด์ฑ์ ๊ฐ์ง๊ณ ์๋ค. ํํธ $t1
์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ช
๋ น2๋ $t1
์ ์ด์ฉํด ๋ง์
์ ํ๋ ๋ช
๋ น3๊ณผ ์์กด์ฑ์ ๊ฐ์ง๋ค.
์์ฐจ์ ์ผ๋ก ๋ช ๋ น์ ์คํํ๋ค๋ฉด 1, 2, 3, 4, 5 ์์๊ฐ ๋ง๋ค. ํ์ง๋ง ์ด๋ ๊ฒ ํ๋ฉด ๋ฉ๋ชจ๋ฆฌ์์ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ์๊ฐ, ์ฐ์ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ ์ง์คํฐ์ ์์ฑํ๋ ์๊ฐ ๋์ ์ง์ฐ์ด ๋ฐ์ํ๋ค.
+---+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 1 | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 2 | | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 3 | | IF | ID | | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 4 | | IF | ID | | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+------+------+
| 5 | | IF | ID | EX | MEM | WB |
+---+------+------+------+------+------+------+------+------+------+------+------+------+------+
๋ช ๋ น 5๋ ๋ช ๋ น 1๊ณผ ์์กด์ฑ์ด ์์ง๋ง, ๋ค๋ฅธ ๋ช ๋ น๋ค๊ณผ๋ ์์กด์ฑ์ด ์๋ค. ๋ฐ๋ผ์ ๋ช ๋ น์ ์คํ ์์๊ฐ ๋ฌ๋ผ์ ธ๋ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํ ์ ์๋ค.
+---+------+------+------+------+------+------+------+------+------+------+------+
| 1 | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+
| 2 | | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+
| 3 | | IF | ID | | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+
| 5 | | IF | ID | EX | MEM | WB | |
+---+------+------+------+------+------+------+------+------+------+------+------+
| 4 | | IF | ID | EX | MEM | WB |
+---+------+------+------+------+------+------+------+------+------+------+------+
1, 2, 3, 5, 4 ์์๋ก ์คํํ๋ 2 ํด๋ญ ์ฌ์ดํด์ด ์ค์๋ค. ์ด์ฒ๋ผ ํ๋ก์ธ์๋ ์ฑ๋ฅ์ ์ํด ์ฝ๋์ ์์๋ฅผ ๋ฐ๊พผ๋ค. ์์๋ฅผ ๋ฐ๊ฟ ์คํํ๋ ๊ฒ์ ๋น์์ฐจ์ ๋ช ๋ น ์คํ์ด๋ผ๊ณ ํ๋ฉฐ, ์ธํ ์ ์์กด์ฑ์ด ์๋ ๋ช ๋ น์ ๊ฐ์ ํด๋ญ ์ฌ์ดํด์ ์คํํ๋ ์ํผ์ค์นผ๋ผ(Superscalar) ๊ธฐ์ ์ ์ฌ์ฉํ๋ค. ๊ฐ๋ น n-way ์ํผ์ค์นผ๋ผ์ ๊ฒฝ์ฐ ๊ฐ์ ํด๋ญ ์ฌ์ดํด์ IF ๋จ๊ณ์ ๋ช ๋ น์ n๊ฐ ๋์ ์ฒ๋ฆฌํ ์ ์๋ค.
Attack Overview
๋ฉํธ๋ค์ด ์ทจ์ฝ์ ๊ณต๊ฒฉ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํํด์๋ ์๋๋ ์ฝ๋๋ฅผ ๋น์์ฐจ์ ์คํ์ผ๋ก ์คํ์ํค๊ณ , ์ด๋ ์บ์์ ์ฌ๋ผ๊ฐ ๋ฐ์ดํฐ์ ์ ๊ทผํด ์ฌ์ ์ธ ์ ๋ณด๋ฅผ ์์๋ด๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ค.
A Toy Example
๋น์์ฐจ์ ์คํ์ ์ทจ์ฝ์ ์ ๋ณด์ฌ์ฃผ๋ ๊ฐ๋จํ ์์ ์ฝ๋๋ฅผ ๋ณด์:
raise_exception();
// the line below is never reached
access(probe_array[data * 4096]);
data
๋ ์ ๊ทผํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฐ๋ฆฌํค๋ ๊ฐ์ด๋ฉฐ, 4096
์ ํ์ด์ง ํฌ๊ธฐ๋ค. ๊ณต๊ฒฉ์๋ data
์ 4KB ํ์ด์ง ์ฌ์ด์ฆ๋ฅผ ๊ณฑํด data
๋ฒ์งธ ํ์ด์ง์ ๋ฒ ์ด์ค ์ฃผ์์ ์ ๊ทผํ๋ค. (ํ์ด์ง๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ๊ธฐ ์ํด ํ๋ก์ธ์ค๋ฅผ ์ฌ๋ฌ ์กฐ๊ฐ์ผ๋ก ๋๋ ๋จ์์ด๋ค.) ์ฆ, ๊ณต๊ฒฉ์๋ probe_array
๋ฐฐ์ด์ ์ด์ฉํด ์ ๊ทผํ ์ ์๋ ๊ณต๊ฐ์ ์ ๊ทผ์ ์๋ํ๋ค.
์ ์ฝ๋์์๋ raise_exception
์ด ํญ์ ์์ธ๋ฅผ ์ผ์ผํค๊ธฐ ๋๋ฌธ์ ์ด๋ก ์ ์ผ๋ก access
ํจ์๋ ์ ๋๋ก ์คํ๋์ง ์๋๋ค. ๊ทธ๋ฐ๋ฐ ๋น์์ฐจ์ ๋ช
๋ น ์คํ์ ์ํด raise_exception
ํจ์๋ณด๋ค access
ํจ์๊ฐ ๋จผ์ ์คํ๋์ด ํ์ฉ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ ์ ์๋ค.
์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํ๋ก์ธ์๋ ๋น์์ฐจ์ ์ผ๋ก ์คํํ ๋ช
๋ น์ ์ทจ์ํ์ง๋ง, ์ด๋๋ ์บ์์ ์ด๋ฏธ ์ํฌ๋ฆฟ ๋ฐ์ดํธ(Secret byte) data * 4096
์ด ์ฌ๋ผ๊ฐ ์ํ๋ค. ๋ฐ๋ผ์ ์บ์์ ์ ์ฅ๋ ์ํฌ๋ฆฟ ๋ฐ์ดํธ๋ฅผ ์ฐพ์ผ๋ฉด ๋ฐ์ดํฐ๋ฅผ ์ ์ ์๋ค. (์บ์์ ๊ดํ ๋ณด๋ค ์์ธํ ๋ด์ฉ์ ์บ์๊ฐ ๋์ํ๋ ์์ฃผ ๊ตฌ์ฒด์ ์ธ ์๋ฆฌ๋ฅผ ์ฐธ๊ณ .) ์ด์ ๊ณต๊ฒฉ์๋ ํ๋ก์ธ์ค์ ๋ชจ๋ ํ์ด์ง์ ํ๋์ฉ ์ ๊ทผํ๋ฉฐ ์๊ฐ์ ์ธก์ ํ๋ค.
ํ์ด์ง์ ๋ฒ ์ด์ค ์ฃผ์(Base address)๊ฐ 0 * 4096
์ธ ๊ฒ๋ถํฐ 1 * 4096, 2 * 4096, ... , 255 * 4096
๊น์ง ์ ๊ทผํ๋ฉด ์บ์ฑ๋ ํ์ด์ง๋ง ์ ๊ทผ ์๊ฐ(Access time)์ด ์ ๋ํ ์งง์ ๊ฒ์ ๋ณผ ์ ์๋ค. ์ด๊ฒ์ด ๊ณต๊ฒฉ์๊ฐ ๋
ธ๋ฆฌ๋ data
๋ฒ์งธ ํ์ด์ง์ด๋ฉฐ, ์ด๋ฅผ ํตํด data
์ ๊ฐ์ ์๊ฒ ๋๋ค. ๋ง์ฝ ๊ณต๊ฒฉ์๊ฐ ๋
ธ๋ฆฌ๋ data
์ ๊ฐ์ด 'Aโ์๋ค๋ฉด 65๋ฒ์งธ ํ์ด์ง์ ์ ๊ทผํ๋ ์๊ฐ์ด ๊ฐ์ฅ ์งง๊ฒ ๋ํ๋ฌ์ ๊ฒ์ด๋ค. (์์คํค ์ฝ๋์ 'Aโ์ 10์ง์ ๊ฐ์ด 65์ด๊ธฐ ๋๋ฌธ์ด๋ค.)
์บ์๋ฅผ ๋น์ฐ๊ณ (Flush) ์ฝ๋(Reload) ๋ฐฉ์์ผ๋ก ์ ๋ณด๋ฅผ ์์๋ด๋ ๊ณต๊ฒฉ๋ฒ์ Flush-Reload ๊ณต๊ฒฉ๋ฒ์ด๋ผ๊ณ ํ๋ค. ์์ ์บ์๋ฅผ ๋น์ฐ๋ ๊ณผ์ ์ ์๋ตํ๋๋ฐ, ๋ง์ฝ ๋ฐ๋ก ์บ์๋ฅผ ๋น์ฐ์ง ์์ผ๋ฉด ํ๊ฒ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๊ฒ์ธ์ง ๋ถ๊ฐํ ์ ์์์ ๊ฒ์ด๋ค.
Attack Description
๋ฉํธ๋ค์ด ์ทจ์ฝ์ ๊ณต๊ฒฉ์ ํต์ฌ ์ฝ๋๋ฅผ x86 ์ด์ ๋ธ๋ฆฌ ๋ช ๋ น์ผ๋ก ํํํ๋ฉด ์๋์ ๊ฐ๋ค:
; rcx = kernel address, rbx = probe array
xor rax, rax
retry:
mov al, byte [rcx]
shl rax, 0xc
jz retry
mov rbx, qword [rbx + rax]
rcx
๋ ์ง์คํฐ๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๋ด๊ณ ์์ผ๋ฉฐ, rbx
๋ ์ง์คํฐ๋ ์ํฌ๋ฆฟ ๋ฐ์ดํธ๋ฅผ ์ฐพ๊ธฐ ์ํ ๋ฐฐ์ด๋ก ์ฌ์ฉํ๋ค.
- ๋จผ์
mov al, byte [rcx]
๋ช ๋ น์ผ๋ก ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์์ ํน์ ๊ฐ(rcx
)์ ๋ก๋ํดal
๋ก ํํ๋rax
๋ ์ง์คํฐ์ ์ ์ฅํ๋ค.rax
๋ ์ง์คํฐ๋ x86 ์ํคํ ์ฒ์์ ์ฌ์ฉ๋๋ 64๋นํธ ๋ฒ์ฉ ๋ ์ง์คํฐ์ด๋ฉฐ,al
์rax
๋ ์ง์คํฐ์ ํ์ 8๋นํธ ์๋ธ๋ ์ง์คํฐ(Subregister)๋ค. ๋์ฐ๊ธฐ ๋ ์ง์คํฐ(Accumulator register)๋ผ๊ณ ๋ถ๋ฅด๋rax
๋ ์ง์คํฐ๋ ์ฐ์ ์ฐ์ฐ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ๋ ์ฌ์ฉํ๋ค. - ์ ์ ๋ชจ๋(User mode)์์๋ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ์์ธ๊ฐ ๋ฐ์ํ๊ณ , ์คํ ๊ฒฐ๊ณผ๋ ๋ฐ์๋์ง ์์ ์ฑ ์ทจ์๋๋ค. ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ๋ค์ ๋ช ๋ น๋ค์ด ์คํ๋์ง ์์์ผ ํ์ง๋ง ๋น์์ฐจ์ ๋ช ๋ น ์คํ์ ์ํด ์ค์ ๋ก๋ ๋ค์ ๋ช ๋ น๋ค์ด ์คํ๋ ์ ์๋ค.
- ๋น์์ฐจ์ ๋ช
๋ น ์คํ์ผ๋ก ๋ค์ ๋ช
๋ น์ธ
shl rax, 0xc
๋ช ๋ น์ ์คํํ๋ฉดrax
๋ ์ง์คํฐ์ ๊ฐ์ ํ์ด์ง ์ฌ์ด์ฆ์ธ0xc
(4096B, 4KB)๋ฅผ ๊ณฑํ๋ค. - ์ด์ด์
mov rbx, qword [rbx + rax]
๋ช ๋ น์ ํตํดrbx
์ ๋ฒ ์ด์ค ์ฃผ์์rax * 0xc
๋ฅผ ๋ํ๊ณ , ์ด ๊ฒฐ๊ณผ๋ฅผrbx
๋ ์ง์คํฐ์ ์ ์ฅํ๋ค.rbx
๋ ์ง์คํฐ๋ ๋ฒ ์ด์ค ๋ ์ง์คํฐ(Base register)๋ก, ์คํ์ ๋ฒ ์ด์ค ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํจ๋ค. rbx
๋ ์ง์คํฐ์๋rbx + rax * 0xc
๊ฐ ์ ์ฅ๋์ด ์๋ค. ์ฆ,rax
๋ฒ์งธ ํ์ด์ง์ ๋ฒ ์ด์ค ์ฃผ์๊ฐ ์ ์ฅ๋์ด ์๋ ๊ฒ์ด๋ค.- ์์ธ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ ๊ณผ์ ์ ๋ชจ๋ ์ทจ์๋ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก๋
rax * 0xc
์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ํด๋น ๊ฐ์ด L1 ์บ์์ ์ฌ๋ผ๊ฐ๋ค. - ์์ ์์์์ ๋ดค๋ฏ์ด ๊ณต๊ฒฉ์๋ 256๊ฐ ํ์ด์ง๋ฅผ ๋ชจ๋ ํ์ผ๋ฉด์ ์ ๊ทผ ์๊ฐ์ ์ธก์ ํ๋ค.
rax
๋ฒ์งธ ํ์ด์ง๋ ์บ์ฑ๋์ด ์๊ธฐ ๋๋ฌธ์ ํนํ ์ ๊ทผ ์๊ฐ์ด ์งง๋ค. ์ด๋ฅผ ํตํด ๊ณต๊ฒฉ์๋ ๋น๋ฐ๊ฐrax
๋ฅผ ์๊ฒ ๋๋ค.
๋ฉํธ๋ค์ด ์ทจ์ฝ์ ์ ์ ์ ๋ชจ๋์์ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฌด๋จ์ผ๋ก ์ฐธ์กฐํ ์ ์๋ ๋งค์ฐ ์ฌ๊ฐํ ์ทจ์ฝ์ ์ด๋ค. ์ฑ๋ฅ ํฅ์์ ์ํ ๋น์์ฐจ์ ๋ช ๋ น ์คํ ๊ธฐ๋ฒ์ผ๋ก ์ธํด ๋ฐ์ํ ์ทจ์ฝ์ ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์ฑ๋ฅ ์ ํ๊ฐ ๋ถ๊ฐํผํ๋ฉฐ, ๋์์ ํ๋ก์ธ์ ๋ ๋ฒจ์ ์ทจ์ฝ์ ์ด๊ธฐ ๋๋ฌธ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํ๋์จ์ด ์ค๊ณ ์ฐจ์์์๋ ์กฐ์น๊ฐ ํ์ํ๋ค.
Spectre
์คํํฐ๋ ์ธํ , AMD, ARM ํ๋ก์ธ์์์ ๋ฐ๊ฒฌ๋ ์ทจ์ฝ์ ์ผ๋ก, ๊ณต๊ฒฉ ๊ธฐ๋ฐ ์๋ฆฌ๋ ๋ฉํธ๋ค์ด๊ณผ ๋น์ทํ๋ค. ์ปดํจํฐ๋ ์กฐ๊ฑด๋ฌธ์ ์คํํ ๋ ์ด๋ค ์กฐ๊ฑด์ ๋ถํฉํ ์ง ์์ธกํ๊ณ ์คํํ๋๋ฐ, ๋น์ฐํ ์๋ชป๋ ์์ธก์ ํ๋ ๊ฒฝ์ฐ๋ ์๋ค. ์คํํฐ ์ทจ์ฝ์ ์ ์์ธก์ด ์คํจํ๋ ์ํฉ์ ๋ ธ๋ ค ์ธ๋ถ์์ ์ ๊ทผํด์๋ ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ ๊ทผํ๋ ๋ฐฉ์์ผ๋ก ๊ณต๊ฒฉํ๋ค.
Background
์กฐ๊ฑด๋ฌธ์ ์คํ์ ์์ธกํ๋ ๊ฒ์ ๋ธ๋์น ์์ธก(Branch prediction)์ด๋ผ๊ณ ํ๋ค.
for (int i = 0; i < 10; i += 1) {
result += 1;
}
printf("%d", result);
๋ฃจํ๋ฅผ ๋ ๋๋ง๋ค i < 10
์ด ์ฐธ์ธ์ง ๊ฑฐ์ง์ธ์ง ํ๋จํ๊ณ , ๋ฃจํ ๋ด๋ถ๋ฅผ ์คํํด์ผ ํ ์ง ๋ฃจํ๋ฅผ ๋น ์ ธ๋์์ผ ํ ์ง ๊ฒฐ์ ํด์ผ ํ๋ค. ์ ๋ฃจํ์์๋ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ ์ฐ์์ ์ผ๋ก ๋ฐ๋ณต๋๋๋ฐ, ๋งค๋ฒ ํ๋จ ๊ณผ์ ์ ๊ฑฐ์น๋ฉด ์ฑ๋ฅ์ด ์ ํ๋ ์๋ฐ์ ์์ ๊ฒ์ด๋ค.
์กฐ๊ฑด๋ฌธ์ ์คํํ ์ง ๋ง์ง ์์ธกํ๊ณ ๋ฏธ๋ฆฌ ๋ช ๋ น์ ์คํํ๋ฉด ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์๋ค. ์ด๋ฅผ ์ถ์ธก ์คํ(Speculation execution)์ด๋ผ๊ณ ํ๋ค. ๋ธ๋์น ์์ธก์ ์ํ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ผ๋ก BHT(Branch History Table)๊ฐ ์๋๋ฐ, ๊ธฐ๋ณธ์ ์ผ๋ก ๊ณผ๊ฑฐ ๊ธฐ๋ก์ ํตํด ๋ฏธ๋๋ฅผ ์ถ์ธกํ๋ ๊ฐ๋ ์ด๋ค. ์ง์ ์์ธก์ด ์ฐธ์ด์๋๋ฐ ์ด ์์ธก์ด ์ฑ๊ณตํ๋ค๋ฉด ๋ค์ ์ฐธ์ผ๋ก ์์ธกํด ๋ช ๋ น์ ์คํํ๊ณ , ์์ธก์ด ์คํจํ๋ค๋ฉด ๊ฑฐ์ง์ผ๋ก ์์ธกํด ๋ช ๋ น์ ๊ฑด๋๋ฐ๋ ์์ด๋ค. ์์ธก์ด ์คํจํ ๊ฒฝ์ฐ ๋ฏธ๋ฆฌ ์คํํ ๋ช ๋ น์ ๋๋๋ ค์ผ ํ๋ค.
Attack Overview
์คํํฐ ์ทจ์ฝ์ ์ ๋ธ๋์น ์์ธก์ ์คํจ๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉํ ์ ์๋ค. ๊ณต๊ฒฉ์๋ ์บ์ ๋ฉ๋ชจ๋ฆฌ ๋ฑ ์ฌ์ด๋ ์ฑ๋์ ํตํด ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฐ์ดํฐ์ ์ ๊ทผํ๋ค. ์๋ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํด์๋ ์ ๋๊ณ , ์ ๊ทผํ ์๋ ์์ง๋ง, ๋ธ๋์น ์์ธก์ ๋งน์ ์ ์ด์ฉํ๋ฉด ๊ฐ๋ฅํ๋ค.
์คํํฐ ๊ณต๊ฒฉ์ ์ฒซ ๋ฒ์งธ ์ ํ์ ํน์ ์ฝ๋ ๋ธ๋ก์ ์คํํด ๋ฐ์ดํฐ๋ฅผ ์์๋ด๋ ๊ฒ์ด๋ค.
if (x < array1_size) {
y = array2[array1[x] * 4096];
}
๋ณ์ x
๋ ๊ณต๊ฒฉ์๊ฐ ์ค์ ํ๋ ์์์ ๊ฐ์ผ๋ก, ๋ฐฐ์ด์ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๋๋ ๊ฐ(Out of Bounds)์ ๋ฃ๋๋ค. ๋ฐ๋ผ์ array1[x]
๋ ํ์ฉ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ๋ค. ์ฌ๊ธฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ค๋ฅธ ํ์ด์ง๋ค์ ์ฝ๊ธฐ ์ํด ํ์ด์ง ์ฌ์ด์ฆ์ธ 4096
์ ๊ณฑํ๋ค. ์ด๋ ๊ณต๊ฒฉ์๊ฐ ๋
ธ๋ฆฌ๋ array1[x]
๋ฅผ ์ํฌ๋ฆฟ ๋ฐ์ดํธ(Secret byte) k
๋ผ๊ณ ํ๋ค.
ํ์ง๋ง ํ์ฉ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ ๊ทผํ๋ฉด ์ธ๊ทธ๋จผํธ ํดํธ(Segment faults) ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค. ๊ทธ๋์ ์ง์ ํด๋น ๊ตฌ๋ฌธ์ ์คํํ์ง ์๊ณ ๋ธ๋์น ์์ธก์ ์ด์ฉํ๋ค.
- ํ๋ก์ธ์๊ฐ ์กฐ๊ฑด๋ฌธ์ ์กฐ๊ฑด์ ์ฐธ์ผ๋ก ์์ธกํ๋๋ก ์ ๋ํ๋ค. (์กฐ๊ฑด์ด ์ฐธ์ธ ์ํฉ์ ์ฌ๋ฌ ๋ฒ ๋ฐ๋ณตํ๋ค.)
- ์ด์ ์กฐ๊ฑด์ด ๊ฑฐ์ง์ด ๋๋๋ก ํ๋ฉด ๋ธ๋์น ์์ธก์ด ์คํจํ๋ค. ์ฝ๋์์ผ๋ก๋ ์กฐ๊ฑด๋ฌธ ๋ด๋ถ์ ๋ช ๋ น์ด ์คํ๋์ง ์๋ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ถ์ธก ์คํ์ผ๋ก ์ธํด ์ค์ ๋ก๋ ๋ช ๋ น์ด ์คํ๋๋ค.
- ์์ธก์ด ์คํจํ์ผ๋ฏ๋ก ํ๋ก์ธ์๋ ์คํํ ๋ช
๋ น์ ๋๋๋ฆฐ๋ค.
y
์๋ ์๋ฌด๋ฐ ๊ฐ๋ ์ ์ฅ๋์ง ์๋๋ค. - ๋ช
๋ น์ด ์ทจ์๋๊ธฐ๋ ํ์ง๋ง, ์ค์ ๋ก๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์๊ธฐ ๋๋ฌธ์ ์ทจ์๋ ๋ช
๋ น์ด ์ ๊ทผํ ๋ฐ์ดํฐ
k * 4096
์ ์บ์์ ์ฌ๋ผ๊ฐ ๋จ์์๊ฒ ๋๋ค. ์ด๋k
๋ ํ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒ์๋ฅผ ๋๋ ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ํ๋ก์ธ์ค์์ ์ ๊ทผํ ์ ์๋ค. - ๋ฐ์ดํฐ์ ์ง์ ์ ๊ทผํ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณต๊ฒฉ์๋ ์บ์ฑ๋ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ๋ค. ๊ณต๊ฒฉ์๋
array2
์ ๋ชจ๋ ์์๋ฅผ ๋ฌด์์๋ก ์ ๊ทผํ๋ฉด์ ์ ๊ทผ ์๊ฐ์ ์ธก์ ํ๋ค. ์ ๊ทผ ์๊ฐ์ด ํนํ ์งง์ ๋ฐ์ดํฐ๋ ์บ์์ ์ ์ฅ๋์ด ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก, ์ด๋ ์ถ์ธก ์คํ์ผ๋ก ์บ์ฑ๋k * 4096
๋ฅผ ๋ปํ๋ค. ๋ฉํธ๋ค์ด ์ทจ์ฝ์ ์ ๊ณต๊ฒฉํ ๋ ์ฌ์ฉํ ๋ฐฉ๋ฒ๊ณผ ๋์ผํ๋ค.
์คํํฐ ์ทจ์ฝ์ ๊ณต๊ฒฉ์ ์ํด์๋ ๋์ ํ๋ก์ธ์ค ๋ด์์ ํ์ฉํ ์ฝ๋ ๋ธ๋ก์ธ ๊ฐ์ ฏ(Gadget)์ ์ฐพ์์ผ ํ ๋ฟ๋๋ฌ, ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๋ฅผ ๊ฐ๋ฆฌํค๋ x
๋ฅผ ์ค์ ํ๋ ค๋ฉด ๊ณต๊ฒฉ ๋์ ๋จธ์ ์ VA(Virtual address)์ PV(Pysical address) ๊ด๊ณ๋ ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ์ค์ ๋ก ๊ณต๊ฒฉํ๊ธฐ๋ ์ด๋ ค์ด ์ ์ด ๋ง๋ค. ํ์ง๋ง ์ด ์ญ์ ์ฌ๊ฐํ ์ทจ์ฝ์ ์์ ํ๋ฆผ์๋ค.
References
- ESTsecurity ์์ฝ ๋ธ๋ก๊ทธ, โ์ธํ CPU ์ทจ์ฝ์ (Meltdown & Spectre) ์์ธ๋ถ์โ, 2018.
- Jann Horn, โReading privileged memory with a side-channelโ, Google Project Zero, 2018.
- Don Marshall et al., โx86 Architectureโ, Microsoft Docs, 2017.
- Moritz Lipp et al., โMeltdown: Reading Kernel Memory from User Spaceโ, 2018.
- Paul Kocher et al., โSpectre: Exploiting Speculative Executionโ, 2018.
- SATAz, โ๋ฉํธ๋ค์ด ์ทจ์ฝ์ ์ ํํค์ณ๋ณด์โ, 2018.
- Silica Plant, โ์คํํฐ ๋ฉํธ๋ค์ด ๊ณต๊ฒฉโ, 2018.
- ๋ ธ๊ท๋จ, โCPU ์ทจ์ฝ์ ์ข ํฉ ๋ณด๊ณ ์โ, ๋ณด์๋ด์ค, 2018.