
linux kernel exploit
waitid 시스템 콜을 악용한 Linux 권한 상승. 이 익스플로잇은 교육 목적으로만 HexpressoTeam의 @XeR_0x2A와 @chaign_c가 제공합니다.
버그는 2017-05-21에 도입되었고 2017-10-09에 수정되었으며, 4.14.0-rc4+는 취약한 것으로 알려져 있습니다.
만약 당신이 초급/중급 익스플로잇 작성자 수준이라면, 우리의 구현을 읽기 전에 직접 익스플로잇 해보기를 권장합니다. 이는 쉬운 익스플로잇 원시(쓰기 가능한 커널 메모리에 임의 쓰기)를 사용한 아주 좋은 연습입니다.
또한 @LiveOverflow에게도 도전해보길 권합니다.
다음은 설명입니다:
oss-security:
안녕하세요,Chris Salls는 Linux 커널 v4.13에서 waitid() 시스템 콜이 리팩토링될 때 들어오는 인자가 사용자 공간을 가리키는지 확인하는 것을 실수로 중단했다는 것을 발견했습니다. 이로 인해 로컬 공격자가 커널 메모리에 직접 쓸 수 있게 되어 권한 상승으로 이어질 수 있습니다.
이 커밋에서 도입됨:
https://git.kernel.org/linus/4c48abe91be03d191d0c20cc755877da2cb35622메인라인 트리에 이 커밋으로 수정됨:
https://git.kernel.org/linus/96ca579a1ecc943b75beba58bebb0356f6cc4b51곧 -stable free(미래의 v4.13.7)에서 수정될 예정:
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable.git/log/?h=linux-4.13.y감사합니다,
waitid:
waitid -- 자식 프로세스의 상태 변경을 기다립니다.
int waitid(idtype_t idtype, id_t id, siginfo_t *infop, int options);
커널은 infop이 커널랜드 포인터인지 사용자랜드 포인터인지 확인하지 않으므로, 쓰기 권한이 있는 모든 커널 메모리 페이지의 메모리를 덮어쓸 수 있습니다. 재미있는 점은 우리가 무엇이 쓰여지는지 부분적으로만 제어할 수 있다는 것입니다.
이를 익스플로잇하는 방법은 천 가지가 넘습니다. 우리는 이 쓰기 원시를 null 포인터 역참조로 변환하기로 결정했습니다. 커널의 .BSS 섹션에 있는 have_canfork_callback 변수를 덮어썼습니다. 이 변수를 0(true) 이외의 값으로 설정하면 설정되지 않은 콜백(null)이 "프로세스가 노출되기 전에 새 작업에서 호출"됩니다.
CVE를 공유해준 Chris Salls와 @kees_cook에게 감사드립니다.
@XeR_0x2A와 @chaign_c의 첫 번째 "실제" Linux 커널 익스플로잇,
HexpressoTeam 소속.
2017-10-22