본문으로 바로가기

Intel CPU Spectre 패치(Retpoline) 와 테스트

category Linux 2018.01.22 20:08

지난 Meltdown 취약점 패치를 통해서 System Call 함수 호출시 4배의 성능이 하락되는 것을 알 수 있었습니다. 


하지만 이 취약점은 Intel CPU에서만 존재하는 취약점이며 Kernel Page Table Isolation (KPTI) 패치를 통해 취약점을 고칠 수 있었고, AMD 및 ARM 프로세서에서는 영향이 없었음을 알 수 있었습니다.


Spectre 취약점은 이전 포스트에서도 설명한 적이 있었습니다. 간단하게 다시 한 번 설명드리자면, A 프로그램이 B 프로그램의 메모리 주소를 침범할 수 있는 취약점으로, 크게는 가상 머신의 OS가 Host OS의 주소 범위까지 침범할 수도 있는 매우 무서운 취약점입니다. 이 취약점은 Intel CPU 뿐만 아니라, AMD, ARM CPU에도 취약점이 존재합니다.


Spectre 취약점은 2개의 종류가 있습니다.


 

 Spectre Variant 1

 Spectre Variant 2 

 대상 아키텍처

 Intel, AMD, ARM 

 Intel, AMD, ARM 

 공격 방법 

 분기문 중 취약한 코드에서 공격 

 악성코드를 통한 공격 

 CVE

 CVE-2017-5753

 CVE-2017-5715 

 패치 방법

 소프트웨어 업데이트 패치 

 소프트웨어 업데이트 및 CPU 마이크로코드 패치


아직 Spectre Variant 2 취약점에 대해서 AMD CPU에서는 발견된 바가 없었습니다. 또, Variant 1에 대한 패치에 대해서는 성능 저하가 거의 없었고, 공격 방법 또한 매우 까다롭기 때문에, Meltdown 취약점 보다는 그렇게 위험하지 않은 편입니다.


하지만 Variant 2 취약점은 다른 프로그램에 의해서 공격할 수 있기 때문에 이야기가 다릅니다. 하지만 AMD CPU에 대해서는 아직 취약하다고 나온 이야기는 없습니다. 현재 Intel과 ARM 아키텍처에서만 취약하다는 이야기가 있으며 Google에서는 Android 8.0 플랫폼에서 패치가 이미 진행되었고, Linux Kernel 에서도 이미 패치가 이루어진 상황입니다. (단, 각 배포판 별 패치는 제외)



Google Retpoline

Google Project Zero 팀에서는 Spectre 취약점에 대해서 성능 하락 이슈 없이 해결할 수 있다. 라고 이야기한 적이 있었는데, 이 방법이 바로 Retpoline 해결 방법입니다. Google에서는 이를 오픈소스화하여 공개한 바 있습니다.


Google Retpoline


이 방법은 CPU의 투기적 동작이나 하드웨어 기능, 혹은 메모리 주소 구조 등의 큰 요소를 바꾸지 않고도 보호할 수 있는 방법으로 실제 KVM, Xen 같은 가상 환경에서 공격하는 것을 충분히 방지할 수 있습니다.



패치 적용

지난 멜트다운 패치 테스트에 이어서 이번엔 스펙타 취약점의 패치를 진행하였습니다. 지난 멜트다운 패치는 리눅스 커널에 Meltdown 패치 옵션을 주는 것만으로 간단히 커널을 컴파일 할 수 었었지만, 이번 패치는 패치 옵션만으로 컴파일 되지 않습니다.


Retpoline 패치가 적용된 커널을 컴파일 하기 위해 아래의 준비물이 필요합니다.


- Linux Kernel 4.15-rc9

- GCC 7.2.1 버전의 Retpoline 이슈가 적용된 컴파일러


리눅스 커널 소스를 구해서 컴파일을 할 때, 반드시 GCC 7.2.1 컴파일러를 요구합니다. 각각의 프로그램 소스는 아래의 버튼을 통해 구할 수 있습니다.


Linux Source GNU C Compiler Source


저의 경우, Ubuntu 17.10 공식 레포지터리에서 GCC 7.2.1 컴파일러를 구할 수 없어 직접 소스 설치를 진행하였습니다. 


자신의 컴파일러가 이렇게 7.2.1 20180118 이후 버전의 컴파일러를 가진 상태에서 커널 옵션에 Retpoline 패치를 준 다음에야 Google Retpoline 패치가 적용됩니다.



패치 확인 및 테스트

커널을 빌드하고 설치했다면, 이제 Google Retpoline 패치가 적용되었는지 확인해보도록 하겠습니다.

Spectre Variant 2 취약점 부분에서, Full generic retpoline 표시가 나타나면, Retpoline 패치가 적용된 것입니다.


저의 경우, 취약점 패치 도구인 Spectre-meltdown-checker로 확인하였지만, 실제로 공식적인 확인 방법은 다음의 커널 값을 통해 확인할 수 있습니다.


# cat /sys/devices/system/cpu/vulnerabilities/spectre_v2 

위의 값을 출력해서 Full generic retpoline이 나오면 적용된 것입니다. 

