Skip to content
KitploitKITPLOIT
도구익스플로잇블로그
Log in
제출
도구익스플로잇블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

피드문의개인정보© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
CVE-2024-20154 — CVE-2024-20154에 대한 기술 분석 문서로, MediaTek MT6769 NB-IoT 베이스밴드 펌웨어의 스택 기반 버퍼 오버플로우를 다루며 리버스 엔지니어링과 익스플로잇 체인을 설명합니다. | Kitploit
도구/GitHubGitHub/harbingerse7en/cve-2024-20154
Embedded Systems SecurityIoT SecurityMemory ForensicsVulnerability AnalysisReverse EngineeringMobile SecurityHardware & IoT SecurityBinary AnalysisPapers & ResearchLearning & EducationFirmware Analysis
173개월 전아직 검토되지 않음

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
GitHub
harbingerse7en/cve-2024-20154

CVE-2024-20154

CVE-2024-20154에 대한 기술 분석 문서로, MediaTek MT6769 NB-IoT 베이스밴드 펌웨어의 스택 기반 버퍼 오버플로우를 다루며 리버스 엔지니어링과 익스플로잇 체인을 설명합니다.

저장소 보기

CVE-2024-20154: MediaTek MT6769 베이스밴드의 NB-IoT SIB1-NB 스택 오버플로

분류: CWE-121 — 스택 기반 버퍼 오버플로
심각도: 치명적 (MediaTek 공지) · 8.8 높음, 공격 벡터: 인접 (CISA-ADP)
유형: 원격 코드 실행 — 사용자 상호작용 없음, 사전 연관 없음
공개: MediaTek 보안 공지, 2025년 1월 6일 https://corp.mediatek.com/product-security-bulletin/January-2025 분석 대상: Samsung Galaxy A14 SM-A145R — MT6769 패밀리 (Helio G80), MediaTek의 영향받는 칩셋 목록 내 - 펌웨어는 안전한 조건에서 에뮬레이션되었습니다. 상태: 패치됨.


배경 및 동기

이것은 나의 첫 번째로 발표한 베이스밴드 연구였다. 나는 통신 인프라, 합법적 감청 중재 계층, 스팅레이 및 IMSI-캐처 분석, 그리고 임베디드 기기 보안과는 거리가 먼 배경 출신이었다 — 나는 이전에 셀룰러 모뎀에 대한 심층 펌웨어 리버스 엔지니어링을 해본 적이 없었다. 나는 구조화된 분석 방법론이 대상에 관계없이 적용될 수 있다는 것, 그리고 특정 플랫폼에 대한 친숙함이 엄격한 체인 추적으로 대체될 수 있다는 것을 스스로에게 증명하고 싶었다. NB-IoT는 진정으로 위험한 교차점에 위치하기 때문에 눈에 띄었다: 이 프로토콜은 제약된 IoT 기기를 위해 설계되었고, 공격 표면은 사전 연관 단계이며, 모뎀 스택은 핸드셋 사용자가 무엇을 하고 있든 관계없이 이를 처리한다.

패치된 펌웨어가 분석되고 취약한 패턴이 부재함이 확인되었을 때, 특정 기능을 대상으로 하기 전에 펌웨어의 대량 분석에 사용된 AI 시스템은

재구성된 버그 클래스, 조건, 영향을 받는 펌웨어 패밀리를 CVE-2024-20154의 설명과

독립적으로 일치시켰다.

기술적 결론은 분석가 자신의 것이다.


1. 서론

주머니 속의 휴대폰에는 적어도 두 대의 별도 컴퓨터가 들어 있다. 당신이 상호작용하는 하나는 Android를 실행한다. 다른 하나 — 베이스밴드 — 는 완전히 독립적으로 실행되며, 모든 무선 통신을 처리하고, 그 위의 운영체제에는 거의 완전히 보이지 않는다. Android는 완전히 패치되었을 수 있다. 브라우저는 샌드박스 처리되었을 수 있다. 사용자는 결코 악성 링크를 탭하지 않을 수 있다. 취약한 코드가 애플리케이션 프로세서가 관여하기 전에 무선 신호를 처리하는 모뎀 펌웨어에 있다면, 그 어느 것도 중요하지 않다.

