컴퓨터 중앙처리장치(CPU)에서 심각한 보안 결함이 발견됐다. CPU가 명령을 처리하면서 벌어질 수 있는 특정 상황의 컴퓨터 메모리에 담긴 정보를 공격자에게 노출시킬 수 있는 3가지 취약점과 실험적인 공격기법이 확인됐다.
그 중 두 가지는 스펙터(Spectre), 한가지는 멜트다운(Meltdown)이란 별명으로 지난 주 공개됐다. 두 보안 결함은 앞으로 상당기간 광범위한 컴퓨터 시스템에 보안 위협이 될 것으로 전망됐다.
얼마나 위험할까. 일단 스펙터 공격은 인텔 뿐아니라 AMD와 ARM이 만든 CPU에 들어가 있는 여러 명령어 동작의 기능을 악용할 수 있는 것으로 파악됐다. 그래서 데스크톱, 노트북, 클라우드서버, 스마트폰을 비롯한 거의 모든 컴퓨터 시스템이 모두 잠재적으로 취약하다.
멜트다운 공격에는 1995년 이후 나온 대다수 인텔CPU가 취약하다. AMD와 ARM은 멜트다운 공격 영향을 받지 않는 것으로 분석됐다.
요약하면 운영체제(OS)를 가릴 것 없이, CPU가 들어간 웬만한 개인용 모바일 및 컴퓨터 기기 사용자는 모두 영향권에 있다. 개인용 단말기뿐아니라 개인정보와 민감한 데이터, 암호화된 기밀정보가 처리되는 기업과 기관용 전산시스템도 마찬가지다. 공격자가 취약점을 악용하려면 시스템에 직접 접근할 수 있어야 한다는 제약이 있지만, 클라우드서비스처럼 자원을 공유하는 시스템에선 분명 실질적인 위협이다.
취약점을 발견해 지난 3일 공개한 주체는 구글 보안연구조직 '프로젝트제로' 팀 멤버와 보안관련 학계, 산업계 전문가들이었다. 프로젝트제로 팀과 전문가들의 분석에 따르면 스펙터는 인텔, AMD, ARM 등 주요 제조사의 현대 CPU에 공통적으로 영향을 주는 보안취약점이고, 멜트다운은 인텔 CPU에서만 발견된 보안취약점이다. CPU 시장 점유율이 높고 더 많은 취약점을 노출한 인텔에 여론의 비난이 집중됐다.
취약점이 공개된 직후 인텔은 수습에 나섰다. 회사는 지난 4일 3가지 보안취약점의 영향을 받는 자사 CPU 제품군과 세대 정보를 발표했다. 더불어 이달중 소프트웨어(SW) 및 마이크로코드(microcode) 업데이트를 통해 출시 5년 이내 CPU의 문제를 해결하겠다고 예고했다. [☞관련기사] 보안 업데이트 적용 후 성능저하가 심각하다는 지적이 일자, 몇몇 테스트 결과를 근거로 "영향 없다"고 일축했다. [☞원문보기]
사실 영향이 없지 않았다. 10일 현재 마이크로소프트(MS)는 클라이언트 및 서버용 윈도 OS기반 컴퓨터 시스템에 인텔CPU 보안버그를 해결한 SW업데이트를 적용한 이후 상황에 따라 현저한 성능 저하가 나타날 수 있음을 확인했다고 발표한 상태다. [☞관련기사] 앞서 클라우드서비스와 제품의 SW업데이트 후 성능에 영향이 없었다던 3사의 설명도, 패치 이후 기존과 100% 동일 성능이 유지된단 뜻은 아니었다.
게다가 인텔도 이럴 가능성을 예상하고 있었다. 실사용 환경에서 개인과 기업용 SW 업데이트가 3가지 보안 취약점을 어떻게 처리했느냐에 따라, 컴퓨터 시스템의 성능이 영향을 받으리라는 걸 자각하고 있었다는 얘기다. 이는 인텔이 지난 4일 보안취약점의 영향을 받는 CPU 제품군과 세대 정보를 공개하면서 함께 배포한 '투기적실행의 부채널 분석' 문건을 통해 확인됐다. [☞원문보기(PDF, 영문)]
문건은 인텔CPU에서 발견된 3가지 공통 보안취약점 공개항목(CVE)별 개념을 제시했다. 스펙터, 멜트다운이란 이름을 쓰지 않고 각 취약점을 ▲경계검사 우회(bounds check bypass, CVE-2017-5753) ▲분기표적 주입(branch target injection, CVE-2017-5715) ▲불량데이터캐시 적재(rogue data cache load, CVE-2017-5754)라는 정식 공표 명칭으로만 지칭했다. 앞의 2개가 스펙터, 뒤의 1개가 멜트다운이다.
문건 내용에 제시된 취약점 특성, 그 배경 주요 개념, 인텔이 제시한 해법, 제시된 해법을 따랐을 때 발생할 수 있는 성능과 관련해 인텔이 언급한 내용 등을 거칠게 정리했다.
■ 보안취약점 3건 모두 CPU 내재된 '투기적실행' 동작과 연관
백서의 제목으로 언급되는 '투기적실행(speculative execution)'은 CPU가 성능을 높이는 최적화 동작을 가리킨다. 당장 필요한 명령을 처리하면서, 여분의 자원을 활용해 당장 불필요한 명령을 미리 처리하는 기법인데, 이 때 미리 처리할 명령을 단정 수 없는 상태에서 '추정(speculation)'해 실행하기 때문에 붙은 이름이다. 인텔의 백서에 따르면 3가지 보안취약점 모두 CPU의 투기적실행 동작과 관련돼 있다.
경계검사 우회 취약점은 CPU의 조건분기명령이 처리될 때 발생하는 투기적실행 동작의 허점이다. 인텔의 설명을 요약하면, 이 취약점은 CPU가 처리할 데이터가 경계 안에 있는지 확인할 때, 투기적실행 명령이 동작하면서 당장 처리 대상이 아닌 메모리 영역에 접근할 수 있게 돼 발생한다. 공격자는 투기적실행 명령을 유도하는 코드를 집어넣고, 취약점 발생 상황을 틈타 메모리상의 정보를 빼낼 수 있다.
분기표적 주입 취약점은 CPU내 간접분기예측기(indirect branch predictors)의 허점이다. 간접분기예측기는 CPU가 투기적실행으로 처리할 명령이 뭔지 지시하는 역할을 한다. 인텔은 "조건부 직접분기에선 공격자가 분기의 표적, 그 분기가 직접 수반하는 명령어의 경로, 2가지를 벗어난 코드의 투기적실행을 유도할 수 없지만, 간접분기는 더 광범위한 표적군에서 코드의 투기적실행을 유도할 수 있다"고 설명했다.
불량데이터캐시 적재 취약점은 애플리케이션(사용자) 수준 권한만 갖고 있는 공격자가 직접 커널(관리자) 수준 메모리에 '탐침'을 허용하게 만든다. 인텔은 "예를 들어 어떤 투기적실행 명령은 필요한 데이터가 L1캐시에 있을 때에 한해 뒤따르는 명령에 데이터를 건네는데, 이는 애플리케이션이 (데이터가 관리자전용으로 지정된 메모리 구역에 있더라도) 해당 데이터를 요청할 수 있도록 허용한다"고 설명했다.
인텔은 백서 후반부 내용을 통해 3가지 CVE를 악용한 공격의 보안위협을 낮출 수 있는 방법을 제시했다. 인텔의 해법은 주로 OS 및 컴퓨터 하드웨어 제조사의 펌웨어 업데이트였다. SW업데이트 CPU 기반의 컴퓨터시스템에서 구동되는 OS와 SW 프로그램, 또는 SW프로그램 코드에서 기계어로 컴파일된 CPU 명령어를 처리하는 마이크로코드(microcode) 업데이트에 국한됐다. CPU 설계 변경 언급은 없었다.
■"경계검사 우회 공격, 투기적실행 방벽 갖춘 SW업데이트로 예방"
백서에서 인텔은 경계검사 우회 공격을 막기 위한 전략으로 SW 코드 변경에 초점을 맞춰 설명했다. 일단 CPU가 투기적실행 동작을 덜 과감하게 하도록 SW 안에 "적절한 위치에 방벽을 삽입"하라고 권고했다. 방벽은 투기적실행 명령을 위해 CPU가 수행하는 추정(speculation) 작업을 멈추는 역할을 한다. 방벽은 인텔64 및 IA-32 아키텍처에 정의된 직렬화명령어(serializing instructions)를 통해 구현된다.
인텔 아키텍처에 정의된 직렬화명령어 중에 관리권한 외의 메모리 영역을 정렬하는 역할인 SFENCE, LFENCE, MFENCE 등이 있다. 인텔은 "직렬화명령어는 더 오래된 명령어가 퇴장(retired)하기 전에 더 젊은 명령어가 투기적으로 실행되는 것을 막는데, 다른 직렬화명령어에 비해 LFENCE는 성능이 더 나은 솔루션이다"라며 LFENCE 명령어 사용을 권장하고 있다.
하지만 인텔은 LFENCE 명령어를 남용할 경우 성능 손실 폭이 커질 수 있다고 경고했다. 이어지는 설명에 "만일 LFENCE 삽입을 너무 남용하면 성능이 확연히 손상될 수 있다"고 언급한 것이다. 또 "리눅스커널을 분석한 결과 성능에 영향을 최소화할 수 있을만큼 소수의 LFENCE 삽입이 필요한 위치를 발견했다"고 덧붙였다. 이미 인텔 엔지니어들이 보안패치에 따른 성능 저하를 예상했음을 시사하는 대목이다.
■"분기표적 주입 공격, 간접분기예측 통제할 마이크로코드 업데이트로 대응"
분기표적 주입 공격의 해법은 인텔이 제안하는 방식과, 구글 전문가들이 제안한 방식, 2가지다. 2가지 방식은 달성되는 보안 수준과 적용 방식 면에서 상이한 장단점이 있다. 컴퓨터 사용자와 시스템을 운영하는 관리자가 각자 사정에 따라 2가지 중 하나를 선택해야 한다는 뜻이다. 하지만 인텔은 이 공격의 대책을 제안하는 내용에서도 이를 반영한 CPU의 성능 손실 가능성을 부정하지 않았다.
우선 인텔은 CPU와 OS같은 시스템SW 사이에, 간접분기예측기를 통제하지 못하게 함으로써 공격을 방어할 특정한 신기능을 지원하는 새 인터페이스 구성을 제안했다. 포함될 기능은 간접분기의 투기적실행을 제한하는 '간접분기제한추정(IBRS)', 하이퍼쓰레드상의 형제쓰레드 간접분기예측을 막는 '싱글쓰레드간접분기예측기(STIBP)', 선행 코드의 후행 간접분기예측 제어를 막는 '간접분기예측기방벽(IBPB)' 등이다.
인텔은 이런 인터페이스를 구성하기 위해 "시스템 SW업데이트와 더불어 다수의 기존 프로세서용 신규 인터페이스를 지원하기 위해 적재될 마이크로코드 업데이트가 필요하다"면서 "적절한 마이크로코드 업데이트가 적용되면 (보안대책은) 종전의 제품에서 유효해지고, 향후 출시될 제품에선 이 대책의 성능 비용(performance cost)이 개선될 것"이라고 밝혔다. 역시 기존 CPU의 성능 손실 여지를 인정한 대목이다.
구글 전문가들은 CPU와 OS간의 새 인터페이스를 만드는 대신 '리트폴린(retpoline)' 또는 '리턴 트램폴린(return trampoline)'이라 불리는 기법을 고안해냈다. 인텔 설명에 따르면 컴파일러가 분기예측시 간접적으로 인접한 '점프' 또는 '호출' 명령어를 스택상의 해당 분기표적으로 밀어넣고 '리턴' 명령어를 실행해 그 위치로 점프하는 코드시퀀스로 대체할 때, 이 기법을 통해 리턴 명령어를 보호할 수 있다.
인텔은 이 방식이 "다수의 현존 인텔 프로세서상의 특정 워크로드에서 먼젓번 테크닉(CPU-OS간 새 인터페이스 구성)보다 더 잘 수행될 수 있다"며 "다양한 오픈소스 컴파일러로 리턴 트램폴린을 지원할 수 있도록, 그리고 OS 벤더와도 이 테크닉을 지원하도록 작업했다"고 밝혔다. 다만 "브로드웰 세대 이후 코어 프로세서에 이 전략으로 온전한 효과를 내려면 마이크로코드 업데이트도 적용돼야 한다"고 덧붙였다.
■"불량데이터캐시 적재 공격, 2계층 페이징 메모리관리 OS업데이트로 해결"
인텔CPU만의 문제인 불량데이터캐시 적재 공격, 즉 멜트다운 공격 위협에 따른 대책은 뭘까. 인텔은 "사용자모드에서 관리자 권한 페이지에 접근하는 시도에서 보호받으려면 OS는 해당 권한 페이지가 사용자 코드 실행시 맵핑되지 않게 보장해야 한다"며, 이런 메모리 관리 기법을 반영한 OS의 SW업데이트 필요성을 시사했다.
인텔은 OS가 '사용자(User)'와 '관리자(Supervisor)'라는 두 계층의 프로세스에 상응하는 2계층 페이징 구조를 제안했다. 사용자 페이징 구조에선 모든 애플리케이션 전체 페이지와, 관리자모드로 전환할 때 필요한 최소 페이지 영역만을 맵핑할 수 있다. 관리자 페이징 구조에선 모든 커널 페이지를 매핑할 수 있다. 쉽게 말해 사용자 권한 프로세스의 방만한 관리자 권한 메모리 접근을 막는 아이디어다.
관련기사
- 엔비디아, 스펙터 취약점 완화 패치 배포2018.01.11
- MS, 인텔CPU 보안패치 후 윈도 성능저하 확인2018.01.11
- KISA, CPU취약점 해킹 대비 OS 업데이트 권고2018.01.11
- "CPU 보안패치 못했다면 백신업데이트부터"2018.01.11
설명 말미에 인텔은 "이 듀얼 페이지 테이블 대책을 구현한 OS는 프로세스문맥식별기(PCID) 기능을 지원하는 프로세서에서 해당 기능의 이점을 활용할 것"이라며 "PCID는 사용자-관리자 모드 변환시 잦은 CR3 리로딩으로 야기되는 변환색인버퍼(TLB) 플러시 동작의 성능비용을 크게 낮출 수 있다"고 덧붙였다. 뒤집어보면 PCID라는 특정 기능이 없는 CPU에선 성능손실이 더 클 것이란 얘기다.
실제로 리눅스 커뮤니티는 지난 3일 이런 대책이 커널페이지테이블격리(KPTI)라는 이름으로 반영된 패치를 배포했다. 그런데 커널 메모리를 사용자 영역으로부터 분리시킨 이 패치를 적용 후 벤치마크 테스트 결과 일부 워크로드를 구동하는 시스템의 성능이 최대 30%까지 떨어진다는 보고가 나왔다. 이 성능저하는 가상머신에도 해당돼, 클라우드서비스 사용자들에게 심각한 문제로 대두된 상태다. [☞관련기사]