광자 방출 유도 레이저 결함 주입을 통한 RP2350 보안 디버그 우회
요약 (TL;DR)
- 광자 방출 현미경(PEM)을 사용하여 RP2350의 디버그 액세스를 제어하는
DEBUGEN레지스터의 위치를 정확히 찾아냈습니다. - 980 nm 레이저 펄스를 집중 조사하여
PROC1및PROC1_SECURE비트를 설정함으로써, 영구적인 디버그 비활성화가 설정된 상태에서도 보안 영역(Secure-world) 디버깅을 다시 활성화했습니다. - 구조용 리셋(rescue reset) 후, 공격자는 펌웨어가 런타임에 잠가둔 OTP 메모리에서 128비트 비밀 키를 읽어냈습니다.
- 이 공격에는 파괴적인 칩 준비 과정, 정밀 레이저 장비, 그리고 약 $250,000 상당의 실험실 장비가 필요합니다.
RP2350 보안 아키텍처 및 디버그 비활성화 체인
RP2350 마이크로컨트롤러는 다음을 구현합니다:
- OTP(One-Time-Programmable) 메모리에 저장된 공개 키 검증을 통한 보안 부팅.
- 보안 상태와 비보안 상태를 분리하는 Armv8-M TrustZone.
- 두 코어의 Mem-AP를 비활성화하여 모든 SW-DP 및 디버그-AP 버스 액세스를 차단하는 영구적인
CRIT1.DEBUG_DISABLE플래그. - 데이터시트에 명시된 대로 모든 비트가 설정될 때
DEBUG_DISABLE를 *재정의(override)*할 수 있는DEBUGEN레지스터. DEBUGEN에 대한 소프트웨어 쓰기를 잠그지만 하드웨어 중복성이 없는DEBUGEN_LOCK비트.
OTP 하위 시스템은 영구적인 잠금 행(PAGEn_LOCK0/1)을 저장하고 중요한 플래그에 대해 8개 중 3개 투표(three-of-eight voting) 방식을 사용하여 단일 비트 결함에 대해 영구적인 디버그 비활성화 플래그를 견고하게 만듭니다. 그러나 DEBUGEN 레지스터 자체는 중복성, 패리티 또는 다수결 투표 기능이 부족하여 잠재적인 약점이 됩니다.
해킹 챌린지를 위한 실험 구성
저자들은 리비전 A4 장치에서 Raspberry Pi RP2350 해킹 챌린지를 재현했습니다:
BOOTKEY0에 SHA-256 공개 키 지문을 프로그래밍하고 보안 부팅을 활성화했습니다.CRIT1.DEBUG_DISABLE = 1로 설정하고 결함 탐지기 감도를 최대로 높였습니다.- OTP 페이지 48을
PAGE48_LOCK1 = 0x3c3c3c로 구성하여 보안 읽기/쓰기 권한을 부여하고 비보안 액세스는 거부했습니다. - 챌린지 펌웨어는 부팅 후 런타임에 페이지 48을 잠가(
sw_lock[48] = 0b1111) 추가 읽기를 방지합니다.
광자 방출 현미경(PEM)을 통한 DEBUGEN 비트 활동 격리
개별 DEBUGEN 비트를 위한 작은 저장 셀을 찾기 위해 연구팀은 PEM을 사용했습니다:
- 보안 소프트웨어가 타이트한 루프에서 특정
DEBUGEN비트를 토글했습니다. - 두 개의 상호 보완적인 비트 마스크에 대해 수천 개의 적외선 프레임을 캡처했습니다.
- 스택을 평균화하고 빼는 과정을 통해 정적 배경을 제거하고 토글된 비트와 상관관계가 있는 국소적인 광자 방출을 드러냈습니다.
- 결과로 나온 맵은 비트 0-3에 대한 활동을 포함하는 3마이크로미터 규모의 영역을 강조했습니다.
"서로 다른 비트 마스크에 걸친 반복적인 비교를 통해 카메라 시야의 세 영역에 걸쳐
DEBUGEN비트 0-3과 관련된 소형 사이트가 노출되었습니다." – Ledger Donjon 블로그
이 핫스팟들은 레이저 스캔 영역을 전체 다이에서 몇 마이크론 크기의 창으로 좁혔습니다.
레이저 결함 주입(LFI)을 통한 DEBUGEN 비트 반전
980 nm 펄스 레이저(약 1.2 W, 100 ns 펄스, 50배 대물렌즈)를 사용하여 연구원들은 SW-DP 응답을 모니터링하면서 PEM으로 식별된 영역을 스캔했습니다:
- 한 위치에서 일관되게
PROC1이 설정되었습니다(코어 1의 Mem-AP 활성화). - 두 번째 위치에서
PROC1_SECURE가 설정되었습니다(해당 Mem-AP를 통한 보안 액세스 허용). - 두 위치는 불과 몇 마이크로미터 떨어져 있었으며, 20배 대물렌즈는 더 큰 스팟이 설정 영역과 해제 영역을 모두 타격했기 때문에 이를 격리할 수 없었습니다.
- 반복 스크립트를 통해 두 비트가 모두 설정된 상태로 유지될 때까지 각 스팟에 펄스를 가하여 영구적인
DEBUGEN = 0xc값을 달성했습니다.
결정적으로, 레이저는 해당 DEBUGEN_LOCK 비트도 1로 반전시켜 이후 소프트웨어 쓰기가 디버그 활성화를 해제하지 못하도록 했습니다.
구조용 리셋을 이용한 OTP 비밀 키 읽기
보안 디버그가 복구된 상태에서 공격자는 항상 켜져 있는 RP-AP(CTRL.RESCUE_RESTART)를 통해 **구조용 리셋(rescue reset)**을 수행했습니다. 이 리셋은:
- 사용자 펌웨어가 실행되기 전에 부팅 ROM을 중단시켜 페이지 48에 대한 런타임 잠금이 적용되지 않도록 합니다.
- 영구적인 OTP 잠금(
LOCK_S = READ_WRITE)을 그대로 유지하여 보안 읽기를 허용합니다.
공격 순서는 다음과 같습니다:
- 구조용 리셋을 트리거합니다.
- 코어가 부팅 ROM 대기 루프에 있는 동안
DEBUGEN에 결함을 주어0xc로 만듭니다. - 보안
DHCSR을 통해 코어 1을 중단시킵니다. - 보호된 읽기 인터페이스를 통해 OTP 행
0xc08–0xc0f를 읽어 128비트 비밀 키를 추출합니다.
비밀 키는 단 한 번의 실행으로 복구되었으며, 이는 구조용 리셋과 결합될 때 보안 디버그가 런타임 OTP 잠금을 우회할 수 있음을 보여줍니다.
DEBUGEN_LOCK이 공격을 막지 못하는 이유
DEBUGEN_LOCK은 소프트웨어 쓰기를 차단하기 위한 것이지만, 레이저 결함은 DEBUGEN 비트와 잠금 비트를 동시에 설정할 수 있습니다. 잠금 비트가 1이 되면 소프트웨어는 해당 DEBUGEN 비트를 해제할 수 없으며, 다른 물리적 결함이 발생할 때까지 결함이 영구적으로 유지됩니다.
완화 조치 및 광범위한 영향 평가
- 하드웨어 수준: OTP 중복성은 영구적인 디버그 비활성화 플래그를 보호하지만, 확인되지 않은
DEBUGEN레지스터는 우회 경로를 생성합니다. - 소프트웨어 수준: 런타임
ACCESSCTRL제한은 직접적인 Mem-AP 액세스를 제한할 수 있지만, 보안 속성을 가진 디버거는 여전히 코어를 제어하고 레지스터를 읽어 기밀성을 훼손할 수 있습니다. - 리셋 수준: RP-AP 구조용 리셋은 펌웨어가 다시 잠그기 전에 OTP 런타임 잠금을 영구 상태로 복원하여 보안 읽기/쓰기를 허용하는 모든 OTP 페이지를 노출합니다.
- 실용성: 이 공격은 파괴적인 디캡슐레이션, 고정밀 레이저 시스템, 전문가 수준의 하드웨어 보안 지식이 필요하며 약 $250,000의 비용이 듭니다. 댓글 작성자들은 $25,000 미만으로도 기능적인 복제본을 만들 수 있다고 지적하지만, 일반 공격자에게는 여전히 높은 장벽입니다.
"이 공격은 물리적 접근, 파괴적인 준비 과정, 그리고 약 25만 달러 상당의 실험실 장비가 필요합니다." – Ledger Donjon 블로그
커뮤니티 반응
- 비용 관점: BitBangingBytes는 ChipShouter와 같은 저렴한 구성 요소를 사용하여 $10,000 미만으로 설정을 구성할 수 있다고 주장합니다.
- 광범위한 관련성: byb는 이 발견이 Yubikey 스타일 제품과 같은 모든 보안 엔클레이브 장치에 중요하다고 언급합니다.
- 기술적 호기심: akoboldfrying은 챌린지 비밀 키가 처음에 어떻게 프로그래밍되는지 질문하며, 공개 저장소에는 자리 표시자 값만 기록되어 있고 실제 비밀 키는 대회 주최자가 제공해야 함을 강조합니다.
- 방법론 비판: nullc는 디캡슐레이션을 피할 수 있는 대체 결함 자극(예: X-레이)을 제안하지만, 증거는 제시되지 않았습니다.
결론
- RP2350의 보안 체인은 가장 약한 집행 지점만큼만 강력합니다.
DEBUGEN은 레이저 결함 주입으로 악용될 수 있는 보호되지 않은 재정의 기능을 제공합니다. - 광자 방출 현미경은 효과적인 사전 타겟팅 단계로, 건초 더미에서 바늘 찾기 문제를 다루기 쉬운 마이크로미터 규모의 검색으로 바꿉니다.
- 구조용 리셋 동작은 결함이 있는
DEBUGEN과 결합되어 펌웨어가 런타임에 의도적으로 숨기는 OTP 비밀 키를 읽을 수 있게 합니다. - 완화 조치는 각 메커니즘을 격리하여 처리하는 대신, 변경 불가능한 OTP 비트에서 변경 가능한 제어 레지스터 및 리셋 로직에 이르는 전체 집행 경로를 고려해야 합니다.
공개: 이 취약점은 2026년 7월 28일에 Raspberry Pi에 보고되었습니다. 저자들은 건설적인 대응을 해준 Raspberry Pi 팀에 감사드립니다.
Sources
관련
- Dispatch
- Dispatch
- Dispatch
- Dispatch
- Dispatch