Meltdown

핵심은 2가지다.
  • L1 Cache Hit 시 시간과 아닐 때의 시간 비교
  • 파이프라이닝

정리하면 다음과 같은 과정으로 익스플로잇.
  1. L1 Cache 크기 만큼의 dummy 배열로 L1 Cache 초기화
  2. 배열 잡고 원하는 데이터(Kernel space data)를 index로 배열에 접근하여 해당 index번째를 L1 Cache에 적재. 즉 index=target data.
  3. user mode에서 kernel space 접근하면 보호비트 보고 fault를 일으키지만, 파이프라이닝 때문에 fault가 발생하기 전에 이미 L1 Cache에 타겟 데이터가 적재된 상태.
        fault는 commit 단계에서 발생하기 때문에 이전 명령어가 이미 execute 단계를 지난 상태.
  4. 배열에서 데이터 하나씩 조회해보다가, 다른 것에 비해 read 속도가 빠른 것은 Cache Hit를 의미하므로 이 index가 곧 target data임을 알아낼 수 있음.