
정밀한 엔클레이브 실행 제어를 위한 실용적인 공격 프레임워크
SGX-Step은 Intel x86 프로세서, 특히 Intel SGX 플랫폼에서의 부채널 공격 연구를 용이하게 하기 위한 오픈소스 프레임워크입니다. SGX-Step은 적대적 Linux 커널 드라이버와 사용자 공간에서 신뢰할 수 없는 페이지 테이블 엔트리 및/또는 x86 APIC 타이머 인터럽트를 완전히 구성할 수 있는 작은 사용자 공간 운영 체제 라이브러리로 구성됩니다. SGX-Step은 우리의 연구뿐만 아니라 독립적인 연구자들에 의해 활용되어, 최대 시간 해상도(즉, 모든 단일 명령어 후에 피해자 엔클레이브를 인터럽트)에서 부채널 관찰을 수집하는 여러 가지 새롭고 개선된 엔클레이브 실행 공격을 가능하게 했습니다.
라이선스. SGX-Step은 GPLv3 하에 라이선스된 자유 소프트웨어입니다. SGX-Step 로고는 Eadweard Muybridge의 상징적인 퍼블릭 도메인 "Sallie Gardner at a Gallop" 사진 시리즈에서 파생되었으며, 이는 엔클레이브 단일 스테핑 목표와 마찬가지로, 질주하는 말의 역학을 일련의 개별 사진 프레임으로 분해하여 말의 보행 특성을 드러냅니다.
| SGX-Step 릴리스 | 변경 로그 기능 |
|---|---|
| v1.5.0 | 안정화 수정(KPTI, 커널 ISR 매핑); (실험적) Gramine 포트; IPI 지원. |
| v1.4.0 | 권한 있는 인터럽트/호출 게이트(Plundervolt). |
| v1.3.0 | 일시적 실행 지원(Foreshadow). |
| v1.2.0 | 사용자 공간 인터럽트 처리 및 결정론적 제로-스텝 필터링(Nemesis). |
| v1.1.0 | IA32 지원. |
| v1.0.0 | 사용자 공간 페이지 테이블 조작 및 APIC 타이머 단일 스테핑. |
출판물. SGX-Step은 여러 독립적인 연구 그룹에 의해 사용되었으며, 고해상도 SGX 공격의 새로운 라인을 가능하게 했습니다. SGX-Step을 사용하는 알려진 프로젝트의 전체 최신 목록은 이 README의 하단에 포함되어 있습니다. 원본 논문의 사본은 여기에서 확인할 수 있습니다.``` @inproceedings{vanbulck2017sgxstep, title = {{SGX-Step}: A Practical Attack Framework for Precise Enclave Execution Control}, author = {Van Bulck, Jo and Piessens, Frank and Strackx, Raoul}, booktitle = {2nd Workshop on System Software for Trusted Execution {(SysTEX)}}, publisher = {{ACM}}, pages = {4:1--4:6}, month = Oct, year = 2017, }
**데모.** [app/memcmp](https://github.com/jovanbulck/sgx-step/blob/master/app/memcmp) 디렉터리에는 SGX-Step 공격의 강력함을 보여주는 소형 데모 애플리케이션이 포함되어 있습니다. 이 애플리케이션은 미묘하고 non-constant-time `memcmp` 비밀번호 비교 로직을 포함하는 샘플 enclave를 단일 스텝(single-stepping)으로 실행합니다. 기존의 노이즈가 심한 타이밍 공격과 달리 SGX-Step은 비밀번호를 문자별로 _선형_ 시간에 결정론적으로 무차별 대입(brute-force)할 수 있습니다:

## 개요
SGX-Step 설계의 핵심은 이전의 enclave 선점 제안과 달리, 페이지 테이블 엔트리를 보유한 물리적 메모리 위치, 로컬 APIC 메모리 매핑 I/O 설정 레지스터, 그리고 x86 인터럽트 기술 테이블(IDT)에 대한 사용자 공간 가상 메모리 매핑을 생성하는 데 있습니다. 이를 통해 신뢰할 수 없는 공격자 제어 호스트 프로세스는 사용자 공간 _내에서_ (i) enclave 페이지 테이블 엔트리를 쉽게 추적하거나 수정하고, (ii) APIC 타이머의 단발/주기적 인터럽트 소스를 설정하며, (iii) 프로세서 간 인터럽트를 트리거하고, (iv) 커스텀 인터럽트 핸들러를 등록할 수 있습니다.

위 그림은 우리의 프레임워크를 통해 SGX enclave를 인터럽트하고 재개할 때의 하드웨어 및 소프트웨어 단계 시퀀스를 요약합니다.
1. 로컬 APIC 타이머 인터럽트가 enclave 명령어 내에 도착합니다.
2. 프로세서는 AEX 절차를 실행하여 enclave의 SSA 프레임에 실행 컨텍스트를 안전하게 저장하고, CPU 레지스터를 초기화한 후, IDT에 등록된 (사용자 공간) 인터럽트 핸들러로 벡터링합니다.
3. 이 시점에서 공격별 스파이 코드(spy code)를 쉽게 플러그인할 수 있습니다.
4. 라이브러리는 사용자 공간 AEP 트램펄린으로 돌아갑니다. 우리는 공식 SGX SDK의 신뢰할 수 없는 런타임을 수정하여 커스텀 AEP 스텁(stub)을 쉽게 등록할 수 있도록 했습니다. 또한 공격자가 제어하는 벤치마크 디버그 enclave에서 우리의 접근 방식을 정밀하게 평가할 수 있도록, SGX-Step은 _선택적으로_ 계측되어 인터럽트된 enclave의 SSA 프레임에서 저장된 명령어 포인터를 검색할 수 있습니다 (리눅스의 `/proc/self/mem` 인터페이스와 `EDBGRD` 명령어 사용).
5. 그 다음, 초기 카운트 메모리 매핑 I/O 레지스터에 쓰기 직전에 (6) `ERESUME`을 실행하기 전에 다음 인터럽트를 위한 로컬 APIC 타이머를 설정합니다.
## 소스 코드 개요
이 리포지토리는 다음과 같이 구성되어 있습니다:```
.
├── app -- Collection of sample client applications using SGX-Step to
│ attack different victim enclave scenarios.
├── doc -- Papers and reference material.
├── kernel -- Minimal dynamically loadable Linux kernel driver to export
│ physical memory to user space and bootstrap `libsgxstep`.
├── libsgxstep -- Small user-space operating system library that implements the
│ actual SGX-Step functionality, including x86 page-table and
│ APIC timer manipulations.
└── sdk -- Bindings to use SGX-Step with different SGX SDKs and libOSs.
SGX-Step은 피해자 엔클레이브 명령어를 임의의 공격자 코드와 정밀하게 인터리빙할 수 있는 범용 실행 제어 프레임워크입니다. SGX-Step 프레임워크의 주요 사용 사례 중 일부는 아래 그림에 요약되어 있습니다 (SGX-Step을 사용하는 최신 출판물 목록은 이 README의 하단을 참조하십시오).

