
Linux Kernel의 OOB 읽기 및 쓰기 취약점에 대한 write-up 및 LPE PoC
Linux Kernel의 OOB 읽기 및 쓰기 취약점에 대한 write-up 및 로컬 권한 상승 PoC(Proof-of-Concept)입니다.
이 취약점에 대한 write-up은 제 블로그에서 찾을 수 있으며, nf_tables에 대한 소개도 여기에서 확인할 수 있습니다.
이 저장소에 제공된 익스플로잇이 취약한 커널 버전에서 즉시 성공적으로 실행될 것으로 기대해서는 안 됩니다. 커널 빌드마다 많은 오프셋이 다를 수 있으며, 당연히 ROP 가젯도 다릅니다.
때로는 커널 빌드 간 차이로 인해 취약점을 이용하는 방식 자체를 바꿔야 할 수도 있습니다. 예를 들어 David Bouman(@pqlqpql)의 이 취약점에 대한 또 다른 write-up이 여기에 있는데, 그는 UDP 패킷을 사용해 취약점을 이용합니다 - UDP 패킷이 처리되는 동안 스택을 대상으로 하는 방식입니다 - 하지만 제 커널 빌드에서는 스택 레이아웃의 큰 차이로 인해 이 방식을 사용할 수 없었습니다. 대신 저는 TCP ACK 패킷이 처리되는 동안 스택을 대상으로 하는 방법을 사용했습니다.
직접 테스트해 보고 싶다면 제 write-up을 읽고 오프셋을 찾는 과정, 사용할 훅(hook) 등을 따라가 보시길 권장합니다.
제가 write-up에서 대상으로 삼은 커널을 빌드할 때 사용한 정확한 커널 버전은 5.12.0이며, 커밋은 9f4ad9e425a1d3b6a34617b8ea226d56a119a717입니다.
익스플로잇을 빌드하려면 libmnl 및 libnftnl 라이브러리와 POSIX 스레드(pthread) 라이브러리가 필요합니다.
빌드는 다음과 같이 간단합니다.
gcc -lmnl -lnftnl -lpthread exploit.c -o exploit
이 취약점은 버전 5.12에서 커밋 345023b0db315648ccc3c1a36aee88304a8b4d91로 도입된 nft_validate_register_store에서 발생하며, 버전 5.17의 커밋 6e1acfa387b9ff82cfc7db8cc3b6959221a95851에서 패치되었습니다.
이 Proof-of-Concept와 취약점에 대한 write-up은 교육 목적으로만 제공됩니다. 이 코드가 어떤 방식으로 사용되든 저는 법적 책임을 지지 않습니다.