Abstract
Introduction
Background
Out of oreder excution
- In practice, CPUs supporting out-of-order execution allow running operations speculatively to the extent that the processorโs out-of-order logic processess instructions before the CPU is certain that the instruction will be needed and committed.
- In this paper, we refer to speculative execution in a more restricted meaning, where it refers to an instruction sequence following a branch, and use the term out of order execution to refer to any way of getting an operation executed before the processor has committed the results of all prior instructions.
- For dynamic scheduling of instructions to allow out-of-order execution
- A unified reservation station allows a CPU to use a data value as it has been computed instead of sorting it in a register and re-reading it.
- The reservation station renames registers to allow instructions that operate on the same physical registers to use the last logical one to solve read-after-write, WAR, WAW hazards
MULTD F4,F2,F2
ADDD F2,F0,F6(X)
ADDD F8,F0,F6(Dependency on F2 donโt occur)
- ์ํผ ์ค์นผ๋ผ์ ๊ฐ์ด CPU ๋ด์ ํ์ดํ ๋ผ์ธ์ 4๊ฐ์์~5๊ฐ ๋๋ ๋ช
๋ น์ด๋ค์ด ๊ฐ์ด ํจ์น ๋๊ฒ๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ช ๋ น์ด๋ค์ ๋ง์ดํฌ๋ก์ต์ค์ ์ํด ๋์ฝ๋ฉ ๋์ด์ง๊ณ Reorder Buffer๋ก ๋ณต์ฌ๊ฐ ๋์ด์ง๋ค.
- ์ด๋ Reorder Buffer์์ ์์กด์ฑ์ด ์๋ ๋ ์ง์คํฐ๋ค์ renaming ํด์ฃผ๋ ๋ฑ์ ๊ณผ์ ์ ์งํํด์ฃผ์ด in-order์์ out-of-order๋ก ์ต์ ํ๋ ๋ช ๋ น์ด ์ํ์ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ queue(Unified Reservation Station)์ ๋ค์ด๊ฐ๊ฒ ๋ ๋ ์๋์ ์์์ ๋ง๊ฒ ์ ๋ ฌ์ด ๋์ด์ง๋ค.
Speculative excution
- ์ด๋ out-of-order์ ๋ค๋ฅธ excution์ด๋ค.
IF( CONDITION ){ } ELSE { }
์์, ์ถ์ธก์คํ์ด๋ CONDITION์ด ๋ง๋ค๋ ๊ฐ์ ํ์ CONDITION์์ BODY๋ฅผ ์คํ์ํค๋ ๋ช ๋ น์ด์ด๋ค.
- Out of order excution๊ณผ ๊ตฌ๋ถ์ด ํ์ํ๋ค.
Cache Attacks
A Toy Example
raise_exception();
access(probe_array[data * 4096])
- ์ด ๊ณผ์ ์์ ์ง์คํด์ผํ๋ ๊ฒ์ data์ * 4096๋ฒ์ง๋ฅผ ๊ณฑํ ๊ฒ์ด๋ค. ๊ทธ ์ด์ ๋ flush+reload์์ ์์ด๋์ด๋ฅผ ์ป์ ์ ์๋ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, prefetch๋๋ฌธ์ด๋ค. flush+reload์์ ๋ก๋ํ๋ ๊ณผ์ ์์ ํ์ด์ง ๋จ์๋ก ๋ก๋๋ฅผ ํ๊ธฐ ๋๋ฌธ์ ์ ํํ ์ด๋ ๊ณณ์ ์ ๊ทผ์ ํ๋์ง์ ๋ํด์ ํ์ ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ์ ๊ทธ๊ฒ์ ๋ง์์ฃผ๊ณ ์ data์ 4096์ ๊ณฑํ์ฌ ์ํ๋ ์ปค๋ ์ฃผ์(๋ฐ์ดํฐ)์ ๊ฐ์ ํ์ ํ๊ธฐ ์ฉ์ดํ๊ฒ ๋ง๋ค ์ ์๋ค.
- ์ฒซ๋ฒ์งธ ๋ผ์ธ์์ ์๋๋๋ก๋ผ๋ฉด EXCEPTION์ด ๋ฐ๋๋์ด, ๋๋ฒ์งธ ๋ช ๋ น์ด๊ฐ ์คํ์ด ๋๋ฉด ์๋๋ค.
- ํ์ง๋ง ์ํผ์ค์นผ๋ผ์ ์ํด์ ๋๊ฐ์ง์ ๋ช ๋ น์ด๊ฐ ๊ฐ์ด ํ์น๋์ด, Reorder Buffer์์ ๋๊ฐ์ ๋ช ๋ น์ด๋ค ์คํ์ด ๊ฐ๋ฅํ ์ํ๋ก ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํ๋ค.
- ๊ทธ๋ ๊ฒ ๋๋ฉด ์ด๋ฏธ ์ ๊ทผํ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ํ์ด์ง๋ค์ด ์บ์์ ์ฌ๋ผ์์๊ฒ ๋๊ณ , ์คํ๋ probe_array์ ๋ชจ๋ ํ์ด์ง๋ค์ Flush+Reload๋ฅผ ์งํํ๊ฒ๋๋ฉด data์ ํน์ ํ์ด์ง์ ๋ํ ์ ๊ทผ๋ง ๋น ๋ฅด๊ฒ ๋จ์ผ๋ก ์ด๋ ํ์ด์ง๊ฐ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ ๋์๋์ง๋ฅผ ํ์ธํ ์ ์๊ฒ๋๋ค.
- access์ ๊ฐ์ด ์ผ์์ ์ผ๋ก ์กด์ฌ๋๋ ๋ช ๋ น์ด๋ค์ transient instruction์ด๋ผ ๋ถ๋ฅธ๋ค.
- ๋น๋ฐ ๊ฐ์ ์ ์ถ์ํค๊ธฐ ์ํด์๋ transient instruction์ด ๊ณต๊ฒฉ์๊ฐ ์ ์ถ์ํค๊ธฐ ์ํ๋ ๋น๋ฐ ๊ฐ์ ์ด์ฉํ๊ณ ์์ด์ผ๋งํ๋ค.
Building Blocks of the Attack
- Meltdown ๊ตฌํ์ ์ฒซ๋ฒ์งธ block์์๋ transient instruction์ ์คํ์ด ์๊ณ , CPU๊ฐ ๊ฒฝํ์ ์ง์์๊ฐ์ ์ต์ ํ ์ํค๊ธฐ์ํด์ ๊ณ์์ ์ผ๋ก ํ์ฌ ๋ช ๋ น์ด ์์์ ์คํ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์๊ฐ์ ์ผ์ด๋๋ค.
- Transient Instuction์ ๋ง์ฝ ๊ทธ๋ค์ operation์ด secret value๋ฅผ ๊ฐ๊ณ ์๋ค๋ฉด side channel attack์ ์คํ์ํฌ ์ ์๋ค.
- userspace์์ kernel space๋ฅผ ์ ๊ทผํ๋ ์ฃผ์๊ฐ์ด์ฌ์ผ ํ๊ณ , kernel space์ธ ์ด์ ๋ kernel address space์์๋ ๋ชจ๋ physical memory๋ก์ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ด๋ค.
- ํ์ง๋ง userspace์์ kernelspace๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ ์์ธ์ฒ๋ฆฌ๋ฅผ ๋ฐ์์ํค๊ณ ๋ฐ๋ก ์ดํ๋ฆฌ์ผ์ด์ ์ด ์ข ๋ฃ๋๋๋ก ๋ง๋ค์ด๋ฒ๋ฆฐ๋ค. ๊ทธ๋ ๊ธฐ์ ์์ธ์ฒ๋ฆฌ๊ฐ ๋ฐ์๋๋๋ผ๋ ๊ทธ๊ฒ์ ๋ค๋ฃฐ ์ ์๋ ๊ณผ์ ์ด ์์ด์ผ๋ง ๊ณต๊ฒฉ์๋ Secret value๋ฅผ ๋์ถ์ํฌ ์ ์๋ค.
Excuting Transient Instructions
- ์๋๋๋ก๋ผ๋ฉด exception์ด ๋ฐ๋๋์์๋ ๋ฐ๋ก ๊บผ์ ธ์ผ ํ๋๋ฐ ๋ฐ๋ก ๊บผ์ง์ง ์๊ฒ ์ด๋ป๊ฒ ํ ๊น?
- Exception handling: ์์ธ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋ ํ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ
- ์ ํจํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ์ ์ ๊ทผํ๊ธฐ ์ ์ ๊ณต๊ฒฉํ๋ ์ค์ธ application์ forkํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ child process์์๋ง ์ ํจํ์ง ์๋ ๋ฉ๋ชจ๋ฆฌ ์์น๋ก ์ ๊ทผํ๋ ๊ฒ์ด๋ค.
- CPU๋ transient instuction sequence๋ฅผ child process์์ ์ถฉ๋๋๊ธฐ์ ์ ์คํํ๋ค.
- Parent Porcess๋ Microarchitectural state(side-channel)๋ฅผ ๊ด์ฐฐํจ์ผ๋ก์จ secret value๋ค์ ๋ณต๊ตฌํ ์ ์๋ค.
- ํน์ ํ ์์ธ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋ฌ์ ๋ ์ํ๋๋ Signal handler๋ฅผ ์ค์นํ๋ ๊ฒ์ผ๋ก๋ ๊ฐ๋ฅํ๋ค.
- ๊ณต๊ฒฉ์๊ฐ ๋ช ๋ น์ด๋ค์ sequence๋ฅผ ๋ฐํํ๋๋ก ํ๊ณ , ๊ทธ๋ฆฌ๊ณ crash๋ก๋ถํฐ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง์์ผ๋ก์จ ์๋ก์ด ํ๋ก์ธ์ค๋ฅผ ์์ฑํ์ง ์๊ธฐ ๋๋ฌธ์ overhead๋ฅผ ์ค์ผ ์ ์๋ค. 2. Exception suppression: ์์ธ์ฒ๋ฆฌ๊ฐ ์ผ์ด๋๋ ๊ฒ์ ๋ง๊ณ ๊ทธ๋ฆฌ๊ณ control flow๋ฅผ redirectํ๋ ๋ฐฉ๋ฒ
- ์ฒ์ ๋ฌธ์ ๊ฐ ์ ๊ธฐ๋๋ ๊ฒ์์๋ถํฐ ์์ธ์ฒ๋ฆฌ ํ ๊บผ์ง๋ ๊ฒ์ ๋ง์๋ฒ๋ฆฌ๋ ๋ฐฉ๋ฒ
- Transaction memory๋ ๋ฉ๋ชจ๋ฆฌ Access๋ฅผ ํ๋์ ์์ ์๋์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ๊ทธ๋ฃนํ ํด์ฃผ์ด, ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ทธ ์ด์ ์ ์ํ๋ก ๋์๊ฐ ์ ์๋๋ก option์ ์ ๊ณตํด์ค๋ค.
- ๋ง์ฝ ์์ธ์ฒ๋ฆฌ๊ฐ Transaction์์ ๋ฐ์๋๋ค๋ฉด, architectural state๋ ์ด๊ธฐํ๋๊ณ , ๊ทธ๋ฆฌ๊ณ ํ๋ก๊ทธ๋จ ์คํ์ ๋ฐฉํด์์ด ์ง์๋๋ค.
- Speculative execution์ branch misprediction๋๋ฌธ์ ์คํ๋ ์ฝ๋ path์์ ์คํ๋์ง ์์ ๊ฒ ๊ฐ์ ๋ช ๋ น์ด๋ฅผ ๋ฐ์์ํจ๋ค.
- ์ด์ ์กฐ๊ฑด branch๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ฐ๋ฅด๋ ์ด๋ฌํ ๋ช ๋ น์ด๋ค์ ์ถ์ธก์ ์ผ๋ก ์คํ๋๋ค.
- ๊ทธ๋ผ์ผ๋ก, ์ ํจํ์ง ์์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผ์ (๋จ์ง ์ด์ ์ branch condition์ด true์ด๊ธฐ์ ์คํ์ด ๋์๋) ์ถ์ธก๋ช ๋ น์ด๋ค์ ์ํด์ ์คํ๋์ด์ง๋ค.
- condition๋ค์ด ์คํ ์ฝ๋์์ ๊ฒฐ์ฝ true๋ผ๊ณ ํ๊ฐํ์ง ์์ ๊ฒ์ด๋ผ ํ์ ์ด๋ค๋๋ก ๋ง๋ฆ์ผ๋ก์จ ์ฐ๋ฆฌ๋ ์ผ์ด๋๋ ์์ธ๋ค(๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ด ๋จ์ง ์ถ์ธก์ ์ด๊ฒ ์คํ๋์ด์ง๋)์ ์ต์์ํฌ ์ ์๋ค.
Building a Covert Channel
- ๋๋ฒ์งธ Meltdown block์ ๋ณด๊ฒ๋๋ฉด transient instruction์ด ๋ง์ง๋ง์๋ microarchitectual covert channel์ ํตํด ์ ๋ณด๋ฅผ ๋ณด๋ด๊ณ ์๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
- covert channel์ ๋์์ ๋ฐ๋ ๊ฒ์ microarchitectural์ ๋ณํ๋ฅผ ๋ฐ๋ ๊ฒ์ด๊ณ state๋ก๋ถํฐ secret์ ์ถ์ ํ ์ ์๊ฒ ํ๋ ๊ฒ์ด๋ค.
- ๋ฐ๋ ๊ณณ์ transient sequence์ ๋ถ๋ถ์ด ์๋์ ์ฃผ๋ชฉํ๊ณ ๋ค๋ฅธ ์ฐ๋ ๋, ๋๋ ํ๋ก์ธ์ค๊ฐ ๋ ์ ์๋ค. (์๋ฅผ๋ค์ด fork์์ parents process)
- ์ฐ๋ฆฌ๋ค์ Cache attack์ผ๋ก๋ถํฐ ๊ธฐ์ ๋ค์ ์ํฅ๋ ฅ์๊ฒ ํ๋ค. ์๋ํ๋ฉด cache state๋ ๋ค์ํ ๊ธฐ์ ๋ค์ ์ฌ์ฉํด์ architectual state๋ฅผ ๋ฏฟ์ ์ ์๊ฒ ์ ์ก๋์ด์ง ์ ์๋ microarchitectural state์ด๊ธฐ ๋๋ฌธ์ด๋ค.
- ํนํ ์ฐ๋ฆฌ๋ F+R์ ์ฌ์ฉํ๊ณ , secret value์ ๋ฐ๋ผ์ transient instruction sequence๋ regular memory access๋ฅผ ์ํํ๋ค.
- trasient instruction sequence๊ฐ ์ ๊ทผํ ์ ์๋ ํ์ด์ง์ ์ ๊ทผํ ํ์(covert channel์ sender์ ์คํํ ํ์), ์ฃผ์๋ subsequent access๋ฅผ ์ํด cached ๋์ด์ ธ์๋ค.
- receiver๋ ์ด๊ฒ์ ๊ฐ์ํ ์ ์๋ค. ์ฃผ์๊ฐ cache์ load๋์๋์ง ์๋์๋์ง๋ฅผ, ์ฃผ์์ access time์ ์ธก์ ํจ์ผ๋ก์จ(FR์ ๊ฐ๋ )
- ๊ทธ๋ผ์ผ๋ก sender๋ ์ฃผ์์ ์ ๊ทผํจ์ผ๋ก์จ 1์ ๋ณด๋ผ ์ ์๊ณ ์ฃผ์์ ์ ๊ทผํ์ง ์์์ผ๋ก์จ 0์ ๋ณด๋ผ ์ ์๋ค.
- in toy example
- ๋ค์์ ๋ค์ํ ์ข ๋ฅ์ cache line๋ค์ ์ฌ์ฉํจ์ผ๋ก์จ ํ๋ฒ์ multibit์ ์ ์กํ ์ ์๋ค.
- ๋ชจ๋ 256 different byte value๋ฅผ ์ํด sender๋ ๋ค๋ฅธ cache line์ ์ ๊ทผํ ์ ์๋ค.
- 256 ๊ฐ๋ฅํ ๋ชจ๋ cache๋ผ์ธ๋ค์ Flush+Reload ๊ณต๊ฒฉ์ ์งํํจ์ผ๋ก์จ receiver๋ ํ๋นํธ๊ฐ ์๋ ๋ชจ๋ ๋นํธ๋ฅผ ๋ณต๊ตฌํ ์ ์๋ค.
- ํ์ง๋ง F+R ๊ณต๊ฒฉ์ ๋งค์ฐ ๊ธธ๊ธฐ ๋๋ฌธ์, ํ๋ฒ์ ํ๋นํธ๋ง ๋ณด๋ด๋ ๊ฒ์ด ๋ ํจ๊ณผ์ ์ด๋ค.
- ๊ณต๊ฒฉ์๋ ๊ฐ๋จํ๊ฒ secret value๋ฅผ ๋ณ์กฐํ๊ณ ๋ณํ ์ํฌ ์ ์๋ค.
- ๋ค๋ฅธ instruction์ ๊ฐ๊ณ covert channel ๋ง๋ค๊ธฐ
- covert channel์ ๋จ์ง cache์ ์์กด๋์ด์ง microachitectural์ ์ ํ๋์ด ์์ง์๋ค.
- ๋ชจ๋ mircroarchitectual state๋ instruction์์ํด ์ํฅ๋ฐ์์ง ์ ์๊ณ side channel(covert channel์ ๋ง๋ค ์ ์๋)์ ํตํด ๊ด์ธก๋์ด์ง ์ ์๋ค.
- ์๋ฅผ๋ค์ด 1bit์ ๋ณด๋ด๊ธฐ ์ํด์ ALU์ ๊ฐ์ ์คํ port(?)๋ฅผ ์ ๋ นํจ์ผ๋ก์จ covert channel์ ๋ง๋ค ์ ์๋ค.
- receiver๋ ๊ฐ์ ๋ช ๋ น์ด port์์ instruction์ ์คํํ ๋ latency๋ฅผ ์ธก์ ํ ์ ์๋ค. ๋์ latency๋ 1bit๋ฅผ sender๊ฐ ๋ณด๋์์ ๋งํด์ฃผ๊ณ , ๋ฎ์ latency๋ 0์ ๋ณด๋์์ ์ ์ ์๋ค.
- ๊ทธ๋ผ์ผ๋ก F+R์ ์ฅ์ ์ ๋ ธ์ด์ฆ๊ฐ ์ ๊ณ ๋์ ์ ๋ฌ์ฑ์ ๊ฐ๊ณ ์๋ค.
- ๋ชจ๋ cpu์ฝ์ด๋ก ๋ถํฐ ๋์๋ค์ ๊ด์ธกํ ์ ์๋ค.
Meltdown
1 ; rcx = kernel address, rbx = probe array
2 xor rax, rax
3 retry:
4 mov al, byte [rcx]
5 shl rax, 0xc
6 jz retry
7 mov rbx, qword [rbx + rax]
- ์ด๋ฒ ์ฅ์์๋ ๊ถํ์ด ์๋ user program์์ ์์์ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฝ๋ ๊ฐ๋ ฅํ ๊ณต๊ฒฉ์ธ meltdown์ ์๊ฐํ๋ค.
- ์ฒซ๋ฒ์งธ๋ก ์ด ๊ณต๊ฒฉ์ ๋์ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ ๊ฐ์กฐํ๊ธฐ ์ํ Attack Setting์ ๋ํด์ ์ค๋ช ํ๋ค.
- ๋๋ฒ์งธ๋ก ์ด๋ป๊ฒ ์๋์ฐ,๋ฆฌ๋ ์ค,๋ฑ์ ๊ฐ์ธ ์ปดํจํฐ ๊ทธ๋ฆฌ๊ณ ์๋๋ก์ด๋ ๋ชจ๋ฐ์ผํฐ, ํด๋ผ์ฐ๋์์ meltdown์ด mount๋ ์ ์๋์ง ๋งํ๋ค.
- ๋ง์ง๋ง์ผ๋ก meltdown ๊ตฌํ์ด kernel memory๋ฅผ ๋น ๋ฅธ ์๋๋ก dumpํ๋ ๊ฒ์ ๋ํด์ ๋งํ๋ค.
- Attack setting
- ๊ฐ์ธ์ปดํจํฐ์ ๊ฐ์ ๋จธ์ ์ ํด๋ผ์ฐ๋์ ์๋ค๋ ๊ฐ์
- ๊ณต๊ฒฉ์๋ ์์์ ๊ถํ์ด ์๋ ์ฝ๋ ์คํ์ ๊ฐ๊ณ ์๋ค๋ ๊ฐ์ (์ฆ, ๊ณต๊ฒฉ์๋ ์ผ๋ฐ ์ ์ ์ ๊ถํ๋งํผ ์ด๋ค ์ฝ๋๋ฅผ ์คํํ ์ ์๋ค)
- ๊ณต๊ฒฉ์๋ ๋ฌผ๋ฆฌ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ํ์ง ๋ชปํ๋ค๋ ๊ฐ์
- ์์คํ ์ ์ต์ ์ํ์ ๋ณด์(ASLR,KASLR,SMAP..)์ ์ํ
- ๋ฒ๊ทธ๊ฐ ์๋ os์ด๊ณ , kernel์ฃผ์๋ฅผ ์ ๊ทผํ๋ ๊ฒ์ ์ทจ์ฝ์ ์ด ์๋ ์ํ์ด์ด์ผํจ
- ๊ณต๊ฒฉ์์ ์ต์ข ๋ชฉํ๋ ์ ์ ์ ๋ฐ์ดํฐ(password,private key)๋ฑ์ ์ถ์ถํ๊ณ ์ ํจ