HDD 펌웨어 해킹 심층 탐구: 리버스 엔지니어링 및 실시간 디버깅
하드 디스크 드라이브(HDD) 또는 솔리드 스테이트 드라이브(SSD)의 펌웨어를 수정하는 일은 매우 어려운 작업입니다. 이러한 장치는 복잡한 임베디드 시스템으로, 종종 독점적인 아키텍처와 난독화된 바이너리를 사용합니다. 그러나 보안 연구자에게는 드라이브의 응답 시간을 조작할 수 있는 능력이 레이스 컨디션 실패와 성공적인 익스플로잇 사이의 차이를 만들 수 있습니다.
이 글에서는 Xbox 360 소프트모드를 지원하기 위해 수행된 연구를 바탕으로 HDD 펌웨어를 덤프, 분석 및 수정하는 과정을 살펴봅니다. 목표는 특정 섹터를 읽을 때 수백 밀리초 수준의 정확한 지연을 도입하여 레이스 컨디션 익스플로잇이 트리거될 수 있는 창을 제공하는 것이었습니다.
펌웨어 획득의 도전 과제
펌웨어 이미지를 얻는 것이 첫 번째 장벽입니다. 드라이브에 따라 여러 방법으로 이를 달성할 수 있습니다:
- 전문 도구: PC-3000과 같은 도구는 독점적인 벤더 명령을 사용하여 펌웨어를 드라이브에서 직접 덤프합니다.
- OEM 업데이트 유틸리티: 제조사 웹사이트(예: Lenovo)에서 펌웨어 업데이트 유틸리티를 검색하면 펌웨어 이미지를 얻을 수 있습니다. 이러한 유틸리티는 종종 이미지를 플래시하기 전에 복호화 또는 난독화 해제를 수행합니다.
- 커뮤니티 덤프: HDD Guru와 같은 포럼에서는 다양한 드라이브 모델의 덤프를 제공하는 경우가 많습니다.
다양한 드라이브 아키텍처 분석
제조사마다 펌웨어 보호 전략이 다릅니다. 예를 들어 Western Digital(WD) 드라이브는 섹션 헤더와 체크섬이 포함된 플랫 파일 형식을 사용할 수 있으며, 기본 로더 스텁은 순수 ARM 코드이지만 이후 섹션은 수정된 LZHUF 알고리즘으로 압축됩니다.
반면 Samsung SSD는 종종 비트 조작 난독화를 사용합니다. 업데이트 유틸리티를 리버스 엔지니어링하면 디코딩 알고리즘을 도출하고 ARM Cortex-M3 메모리 맵에 맞는 메모리 주소를 식별할 수 있어, 바이너리를 IDA Pro와 같은 도구에 로드하여 분석할 수 있습니다.
플래싱 및 복구 전략
수정된 펌웨어를 드라이브에 다시 쓰는 것은 고위험 작업이며, 작은 실수 하나로 장치를 벽돌(사용 불가) 상태로 만들 수 있습니다. 플래싱에는 주로 세 가지 방법이 있습니다:
- DOWNLOAD MICROCODE ATA 명령: 대부분의 최신 드라이브와 OEM 업데이트 유틸리티에서 사용하는 표준 방법.
- 백도어 벤더 명령: 특히 Western Digital과 같은 일부 드라이브는 SMART READ/WRITE LOG 명령을 통해 벤더 고유 명령(VSC)을 사용하여 플래터의 서비스 영역에 있는 "overlay modules"를 수정합니다.
- 물리적 시리얼 인터페이스: 많은 드라이브가 PCB의 핀을 통해 RS232 시리얼 포트를 노출하여 진단 및 수리를 가능하게 합니다.
벽돌 위험을 완화하기 위해 연구자들은 SPI 플래시 칩을 사용할 수 있습니다. PCB의 비어 있는 패드에 칩을 납땜하면 MCU가 내부 플래시 대신 SPI 플래시에서 부팅하도록 강제할 수 있어, 펌웨어가 손상될 경우 외부 프로그래머를 통해 손쉽게 복구할 수 있습니다.
JTAG를 통한 실시간 디버깅
HDD 펌웨어를 분석하는 가장 강력한 기술 중 하나는 실시간 디버깅입니다. 많은 WD 드라이브는 MICTOR 커넥터를 통해 JTAG 연결을 제공합니다. JTAG 어댑터(예: FT232)를 연결하고 OpenOCD를 사용하면 연구자는 실시간으로 브레이크포인트를 설정하고 메모리를 검사하며 실행을 단계별로 진행할 수 있습니다.
읽기 요청 핸들러 식별
읽기 요청(예: DMA READ EXT 명령)을 처리하는 특정 코드를 찾는 것은 펌웨어가 저수준이며 문자열이 없기 때문에 어렵습니다. 성공적인 전략은 다음과 같습니다:
- 브레이크포인트 트리거링: 특정 주소의 RAM을 읽기 위해 벤더 고유 명령(VSC)을 사용합니다. 해당 주소에 메모리 브레이크포인트를 설정하고 VSC가 발행되면 디버거가 핸들러 함수에서 멈춥니다.
- 콜 스택 추적: VSC 핸들러에서 콜 스택을 위로 올라가 공통 디스패처나 요청 테이블을 찾습니다.
- 요청 테이블 오염: 읽기 섹터 명령을 반복해서 발행하면 드라이브 내부 요청 배열에서
DMA READ EXT명령에 대한 함수 포인터가 업데이트되는 항목을 식별할 수 있습니다.
타이밍 조작을 위한 패치
핸들러를 식별한 후, 사용되지 않는 RAM 섹션에 "코드 동굴"을 만들 수 있습니다. 원래 읽기 함수에 훅을 삽입하여 이 동굴로 점프하도록 하고, 동굴에서는 스핀 루프를 실행해 지연을 만든 뒤 원래 실행 흐름으로 복귀합니다.
# Example of a simple delay loop in ARM
Hook_SataDmaRead_loop:
sub r3, r3, #1
bne Hook_SataDmaRead_loop
bx lr
실제로 이는 드라이브의 응답 시간을 조작할 수 있게 합니다. 초기 목표는 Xbox 360 익스플로잇을 지원하는 것이었지만, 연구자는 결국 이러한 수정 없이도 익스플로잇을 트리거할 수 있음을 발견했으며, SSD는 여전히 너무 빨라 신뢰할 수 있는 대상이 되지 못했습니다.
더 넓은 의미와 커뮤니티 인사이트
HDD 펌웨어를 조작할 수 있는 능력은 중요한 보안 영향을 미칩니다. 커뮤니티 논의에서 언급되듯이, 이 기술은 안티 포렌식이나 드라이브 컨트롤러 자체에 존재하는 은밀한 악성코드를 만드는 데 사용될 수 있으며, 이는 NSA가 유명하게 보유한 능력으로 알려져 있습니다.
또한 일부 벤더 난독화가 지나치게 단순하다는 점도 논란이 됩니다. 일부 연구자들은 Linux 기반 펌웨어 업데이트 유틸리티가 펌웨어를 평문으로 디스크에 복호화하는 경우가 많아 리버스 엔지니어링 과정이 예상보다 훨씬 쉬워진다고 지적했습니다. 이는 하드웨어 벤더가 인식하는 보안과 실제 펌웨어 보호 구현 사이에 지속적인 격차가 있음을 강조합니다.