가상화 기술의 핵심인 하이퍼바이저(hypervisor)를 샌드박스에 가두어 가상 머신 탈출(virtual machine escape)을 방어하는 연구가 Black Hat USA 2021에 채택되었습니다. Black Hat은 본 학회인 Black Hat USA와 지역 학회인 Black Hat Asia, Black Hat Europe으로 나누어지는데, 이제야 겨우 본 학회에 발을 들였네요. 그동안 계속 떨어지는 바람에 Asia와 Europe만 다녔거든요. 쿨럭...;; 네트워킹하기 좋은 기회인데 코로나 때문에 온라인으로 발표할 예정이라 많이 아쉽긴 합니다. ^^;;;

Black Hat USA 2021 - 발표 내용
Black Hat USA 2021 - 발표자 소개

가상 머신 탈출(virtual machine escape)은 가상 머신에서 동작하는 악성코드(malware)가 가상 머신을 빠져나와 시스템 전체, 즉 호스트(host)와 게스트(guest)에 영향을 미치고 악의적인 행위를 하는 것을 뜻합니다. 가상 머신 탈출은 특히나 Amazon과 같은 클라우드 사업자(cloud vendor)에게 치명적인데, 서비스의 특성상 가상 머신이 사용자에게 제공되고 임의의 코드가 내부에서 실행되기 때문입니다. 악의적인 사용자라면 가상 머신을 임대한 후, 가상 머신의 취약점을 이용해서 탈출할 수 있는 것이죠.

가상 머신 탈출은 이처럼 파급효과가 크기 때문에 #BlackHat 컨퍼런스에 단골로 등장하고 있습니다. 올해 5월에 열린 Black Hat Asia 2021에도 가상 머신 탈출 관련 발표가 있었구요. 앞으로도 문제가 있을 것 같아서 실용적으로 문제를 해결하고자 여러 가지 시도를 했는데, 많은 분들이 도와주셔서 좋은 결과가 나온 것 같습니다. 필드 적용성을 높이려고 현재 동작 중인 시스템은 최대한 수정하지 않았는데, 클라우드 사업자들에게 도움이 되면 좋겠네요. ^^)/

연구 내용이 조금 복잡해서 주요 내용만 간단히 소개해 드리면, 하이퍼바이저는 가상 머신과 직접적으로 연결되어 있습니다. 다수의 가상 머신을 통제하고 서비스를 제공해야 하기 때문이죠. 그런데, 하이퍼바이저는 꽤나 높은 권한에서 동작하므로, 하이퍼바이저에 취약점을 이용해서 가상 머신을 탈출할 수 있습니다. 이를 막고자 제가 만든 경량 하이퍼바이저로 샌드박스(sandbox)를 구성하고, 기존 하이퍼바이저의 권한을 낮춘 후 샌드박스에서 구동하는 것이 핵심 아이디어입니다. 샌드박스를 위해 중첩 가상화(nested virtualization)를 직접 구현했고, 발생하는 부하를 줄이기 위해 Intel 프로세서의 VPID, VMCS Shadowing 같은 기술도 같이 활용했는데... 이 부분은 Black Hat USA 2021 발표와 함께 자세히 말씀드리겠습니다.

끝으로, 항상 지지해 주시는 본부장님과 실장님을 비롯한 동료분들께 감사드립니다. 여러분들의 도움이 없었다면 아이디어도 발굴하지 못했을 겁니다. 앞으로도 많이 부탁드립니다. ^^)-b

ps) 발표는 아래에서 확인하실 수 있습니다.

https://www.blackhat.com/us-21/briefings/schedule/index.html?fbclid=IwAR3TWHTC1UXsa54x9VcdpG82Jdgd0QWgFYgAc5LWqUNxd6CWR6Hp9Dcpvqs#alcatraz-a-practical-hypervisor-sandbox-to-prevent-escapes-from-the-kvmqemu-and-kvm-based-microvms-22875 

 

Black Hat

Black Hat

www.blackhat.com

 

이 내용은 부채널 공격(Side-Channel Attack)의 대가인 Daniel Gruss의 졸업 논문인 Software-based Side-Channel Attacks and Defenses in Restricted Environments의 내용을 발췌한 것입니다. ^^;;; 저도 그동안 부채널 공격을 관심있게 보지 않아서 대략적인 내용만 알고 있었는데, 이번에 Black Hat Asia의 리뷰보드(Review Board)가 되면서 관심있게 살펴보게 되었습니다.

