
Exploit for CVE-2023-5178
다음에 대한 익스플로잇:
CVE-2023-5178: NVMe-oF-TCP 취약점, 이는 손상된 Initialize Connection Request를 처리하는 과정에서 NVMe-oF-TCP 드라이버의 논리 오류입니다. 이로 인해 **kmalloc-96에서 레이스 조건에 의한 이중 해제(double-free)**가 발생하며, LPE를 획득하는 데 악용될 수 있습니다(아래 데모 참조).
익스플로잇은 6.5.0-9-generic 커널이 탑재된 Ubuntu 23.10(영향을 받는 최신 커널 버전)을 대상으로 합니다.
v6 커널로의 백포팅은 커널 심볼을 변경하고 롭체인(ropchain)을 조정하여 쉽게 수행할 수 있습니다.v5로의 백포팅은 약간의 수정이 필요하며, 이에 대해서는 writeup에서 다루겠습니다. 커널 v5에서의 익스플로잇은 더 쉽고 (writeup에서 논의) 더 안정적입니다.이 버그는 Alon Zahavi가 발견했습니다. 그는 이 openwall 기사에서 취약점에 대한 좋은 설명을 게시했습니다.
동영상은 여기에서 볼 수 있습니다.

nvmet, nvmet-tcp 모듈이 커널에 로드되어 있어야 합니다.libfuse3-dev가 설치되어 있는지 확인하십시오 (Ubuntu에서는 기본적으로 설치되어 있지만 어쨌든). 만약 없다면, github에서 릴리스를 다운로드하여 컴파일하는 것이 가장 좋습니다. 저는 3.14.0을 사용했지만, 다른 버전에서도 작동해야 합니다.SLUB의 작동 방식에 관한 것이지만, 경쟁 조건(race condition)이 상황을 약간 까다롭게 만듭니다. 어쨌든, writeup에서 다중 CPU 머신을 처리하도록 개선하는 방법을 설명하겠습니다.git clone https://github.com/rockrid3r/CVE-2023-5178
cd CVE-2023-5178
make
./build/xpl # run the exploit
libfuse3-dev가 없다면, 컴파일된 libfuse를 수동으로 링크해야 합니다. 컴파일 방법은 Makefile을 참조하십시오. -lfuse3를 -l:path-to-libfuse.so로 바꾸십시오. -I /path/to/libfuse-headers/로 헤더 경로를 추가하는 것을 잊지 마십시오. 다음 명령으로 익스플로잇을 실행하십시오:LD_PRELOAD_PATH=/path/to/libfuse.so ./build/exploit
자신의 시스템에 취약점이 존재하는지 테스트하고 싶은 분들을 위해, 간단히 버그를 트리거하는 src/poc.c 파일이 있습니다. 이 파일은 시스템에서 NVMe-oF-TCP의 기본 IP/포트 구성을 가정합니다. 기본값이 아닌 경우 조정해야 합니다:
#define NVME_SERVER_IP "0.0.0.0" // ip of vulnerable host in LAN (localhost here).
#define NVME_SERVER_PORT 4420 // port on which NVMe-oF-TCP is set up on vulnerable host
다음 명령으로 컴파일하고 실행하십시오:
make build/poc
./build/poc
그냥 실행하면 됩니다(여러 번 실행할 수도 있음) 그런 다음 잠시 기다리십시오. 취약점이 존재하면 시스템이 충돌합니다.
전체 상세 분석은 여기에서 확인하십시오.