CVE-2024-20154는 바로 그런 종류의 취약점이다.

변조된 NB-IoT 시스템 정보 브로드캐스트는 MediaTek 모뎀 펌웨어가 공격자가 제어하는 스케줄링 카운트를 받아들이고, 그 카운트를 RRC-to-L1 구성 경로를 통해 한 번도 클램핑하지 않고 전달하며, 결국 NB-IoT 브로드캐스트 채널 핸들러 내부의 스택 쓰기 루프의 루프 바운드로 사용하도록 만든다. 카운트가 대상 배열의 용량을 초과하면, 루프는 그 너머에 쓰고, 스택의 저장된 레지스터에 도달하며, 저장된 반환 주소를 덮어쓴다. 그런 다음 함수는 손상된 값을 반환 주소 레지스터에 복원하고 그곳으로 점프한다.

심각도를 그렇게 만드는 요소:

  • 취약한 코드 경로는 셀 캠핑 중에 실행된다 — 셀에 동기화한 후 이지만 어떤 RRC 연결, 어떤 인증, 어떤 사용자 상호작용보다도 이전이다.
  • 입력은 무선 브로드캐스트다. 휴대폰은 출처를 인증할 수 없다.
  • 분석된 빌드의 베이스밴드 펌웨어는 ASLR, 스택 카나리, 비실행 스택, 제어 흐름 무결성 없이 실행된다. 저장된 반환 주소 덮어쓰기는 직접적으로 프로그램 카운터 제어로 이어진다.

이 취약점은 MediaTek의 2025년 1월 6일 보안 공지에 치명적 심각도 등급으로 게시되었으며, 무엇보다도 LR12A 모뎀 패밀리에 영향을 미친다. Samsung은 수정 사항을 2025년 2월 보안 유지보수 릴리스에 통합했다.

이 글은 무기화된 익스플로잇을 공개하지 않으며 여기에 게시된 내용만으로는 재현할 수 없다. 목표는 체인이 어디서 끊어지는지, 각 계층이 왜 이를 막지 못했는지, 그리고 라이브 모뎀에 디버거를 붙일 수 없을 때 베이스밴드 버그를 책임감 있게 검증하는 데 무엇이 필요한지를 보여주는 것이다.


2. 대상 및 환경

2.1 기기 및 펌웨어