사실 최근 부채널 공격의 트렌드는 하드웨어 중심이던 예전과 달리 소프트웨어만으로 공격을 한다는 점인 것 같습니다. Daniel Gruss도 이야기하긴 했지만, 예전에는 암호 연산용 칩이 있을 때 암호 연산을 수행하는 알고리즘의 경로에 따라 전력 소모가 달라진다는 점을 이용해서 전력 측정(Power Measurement) 기법을 사용했습니다. 이러한 공격 기법은 현재 대부분 대비가 되어 있는 상태라 새로운 공격 기법이 등장했는데요, 그게 바로 소프트웨어 기반 마이크로아키텍처 공격(Software-based Microarchitectural Attack) 입니다. 주로 캐시(Cache)와 TLB(Translate Look-aside Buffer)를 이용하는데요, 캐시와 TLB에 대해서는 제가 요약한 캐시 및 TLB 부채널 공격(Cache and TLB Side-Channel Attack) 기법을 참고하시길 바랍니다. ^^;;;

소프트웨어 기반 마이크로아키텍터 공격(Software-based Microarchitectural Attack)

1. 캐시 공격(Cache Attack)

캐시 공격 기법은 연산중에 캐시에 남은 정보를 추출해내는 기법인데요, Evit+Time, Prime+Probe, Flush+Reload, Flush+Flush, Evict+Reload 공격 기법이 대표적으로 최근에 활용된 TLB 공격 기법도 있습니다. 이 부분들은 내용이 많아서 제가 따로 정리한 캐시 및 TLB 부채널 공격(Cache and TLB Side-Channel Attack) 기법를 참고하면 좋을 것 같습니다.

2. 예측자 공격(Attacks on Predictors)

CPU에는 성능을 높이기 위해 다양한 예측자(Predictors)가 들어있는데요, Branch Predictors, Prefetchers, Memory-aliasing Predictors가 있습니다.

  • Branch Predictors: 프로그램을 작성하다보면 루프를 사용하게 되는데요, 루프는 일정한 횟수동안 반복해서 도는 특징이 있습니다. 이러한 루프를 만나면 CPU가 루프의 비교문을 만났을 때 다음에도 루프 안쪽을 실행할 것이라고 예측하고 미리 파이프라인에 명령어를 밀어넣는데, Branch Predictors의 예측을 빗나가게 해서 정보를 추출하는 공격 기법이 Branch Predictor Attack입니다.
  • Prefechers: 코드를 실행하다보면 현재 실행중인 명령어의 다음 명령어가 실행될 것이라 예측하고 성능향상을 위해 명령어와 데이터를 미리 채워놓습니다. Prefecher는 캐시 부채널 공격을 수행할 때 원치 않는 잡음(Noise)를 생성하는 원인이 되기도 하는데요, Prefecher Attack은 직접 이를 이용해서 공격을 수행하기 보다는 잡음을 줄이는 방법으로 활용되곤 한답니다.
  • Memory-aliasing Predictors: 최근 CPU는 실행 능력을 향상시키기 위해 다양한 버퍼(Buffer)를 활용하는데요, Memory-aliasing Predictor는 CPU 내부에 있는 저장 버퍼(Store Buffer)의 값을 캐시에 저장하기 전에 읽어야할 때 이를 읽기 버퍼(Load Buffer)로 옮기는 일을 담당합니다. 저장 버퍼의 값이 읽기 버퍼로 옮겨갈 때 접근 권한(Access Right)가 제대로 검사되지 않으면 정보가 유출될 수 있는데 이것이 바로 Memory-aliasing Predictor Attack입니다. 실제로 Store-to-Leak Forwarding Attack이 이를 이용했습니다.

3. DRAM 공격(DRAM Attack)

DRAM 모듈에 저장된 정보는 Row Buffer를 거쳐서 CPU에게 전달되는데, Row Buffer에 저장된 데이터는 다시 읽었을 때 Row Buffer에 없는 데이터보다 빨리 접근되는 특징이 있습니다. 이러한 공격이 실존하고 이를 이용한 공격이 DRAMA Attack 입니다.

DRAMA 공격 기법 - 출처: Software-based Side-Channel Attacks and Defenses in Restricted Environments

4. 임시 실행 공격(Transient-Execution Attack)

최근 가장 핫한 공격이 바로 임시 실행 공격(Transient-Execution Attack) 인데요, 많이들 알고 계시는 멜트다운(Meltdown), 스펙터(Spectre) 공격 기법이 바로 이 카테고리에 속합니다. 임시 실행 공격은 마이크로아키텍처 공격의 한 종류인데요, 현대 CPU의 비순차실행(Out-of-order Execution)과 예측적 실행(Speculative Execution)을 이용해서 데이터를 유출하는 공격 기법입니다. Daniel Gruss의 전공이기도 하지요.

