본문으로 바로가기

안녕하세요. 2018년 첫 포스팅이네요. 모두들 새해 복 많이 받으시기 바랍니다.


새해부터 뭔가 큰 일이 터진 듯합니다. 현재 인텔의 모든 프로세서에서 커널 메모리 취약점이 발견되어 현재 리눅스를 포함한 윈도 운영체제 Redstone 3 버전도 패치 조치가 내려진 상태입니다.


그런데, 패치를 한 뒤에 성능이 30% 감소한다는 이야기가 있는데요. 어떤 취약점이고, 왜 이런 일이 발생하는지 조금 알아보도록 하겠습니다.



Meltdown, Spectre

이번 취약점의 이름은 위와 같은 두 개 이름의 취약점을 가지고 있습니다. 먼저 이 취약점은 구글의 보안기술팀인 Project zero 팀에 의해 발견되었습니다..


Meltdown 취약점은 Intel CPU에 적용된 OoOE(비순차적 명령어 처리) 기술의 버그를 악용한 취약점입니다. 보통 일반 응용 프로그램이 CPU의 캐시 메모리에 직접 접근할 수 없는데, 이것이 가능한 취약점인 것이죠. 아키텍처를 뛰어넘는 엄청난 취약점입니다. 이를테면 운영체제가 사용하고 있는 메모리 영역까지 침투할 수 있기 때문에 공격자의 마음대로 시스템을 조작하는 등의 문제가 발생할 수 있죠. Google Project Zero에서는 Intel 4th Haswell Architecture 기반의 프로세서에서 테스트하였다고 합니다.


Sepctre 취약점은 CPU 속에 담겨 있는 수 많은 명령에서 일어나는 버그를 악용한  취약점으로 이를 통해 나타날 수 있는 것은 하나의 응용 프로그램이 전혀 상관 없는 다른 응용 프로그램이 담긴 메모리를 허락 없이 볼 수 있게 되죠. 이를테면 해킹 프로그램이 심어져 있는 컴퓨터에서 현재 실행 중인 카카오톡 프로그램의 이메일 주소나 패스워드 등이 노출될 수 있다는 것을 말합니다. 실제 Google Project Zero에서는 이 원인과 방법에 대해 공개하지는 않았습니다. 다만 이렇게 된다면 실제 머신 위에 가상 머신 OS를 올려다 놓고, 해당 머신에서 해킹 프로그램이 떠오르게 되면, 호스트OS의 메모리까지 침투할 수 있기 때문에 매우 위험한 상황인 것이죠. 이 부분은 리눅스 컨테이너에서도 똑같은 영향을 끼치게 됩니다.


위 영상은 실제 Meltdown 취약점을 사용한 메모리 해킹 영상입니다. 보시다시피 사용자가 입력하는 패스워드가 그대로 노출됨을 알 수 있습니다. 
(어우 매우 위험하죠...)

 


패치 이후의 성능 저하와 사건의 발단

이 취약점의 패치는 페이징 테이블을 별도로 분리하여 관리함으로써 해결이 되었는데요. 하지만 Intel CPU의 심각한 설계 결함으로 인해 이 기능이 작동을 할 때 성능이 30% 이상 감소를 한다고 합니다.


이 이야기가 급속도로 퍼지게 된 발단은 아래의 사이트에서 시작된 것 같습니다.


https://www.phoronix.com/scan.php?page=article&item=linux-415-x86pti&num=1


인텔 CPU 취약점이 패치 된 리눅스 커널 4.15-rc6 버전에서 벤치마킹 테스트가 이루어졌는데, Redis, FFmpeg, PostgreSQL 등 DBMS와 영상 처리 등을 통하여 확인한 결과 실제 성능 감소가 이루어졌다는 이야기가 나왔습니다.


https://amp.reddit.com/r/sysadmin/comments/7nl8r0/intel_bug_incoming/?__twitter_impression=true


각 페이지 별로 테스트 결과, 진행 작업 등이 나와 있으며 System call 함수를 1억번 정도 호출하였을 때 약 15초 정도의 시간이 걸렸다는 내용입니다.



