RETBLEED, Arbitary Speculative Code Execution with Return Instruction

 

각종 기사에서 “렛블리드”라고 부르고 있으나, “리턴블리드”라고 부르는 것이 더 직관적이다.

이 글은 취리히 공대 COMSEC 블로그에 게시된 포스팅을 번역한 것이다.

 

1. 개요

 

리턴블리드(CVE-2022-29900, CVE-2022-29901)는 예측 실행1speculative execution 공격의 일종이다.

예측 실행 공격이란, 분기 위치 인젝션2Branch Target Injection을 이용하여 정보를 노출하는 공격이다.

분기 위치 인젝션을 스펙터BTI3Spectre-BTI라고 부른다.

다른 예측 실행 공격과 다르게, 리턴블리드는 간접 분기4Indirect Jumps or Calls로 유해한 분기 위치를 예측할 때 리턴 명령을 이용한다.

이는 엄청난  일이다. 왜? 기존 스펙터BTI에 대한 방어를 뚫을 수 있기 때문이다.

 

현재 다수의 운영체제는 레트폴린5retpoline이라는 방어를 사용한다.

레트폴린은 간접 분기를 리턴으로 대체하는 방법으로 동작한다.

레트폴린은 공격자가 스펙터BTI를 사용하여 시스템 메모리에서 정보를 유출하는 것을 예방하기 위해 개발되었다.

리턴도 스펙터BTI 공격에 취약할 수 있다는 우려가 있었지만, 리턴을 익스플로잇하는 것은 비현실적으로 여겨져 기각되었다.

일반적인 마이크로 아키텍처 컨디션에서 간접 분기로 리턴 위치를 예측할 수 없다는 것이 주된 이유였다.

 

그러나, 다음 두 항목을 통해, 현실에서 리턴블리드를 익스플로잇할 수 있다.

  • 간접 분기처럼 리턴을 예측할 수 있게 하는 마이크로 아키텍처 컨디션을 구성할 수 있다. 이는 AMD와 인텔 CPU에서 모두 가능하다. 리눅스 커널에서 이런 컨디션을 충족하는 위치를 검색하는데 필요한 도구를 개발했다.
  • 분기 위치를 삽입할 수 있다. 분기 위치는 커널 주소 영역에 있고, 일반 사용자 권한으로도 삽입할 수 있다. 커널 주소 영역에 있는 분기 위치에 액세스할 수 없으면, 페이지 오류가 발생한다. 이 경우에도 분기 추측 유닛은 분기를 관찰하여 스스로 업데이트하고, 커널 주소에서 이상없이 실행되었는지 추정한다

 

2. 리턴블리드 익스플로잇을 위한 마이크로 아키텍처 컨디션

 

2.1. 인텔

 

인텔에서 리턴은 리턴 스택 버퍼가 언더플로우되면, 간접 점프처럼 동작한다.

리턴 스택 버퍼는 예측된 리턴 위치를 가지고 있다.

이는 딥 콜스택6deep call stack을 실행할 때 일어난다.

시스템 콜로 구성할 수 있는 컨디션을 1000개 이상 발견했다.

인텔 CPU에서 간접 분기 위치 추정은 지속적으로 연구되어 왔다.7Reading privileged memory with a side-channel

 

2.2. AMD

 

AMD에서 리턴은 리턴 주소 스택의 상태에 관계없이 간접 분기처럼 동작한다.

사실, 간접 점프를 이용하여 리턴 명령을 포이즈닝한다.

AMD 분기 예측기는 리턴 대신 간접 점프를 조우했을 것으로 추정한다.

결과적으로 간접 분기 위치를 예측한다.

이는 시스템 콜을 통해 도달할 수 있는 모든 리턴을 익스플로잇할 수 있다는 의미이다.

 

3. 팬텀 점프

 

AMD CPU는 팬텀 점프8Phantom JMP(CVE-2022-23825)를 보인다.

팬텀 점프란, 해당 분기 명령이 없는 경우에도 분기 예측이 발생하는 것을 말한다.

리턴블리드를 익스플로잇 하는데 사용한 기술을 동일하게 적용하면, 리턴 명령을 완전히 생략할 수 있다.

그리고, 주어진 명령으로 예측된 분기 위치를 인지할 수 있다.

이는 노출된 공격 표면의 범위와 완화에 있어 중요한 의미를 갖는다.

 

4. FAQ

 

4.1. 간접 분기란?

 

간접 호출 및 간접 점프를 말한다.

간접 분기는 실행에 중 분기 위치를 결정한다.

간접 분기는 객체 지향 언어에서 다형성을 지원할 때 찾아볼 수 있다.

또한, 함수를 인자로 전달할 때 사용된다.

 

 

4.2. 왜 간접 분기처럼 리턴을 예측하나?

 

리턴 명령은 본질적으로 팝9pop과  간접 점프를 합쳐 놓은 것이다.

간접 분기와 리턴은 유사하기 때문에 마이크로 아키텍처의 관점에서 그렇게 취급하는 것이 합리적이다.

 

5. 데모

 

 

6. 관련문서