4.1. 스펙터(Spectre)

스펙터는 임시 실행 공격의 한 종류인데요, 실행 흐름 예측 오류(Control-flow misprediction)과 데이터 흐름 예측 오류(Data-flow misprediction)을 이용합니다. 사실 말보다는 그림으로 보면 더 이해하기가 쉬운데요, 아래는 논문에 있는 스펙터 공격의 흐름입니다.

스펙터(Spectre) 공격 기법 - 출처: Software-based Side-Channel Attacks and Defenses in Restricted Environments

  • 위의 그림에서 보는 것처럼 if문 안의 Index가 0~3일 경우는 참이되어 왼쪽의 Then 부분에 코드가 실행됩니다. 따라서 index의 값으로 data 영역을 접근하고 그 값이 공유 메모리 영역인 shm의 index가 되어 최종적으로 값이 읽혀집니다.
  • 이때, index의 값을 계속 if문이 True가 되도록 실행을 하면 Branch Predictor가 앞으로도 계속 참이 될 것이라고 예측하고 index의 값이 4보다 커도 Then 영역을 미리 실행(Out-of-Execution)합니다. 즉 예측이 실패하는 것이지요.
  • index는 data 영역에서 해당 위치만큼 떨어진 영역을 가리키게 되는데요, 이 index를 주요 정보가 있는 영역, 예를 들어 커널에 저장된 Key가 존재하는 영역이라고 가정한다면 해당 키의 정보가 shm의 Index로 사용되어 캐시에 저장됩니다.
  • 마지막으로 공격자는 shm에서 Index만큼 떨어진 영역이 캐시에 저장되었는지를 확인하는 방식으로 주요 정보에 접근할 수 있습니다.

4.2. 멜트다운(Meltdown)

멜트다운은 임시 실행 공격의 한 종류인데요, 예외(Exception)가 발생했을 때 비순차실행(Out-of-order)의 결과로 데이터가 유출되는 것을 노리는 기법입니다. 역시 그림으로 보는 것이 더 이해가 쉬우니 논문의 그림을 인용하겠습니다.

멜트다운(Meltdown) 공격 기법 - 출처: Software-based Side-Channel Attacks and Defenses in Restricted Environments

  • 위의 그림에서 kernel 부분의 메모리는 접근이 불가능하기 때문에 오류(Exception)이 발생합니다.

  • 이때, 비순차실행 때문에 value가 공유 메모리 영역인 shm의 index로 사용됩니다.

  • 공격자는 스펙터의 공격기법과 같이 shm에서 Index만큼 떨어진 영역이 캐시에 저장되었는지를 확인하는 방식으로 주요 정보에 접근할 수 있습니다.

    지금까지 부채널 공격에 대해서 정리해봤는데요, 최근 부채널 공격은 소프트웨어만 이용해서 공격이 가능한 만큼 파급력이 큽니다. 하지만 다행히도 방어법 또한 마련되어 있는데요, 다음에는 방어법에 대해서 정리해보겠습니다.

    그럼 좋은 밤 되세요 ^^)/

Black Hat Asia의 Review Board에 합류했습니다. @0@)-b 가문의 영광이자 저한테는 과분한 기회인데... 열심히 한 번 해보겠습니다! 사실 합류한지는 조금 지났는데요...^^;;; 여러 가지 일도 있고 Black Hat Europe 발표 준비를 해야 해서 이제야 한 자 적어봅니다.

Black Hat 컨퍼런스는 매년 Asia, USA, Europe에서 열리는데요, Asia의 경우는 약 2000명이 다녀갈 정도로 크고 인지도가 높은 산업계 주도의 컨퍼런스입니다. Offensive 관련 주제가 많고 파급력 있고 실용적인 주제를 높게 평가하기 때문에 흥미로운 내용으로 가득 차 있지요. ^0^)/

Black Hat Asia 2020의 CFP가 지난 달에 닫혀서 리뷰가 진행 중인데요, 다른 리뷰어님들께 누가 되지 않도록 열심히 하겠습니다. 사실 논문 편수가 300건이 넘게 제출돼서, 제가 맡은 트랙만 리뷰하는데도 편수가 꽤 되는군요. 부담이 벌써부터... 쿨럭..;;; 일단 어느 정도 리뷰가 끝난 상태인데, 열심히 하겠습니다. ^^;;;

