qianfei11/CVE-2026-33317
GitHub: qianfei11/CVE-2026-33317
针对OP-TEE PKCS#11 TA越界写入漏洞(CVE-2026-33317)的概念验证,演示通过Normal World恶意请求触发Secure World堆内存破坏。
Stars: 0 | Forks: 0
# CVE-2026-33317 OP-TEE PKCS#11 PoC
本仓库包含针对 CVE-2026-33317 / GHSA-8cqw-mg7v-c9p9 的 Normal World 概念验证、复现说明以及捕获的日志。
OP-TEE 官方安全公告描述了在 `entry_get_attribute_value()` 中针对 `PKCS11_CMD_GET_ATTRIBUTE_VALUE` 缺乏验证的问题。该漏洞可能导致从 PKCS#11 TA 堆中发生越界读取,并且在使用格式错误的属性模板时,会发生超出临时模板缓冲区的越界写入。此 PoC 针对越界写入的情况,演示了 PKCS#11 TA 中的 Secure World 堆内存破坏。
- 安全公告: https://github.com/OP-TEE/optee_os/security/advisories/GHSA-8cqw-mg7v-c9p9
- CVE: `CVE-2026-33317`
- 受影响的包: OP-TEE PKCS#11 TA
- 公告中受影响的版本: `>= 3.13.0`
- 公告中已修复的版本: `4.11` 及更高版本
- 公告中的 CVSS v3.1: `8.7` 高
- 公告中的弱点: `CWE-125`, `CWE-787`
请仅在您获得授权测试 OP-TEE 的本地实验室或其他环境中使用此代码。
## 此文件夹中的内容
准备此 README 的本地工作副本是一个扁平化的 OP-TEE QEMUv8 工作区。`.repo` 目录和所有 `.git` 元数据文件/目录已被移除,因此该本地归档不再适用于 `repo sync` 或常规的 git 历史记录命令。
该 GitHub 仓库有意排除了庞大的 OP-TEE/QEMU 源码树、工具链和构建输出。请从 `qemu-v8-setup.md` 重新创建这些内容,或者将 PoC 文件复制到现有的 OP-TEE `qemu_v8` 构建根目录中,然后再从全新的克隆中运行自动化的 QEMU 复现。
重要的顶层文件:
| 路径 | 用途 |
| --- | --- |
| `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 panic 的 Secure World 日志 |
| `reproduction-log.md` | 完整的 QEMUv8 复现说明 |
| `qemu-v8-setup.md` | OP-TEE QEMUv8 设置和基线验证说明 |
| `C-01-reproduction.md` | 早期的 ASAN harness 说明;不是此文件夹中主要的可运行 PoC |
| `AGENTS.md` | 面向未来 AI/代码代理的维护说明 |
准备好的本地归档还包含如 `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 字节 label 相匹配。
这会创建一个 16 字节的模板分配:
```
sizeof(pkcs11_object_head) + attrs_size = 8 + 8 = 16
```
`cli_ref->data` 随后指向 `template + 16`,恰好超出分配空间末尾一个字节。`ta/pkcs11/src/attributes.c` 中的 `get_attribute()` 发现调用者提供的大小足够,并将 16 字节的 label 复制到该越界指针,从而破坏了 PKCS#11 TA 堆。
## 快速开始
准备好的 QEMUv8 工作区所使用的前置条件:
- Linux x86-64 主机
- `expect`
- 一个包含构建输出、工具链和 QEMU 二进制文件的 OP-TEE `qemu_v8` 工作区,其布局类似于 `qemu-v8-setup.md` 中描述的本地归档
构建 PoC:
```
./build_poc.sh
```
预期构建结果:
```
Built: out/bin/c01_poc
```
运行自动化的 QEMUv8 复现:
```
./run_c01.sh
```
封装脚本在启动前会检查这些暂存文件:
- `out/bin/bl1.bin`
- `out/bin/Image`
- `out/bin/rootfs.cpio.gz`
- `out/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 panic:
```
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.log`
- `out/bin/c01_sw.log`
## PoC 流程
`c01_poc.c` 通过 `libteec` 调用 PKCS#11 TA UUID `fd02c9da-306c-48c7-a49c-bbd827ae86ee`:
1. 与 PKCS#11 TA 打开一个 TEEC 会话。
2. 初始化令牌插槽 0。
3. 打开一个 R/W PKCS#11 会话。
4. 创建一个带有 `CKA_LABEL = "AAAAAAAAAAAAAAAA"` 的 AES 会话对象。
5. 发送一个格式错误的 `CMD_GET_ATTRIBUTE_VALUE` 请求,其中 `attrs_size = 8` 且 `cli_head.size = 16`。
第一个恶意请求足以破坏堆元数据。当 OP-TEE bget 分配器检测到被破坏的块元数据时,TA 随后会发生 panic。
## 备注
- `run_c01.sh` 通过 virtio-9p 将 `out/bin` 共享给客户机,并将日志写回同一目录。
- 在完整的本地归档中,`out/bin` 中暂存的启动产物链接应指向该归档内的产物。已发布的 GitHub 仓库仅跟踪捕获到的 `out/bin/c01_*.log` 文件。
- `C-01-reproduction.md` 记录了早期的 x86 ASAN harness 方法。此文件夹中可运行的 PoC 是 QEMUv8 TEEC PoC:`c01_poc.c`。
- 由于 repo 元数据已被移除,请将此目录视为一个已归档的 PoC 工作区,而不是与上游同步的 OP-TEE 检出。
标签:AArch64, ARM TrustZone, CISA项目, Cutter, CVE-2026-33317, CWE-125, CWE-787, libteec, OP-TEE, PKCS#11, PoC, QEMU, TEE, Web报告查看器, 内联执行, 协议分析, 堆溢出, 安全世界, 客户端加密, 暴力破解, 权限提升, 漏洞复现, 物联网安全, 目录枚举, 硬件安全, 移动安全, 网络安全, 越界写入, 隐私保护