- 데이터 메모리 의존 프리페처(DMP) 가 암호 코드의 데이터 값을 주소처럼 다루면서, 상수 시간(constant-time) 구현에서도 비밀 키가 새어 나갈 수 있음
- Apple m-series CPU에서는 메모리에서 로드된 값이 포인터처럼 보일 때 DMP가 역참조를 시도해 데이터와 주소 분리라는 상수 시간 프로그래밍 전제가 흔들림
- 연구진은 Apple m1에서 OpenSSL Diffie-Hellman, Go RSA 복호화, CRYSTALS-Kyber, CRYSTALS-Dilithium의 엔드투엔드 키 추출을 시연했고 m2·m3에서도 유사한 DMP 동작을 확인함
- m3에서는 DIT bit가 DMP를 효과적으로 비활성화하지만 m1·m2에는 해당하지 않으며, 2024년 4월 발견된 HID 설정 비트는 macOS 커널 지원이 없어 바로 쓰기 어려움
- 완화에는 최신 소프트웨어 유지, 일부 CPU의 DIT/DOIT bit 사용, 입력 블라인딩, 하드웨어 공유 회피가 포함되며 취약성 평가는 암호분석과 코드 검사가 필요함
GoFetch 공격의 핵심
- GoFetch는 데이터 메모리 의존 프리페처(DMP)를 이용하는 마이크로아키텍처 사이드 채널 공격임
- 상수 시간으로 작성된 암호 구현에서도 비밀 키 추출이 가능함
- 연구진이 시연한 대상은 다음과 같음
- OpenSSL Diffie-Hellman Key Exchange
- Go RSA decryption
- CRYSTALS-Kyber
- CRYSTALS-Dilithium
- 논문과 도구는 각각 Paper, Tools로 제공됨
DMP가 상수 시간 전제를 깨는 방식
- Apple m-series CPU의 DMP는 메모리에서 로드된 데이터가 포인터처럼 보이는 값이면 활성화되고 역참조를 시도함
- 상수 시간 프로그래밍은 비밀 값에 따라 분기, 루프, 메모리 접근, 배열 인덱스가 달라지지 않도록 데이터와 주소를 분리해야 함
- 피해자 코드가 이 규칙을 지켜도, DMP가 하드웨어 수준에서 비밀 의존적 메모리 접근을 대신 만들어낼 수 있음
- 그 결과 원래 상수 시간이어야 하는 코드에 관측 가능한 시간 차이가 생기고 키 추출 공격에 노출됨
공격 절차
- 공격자는 암호 연산에 들어가는 선택 입력을 구성해, 비밀 키 일부를 맞게 추측했을 때만 중간 상태에 포인터처럼 보이는 값이 나타나게 함
- 이후 캐시 타이밍 분석으로 DMP가 역참조를 수행했는지 확인해 추측이 맞는지 검증함
- 올바른 추측이 확인되면 같은 방식으로 다음 키 비트 묶음을 추측함
- 이 절차로 고전 암호와 포스트퀀텀 암호 구현에서 엔드투엔드 키 추출이 가능함
영향받는 프로세서와 관찰 결과
- 엔드투엔드 GoFetch 공격은 Apple m1 프로세서가 장착된 하드웨어에서 수행됨
- m2와 m3 CPU도 유사하게 악용 가능한 DMP 활성화 패턴을 보임
- m2 Pro 같은 다른 m-series 변형은 테스트하지 않았지만, 단순 모델과 같은 마이크로아키텍처를 쓰므로 악용 가능한 DMP가 있을 가능성이 있음
- Intel 13th Gen Raptor Lake 마이크로아키텍처에도 DMP가 있음
- 다만 활성화 기준이 더 제한적이어서 GoFetch 공격에는 견고함
Augury와의 차이
- Apple m-series DMP는 Augury가 처음 발견함
- Augury는 DMP가 일부 조건에서 데이터와 주소를 섞을 수 있다고 봄
- GoFetch 연구진은 Augury가 정리한 DMP 활성화 기준이 지나치게 제한적이라고 판단함
- 실제 동작에서는 메모리에서 로드된 어떤 값도 역참조 후보가 될 수 있어, 실제 상수 시간 암호 코드에 대한 엔드투엔드 공격으로 이어짐
캐시와 프리페처 배경
- 최신 프로세서는 메모리 접근 지연을 줄이기 위해 캐시를 사용함
- 이전에 접근한 데이터는 캐시에 남아 이후 접근이 더 빨라짐
- 같은 머신에서 함께 실행되는 공격자는 공유 캐시 상태를 관찰해 피해자의 접근 패턴을 추론할 수 있음
- 일반 프리페처는 이전 메모리 접근 주소 추적을 바탕으로 앞으로 접근할 주소를 예측함
- DMP는 연결 리스트 순회 같은 불규칙 접근 패턴을 처리하기 위해 메모리 내용까지 고려해 가져올 데이터를 결정함
- 이 동작은 하드웨어 수준에서 데이터와 메모리 주소를 섞기 때문에 전체 계산 스택을 비상수 시간(non-constant-time)처럼 만들 수 있음
취약 여부 판단과 완화책
- 구현이 취약한지 판단하려면 중간 값이 비밀 의존적으로 포인터처럼 보이게 만들 수 있는 시점과 방식을 알아야 함
- 이 평가는 암호분석과 코드 검사가 필요하며, 수작업이고 느린 데다 다른 공격 방식을 배제하지 못함
- 일부 프로세서에서는 DMP를 비활성화할 수 있음
- 2024년 4월 Hector Martin(marcan)이 m1·m2 CPU에서 DMP를 비활성화하는 HID 설정 비트
SYS_APL_HID11_EL1[30]을 발견함- 이 chicken bit 설정에는 커널 지원이 필요함
- 현재 macOS에는 해당 지원이 없음
- 관련 정보는 @marcan의 글에 있음
- 사용자에게는 최신 소프트웨어 사용과 정기 업데이트가 권장됨
- 암호 라이브러리 개발자는 가능한 CPU에서 DIT/DOIT bit를 설정할 수 있음
- 입력 블라인딩은 일부 암호 스킴에서 공격자가 제어하는 중간 값을 피하는 데 도움이 될 수 있음
- 공격자가 DMP 활성화를 측정하지 못하도록 하드웨어 공유를 피하면 암호 프로토콜 보안을 더 강화할 수 있음
공개와 후속 업데이트
- 연구진은 2023년 12월 5일 Apple에 결과를 공개했으며, 이는 공개 릴리스 107일 전임
- 2024년 8월 GoFetch는 Pwnie Award 2024 Best Cryptographic Attack을 수상함
- 2024년 12월 후속 연구에서 Intel DMP의 의미론을 리버스 엔지니어링하고, DMP가 유효하지 않은 포인터를 역참조하는 경우에도 정보를 유출할 수 있는 기법을 보임