전체 리뷰어 목록은 Black Hat Asia 2020 Review Board 에서 보실 수 있습니다.

그럼 좋은 하루 되세요 ^^

ps) 조금 내려가시면 가운데쯤 Seunghun Han이라고 되어 있습니다. 쿨럭..;;;

이번에 운이 좋아서 제가 만든 가상화 기반 운영체제 보호 기술이 Black Hat Asia와 Hack In The Box Security Conference(HITBSecConf)에 둘다 채택되었습니다. 덕분에 3월에는 싱가포르를, 4월에는 네덜란드를 다녀왔는데요, 출장을 다녀왔더니 일이 엄청 밀려있어서 2개월이 지난 지금에서야 회고를 씁니다. ㅠㅠ 해킹 컨퍼런스는 발표가 필수기 때문에 논문이 채택되어도 발표 준비 때문에 시간이 엄청 드네요. ㅠㅠ

HITBSecConf는 사실 작년에도 다녀왔는데요, 작년에는 Bad USB 관련 연구로 다녀왔습니다. 논문이 심사될 당시에 한참 모바일 디바이스의 충전기 해킹 문제로 시끌시끌할 때였는데요, 때마침 제가 제출한 논문이 소형 디바이스로 베터리, 키보드, USB 카드 리더기에 여러 기능을 추가하는 것과 관련된 것이라 운 좋게 채택이 되었습니다. 이전 논문은 IRON-HID: Create Your Own Bad USB 에서 보실 수 있습니다. ^^;;;

이번에 갔을 때 인상적이었던 부분은 컨퍼런스 관계자가 저를 알아봐주고 먼저 인사를 건내줬다는 것입니다. ㅠㅠ 아아... 별 것 아니지만 왠지 너무 고맙더라구요. ㅠㅠ 덕분에 긴장도 풀리고 발표도 잘 하고 올 수 있었습니다. 제가 발표한 내용은 Shadow-Box: The Practical and Omnipotent Sandbox에서 보실 수 있습니다. ^^

<HITBSecConf 2017 - Shadow-Box: The Practical and Omnipotent Sandbox>

이번 학회에서도 귀인 두 분을 만났는데요, 첫 번째 귀인은 NSHC를 운영하고 계신 허?? 대표이사님입니다. 소싯적에 해커로 이름을 날리시고 현재는 회사를 운영중이신데요, HITBSecConf 2017에서 SCADA 해킹 세션도 운영하셨더라구요. 너무 멋졌습니다. ㅠㅠ)-b

<NSHC의 허영일 대표님(가운데)와 BOB 멘토로 활동중이신 신정훈(singi)님(왼쪽)>

두 번째 귀인은 브라우저 취약점 분석에 달인이신 신정훈(singi)님입니다. 정훈님은 현재 BOB 멘토로도 활동 중이신데요, HITBSecConf 2017에서 펨토셀 해킹 관련 내용을 발표하셔서 인기가 폭발이셨어요. 멋졌습니다. ㅠㅠ)-b

두 달이나 지나서 회고를 쓰지만 왠지 학회 발표날 글을 쓰고 있는 듯한 기분이 드네요. 너무 재미있는 경험이었고 내년에도 또 갈 수 있으면 좋겠네요. 그럼 좋은 밤 되세요. ^^)/

얼마 전 제가 쓴 64비트 멀티코어 OS 원리와 구조의 A/S건으로 보안 프로젝트 카페에 가입을 하게되었는데요, 배울 내용이 많아 종종 들러서 공부를 하고 있습니다(감사합니다. 보안 프로젝트 선배님들 ^^). 오늘도 아침에 일어나 애기가 자는 사이 뭐라도 배울 게 없나 훑어보고 있었는데요, 재미있는 내용을 발견했습니다.

Kioptrix » Downloads 2014-02-08 09-20-39

할만한 해킹 첼린지 문제라는 글인데요, kioptrix라는 사이트에서 제공하는 가상머신 이미지를 구동시켜 루트권한을 얻는 겁니다. 제가 이런 류의 첼린지에 좀 흥미가 있어서 관심있게 봤는데요, 혹시 저 말고도 관심있는 분들이 계실까봐 링크를 걸어둡니다. ^^

그럼 좋은 하루 되세요 ^^

ps) 사실 아직 다운로드 받아서 해본 건 아니라... 내용이 어떤 지는 잘 모릅니다. ㅠㅠ 애기가 푹 자는 저녁이나 해볼 수 있거든요 ㅠㅠ

