๐Ÿ‘ป CPU ๋ณด์•ˆ ์ทจ์•ฝ์ ์„ ๊ณต๊ฒฉํ•˜๋Š” ์•„์ฃผ ๊ตฌ์ฒด์ ์ธ ์›๋ฆฌ

๋ฉœํŠธ๋‹ค์šด, ์ŠคํŽ™ํ„ฐ ํŽ˜์ดํผ ์ฝ๊ธฐ

์ง€๋‚œ 5์›” ์ธํ…” CPU์˜ ์ƒˆ๋กœ์šด ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ๋ณด๊ณ ๋๋‹ค. MDS(Microarchitectural Data Sampling)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์ด ์ทจ์•ฝ์ ์€ 2018๋…„ ์ดˆ ๋ณด๊ณ ๋œ ๋ฉœํŠธ๋‹ค์šด(Meltdown), ์ŠคํŽ™ํ„ฐ(Spectre) ์ทจ์•ฝ์ ๊ณผ ๋‹ฌ๋ฆฌ CPU ๋‚ด๋ถ€ 3๊ฐœ์˜ ๋ฒ„ํผ(Line Fill Buffers, Load Ports, Store Buffers)๋กœ๋ถ€ํ„ฐ ์‚ฌ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. MDS์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•˜๊ธฐ ์ „ (๋’ค๋Šฆ๊ฒŒ) ๋ฉœํŠธ๋‹ค์šด๊ณผ ์ŠคํŽ™ํ„ฐ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค.

Meltdown

Meltdown: Reading Kernel Memory from User Space.

๋ฉœํŠธ๋‹ค์šด์€ ์ธํ…” ํ”„๋กœ์„ธ์„œ์—์„œ ๋ฐœ๊ฒฌ๋œ ์ทจ์•ฝ์ ์ด๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ๋น„์ˆœ์ฐจ์  ๋ช…๋ น ์‹คํ–‰(Out of Order Execution)์˜ ๋งน์ ์„ ์ด์šฉํ•ด ์ ‘๊ทผํ•  ์ˆ˜๋„, ์ ‘๊ทผํ•ด์„œ๋„ ์•ˆ๋˜๋Š” ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•˜๊ณ , ์บ์‹œ์™€ ๊ฐ™์€ ์‚ฌ์ด๋“œ ์ฑ„๋„์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ์•Œ์•„๋‚ธ๋‹ค.

Background

