Rowhammer 관련 간단한 기록 (1)

dusty
24 min readSep 18, 2022

Rowhammer 공격은 14년 IEEE ISCA에서 발표된 논문 [1] 이후, 15년 구글의 프로젝트 제로 팀에서 발표한 리눅스 LPE 및 Chrome NaCl Sandbox Escape [2] 등 다양한 익스플로잇에 사용되고 있습니다.

이 글에서는 Rowhammer 공격이 어떠한 이유로 가능한지, 최초 발견 및 익스플로잇 이후 어떤 미티게이션이 제안, 적용되었는지 등에 대해 간략히 다루려고 합니다. (제가 20년도에 학부연구생으로 있으면서 적어둔 내용 등을 모아서 간단히 정리한 글로, 22년 현재의 최신 기법 및 트렌드 등에 대해 자세히 다루지는 못했습니다…)

글 끝부분에 See Also가 있는데 이 글보다는 거기 있는 강의나 아티클이 도움이 더 많이 될 것 같습니다…

1. DRAM이 데이터를 저장하는 방법

Rowhammer 공격이 어떤 식으로 이루어지는지 이해하려면 우선 DRAM 하드웨어의 구조에 대한 간단한 이해가 필요합니다.

Fig 1. DRAM에 데이터를 저장하는 가장 작은 단위인 cell 및 2차원 배열 형태의 구조 [1]

DRAM은 여러 개의 cell이 2차원 배열 형태로 이루어진 구조를 가지고 있습니다. cell은 데이터를 저장하는 커패시터 1개와 트랜지스터 1개로 구성됩니다. (이 때 전하가 충전된 상태를 1로, 방전된 상태를 0으로 표현하는 cell을 true-cell, 반대로 충전된 상태를 0으로, 방전된 상태를 1로 표현하는 cell을 anti-cell로 부릅니다.) 같은 row끼리는 동일한 wordline에 연결되고, 같은 column은 동일한 bitline에 연결되어 있습니다.

Wordline에 전압이 가해지면 해당 row 전체의 access-transitor가 작동하고, bitline이 row-buffer에 연결됩니다. Row-buffer는 커패시터 내의 전하를 증폭하는 sense amplifier 등으로 구성되어, bitline을 통해 인출된 데이터를 저장하게 됩니다. 이때 cell을 구성하는 커패시터는 충전된 전하를 잃게 되므로, 데이터를 잃지 않기 위해 row의 cell들을 재충전하는 작업이 필요합니다.

Row-buffer는 CPU의 cache와 유사하게 동작하여, 동일한 row에 대한 접근은 매번 cell에서 데이터를 인출할 필요 없이 row-buffer에서 바로 이루어집니다.

Row에서 데이터를 인출하는 경우 외에도 cell의 커패시터는 시간이 지나면 충전된 전하를 잃게 됩니다. 따라서 DRAM은 주기적으로 cell의 전하를 충전하는 작업(refresh)을 하게 됩니다. DRAM의 세대나 종류 등에 따라 달라질 수 있지만, 일반적으로 64ms의 주기를 가지며 이를 tREF(또는 tREFI — 각각 refresh, refresh interval의 약어)로 부릅니다.

특정 Wordline의 전압이 반복적으로 토글되면, 인접한 다른 row의 cell들이 훨씬 빠르게 충전된 전하를 잃고, tREF보다 빨리 전하를 잃는 경우 cell에 저장된 데이터를 잃게 됩니다. Rowhammer는 이러한 DRAM 하드웨어의 특성을 이용하는 공격입니다.

목표로 하는 데이터를 직접 액세스하지 않고 인접한 row를 반복적으로 접근하는 방식으로 데이터에 에러를 주입할 수 있으므로, 주로 write-primitive로 사용되게 됩니다. (DRAM 하드웨어의 다른 특성과 조합하여 Rowhammer를 read-primitive로 이용한 공격 [3] 또한 존재하며, 이에 대한 내용은 뒤에서 마저 다루겠습니다.)

2. Double-sided Rowhammer