테스트의 시작

일단 이미 테스트한 결과들은 대부분 6세대 프로세서 혹은 8세대 프로세서인데, 내용에서는 세대 수와 관계 없이 영향을 끼칠 수 있다는 이야기도 있고, 어떤 페이지에서는 2세대 이후, 또 다른 페이지에서는 6세대 이후 이런 이야기들이 많습니다만 아직 확실하지는 않은 것 같습니다.


그래서 제가 직접 Github에 있는 Linux Kernel 4.15-rc6 버전을 빌드하여 설치해보기로 하였습니다.


모든 옵션을 기본값, 드라이버 또한 기본값으로 설정한 후, 빌드하였습니다.


Kconfig를 통해서 PAGE_TABLE_ISOLATION 옵션을 On 처리하여 Intel CPU 패치를 진행하였습니다.



패치를 진행하였더니, bugs에 cpu_insecure 가 활성화 되었습니다. 프로세서는 5세대 프로세서입니다.



SystemCall Test

먼저 System Call 함수가 어느 정도의 차이를 보이는지 한 번 테스트 해봤습니다.


패치를 하기 전, 테스트 결과입니다. System Call 함수는 1000만 번을 호출한 결과입니다.



패치 한 후, 0.9초 정도 느려졌네요.. 작은 양이 이 정도라면, 좀 더 큰 요청은....




이번에는 코드를 바꿔서 1억 번을 호출해봤습니다. 패치 되기 전 결과입니다.



패치를 하고 나니 17초... 무려 4배 이상 차이 나네요... 와 이건 좀...


Reddit 테스트 결과 원본 링크: https://paste.ubuntu.com/26316759/

거의 같은 코드를 사용하였고, 테스트의 결과도 거의 동일하게 나왔습니다. 정말 암울하네요.. 이것보다 더 많은 함수 호출에서는 더 많이 차이가 난다는 거죠..



Network Test

사실 네트워크까지는 큰 영향이 없을 것이라 생각은 하고 있는데, Reddit에서는 이 테스트를 통해서도 성능 차이가 있었다고 하여 한 번 진행해봤습니다. 


길이는 1MB, 윈도우의 크기는 기본값으로 놓고, 10초 간격으로 측정해봤습니다. 패치 되기 전의 모습입니다.



패치되고 난 후의 테스트 결과입니다. 10~20초 구간에서 1GB 정도의 전송 차이가 있었습니다.


Reddit 테스트 결과 원본 링크: https://paste.ubuntu.com/26316783/

역시 이 부분도 거의 원본과 일치하게 차이가 있었습니다..




File I/O Test

이번에는 가장 큰 이슈가 되고 있는 입출력 부분을 한 번 테스트 해봤습니다.


하드디스크, M.2 SSD 두 개의 하드웨어 테스트가 진행되었으며 파일의 크기는 4byte 총 7000개의 파일과 32개의 서브 디렉터리를 생성하였을 때의 결과를 나타낸 것입니다. 패치하기 전의 모습입니다.



패치를 하고 난 뒤의 모습입니다. 패치하기 전의 모습처러 왼쪽은 HDD 오른쪽은 M.2 SSD 테스트 결과입니다. 거의 30초 정도가 느림을 알 수 있었습니다.



1차 테스트 진행...

데이터가 작은 급의 라이트 테스트가 주여서 그런지는 몰라도 차이가 미미했지만, 실제 시스템 함수를 1억 번 호출했을 때 엄청 크게 성능 하락이 보였음을 알 수 있었습니다. 성능 30% 하락은 충분히 있어보이며 실제 일반 사용자가 주로 처리하는 작은 양에 대해서는 성능 감소가 미미하지만, 서버 같은 대용량 처리를 하는 곳에서는 굉장히 많은 차이가 있어 큰 타격이 되겠네요. 


다음 2차 테스트에서는 좀 더 큰 데이터를 처리하는 방향으로 진행할 예정 입니다.



[참고]: 

인텔 보안 취약점 관련: https://meltdownattack.com/


comments powered by Disqus

티스토리 툴바