๋น„์ˆœ์ฐจ์  ๋ช…๋ น ์‹คํ–‰์— ๋Œ€ํ•ด ๋‹ค๋ฃจ๊ธฐ ์ „์— ํŒŒ์ดํ”„๋ผ์ธ(Pipeline)์— ๋Œ€ํ•ด ๊ฐ„๋‹จํžˆ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค. ์šฐ์„  ํ”„๋กœ์„ธ์„œ๊ฐ€ ๋ช…๋ น์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ณผ์ •์€ ๋‹ค์„ฏ ๋ถ€๋ถ„์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค.

  1. IF (Instruction Fetch): ๋ฐ”์ด๋„ˆ๋ฆฌ ํ˜•์‹์˜ ๋ช…๋ น์„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ CPU๋กœ ๊ฐ€์ ธ์˜จ๋‹ค.
  2. ID (Instruction Decode): ๋ช…๋ น์˜ ์ข…๋ฅ˜๋ฅผ ์•Œ์•„๋‚ด๊ณ  ๋ ˆ์ง€์Šคํ„ฐ์— ์ž…๋ ฅํ•œ๋‹ค.
  3. EX (Execute): ๋ช…๋ น์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—ฐ์‚ฐํ•œ๋‹ค.
  4. MEM (Memeory): ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•œ๋‹ค.
  5. 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 ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์‹œํฌ๋ฆฟ ๋ฐ”์ดํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•œ ๋ฐฐ์—ด๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

  1. ๋จผ์ € mov al, byte [rcx] ๋ช…๋ น์œผ๋กœ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŠน์ • ๊ฐ’(rcx)์„ ๋กœ๋“œํ•ด al๋กœ ํ‘œํ˜„๋œ rax ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•œ๋‹ค. rax ๋ ˆ์ง€์Šคํ„ฐ๋Š” x86 ์•„ํ‚คํ…์ฒ˜์—์„œ ์‚ฌ์šฉ๋˜๋Š” 64๋น„ํŠธ ๋ฒ”์šฉ ๋ ˆ์ง€์Šคํ„ฐ์ด๋ฉฐ, al์€ rax ๋ ˆ์ง€์Šคํ„ฐ์˜ ํ•˜์œ„ 8๋น„ํŠธ ์„œ๋ธŒ๋ ˆ์ง€์Šคํ„ฐ(Subregister)๋‹ค. ๋ˆ„์‚ฐ๊ธฐ ๋ ˆ์ง€์Šคํ„ฐ(Accumulator register)๋ผ๊ณ  ๋ถ€๋ฅด๋Š” rax ๋ ˆ์ง€์Šคํ„ฐ๋Š” ์‚ฐ์ˆ  ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
  2. ์œ ์ € ๋ชจ๋“œ(User mode)์—์„œ๋Š” ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , ์‹คํ–‰ ๊ฒฐ๊ณผ๋Š” ๋ฐ˜์˜๋˜์ง€ ์•Š์€ ์ฑ„ ์ทจ์†Œ๋œ๋‹ค. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ๋‹ค์Œ ๋ช…๋ น๋“ค์ด ์‹คํ–‰๋˜์ง€ ์•Š์•„์•ผ ํ•˜์ง€๋งŒ ๋น„์ˆœ์ฐจ์  ๋ช…๋ น ์‹คํ–‰์— ์˜ํ•ด ์‹ค์ œ๋กœ๋Š” ๋‹ค์Œ ๋ช…๋ น๋“ค์ด ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.
  3. ๋น„์ˆœ์ฐจ์  ๋ช…๋ น ์‹คํ–‰์œผ๋กœ ๋‹ค์Œ ๋ช…๋ น์ธ shl rax, 0xc ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋ฉด rax ๋ ˆ์ง€์Šคํ„ฐ์˜ ๊ฐ’์— ํŽ˜์ด์ง€ ์‚ฌ์ด์ฆˆ์ธ 0xc(4096B, 4KB)๋ฅผ ๊ณฑํ•œ๋‹ค.
  4. ์ด์–ด์„œ mov rbx, qword [rbx + rax] ๋ช…๋ น์„ ํ†ตํ•ด rbx์˜ ๋ฒ ์ด์Šค ์ฃผ์†Œ์— rax * 0xc๋ฅผ ๋”ํ•˜๊ณ , ์ด ๊ฒฐ๊ณผ๋ฅผ rbx ๋ ˆ์ง€์Šคํ„ฐ์— ์ €์žฅํ•œ๋‹ค. rbx ๋ ˆ์ง€์Šคํ„ฐ๋Š” ๋ฒ ์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ(Base register)๋กœ, ์Šคํƒ์˜ ๋ฒ ์ด์Šค ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
  5. rbx ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” rbx + rax * 0xc๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋‹ค. ์ฆ‰, rax๋ฒˆ์งธ ํŽ˜์ด์ง€์˜ ๋ฒ ์ด์Šค ์ฃผ์†Œ๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.
  6. ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ„ ๊ณผ์ •์€ ๋ชจ๋‘ ์ทจ์†Œ๋  ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ๋Š” rax * 0xc์— ์ ‘๊ทผํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๊ฐ’์ด L1 ์บ์‹œ์— ์˜ฌ๋ผ๊ฐ„๋‹ค.
  7. ์•ž์„  ์˜ˆ์‹œ์—์„œ ๋ดค๋“ฏ์ด ๊ณต๊ฒฉ์ž๋Š” 256๊ฐœ ํŽ˜์ด์ง€๋ฅผ ๋ชจ๋‘ ํ›‘์œผ๋ฉด์„œ ์ ‘๊ทผ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ๋‹ค. rax๋ฒˆ์งธ ํŽ˜์ด์ง€๋Š” ์บ์‹ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํŠนํžˆ ์ ‘๊ทผ ์‹œ๊ฐ„์ด ์งง๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๊ณต๊ฒฉ์ž๋Š” ๋น„๋ฐ€๊ฐ’ rax๋ฅผ ์•Œ๊ฒŒ ๋œ๋‹ค.

๋ฉœํŠธ๋‹ค์šด ์ทจ์•ฝ์ ์€ ์œ ์ €๋ชจ๋“œ์—์„œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋ฌด๋‹จ์œผ๋กœ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋งค์šฐ ์‹ฌ๊ฐํ•œ ์ทจ์•ฝ์ ์ด๋‹ค. ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ๋น„์ˆœ์ฐจ์  ๋ช…๋ น ์‹คํ–‰ ๊ธฐ๋ฒ•์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•œ ์ทจ์•ฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์„ฑ๋Šฅ ์ €ํ•˜๊ฐ€ ๋ถˆ๊ฐ€ํ”ผํ•˜๋ฉฐ, ๋™์‹œ์— ํ”„๋กœ์„ธ์„œ ๋ ˆ๋ฒจ์˜ ์ทจ์•ฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„ ์ฐจ์›์—์„œ๋„ ์กฐ์น˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.

Spectre

Spectre Attacks: Exploiting Speculative Execution.

