2018년 1월 2일부터 밝혀진 "Spectre" 익스플로잇 사용 예(CVE-2017-5753 및 CVE-2017-5715)
Spectre는 서로 다른 애플리케이션 간의 격리를 깨뜨립니다. 이를 통해 공격자는 모범 사례를 따르는 오류 없는 프로그램을 속여 비밀을 유출할 수 있습니다. 실제로 앞서 말한 모범 사례의 안전 검사는 실제로 공격 표면을 증가시키고 애플리케이션이 Spectre에 더 취약하게 만들 수 있습니다.
C에서는 libs를 사용합니다.
우리는 "The Magic Words are Squeamish Ossifrage"라는 텍스트를 넣을 것입니다. 메모리에 저장한 다음 익스플로잇을 사용하여 읽으려고 합니다. 시스템이 취약한 경우 출력에 동일한 텍스트가 표시되고 메모리에서 읽혀집니다.
이 코드에서 victim_function()
의 컴파일된 명령어가 엄격한 프로그램 순서에 따라 실행된 경우 array1 크기 = 16이므로 함수는 array1[0..15]
에서만 읽습니다. 그러나 추론적으로 실행되면 범위를 벗어난 읽기가 수행됩니다. 가능합니다. readMemoryByte()
함수는 victim_function()
에 대한 여러 훈련 호출을 만들어 분기 예측자가 x에 대해 유효한 값을 예상하도록 한 다음 범위를 벗어난 x를 호출합니다. 조건부 분기는 잘못 예측하고 그에 따른 추측 실행은 범위를 벗어난 x를 사용하여 비밀 바이트를 읽습니다. 그런 다음 추측 코드는 array2[array1[x] * 512]
에서 읽어 array1[x]
값을 캐시 상태로 유출합니다. 공격을 완료하기 위해 간단한 플러시+프로브를 사용하여 array2
의 어떤 캐시 라인이 로드되었는지 식별하고 메모리 내용을 드러냅니다. 공격은 여러 번 반복되므로 대상 바이트가 처음에 캐시되지 않았더라도 첫 번째 반복에서는 이를 캐시로 가져옵니다.
최적화되지 않은 코드는 i7 Surface Pro 3에서 약 10KB/초를 읽습니다.
gcc -std=c99 Source.c -o spectre.out
또는 make
새로운 빈 프로젝트를 생성하고 Source.c를 추가한 다음 빌드를 클릭하세요.
매개변수가 없는 .spectre.out
.
.spectre.out {address} {length}
(매개변수 포함):