Fig 2. Double-sided Rowhammer 관련 그림 ([2]에 대한 BlackHat 발표에서 인용)

Rowhammer 공격은 대상이 되는 row와 인접한 row를 반복적으로 접근하는 방식으로 이루어지게 됩니다. 이 때 대상이 되는 row 바로 위와 아래의 2개 row를 번갈아서 반복적으로 액세스하는 공격을 Double-sided Rowhammer라고 부릅니다.

Fig 2에서 보라색으로 표시된 row가 공격의 대상이 되고, 바로 위와 아래에 위치한 노란색 row를 번갈아서 액세스해서 공격을 진행하게 됩니다.

3. Virtual Address에서 DRAM Internal Address까지

Rowhammer를 이용한 익스플로잇의 성공 확률을 높이기 위해서는, 대상으로 하는 데이터가 어느 row에 있는지, 인접한 row를 접근하려면 어떻게 해야하는지 등을 알아야 합니다.

Fig 3. OS에서 사용하는 메모리 주소와 실제 DRAM에서 사용하는 주소의 관계를 나타낸 그림 [4]

OS에서 실행되는 프로그램은 Virtual Address를 사용하게 됩니다. 이는 OS를 통해 Physical Address로 변환되고, CPU 내의 메모리 컨트롤러를 거쳐 DRAM 모듈(DIMM)에서 사용하는 DDR Logical Address로 변환됩니다. (Channel, Rank, Bank Group 및 Bank 등 — DDR 세대마다 구성이 조금씩 다릅니다.) DDR Logical Address는 각각의 DRAM 모듈 내에서 DRAM Internal Address로 변환되어 사용됩니다. (row 및 column 등)