์ŠคํŽ™ํ„ฐ๋Š” ์ธํ…”, 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) ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ง์ ‘ ํ•ด๋‹น ๊ตฌ๋ฌธ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ธŒ๋žœ์น˜ ์˜ˆ์ธก์„ ์ด์šฉํ•œ๋‹ค.

  1. ํ”„๋กœ์„ธ์„œ๊ฐ€ ์กฐ๊ฑด๋ฌธ์˜ ์กฐ๊ฑด์„ ์ฐธ์œผ๋กœ ์˜ˆ์ธกํ•˜๋„๋ก ์œ ๋„ํ•œ๋‹ค. (์กฐ๊ฑด์ด ์ฐธ์ธ ์ƒํ™ฉ์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๋ฐ˜๋ณตํ•œ๋‹ค.)
  2. ์ด์ œ ์กฐ๊ฑด์ด ๊ฑฐ์ง“์ด ๋˜๋„๋ก ํ•˜๋ฉด ๋ธŒ๋žœ์น˜ ์˜ˆ์ธก์ด ์‹คํŒจํ•œ๋‹ค. ์ฝ”๋“œ์ƒ์œผ๋กœ๋Š” ์กฐ๊ฑด๋ฌธ ๋‚ด๋ถ€์˜ ๋ช…๋ น์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ, ์ถ”์ธก ์‹คํ–‰์œผ๋กœ ์ธํ•ด ์‹ค์ œ๋กœ๋Š” ๋ช…๋ น์ด ์‹คํ–‰๋œ๋‹ค.
  3. ์˜ˆ์ธก์ด ์‹คํŒจํ–ˆ์œผ๋ฏ€๋กœ ํ”„๋กœ์„ธ์„œ๋Š” ์‹คํ–‰ํ•œ ๋ช…๋ น์„ ๋˜๋Œ๋ฆฐ๋‹ค. y์—๋Š” ์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.
  4. ๋ช…๋ น์ด ์ทจ์†Œ๋˜๊ธฐ๋Š” ํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ทจ์†Œ๋œ ๋ช…๋ น์ด ์ ‘๊ทผํ•œ ๋ฐ์ดํ„ฐ k * 4096์€ ์บ์‹œ์— ์˜ฌ๋ผ๊ฐ€ ๋‚จ์•„์žˆ๊ฒŒ ๋œ๋‹ค. ์ด๋•Œ k๋Š” ํ—ˆ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ ๋ฒ”์œ„๋ฅผ ๋„˜๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ”„๋กœ์„ธ์Šค์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
  5. ๋ฐ์ดํ„ฐ์— ์ง์ ‘ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ณต๊ฒฉ์ž๋Š” ์บ์‹ฑ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ด์šฉํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” array2์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋ฌด์ž‘์œ„๋กœ ์ ‘๊ทผํ•˜๋ฉด์„œ ์ ‘๊ทผ ์‹œ๊ฐ„์„ ์ธก์ •ํ•œ๋‹ค. ์ ‘๊ทผ ์‹œ๊ฐ„์ด ํŠนํžˆ ์งง์€ ๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ, ์ด๋Š” ์ถ”์ธก ์‹คํ–‰์œผ๋กœ ์บ์‹ฑ๋œ k * 4096๋ฅผ ๋œปํ•œ๋‹ค. ๋ฉœํŠธ๋‹ค์šด ์ทจ์•ฝ์ ์„ ๊ณต๊ฒฉํ•  ๋•Œ ์‚ฌ์šฉํ•œ ๋ฐฉ๋ฒ•๊ณผ ๋™์ผํ•˜๋‹ค.

์ŠคํŽ™ํ„ฐ ์ทจ์•ฝ์  ๊ณต๊ฒฉ์„ ์œ„ํ•ด์„œ๋Š” ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค ๋‚ด์—์„œ ํ™œ์šฉํ•  ์ฝ”๋“œ ๋ธ”๋ก์ธ ๊ฐ€์ ฏ(Gadget)์„ ์ฐพ์•„์•ผ ํ•  ๋ฟ๋”๋Ÿฌ, ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” x๋ฅผ ์„ค์ •ํ•˜๋ ค๋ฉด ๊ณต๊ฒฉ ๋Œ€์ƒ ๋จธ์‹ ์˜ VA(Virtual address)์™€ PV(Pysical address) ๊ด€๊ณ„๋„ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๊ณต๊ฒฉํ•˜๊ธฐ๋Š” ์–ด๋ ค์šด ์ ์ด ๋งŽ๋‹ค. ํ•˜์ง€๋งŒ ์ด ์—ญ์‹œ ์‹ฌ๊ฐํ•œ ์ทจ์•ฝ์ ์ž„์€ ํ‹€๋ฆผ์—†๋‹ค.

References