주 대상: Samsung Galaxy A14 (SM-A145R). 무선 서브시스템은 MT6769 칩셋 패밀리 (Helio G80)의 MediaTek 베이스밴드 프로세서에 의해 구동된다. MT6769 패밀리는 CVE-2024-20154에 대해 MediaTek의 영향받는 칩셋 목록에 명시적으로 기재되어 있다.``` AP/CP firmware: A145RXXU1AWD1 Modem software: MOLY LR12A.R3.TC10.6M.A14.PR.SP.V1.P5 Build date: 2023-04-18

베이스밴드 펌웨어는 Android 코드가 아니다. 이는 SoC의 무선 서브시스템에 있는 별도의 임베디드 시스템으로, 자체 CPU, 자체 RTOS, 자체 메모리 공간을 가지며 Android 프로세스 샌드박스 외부에 존재한다.

### 2.2 모뎀 아키텍처

추출된 바이너리 분석 결과, 모뎀 프로세서는 리틀 엔디언 모드에서 MIPS16e2 압축 명령어를 사용하는 MIPS32를 실행한다. MIPS16e2는 임베디드 코드 크기 축소를 위한 16비트 인코딩 확장으로, Helio 세대 베이스밴드에 대한 MediaTek의 접근 방식과 일치하며, 이 SoC 제품군에 대한 독립적으로 발표된 베이스밴드 연구로 확인되었다.

운영체제는 Nucleus RTOS로, 태스크 스케줄링, IPC 메시지 큐, 풀 기반 메모리 할당자를 제공한다. 커널/사용자 권한 분리, 태스크 간 메모리 보호 유닛 적용, 하드웨어 스택 가드 메커니즘이 없다.

이 글의 모든 주소는 Ghidra에서 베이스 `0x90000000`으로 로드된 가상 주소이다.

### 2.3 완화 기법 (분석된 빌드에서 관찰됨)

| 완화 기법 | 상태 | 효과 |
|---|---|---|
| ASLR | 없음 | 펌웨어 주소가 정적이며 이미지에서 예측 가능 |
| 스택 카나리 | 없음 | `SAVE`/`RESTORE`가 가드 값 없이 callee-saved 레지스터를 저장 |
| NX / W^X | 없음 | 스택 메모리가 실행 가능 |
| CFI | 없음 | 반환 주소가 어떤 정책에 대해서도 검증되지 않음 |

### 2.4 분석 접근 방식

세 가지 병렬 트랙:

**정적 분석.** Samsung 펌웨어 패키지 → CP 파티션 추출 → `md1img.img` → Ghidra (MIPS LE 32-bit, 베이스 `0x90000000`), NCC Group `mtk_bp` 툴셋을 사용하여 펌웨어 디버그 섹션에서 복구된 MediaTek 엔지니어링 심볼과 함께.

**동적 검증.** Unicorn Engine (MIPS32 에뮬레이션)을 사용하여 두 단계에 걸쳐 특정 펌웨어 루틴을 격리 실행했다. 1단계에서는 네이티브 명령어 쌍을 통해 `si_count`가 채널 컨텍스트로 클램프 없이 복사되는 것을 입증하려 시도했다. 2단계에서는 실제 펌웨어 바이트에서 취약한 루프를 실행하여 펌웨어 자체의 명령어가 저장된 반환 주소를 손상시키는 것을 확인했다. 1단계가 완전히 네이티브로 실행될 수 없었던 경우 — CPHY 디스패치 경로에 필요한 RTOS 서비스 객체 환경이 재구성되지 않았기 때문 — 부작용을 직접 모델링하고 모든 출력에서 그렇게 표시했다.

**무선 측 검증.** ZMQ 루프백을 사용한 srsRAN 4G — 소프트웨어 전용, RF 방출 없음 — 는 테스트 페이로드가 NB-IoT PHY 인코딩과 전송 블록 전달을 견뎌낸다는 것을 확인했다.

---

## 3. 공격 표면: NB-IoT 및 SIB1-NB

### 3.1 사전 연관 공격 표면

NB-IoT (Narrowband Internet of Things)는 3GPP Release 13으로, 기존 라이선스 LTE 스펙트럼을 사용하여 제약된 IoT 기기를 연결하도록 설계되었다. 소비자 스마트폰을 포함한 다양한 최신 셀룰러 SoC에 구현되어 있다.

RRC_IDLE 상태에서, RRC 연결이 설정되기 전에, 서비스를 검색하는 기기는:

1. 셀의 타이밍 신호(NPSS/NSSS)와 동기화
2. NPBCH를 통해 Master Information Block 디코딩 (640 ms 전송 윈도우)
3. NPDSCH에서 SIB1-NB 디코딩 (2560 ms 스케줄)
4. SIB1-NB의 스케줄링 정보를 사용하여 추가 시스템 정보 블록 위치 파악

3단계에서 모뎀은 인증하지 않은 엔티티로부터 온 메시지를, 어떤 연결이나 사용자 상호작용도 있기 전에 처리한다. 정상적인 셀 선택 조건을 충족하는 악성 송신기가 처리될 것이다.```
+------------------+                   +---------------------+
|  Rogue Base Stn  |                   |  Target UE (Modem)  |
+--------+---------+                   +----------+----------+
         |                                        |
         |   NPSS/NSSS sync                      |
         |--------------------------------------->|
         |   MIB-NB (640 ms cycle)                |
         |--------------------------------------->|
         |   SIB1-NB (malformed, si_count > 8)    |
         |--------------------------------------->|   ← vulnerability triggered
         |   [no RRC connection established]      |

3.2 스케줄링 카운트 필드

SIB1-NB는 3GPP TS 36.331에 정의되어 있습니다. 이의 schedulingInfoList 필드는 셀이 브로드캐스트하는 System Information 메시지의 수를 전달하며, 스펙에 의해 최대 8개 항목(1..maxSI-Message-NB-r13 = 8)으로 제한됩니다. 이는 프로토콜 계층의 제약입니다. 메모리 안전성 제약 — 즉, 리스트 길이가 목적지 배열의 용량을 초과하지 않아야 한다는 것 — 은 펌웨어에 의해 별도로 강제되어야 합니다.