개인적인 사정 때문에 MD5 Hash Collision에 대해서 찾아보다가 재미있는 글을 찾았습니다. "안전한 패스워드 저장"에 관한 글인데요, 원문은 http://helloworld.naver.com/helloworld/318732 에서 보실 수 있습니다. ^^


내용을 간단히 요약하면 단방향 해시 함수(SHA-256과 같은...)를 사용하면 좀 안전하게 암호를 저장할 수 있는데요, 여기에 Salt 추가와 Key Stretching을 사용하면 보다 더 안전하게 저장할 수 있다는 이야기입니다. ^^ 기회가 되면 한번 써먹어봐야겠군요. ^^


그럼 좋은 밤 되세요 >ㅁ<)-b

간만에 재미있는 질문을 받았습니다. 보안 관련 기술 쪽에 ASLR(Address Space Layout Randomization) 기법이 있는데, 이를 어떻게 MNIT64 OS에 적용할 수 있을까를 묻는 내용이었습니다.

저도 보안 쪽은 좀 생소하여 ASLR을 잠시 찾아봤는데, 응용프로그램을 로딩할 때 항상 정해진 어드레스가 아닌 매번 다른 어드레스로 로딩하여 크래커로부터 보호하는 기법이더군요. 사실 어드레스를 매번 변경한다고 해도 찾아서 뚫을려고 마음 먹으면 어쩔 수 없기 때문에 완벽한 방법은 아닙니다만, 나름대로 괜찮은 아이디어라는 생각이 들었습니다.

그래서, 어떻게 하면 MINT64 OS에도 이를 적용할 수 있을까 생각을 해봤는데 의외로 답은 간단했습니다. ^^;;; MINT64 OS는 응용프로그램을 메모리에 로딩할 때 동적 메모리 관리 모듈에서 먼저 메모리를 할당 받은 뒤에 그 메모리에 올려서 응용프로그램을 동작시킵니다. 따라서, 많은 응용프로그램이 실행되고 종료되는 상황이라면, 저절로 어드레스가 랜덤하게 할당되는 것이지요.

물론, 응용프로그램 하나만 계속 생성되었다가 종료되는 상황이라면 여전히 문제가 있습니다. 이 문제도 사실은 간단히 해결할 수 있습니다. 동적 메모리 관리 모듈에서 메모리를 할당받을 때, 메모리 블록을 항상 인덱스 0번부터 검색할 것이 아니라 랜덤한 인덱스부터 검색하도록 하면 됩니다. ^^;;; 나중에 여유가되면 한번 기능을 추가해봐야겠군요. ^^)/~

그럼 즐거운 밤 되세요 ;)
 운동을 갔다 오니 벌써 세미나가 시작되서 후다닥 들어갔더니 한 20분치를 날려먹었습니다.ㅜ_ㅜ 세미나 내용은 SE Linux를 이용해서 좀더 보안에 강한 구조로 만드는 것인데, 일단 ARM 기반의 임베디드 리눅스라는 점과 커널과 파일 시스템을 직접 손봐야 한다는 점에서 난이도가 좀 있었지요. ^^;;;

 아무 생각없이 세미나 자료를 죽 훓어보고 있었는데, 오~!!! 나름대로 준비를 좀 했습니다. 솔찍히 말하자면 스택과 힙 오버플로우를 이용한 쉘 획득은 거의 막은 듯 보였습니다. 물론 제가 리눅스를 잘 모르기때문에 다른 방법이 있는지는 잘 모르겠지만, 커널쪽의 API를 수정해서 프로세스 실행 쪽을 모니터링하고 있더군요.

 자세한 로직은 공개하기가 힘들지만 딱 보기에도 이렇게 하면 마음대로 실행이 안되겠구나 하는 생각이 들었습니다. 커널을 수정하고 테스트하는 것이 쉬운 방법이 아닐텐데 용케 했더군요.

 파일 시스템도 JFFS2를 수정해서 파일별로 권한 정보 및 인증 정보를 따로 남기도록 해놨습니다. 따라서 커널이 프로그램을 실행할 때 그 정보를 이용해서 실행파일이 변조되지 않은 유효한 것인지 그리고 실행할 수 있는 것인지를 처리하더군요. 그 외에도 많은 기능이 있는데 일일이 나열하면 왠지 안될 것 같아서 이만 줄입니다. ^^;;;

 제가 관심이 있는 분야가 이쪽이라서 그런지 아주 흥미진진하더라구요. 후배들 덕에 공부 한번 제대로 했습니다. 후배들 화이팅~!!! ^ㅡ^)/~

+ Recent posts