Physical Address를 CPU 메모리 컨트롤러가 DDR Logical Address로 변환하는 방법에 대한 정보는 과거 AMD 불도저 아키텍쳐 등의 경우 공개한 적이 있지만(https://www.amd.com/system/files/TechDocs/50742_15h_Models_60h-6Fh_BKDG.pdf), 현재는 Intel과 AMD 양사 모두 관련 정보를 공개하지 않는 상태입니다.

DRAM Internal Address의 경우 DRAM 패키지(칩) 제조사 및 생산 주차, 모듈 제조사 등에 따라 각각의 모듈 내에서 remapping을 진행하기도 합니다. DDR3 표준에 존재하는 Rank Address Mirroring 이외에도 제조사에 따라 공개되지 않은 다양한 커스텀 리매핑을 사용합니다. [5]

4. Rowhammer를 이용한 다양한 익스플로잇

구글 프로젝트 제로 팀은 2015년 PTE를 대상으로 Rowhammer를 이용하여 리눅스 환경에서 LPE (Local Privilege Escalation) 및 Chrome의 NaCl Sandbox를 이스케이프하는 두 가지 익스플로잇 [2] 을 성공했습니다.

해당 익스플로잇과 관련하여 리눅스 LPE의 경우 커널 4.0 이후 /proc/PID/pagemap 인터페이스를 이용하는데 CAP_SYS_ADMIN 권한을 필요로 하게 되었으며 (https://github.com/torvalds/linux/blob/v4.9/Documentation/vm/pagemap.txt), 크롬 NaCl 이스케이프의 경우 샌드박스 내에서 사용 가능한 명령어에서 clflush 명령어를 제외하는 식의 미티게이션이 이루어졌습니다.
(clflush 명령어는 지정된 주소가 캐시에 존재하는 경우 이를 포함하는 cacheline을 flush하는 명령으로, x86_64에서는 유저 권한에서도 실행이 가능합니다.)

왜 CPU 캐시를 flush하는 명령이 Rowhammer에 연관이 있는지 잠시 짚고 넘어가자면, 동일한 메모리 주소에 대해 반복적으로 접근하는 경우, 이 주소의 데이터는 CPU의 캐시에 저장되어 연속된 요청이 메모리 액세스로 이어지지 않고, CPU 캐시를 읽어오는 작업으로 끝나기 때문입니다. (x86_64 아키텍쳐의 clflush 명령어의 경우 Rowhammer 이외에도 FLUSH+RELOAD, FLUSH+FLUSH 등 cache side channel 공격에서 자주 사용되는 명령어입니다.)
(참고: ARMv7 아키텍쳐의 경우 clflush와 동일한 기능을 하는 단일 명령어가 없고, ARMv8의 경우 유사한 기능을 하는 명령어를 MSR을 통해 EL0에서 실행 허용 여부를 결정할 수 있습니다.)

이후 네이티브 코드의 실행 없이 브라우저 내의 JS 코드를 통해 Rowhammer 공격을 하는 연구 [6], ARM 및 LPDDR을 사용하는 모바일 플랫폼에서 공격을 진행하는 연구 [7], DDR Logical Addressing을 소프트웨어적으로 리버싱하는 방법 등을 제시한 연구 [8], 리눅스 커널의 KSM(Kernel Samepage Merging)을 이용한 공격 기법에 대한 연구 [9] 등의 후속 연구가 발표되었습니다. (여기서 언급하지 못하고 넘어가는 다른 좋은 연구 및 발표 또한 많습니다…)

5. RAMBleed — Rowhammer를 read-primitive로

거의 대부분의 공격과 달리, RAMBleed 공격 [3]은 Rowhammer로 인해 일어나는 bit-flip이 data-dependent하다는 점을 이용하여 직접 접근하지 않은 메모리의 내용을 유출하는 공격입니다.

이 연구에서는 Rowhammer 공격을 통해 cell의 커패시터가 전하를 잃을 때, 인접한 row의 cell이 방전된 상태인 경우 cell이 전하를 잃는 현상이 발생할 가능성이 높다는 점을 이용합니다. True-cell을 예시로 하면, 같은 column의 인접한 세 cell이 0–1–0일때 0인 두 cell이 포함된 row를 번갈아 액세스하는 식으로 Rowhammer 공격을 진행할 때 bit-flip이 일어나 0–0–0으로 오류가 발생할 가능성이 높다는 뜻입니다. (즉, anti-cell의 경우 1–0–1일때 1–1–1로 오류가 발생할 가능성이 높습니다.)

Fig 4. Frame Feng Shui 기법을 이용해 OpenSSH 대몬에 RAMBleed 공격을 진행하는 과정 [3]

해당 연구에서는 Frame Feng Shui 라고 명명한 기법을 통해 Linux 커널의 buddy allocator의 특성을 이용하여 huge page의 사용 없이도 공격자가 원하는 대로 (physical) 메모리 레이아웃을 컨트롤하여, Rowhammer를 진행합니다.

Fig 4d에서 볼 수 있듯, 유출하려는 Secret (S)가 Sampling Page (A1)의 바로 위 row와 아래 row에 존재하도록 FFS를 진행한 다음, 공격자가 Row Activation Page A0과 A2를 번갈아 액세스하여 Rowhammer를 진행합니다. (A1 페이지의 내용은 true-cell일 경우 1, anti-cell일 경우 0으로 미리 채워둡니다.)
충분한 횟수만큼 액세스를 진행한 다음, Rowhammer 공격이 성공한 column의 cell은 전하를 잃어 bit-flip이 일어났을 것입니다. 공격자는 A1을 읽어 S의 일부를 추출하고, 이를 반복 및 다양한 key recovery method를 이용하여 S를 복원합니다.

6. 하드웨어 기반의 미티게이션

소프트웨어 레벨에서 Rowhammer를 방어하는 데에는 크고 작은 어려움이 있습니다. OS 레벨에서 사용하는 physical address를 DDR Logical Address 및 DRAM Internal Address로 변환하기 위해서는 하드웨어 제조사에서 공개하지 않는 정보가 필요하여, 하드웨어의 수정 또는 기능 추가 등 없이 Rowhammer 공격을 탐지하기 쉽지 않습니다.

ECC가 적용된 하드웨어를 사용하면 Rowhammer 공격의 난이도가 상승하기는 하나, 완벽하게 방어하기는 어렵습니다. DIMM 모듈에서 ECC를 적용하는 경우 교정 불가능한 에러가 발생할 때 시스템이 실행을 중단하게 되는데, 여러 방법을 통해 DIMM에 적용된 SECDED 구현을 리버싱하여 ECC 함수가 탐지할 수 없는 패턴의 오류를 주입하는 방식으로 Rowhammer 공격이 가능하다는 연구 결과가 존재합니다. [10]

Fig 5. Rowhammer 미티게이션 도입의 타임라인 [11].

ECC DIMM 외에도 다양한 하드웨어 레벨에서 방어 기법이 도입되었습니다. 알려진 미티게이션으로는 Intel Ivy Bridge-EP 시스템과 호환되는 DDR3 메모리를 사용할 경우 활성화되는 pTRR (pseudo-TRR, Target Row Refresh), Intel의 Broadwell-EP 시스템에서 적용된 2x Refresh Rate, DDR4 모듈 내에 적용된 TRR (Target Row Refresh) 등이 있습니다. [11] 이 중 pTRR2x Refresh Rate의 경우 메모리 컨트롤러에서(Fig 11의 in-MC), TRR의 경우 DRAM 모듈 내에서 구현되어 있습니다.

TRR은 액세스가 빈번한 row를 하드웨어에서 파악하여, 인접한 row가 전하를 잃고 데이터에 오류가 발생하기 전에 refresh를 진행하는 하드웨어 미티게이션입니다. 구현에 대해 하드웨어 제조사에서 자세한 정보를 제공하지 않으며, [11]에서 FPGA 등을 이용한 실험 등을 통해 구현에 따른 특징과 이를 우회한 새로운 Rowhammer 기법인 Many-sided Rowhammer (N-sided Rowhammer로도 불림), 이러한 패턴을 자동으로 탐색할 수 있는 Fuzzer 구현체인 TRRespass를 제시 및 공개했습니다. (https://github.com/vusec/trrespass)

이외에도 구현 방식 등이 명확히 알려지지 않은 Intel Hardware RHP가 존재합니다. [12]

1) Intel Hardware RHP

PARA (Probabilistic Adjacent Row Activation)은 [1]에서 제시한 하드웨어 기반의 미티게이션 기법으로, 하드웨어 추가를 통해 row 액세스가 일어날 때, 낮은 확률로 인접 row의 refresh를 진행하도록 하여 낮은 하드웨어 코스트로 Rowhammer 공격 성공률을 낮추는 기법입니다.

It appears that some very recent Intel memory controllers implement a limited variant of PARA, whose adjacent-row activation probability can be chosen by the user via modifications in the BIOS.

[12]에서는 당시 출시된 일부 Intel CPU의 메모리 컨트롤러에 PARA의 일종이 구현되어 있는 것으로 보인다는 내용이 있습니다. 문제는 해당 내용의 cite를 따라가보면 나오는 사진(https://twitter.com/isislovecruft/status/1021939922754723841)의 노트북이, 기성품이 아닌 ES CPU를 사용하여 중국에서 제작되어 판매되는 커스텀 메인보드라는 점입니다. (nb51 X210, 구형 씽크패드 마니아들을 위해 X201 섀시에 호환되는 최신 하드웨어를 적용한 커스텀 메인보드라는 것 같습니다…)

Fig 6. LG 14ZB990-GP70ML에서 Row Hammer Solution 옵션을 확인한 결과 1
Fig 7. LG 14ZB990-GP70ML에서 Row Hammer Solution 옵션을 확인한 결과 2

해당 옵션이 ES CPU에만 존재하는지 등이 궁금하여 찾아본 결과, 당시 제가 가지고 있던 LG의 14ZB990-GP70ML 노트북에서 동일한 옵션을 찾을 수 있었습니다. (Fig 6, 7은 EFI 셋업 화면에서 Ctrl + Alt + F7을 눌러 일반적으로 확인할 수 없는 추가 옵션을 볼 수 있는 상태에서 찍은 사진입니다.)

Fig 8. AMIBCP를 통해 ASRock Z390 Extreme 4 메인보드의 펌웨어에서 관련 옵션의 존재를 확인한 스크린샷

이외에도 여러 종류의 Intel Z390 메인보드의 펌웨어에서 동일한 옵션의 존재를 AMIBCP 툴을 통해 확인할 수 있었습니다.

선행 연구에서 Intel i5–9400 CPU의 일부 DRAM Address Mapping을 리버싱 한 정보와, 해당 펌웨어를 수정 후 리플래싱 하는 작업을 통해 해당 옵션을 임의로 변경하여, 미티게이션의 효과, RH Activation Probability 옵션 변경에 따른 성능 변화 등을 측정해보려 했으나, 당시 가지고 있는 롬 라이터의 문제인지 사용자 불량인지 잘 되지 않아 추가 작업을 진행해보지는 않았습니다…

(저는 컨수머 플랫폼 일부만 확인해보고 말았지만, Skylake-EP 및 Cascade Lake, Ice Lake 등 비교적 최신의 엔터프라이즈 / 서버 플랫폼에도 이와 유사한 기능이 존재하는지 등을 확인해보는 것도 재미있는 경험이 될 것 같습니다.)

7. DDR5: on-die ECC의 도입

JEDEC에서 DDR5 표준을 확정하면서, on-die ECC가 필수 스펙이 되었습니다. LPDDR4X 표준에 on-die ECC가 이미 추가되기는 했으나 이는 optional한 스펙이었던 것과 달리, DDR5는 반드시 적용해야 합니다.

on-die ECC (간혹 in-DRAM ECC로 칭하기도 함)는 기존 엔터프라이즈 하드웨어에서 자주 사용되는 ECC DIMM과 다르게, 각각의 DRAM 패키지(칩) 내에서 ECC를 구현한 방식입니다. 기존의 ECC DIMM과 다소 다른 개념이며, 메모리 컨트롤러의 지원 여부와 무관하게 동작하고, 에러 검출 및 교정 결과 등이 메모리 컨트롤러에 보고되지 않는 것으로 알고 있습니다.

이와 관련하여 기존 ECC DIMM의 ECC와 on-die ECC 등 여러 DRAM ECC에 대한 설명을 잘 해둔 아티클이 있습니다. https://www.synopsys.com/designware-ip/technical-bulletin/error-correction-code-ddr.html

마치면서…

너무 예전에 봤던 내용을 급하게 올리느라 글에 두서가 없네요…

DDR5 표준(JESD79–5)이 확정되기 전에 Rowhammer 관련 내용을 알아보던 것 같은데, 어느새 JESD79–5A가 나온 것 같습니다. 시간이 빠르네요…

본문에서 언급하지 못했지만 좋은 연구가 많고, 올해 IEEE S&P에는 Blacksmith라는 Rowhammer 관련 연구 및 Fuzzer가 발표된 것으로 알고 있습니다. (https://comsec.ethz.ch/research/dram/blacksmith/)

최근 엔터프라이즈 CPU 시장에 AMD Epyc 이외에도 Ampere A1 등이 많이 보이고, Apple이 M1 및 M2의 출시를 통해 ARM으로 이주를 성공적으로 진행하고 있는데 이런 점이 앞으로 Rowhammer 및 하드웨어 메모리 관련 사이드 채널 연구에 어떤 영향을 미칠 지 궁금해집니다.

See Also

References

[1] Yoongu Kim, Ross Daly, Jeremie Kim, Chris Fallin, Ji Hye Lee, Donghyuk Lee, Chris Wilkerson, Konrad Lai, and Onur Mutlu. 2014. Flipping bits in memory without accessing them: an experimental study of DRAM disturbance errors. SIGARCH Comput. Archit. News 42, 3 (June 2014), 361–372. https://doi.org/10.1145/2678373.2665726

[2] M. Seaborn and T. Dullien. 2015. Exploiting the DRAM rowhammer bug to gain kernel privileges. https://googleprojectzero.blogspot.com/2015/03/exploiting-dram-rowhammer-bug-to-gain.html

[3] A. Kwong, D. Genkin, D. Gruss and Y. Yarom, “RAMBleed: Reading Bits in Memory Without Accessing Them,” 2020 IEEE Symposium on Security and Privacy (SP), 2020, pp. 695–711, doi: 10.1109/SP40000.2020.00020. https://rambleed.com

[4] L. Cojocar et al., “Are We Susceptible to Rowhammer? An End-to-End Methodology for Cloud Providers,” 2020 IEEE Symposium on Security and Privacy (SP), 2020, pp. 712–728, doi: 10.1109/SP40000.2020.00085. https://arxiv.org/abs/2003.04498

[5] Tatar, Andrei, Cristiano Giuffrida, Herbert Bos and Kaveh Razavi. “Defeating Software Mitigations Against Rowhammer: A Surgical Precision Hammer.” RAID (2018). https://www.researchgate.net/publication/327469614_Defeating_Software_Mitigations_Against_Rowhammer_A_Surgical_Precision_Hammer_21st_International_Symposium_RAID_2018_Heraklion_Crete_Greece_September_10-12_2018_Proceedings

[6] Daniel Gruss, Clémentine Maurice, and Stefan Mangard. 2016. Rowhammer.js: A Remote Software-Induced Fault Attack in JavaScript. In Proceedings of the 13th International Conference on Detection of Intrusions and Malware, and Vulnerability Assessment — Volume 9721 (DIMVA 2016). Springer-Verlag, Berlin, Heidelberg, 300–321. https://arxiv.org/abs/1507.06955

[7] Victor van der Veen, Yanick Fratantonio, Martina Lindorfer, Daniel Gruss, Clementine Maurice, Giovanni Vigna, Herbert Bos, Kaveh Razavi, and Cristiano Giuffrida. 2016. Drammer: Deterministic Rowhammer Attacks on Mobile Platforms. In Proceedings of the 2016 ACM SIGSAC Conference on Computer and Communications Security (CCS ‘16). Association for Computing Machinery, New York, NY, USA, 1675–1689. https://www.vusec.net/projects/drammer/

[8] Peter Pessl, Daniel Gruss, Clémentine Maurice, Michael Schwarz, and Stefan Mangard. 2016. DRAMA: exploiting dram addressing for cross-cpu attacks. In Proceedings of the 25th USENIX Conference on Security Symposium (SEC’16). USENIX Association, USA, 565–581. https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/pessl

[9] Kaveh Razavi, Ben Gras, Erik Bosman, Bart Preneel, Cristiano Giuffrida, and Herbert Bos. 2016. Flip Feng Shui: hammering a needle in the software stack. In Proceedings of the 25th USENIX Conference on Security Symposium (SEC’16). USENIX Association, USA, 1–18. https://www.usenix.org/conference/usenixsecurity16/technical-sessions/presentation/razavi

[10] L. Cojocar, K. Razavi, C. Giuffrida and H. Bos, “Exploiting Correcting Codes: On the Effectiveness of ECC Memory Against Rowhammer Attacks,” 2019 IEEE Symposium on Security and Privacy (SP), 2019, pp. 55–71, doi: 10.1109/SP.2019.00089. https://www.vusec.net/projects/eccploit/

[11] Frigo, Pietro, Emanuele Vannacc, Hasan Hassan, Victor Van Der Veen, Onur Mutlu, Cristiano Giuffrida, Herbert Bos, and Kaveh Razavi. “TRRespass: Exploiting the many sides of target row refresh.” In 2020 IEEE Symposium on Security and Privacy (SP), pp. 747–762. IEEE, 2020. https://www.vusec.net/projects/trrespass/

[12] Onur Mutlu and Jeremie S. Kim. 2020. RowHammer: A Retrospective. Trans. Comp.-Aided Des. Integ. Cir. Sys. 39, 8 (Aug. 2020), 1555–1571. https://arxiv.org/abs/1904.09724

--

--