모바일 폰 아키텍처
모바일 폰에서 주요한 프로세서는 컴퓨터의 CPU에 해당하는 애플리케이션 프로세서(AP)이다. 또한 Wi-Fi, NFC, 블루투스 라디오, GPS 등 다양한 센서가 담겨 있다. 우리는 연결 프로세서(Connection Processor, CP)를 살펴본다.
베이스밴드
AP는 안드로이드에서 리눅스 커널을 실행시키고, 실행된 OS는 CP와 상호작용하는 다양한 프로그램과 서비스를 실행한다. RILD(Radio Interface Layer Daemon)은 모뎀과 인터페이스를 제공하는 프로그램, CBD(CP Boot Daemon)은 베이스밴드 프로세서에 펌웨어 이미지를 로드하는 프로그램, RFS(Remote File System)은 모뎀 설정을 저장하고 모뎀으로부터 안드로이드 파일 시스템의 접근 권한을 제공한다.
베이스밴드(Baseband)칩은 통화기능을 수행하는 핵심 칩이다. 디지털신호와 통화 호(呼) 처리를 위한 프로세서이다.
Shannon은 삼성의 베이스밴드 소프트웨어로 ARM Cortex-R7 CPU에서 실행된다.
일반적으로 운영체제는 메인 메모리를 쪼개고 각각은 base address, size, permission으로 프로그래밍 된다. 일반적인 권한은 RWX이다. ARM 아키텍처에서 MRC, MCR같은 특정한 명령이 가능하다. 메모리는 또한 TCM(tightly coupled memory)이라는 고속 메모리 영역이 있고, 이를 컨트롤하기 위한 MPU(memory protection unit)이 있다. 보조프로세서(coprocessor)의 에로는 FPU(floating-point unit)이 있는데, CPU의 부동소수점 산술 연산을 돕는다.
베이스밴드 프로세서는 고유한 RAM과 OS를 가진 독립적인 존재이지만 통신 인터페이스를 통해 AP와 데이터를 공유한다. 물리적으로 불리되어 있음에도 불구하고 이 인터페이스들은 공격받을 수 있고, 베이스벤드 프로세스로부터 AP 혹은 전체 폰의 제어권을 빼앗는 예도 있다.
Shannon
Shannon은 클로즈소스 OS로 관련된 정보가 제한적이다. 그래도 다른 베이스밴드와 개념, 방법론을 공유한다.
Shannon의 큰 특징 중 하나는 RTOS(Real-Time Operating System)이라는 점이다.
기본적인 기능은 메모리, 작업 동기화, 관리 등을 담당하는 PAL(Platform Abstraction Layer)에서 구현한다. PAL은 작은 버전의 libc를 포함한 마이크로 커널로 생각할 수 있다. RTOS에서, 프로세스는 태스크로 불린다. 각각의 태스크는 고유한 주소가 있고 다른 태스크와 독립적으로 동작한다. Shannon의 PAL도 다른 운영체제처럼 우선순위에 기반한 태스크 스케줄러를 구현한다. 하지만 성능 제약 때문에 non-excutable stack이나 ASLR 등 스택 오버플로우 취약점 방지 기법을 구현하지 않았다.
FirmWire 세팅
다음 명령으로 도커 이미지를 받고 실행한다.
sudo apt-get -y install docker docker.io
git cloe https://github.com/FirmWire/FirmWire.git
sudo su
echo core >/procs/sys/kernel/core_pattern
exit
git clone https://github.com/FirmWire/panda.git
docker build -t firmwire .
docker run --rm -it -v $(pwd):/firmwire firmwire
살펴볼 취약점은 GSM Call 셋업 중에 발생한다. FirmWire 에뮬레이터는 QEMU의 수정 버전인 panda를 사용한다. record/replay 기능과 더불어 FirmWire는 shared memory fuzzing, persistent mode, in-parent TCG caching, TCG chaining 등 빠른 퍼징을 위한 기능을 제공한다.
FirmWire/modkit/shannon/af.c에 흥미로운 코드가 있다. 베이스벤드 에뮬리ㅔ이터가 svc 명령어를 통해 퍼저를 호출한다. 이 명령어는 fake system call로, QEMU를 중단시키고, vanilla snapshot을 시작하고, 새로운 인풋을 넣는다. aflCall() 함수는 system service 호출을 보여준다(0x3f).
static inline unsigned int aflCall(unsigned int a0, unsigned int a1, unsigned int a2)
{
unsigned int ret;
register long r0 asm ("r0") = a0;
register long r1 asm ("r1") = a1;
register long r2 asm ("r2") = a2;
//asm(".word 0x0f4c4641"
asm volatile("svc 0x3f" //.byte 0x3f, 0xdf" // 0x0f4c4641"
: "=r"(r0)
: "r"(r0), "r"(r1), "r"(r2)
);
ret = r0;
return ret;
}
CVE-2020-25279
QEMU로 모뎀을 에뮬레이팅하고, fake call setup 메시지를 퍼저로 만들고, 크래시가 발생하기를 기다리면 된다.
GSM call setup 절차는 다음과 같다.
1. 폰이 base station(BS)에 alert 메시지를 보내 호출을 시작한다. 메시지에는 호출된 파티의 전화 번호가 들어 있다.
2. BS는 경고 메시지를 Mobile Swithing center(MSC)에 보낸다.
3. 호출된 파티가 사용가능하고 라우팅이 정확하다면 MSC는 call proceeding 메시지를 BS에 보낸다.
4. MSC는 setup 메시지를 BS에 보낸다. setup에는 호출된 파티의 전화 번호가 들어 있다.
5. BS는 setup 메시지를 폰에 보낸다.
6. 호출은 connected로 간주되고, 폰과 호출된 파티가 대화를 시작한다.
퍼저의 인풋값이 될 BCD(binary coded decimal)을 만든다.
mkdir fuzz_input
python3 -c 'import binascii; print(binascii. unhexlify("3030303030303030303030303030303030300B0403339001214365C2870A0033").decode("latin-1"))' > fuzz_input/call_setup
성능을 향상시키기 위해 스냅샷을 가져온다.
python3 -u ./firmwire.py https://github.com/grant-h/ShannonFirmware/raw/master/modem_files/CP_G973FXXU3ASG8_CP13372649_CL16487963_QB24948473_REV01_user_low_ship.tar.md5.lz4
이 경우, 0x4054df83이 스냅샷 주소로 지정된다.
다음 명령으로 스냅샷을 지정한다.
python3 -u ./firmwire.py --snapshot-at 0x4054df83,gsm_fuzz_base --fuzz-triage gsm_cc --fuzz-input ./fuzz_input/ ./CP_G973FXXU3ASG8_CP13372649_CL16487963_QB24948473_REV01_user_low_ship.tar.md5.lz4
이 때 에러가 발생할 수 있다.
다음과 같이 해결한 후 다시 실행한다.
cd modkit/
make
cd ..
도커에 AFL++가 없으므로 설치하고 퍼징을 시작한다.
git clone https://github.com/AFLplusplus/AFLplusplus.git
cd AFLplusplus && make && make install && cd ../firmwire
AFL_NO_UI=1 AFL_FORKSRV_INIT_TMOUT=100000 \
timeout 86400 afl-fuzz \
-i fuzz_input -o out -t 10000 -m none -M "main" -U -- ./firmwire.py --fuzz gsm_cc --fuzz-input @@ ./CP_G973FXXU3ASG8_CP13372649_CL16487963_QB24948473_REV01_user_low_ship.tar.md5.lz4
원래는 퍼저가 실행되어야 하는데, 다음과 같은 오류가 발생했다. 해결 방법은 찾지 못했다.
그리고 도커가 종료되니 설치한 모든 내용이 사라지는 것 같다.
참고자료
Antonio Nappa , Eduardo Blázquez - Fuzzing Against the Machine
'보안 > fuzzing' 카테고리의 다른 글
[번역] A Look at AFL++ Under The Hood (0) | 2024.04.12 |
---|---|
[하드웨어 해킹]OpenWrt 풀 시스템 퍼징 (1) | 2024.02.06 |
[하드웨어 해킹] QEMU 수정하기 (0) | 2024.01.21 |
[하드웨어 해킹] CVE-2011-0531 재현하기(실패) (0) | 2024.01.19 |
[하드웨어 해킹] 퍼징 기술 (0) | 2024.01.15 |