
CVE-2024-45200에 대한 기술적 분석 및 개념 증명(PoC)으로, Mario Kart 8 Deluxe의 Pia P2P 네트워킹 라이브러리에 존재하는 스택 기반 버퍼 오버플로우를 통해 Nintendo Switch에서 원격 충돌 및 잠재적 RCE(원격 코드 실행)를 가능하게 합니다.
Mario Kart 8 Deluxe의 "KartLANPwn" 스택 기반 버퍼 오버플로 취약점에 대한 정보 및 개념 증명
작성자: Chad Hyatt
| CVE | CVE-2024-45200 |
| CVSS 3.1 | 미정 (Nintendo..는 4.3/10이라고 주장) |
| 지급된 현상금 | $512 |
| H1 보고서 | #2611669 |
| 발견일 | 2024년 7월 2일 |
| 수정일 | 2024년 9월 11일 (v3.0.3) |
| 공개일 | 2024년 9월 29일 |
KartLANPwn은 Mario Kart 8 Deluxe가 Pia P2P 네트워킹 라이브러리를 잘못 사용하여 발생하는 취약점입니다. 여기서 "[CopyAppData](#lan_copyappdata-의사-코드)"의 개별 구현이 out 버퍼 자체보다 큰 outBufSize로 호출되는 경우가 있습니다. 이는 체인을 통해 정보 유출과 결합될 경우 피어 콘솔에서 사용자 모드 원격 코드 실행(RCE)으로 이어질 수 있습니다. KartLANPwn은 Pia의 LAN/LDN 멀티플레이 및 NEX 온라인 멀티플레이 구현에 영향을 미칩니다.
이 취약점은 Mario Kart 8 Deluxe의 v3.0.1 *(중국/텐센트의 경우 v3.0.2)*까지 모든 버전에 영향을 미치며, MK8DX v3.0.1 소매 릴리스의 "LAN Play" 기능을 통해 구체적으로 시연되었습니다.
2024/09/11 기준으로 닌텐도는 모든 지역(중국 제외)에 v3.0.3과 함께 KartLANPwn 수정을 배포했습니다. 2024/09/27 기준으로 중국에도 v3.0.3이 출시되었습니다. 닌텐도의 허가를 받은 후 이 정보를 안전하게 공개했습니다.
독점 Pia 네트워킹 라이브러리는 로컬 또는 온라인 플레이를 지원하는 퍼스트파티 Nintendo Switch 게임에서 LAN/LDN(로컬 멀티플레이) 및 온라인 멀티플레이에 사용되는 NEX 프로토콜에 대한 P2P 네트워크 코드 구현을 제공하는 데 사용됩니다.
시연을 위해 우리는 특히 Pia의 LAN 프로토콜에 초점을 맞출 것입니다. 방 호스트의 콘솔은 로컬 브로드캐스트 주소(255.255.255.255)의 :30000에서 UDP "디스커버리" 소켓을 열고, 동일 네트워크의 다른 콘솔은 자체 소켓(역시 :30000)에서 라우터로 "검색 요청"을 광고하여 동일 네트워크의 다른 장치로 전달해야 합니다.
방 호스트(서버)는 방 정보(호스트 표시 이름, Mii 데이터, 플레이어 수 등)를 포함하는 초기 "검색 응답"을 다시 보냅니다. 검색 응답 패킷 내에서 out 버퍼로 복사될 애플리케이션 데이터의 길이는 out이 128바이트에 불과함에도 불구하고 최대 150까지 제어할 수 있습니다. 이로 인해 스택 프레임의 값이 오버플로됩니다(이 특정 경우 pop {r4-r8, pc}의 경우).
적어도 MK8DX가 사용하는 Pia 버전의 경우, 우리가 집중하는 부분에서 LAN용 검색 응답 패킷은 다음과 같이 구성됩니다:
(모든 정수 유형은 빅 엔디안으로 인코딩됨)
| 인덱스 | 의사 타입 | 설명 |
|---|---|---|
| 0 | u8 | 패킷 유형 (0x1) |
| 1 | u32 | 세션 정보 본문 크기 (1266의 경우) |
| 5 | (42바이트) | 기타 세션 정보 필드, 우리와 무관 |
| 47 | (0x180바이트) | 애플리케이션 데이터 공간 시작 |
| 431 | u32 | 애플리케이션 데이터 길이 |
나머지 세션 정보는 KartLANPwn 패킷 구성에 중요하지 않으므로 생략합니다.
LAN_CopyAppData" 의사 코드시연을 위해 아래는 LAN 구현의 "CopyAppData"의 대략적인 의사 코드입니다. 이 함수 자체에는 문제가 없지만, 잘못된 사용(MK8DX의 경우)으로 인해 패킷의 입력 애플리케이션 데이터로 스택 프레임이 덮어쓰여질 수 있습니다.
(MK8DX v3.0.1의 main에서 +0xA0F8C0에 위치한 함수)
void LAN_CopyAppData(int* r0, int packet, int out, uint outBufSize) {
int u1 = 68612;
if (out != NULL) {
// The actual length to read from the `packet` buffer at the start of our
// application data (which our 'server' controls)
uint appDataLength = *(uint *)(packet + 432);
// In some cases, outBufSize is input as a larger number than the bounds of the
// `out` buffer, which allows a stack buffer overflow (in our specific case, `*out`
// is 128 bytes long, and outBufSize is 150!)
if (appDataLength <= outBufSize) {
memcpy(out, packet + 48, outBufSize); // packet[47], start of application data
u1 = 0;
}
*r0 = u1;
return;
}
*r0 = 68615;
return;
}
우리는 Python으로 작성된 간단한 PoC 스크립트를 제공했습니다. 이 스크립트는 가짜 방 호스트 역할을 하며, 동일 네트워크의 콘솔에서 MK8DX의 "LAN Play" 메뉴를 열면 게임 프로세스가 충돌하도록 특수 제작된 "검색 응답" 패킷으로 응답합니다.
GitHub에서 직접 저장소의 zip을 다운로드하거나 git을 사용하여 클론하십시오:
git clone https://github.com/latte-soft/kartlanpwn.git && cd kartlanpwn
python3 kartlanpwn-poc.py
비디오 시연 보기 (YouTube):
ARM 덕후들을 위해, GDB에서 결과 프로세스 세그폴트 스크린샷:

버그 자체의 세부 사항을 파악하는 데는 며칠밖에 걸리지 않았지만, 실제로 오버플로를 활용하는 것은? 그것은 완전히 다른 문제입니다. 닌텐도 스위치 커널의 사용자 모드는 까다롭습니다; 가능한 모든 부분에서 매우 엄격합니다. 우리는 다양한 아이디어와 단서를 교환하고 조작하는 데 많은 시간을 보냈지만, 실제 (임의) 코드 실행에는 결국 성공하지 못했습니다. 우리의 특정 경우, 신뢰할 수 있는 ROP조차도 실현 가능해 보이지 않았습니다. 대부분의 상대적 네트워킹 관련 함수가 클래스 기반이었고, 또한 r4-r8에 대한 직접 쓰기 액세스만 가능했기 때문입니다. (*_this 내 사랑) 게다가 이전 정보 유출 없이 mov r4, r0 등을 건너뛰어 _this 포인터를 제어하는 것은 쉽지 않았습니다. 재미있는 일이었습니다!
보고 측면에서 이번에는 Nintendo 트리지를 통해 모든 과정이 상대적으로 원활했습니다. $512의 현상금 지급은 예상보다 훨씬 적었지만(항상 그렇죠?), "닌텐도 닌자"가 내 문 앞에 나타나는 것보다는 낫습니다..
닌텐도는 확실히 Wii, 3DS, 심지어 Wii U의 단순했던 시절로부터 교훈을 얻었습니다. 그들은 숙제를 했습니다. 스위치의 사용자 모드에서 서비스 거부 충돌을 넘어선 모든 종류의 성공적인 익스플로잇은 거의 불가능합니다. ASLR, 강제 No-Execute 페이지(실행 가능 메모리 페이지에 직접 쓸 수 없으며, 게임은 전용 sysmodule을 사용해야 함!), ROP 불가능 등 여러 고통스러운 점이 있습니다. (모딩 커뮤니티가 곧 이 말을 반박하기를 기다리며..) 반면, 지난 몇 달 동안 저는 완전히 새로운 플랫폼과 아키텍처(저에게는)에 대해 매우 짧은 시간에 엄청나게 많은 것을 배웠습니다. 게다가 KartLANPwn에서 함께 작업한 멋진 사람들을 만나게 되어 기쁩니다! (Pablo와 fishguy 감사합니다 😄)
| 날짜 | 정보 |
|---|---|
| 2024/07/18 | HackerOne을 통해 Nintendo에 보고서 제출 |
| 2024/07/31 | 내부적으로 보고서 분류 완료 |
| 2024/09/11 | 모든 지역(중국 제외)에 Mario Kart 8 Deluxe v3.0.3과 함께 수정 사항 출시 |
| 2024/09/12 | Nintendo가 현상금 지급 |
| 2024/09/12 | 다른 연구자들이 v3.0.3의 바인드 비교에서 "게임 네트워크 코드의 보안 결함"에 대한 수정 사항을 상당히 빨리 발견 |
| 2024/09/27 | 중국 지역에 Mario Kart 8 Deluxe v3.0.3 출시 |
| 2024/09/29 | Nintendo가 공개를 허가하여 이 저장소가 공개됨 |
| 2024/09/30 | NVD에 의해 CVE-2024-45200 게시됨 |
KartLANPwn © 2024는 CC BY 4.0에 따라 라이선스가 부여됩니다.
이 라이선스의 사본을 보려면 https://creativecommons.org/licenses/by/4.0/을 방문하십시오.