그러나 그렇게 되지 않았습니다.


4. 펌웨어 추출 및 심볼 복구

펌웨어는 Samsung CP 패키지에서 획득되었으며, NCC Group의 mtk_bp 툴셋을 사용하여 추출되었습니다:``` md1img.img → md1_extract.py → 000_md1rom (17.8 MB code image) → 017_md1_dbginfo (XZ-compressed CATI debug symbols)

CATI 디버그 섹션은 `mtk_dbg_extract.py symbols`로 압축 해제 및 파싱한 후,
`ImportSymbolsScript.py`를 통해 Ghidra로 임포트했습니다. 그 결과 모뎀 스택 전반에 걸쳐
전체 내부 함수 이름을 확보할 수 있었습니다 — ERRC 계층, L1 채널 관리, IPC 서브시스템,
그리고 NB-IoT BCCH 핸들러 체인 — 이를 통해 의미론 기반 체인 재구성이 가능해졌습니다.

이 글의 모든 함수 이름은 펌웨어 이미지에서 추출한 MediaTek 자체 내장 디버그 심볼에서
가져온 것입니다.

---

## 5. 취약점

### 5.1 취약한 루프

`el1_ch_nbcch_resume_req` (`0x90213940`)는 NB-IoT 브로드캐스트 채널 재개 이벤트를
처리합니다. 해당 MIPS16e2 함수 프롤로그:```asm
90213940:  save  0xE8, ra, s0-s1

SAVE 명령어는 sp를 0xE8만큼 감소시키고 callee-saved 레지스터들을 아래 방향으로 저장합니다:``` old_sp (= new_sp + 0xE8) new_sp + 0xE4 saved ra ← overflow target new_sp + 0xE0 saved s1 new_sp + 0xDC saved s0 new_sp + 0x98 si_sched_arr [34 halfwords = 68 bytes] new_sp + 0x78 si_type_arr [32 bytes] new_sp + 0x00 ← stack pointer after SAVE

Ghidra로 실제 펌웨어 바이너리를 디컴파일한 결과:```c
for (uVar6 = 0; uVar6 < (byte)param_2[0x40a]; uVar6 = uVar6 + 1) {
    si_type_arr[uVar6]  = /* SI type byte */;          // 1 byte/iter, base new_sp+0x78
    si_sched_arr[uVar6] = /* SI schedule halfword */;  // 2 bytes/iter, base new_sp+0x98
}

param_2[0x40a]는 ch_ctx[+0x40A]입니다 — 채널 컨텍스트 BSS 구조체 내의 영구 바이트입니다. 루프 바운드는 배열 용량과의 사전 비교 없이 직접 사용됩니다.

5.2 오버플로 산술

스트림 A(하프워드 sh 쓰기)는 new_sp+0x98에서 시작하여 반복마다 2바이트씩 진행합니다. 반복 38에서 new_sp+0xE4에 있는 저장된 RA에 도달합니다:``` new_sp + 0x98 + i×2 = new_sp + 0xE4 i = (0xE4 - 0x98) / 2 = 0x4C / 2 = 38

Stream B(바이트 `sb` 쓰기)는 `new_sp+0x78`에서 시작하며 RA 슬롯에 도달하려면 반복 108이 필요합니다:```
new_sp + 0x78 + i = new_sp + 0xE4
i = 0xE4 - 0x78 = 108

si_count = 40(오버플로 임계값 38을 초과하도록 선택된 데모 값)을 사용하면 루프는 40회 반복을 실행한다. Stream B는 RA 슬롯에 도달하지 않는다. RA 손상은 전적으로 Stream A에서 발생한다.

반복sh가 쓰는 위치효과
0–33si_sched_arr[0..33]범위 내
34–35new_sp+0xDC — 저장된 s0s0 손상
36–37new_sp+0xE0 — 저장된 s1s1 손상
38new_sp+0xE4 — 저장된 ra [15:0]RA 하위 하프워드
39new_sp+0xE6 — 저장된 ra [31:16]RA 상위 하프워드

40회 반복 후 MIPS16e2 RESTORE 명령어는 손상된 값을 스택에서 $ra로 다시 로드하고, jrc ra가 제어를 전환한다.

5.3 클램프되지 않은 복사 — Layer B

도구 다운로드