SGX-Step은 SGX 지원 Intel 프로세서와 일반 Linux 커널이 필요합니다. 원래 평가는 i7-6500U/6700 CPU, Ubuntu 18.04, 기본 Linux 4.15.0 커널에서 수행되었습니다. 최신 Linux 커널 및 배포판도 지원됩니다. 아래에 Linux 커널 매개변수를 요약합니다.
| Linux 커널 매개변수 | 설명 |
|---|---|
nox2apic | 메모리 매핑 I/O 모드에서 로컬 APIC 장치를 선택적으로 구성합니다 (SGX-Step의 정밀 단일 스테핑 기능을 활용하기 위해). 설정한 경우 libsgxstep/config.h에서 X2APIC을 0으로 설정해야 합니다. 대안으로 CPU를 x2APIC 모드로 유지할 수 있으며 최신 SGX-Step 배포판도 호환되어야 합니다. |
iomem=relaxed no_timer_check | 커널 로그에서 불필요한 경고 메시지를 표시하지 않습니다. |
nmi_watchdog=0 | 커널 NMI 워치독을 비활성화합니다. |
isolcpus=1 | 피해자 프로세스를 격리된 CPU 코어에 고정합니다. |
clearcpuid=308,295,514 | 수퍼바이저 모드 액세스 방지(SMAP, 비트 295), 수퍼바이저 모드 실행 방지(SMEP, 비트 308) 및 사용자 모드 명령어 방지(UMIP, 비트 514) 기능을 비활성화합니다. |
pti=off | 커널 페이지 테이블 격리를 비활성화합니다 (사용자 IRQ 핸들러로 인한 커널 패닉 방지). |
rcupdate.rcu_cpu_stall_suppress=1 | 커널의 읽기-복사 업데이트(RCU) CPU 스톨 탐지기를 비활성화합니다 (커널의 타이머 인터럽트 핸들러를 호출하지 않고 오랫동안 단일 스테핑할 때 경고를 방지하기 위해). |
msr.allow_writes=on | SGX-Step에 의한 모델별 레지스터(MSR) 쓰기에 대한 커널 경고 메시지를 표시하지 않습니다. |
vdso=0 | 최신 Linux 커널에서만: vdso_sgx_enter_enclave 라이브러리를 비활성화합니다 (AEP 인터셉션 패치와 호환되지 않음). |
dis_ucode_ldr | 선택적으로 CPU 마이크로코드 업데이트를 비활성화합니다 (최근 transient-execution 공격 완화 조치로 인해 단일 스테핑 간격 재보정이 필요할 수 있음). |
다음과 같이 원하는 부트 매개변수를 커널에 전달합니다:```bash
$ sudo vim /etc/default/grub