만약 제가 사용한 취약점 패치 도구를 사용하고자 한다면, 아래의 Github 링크를 사용하시면 됩니다.

(https://github.com/speed47/spectre-meltdown-checker)


패치 적용이 확인되었으니, 바로 테스트 해보도록 하겠습니다.


테스트는 지난번 Meltdown 패치에서 성능 하락으로 이슈가 되었던 System Call 함수와 File I/O 만을 Test 하였습니다.



SystemCall Test

지난번과 동일하게 1억 번의 System Call 함수를 호출하여 얼마만큼의 시간이 걸리는지를 테스트하였습니다.


Retpoline 패치 전의 결과입니다. 단순히 Meltdown 패치만을 적용해서, Meltdown 패치 전의 결과와 4배 정도의 차이 그대로의 모습입니다.


Retpoline 패치 이후, 성능 변화가 거의 없습니다.




File I/O Test

File I/O 부분 테스트도 지난 번 Meltdown 패치와 마찬가지로 SSD에서 테스트를 진행하였습니다.


패치 전의 테스트입니다. Meltdown 성능 체감 영향은 존재합니다.


Retpoline 패치 적용 후 모습입니다. 역시 성능 변화가 거의 존재하지 않습니다..



테스트 결론... (Intel vs Google)

Meltdown 패치에 있어서 성능 체감 변화가 너무 심해, Spectre 취약점 패치에서도 성능 체감이 더 있다고 한다 하여 굉장히 긴장했지만, 다행히 Google Retpoline 패치에서는 성능 변화가 존재하지 않아 조금은 안도 했습니다. 하지만 예외 사항이 있습니다..


실제로 Intel CPU Spectre v2를 패치하는 방법에는 2가지 방법이 존재합니다. 첫 번째 방법은 Intel CPU의 마이크로코드를 수정한 방법인데, 이 방법을 이용하면 커널에서는 IBRS, IBPB, STIBP 기능이 활성화됩니다. 이 기능이 활성화 되면, Intel에서는 일부 CPU 성능이 저하된다고 합니다. 
(공교롭게도 저의 CPU는 아직 마이크로코드 패치가 진행되어 있지 않아 이 부분에 대해서는 테스트할 수 없었습니다..)


- IBRS: 간접분기 기능을 끄는 플래그입니다. 아예 간접분기 기능 자체를 못하도록 막는 것이죠.

- IBPB: 커널 영역 <--> 사용자 영역간 컨텍스트 스위칭이 발생할 경우, BTB를 전부 초기화(간접분기 초기화) 작업을 통해 다른 사용자가 BTB를 볼 수 없도록 하는 기능

- STIBP: 단일 프로세서에서 하이퍼스레딩/SMT가 동작할 때, 각 스레드 간 메모리 영역을 보호하는 기능


두 번째 방법은 Google에서 제안한 Retpoline 패치 방법을 이용하는 것입니다. 이 패치 방법은 소프트웨어 패치로 진행할 수 있으며 CPU 마이크로코드가 수정되지 않은 상태에서도 취약점 패치가 가능합니다. 더 좋은 것은 성능 저하가 거의 없다는 것이지요. 취약점을 막는 방식은 Google Retpoline 공식 문서에 나온 것처럼 간접 분기를 예측 실행하여 공격 코드를 격리 시키는 방법입니다. 실제 Google에서는 이 패치 방법을 Google Cloud Platform, Android, Google Chrome 브라우저에 적용하였습니다.


Google Chrome 63 버전 이상을 사용하고 계신다면, 아래의 링크를 통해서 활성화 할 수 있습니다. 이 방법은 Spectre v2 취약점을 이용한 공격을 의심하면 사이트를 격리 시키는 기능입니다. 하지만 이 방법은 아직 안정화된 것이 아니므로 참고하셔서 사용하시기 바랍니다.

(링크: chrome://flags/#enable-site-per-process)



마치며...

여기까지 Linux 운영체제를 이용하여 Spectre 패치 진행과 성능을 테스트 해보았습니다. 저의 입장에서는 마이크로코드를 패치한 성능 테스트도 맛보고 싶었지만, 아쉽게도 이 부분은 눈으로 보지 못한 점, 하지만 다행히도 성능 이슈가 이만큼으로 마무리되어서 다행이라 생각하고 있습니다.


현재 Windows 운영체제에서는 IBRS, IBPB, STIBP를 사용한 Spectre v2 패치에 문제가 있는 점을 확인했습니다. 일부 CPU 모델에서 자동으로 운영체제가 재부팅 되는 현상이 있다고 하니, 해당 부분을 주의하시고, 패치를 진행해주시기 바랍니다.아마 조만간 Windows에서도 Google Retpoline 패치 방법을 적용하여 다시 내놓지 않을까 라는 저의 개인적인 생각입니다.


여기까지 Spectre 패치 테스트를 마치도록 하겠습니다.



[참고]: http://www.hwbattle.com/bbs/board.php?bo_table=cpumbram&wr_id=98565



comments powered by Disqus

티스토리 툴바