Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

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

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

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
ctl_ctloutput-leak — CVE-2017-13868: XNU에서 초기화되지 않은 커널 힙 데이터의 정보 누출. | Kitploit
도구/GitHubGitHub/bazad/ctl_ctloutput-leak
Memory ForensicsVulnerability AnalysisExploitationInformation GatheringBinary Exploitation
GitHubbazad/ctl_ctloutput-leak

ctl_ctloutput-leak

CVE-2017-13868: XNU에서 초기화되지 않은 커널 힙 데이터의 정보 누출.

저장소 보기
27528년 전Kitploit 검토 완료

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

ctl_ctloutput-leak

macOS High Sierra 10.13의 ctl_ctloutput 함수는 sooptcopyin 호출의 반환 값을 무시하여 초기화되지 않은 커널 힙 데이터를 사용자 공간으로 유출할 수 있는 경쟁 조건 창을 열어줍니다. ctl_ctloutput-leak은 이 정보 유출을 트리거하려는 개념 증명 익스플로잇입니다. 익스플로잇에는 루트 권한이 필요합니다.

이 익스플로잇은 macOS High Sierra 10.13.1 Beta 17B25c 및 iOS 10.1.1 14B100 (mach_portal 사용 시)에서 작동이 확인되었습니다.

취약점: CVE-2017-13868

다음은 macOS High Sierra 10.13의 ctl_ctloutput 관련 부분입니다.

root@kitploit:~
if (sopt->sopt_valsize && sopt->sopt_val) {
	MALLOC(data, void *, sopt->sopt_valsize, M_TEMP,	// (a) data is allocated
		M_WAITOK);					//     without M_ZERO.
	if (data == NULL)
		return (ENOMEM);
	/*
	 * 4108337 - copy user data in case the
	 * kernel control needs it
	 */
	error = sooptcopyin(sopt, data,				// (b) sooptcopyin() is
		sopt->sopt_valsize, sopt->sopt_valsize);	//     called to fill the
}								//     buffer; the return
len = sopt->sopt_valsize;					//     value is ignored.
socket_unlock(so, 0);
error = (*kctl->getopt)(kctl->kctlref, kcb->unit,		// (c) The getsockopt()
		kcb->userdata, sopt->sopt_name,			//     implementation is
			data, &len);				//     called to process
if (data != NULL && len > sopt->sopt_valsize)			//     the buffer.
	panic_plain("ctl_ctloutput: ctl %s returned "
		"len (%lu) > sopt_valsize (%lu)\n",
			kcb->kctl->name, len,
			sopt->sopt_valsize);
socket_lock(so, 0);
if (error == 0) {
	if (data != NULL)
		error = sooptcopyout(sopt, data, len);		// (d) If (c) succeeded,
	else							//     then the data buffer
		sopt->sopt_valsize = len;			//     is copied out to
}								//     userspace.

이 코드는 다음을 수행합니다:

  1. getsockopt의 data 매개변수에 대해 커널 힙 버퍼를 할당하되, 할당된 바이트를 0으로 초기화하는 M_ZERO 플래그를 지정하지 않습니다.
  2. sooptcopyin을 사용하여 사용자 공간에서 getsockopt 데이터를 복사하여 방금 할당된 데이터 버퍼를 채웁니다. 이 복사는 할당된 데이터를 완전히 덮어쓸 것으로 예상되므로 M_ZERO 플래그가 필요하지 않았습니다. 그러나 sooptcopyin의 반환 값이 확인되지 않으므로 복사가 실패하여 버퍼에 초기화되지 않은 데이터가 남을 가능성이 있습니다. 예를 들어 프로그램이 getsockopt에 매핑되지 않은 주소를 전달하면 복사가 실패할 수 있습니다.
  3. 그런 다음 코드는 이 커널 제어 소켓에 대한 실제 getsockopt 구현을 호출합니다. 이 구현은 입력 버퍼를 처리하고 수정 및 단축한 후 결과 코드를 반환해야 합니다. 그러나 구현은 제공된 버퍼가 이미 초기화되었다고 가정할 수 있으므로(이론적으로 사용자 공간에서 오므로) 여러 구현이 버퍼를 전혀 수정하지 않습니다. 예를 들어 NECP 함수 necp_ctl_getopt는 데이터 버퍼를 전혀 처리하지 않고 0을 반환합니다.
  4. 마지막으로 실제 getsockopt 구현이 오류를 반환하지 않으면 ctl_ctloutput은 sooptcopyout을 호출하여 데이터 버퍼를 사용자 공간으로 다시 복사합니다.

따라서 getsockopt에 매핑되지 않은 데이터 주소를 지정하면 제어된 크기의 힙 버퍼가 할당되고, 해당 버퍼의 내용이 초기화되지 않도록 방지한 다음, sooptcopyout 호출로 이어져 해당 버퍼를 매핑되지 않은 주소에 다시 쓰려고 시도합니다. copyout이 성공하기 위해 해야 할 일은 sooptcopyin과 sooptcopyout 호출 사이에 해당 주소를 다시 매핑하는 것뿐입니다. 그렇게 하면 초기화되지 않은 커널 힙 데이터가 사용자 공간으로 유출됩니다.

이 경쟁 조건은 매우 쉽게 이길 수 있는 것으로 밝혀졌습니다. 2015년형 Macbook Pro에서 테스트했을 때 경쟁을 이기기 위한 평균 시도 횟수는 600회를 넘지 않았고 중앙값은 5회를 넘지 않았습니다. iPhone 7의 iOS 10.1.1에서는 경쟁이 훨씬 더 쉽게 이겨졌으며 일반적으로 2회 이하의 시도로 성공했습니다. (이 테스트는 DEBUG를 비활성화한 상태로 수행되었습니다. printfs가 익스플로잇을 크게 느리게 만들기 때문입니다.)

사용법

빌드하려면 make를 실행하세요. 다양한 빌드 옵션은 Makefile 상단을 참조하십시오.

명령줄에 대상 유출 크기를 지정하여 익스플로잇을 실행합니다:

root@kitploit:~
$ sudo ./ctl_ctloutput-leak 128
000000:  ef be ad de ef be ad de  00 00 00 00 00 00 00 00
000010:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
000020:  00 00 00 00 00 00 00 00  01 00 00 00 40 80 00 00
000030:  de 28 45 00 04 00 00 00  a0 ff 4a 26 80 ff ff ff
000040:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
000050:  08 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
000060:  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00
000070:  00 00 00 00 00 00 00 00  ef be ad de ef be ad de

타임라인

이 문제를 2017년 10월 7일 Apple에 보고했습니다. CVE-2017-13868이 할당되었습니다. Apple은 macOS 10.13.2 및 iOS 11.2에서 이 문제를 수정했습니다.

라이선스

ctl_ctloutput-leak 코드는 퍼블릭 도메인으로 공개됩니다. 예의상 이 코드를 참조하거나 사용할 경우 출처를 표시해 주시기를 부탁드립니다.

도구 다운로드