Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
optee-qemu — 具有易受攻击内核的环境,用于利用 TEE 驱动(CVE-2021-44733) | Kitploit
工具/GitHubGitHub/pjlantz/optee-qemu
嵌入式系统安全漏洞分析漏洞利用模糊测试学习与教育二进制利用实验室与实践
GitHubpjlantz/optee-qemu

optee-qemu

具有易受攻击内核的环境,用于利用 TEE 驱动(CVE-2021-44733)

查看仓库
7611144年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

CVE-2021-44733:Linux 内核 TEE 子系统中释放后使用漏洞的模糊测试与利用

最近,在 Linux 内核 TEE 子系统中发现了一个释放后使用漏洞,影响版本直至并包括 5.15.11,已分配编号 CVE-2021-44733 [1]。

乍一看,由于多种原因,它似乎不可利用;然而,在进一步分析漏洞代码路径并实现一个粗糙的概念验证漏洞利用后,可以覆盖内核中的函数指针。本文不提供权限提升载荷,但运行 OPTEE 和该漏洞利用的完整环境可供进一步测试,请参阅“设置环境”部分。

背景

TEE(可信执行环境,Trusted Execution Environment)是一种运行在安全环境中的可信操作系统,例如 ARM CPU 上的 TrustZone。TEE 驱动程序负责处理与 TEE 通信所需的细节。驱动程序的一些更重要的职责是基于 Globalplatform TEE Client API 规范 [3] 向 TEE 提供通用 API,同时还管理 Linux 与 TEE 之间的共享内存。该子系统可以通过在 ARM 架构的内核配置中启用 CONFIG_OPTEE 来开启。

安全世界包含被记为 OP-TEE OS 的可信操作系统 [4]。在该操作系统之上,可以运行所谓的可信应用(Trusted Applications,TA),它们可以在隔离环境中执行某些操作,参见图 1。

TEE overview
图 1:TEE 概览——来自 Linaro 的演示 [5]

普通世界(Linux 用户空间/内核)可以使用客户端应用程序(CA)以及 TEE 子系统暴露的 API 与这些应用程序交互。CA 可以打开一个到特定 TA 的会话,并调用该 TA 实现的函数。TA 与 CA 之间任何参数的传递都是通过共享内存完成的。 下面描述使用所有相关系统调用的 CA 与 TA 之间的交互。

  1. CA 打开 /dev/tee[0-9] 与驱动程序通信。注意,对于这些 API 的常规使用方式,这是通过 libteec 隐式完成的。

  2. CA 可以使用 TEE_IOC_SHM_ALLOC IOCTL 注册共享内存。这会分配共享内存并返回一个文件描述符,用户空间可以将其用作 mmap 的一部分。

  3. 下一步是使用 TEE_IOC_OPEN_SESSION IOCTL 建立会话,并指定特定 TA 的 uuid。该 uuid 在 TA 编译期间被硬编码。

  4. 为了调用 TA 中的任何特定函数,CA 通过指定函数标识符以及任何输入参数来调用,这通过 TEE_IOC_INVOKE 完成。

  5. 当 CA 完成所有请求后,可以使用 TEE_IOC_CLOSE_SESSION 关闭会话。

Session between CA and TA
图 2:CA 与 TA 之间的会话——来自 Linaro 的演示 [5]

客户端与 TEE 之间的大部分通信对驱动程序来说是不透明的。驱动程序的主要工作是管理上下文、接收来自客户端的请求、将其转发给 TEE,并将结果返回 [2]。

对 TEE 驱动程序进行模糊测试

CVE-2021-44733 是通过使用 syzkaller 进行模糊测试发现的。用于此目的的描述文件如下所示。请注意,ioctl$TEE_SHM_REGISTER_FD 仅属于 Linaro(维护者)内核树,而不在上游中。如果根据 syzkaller 文档 [6] 正确配置,“设置环境”中提供的环境可用于模糊测试。``` #include <uapi/linux/tee.h>

resource fd_tee0[fd] resource session_resource[int32]

openat$tee0(fd const[AT_FDCWD], dev ptr[in, string["/dev/tee0"]], flags flags[open_flags], mode flags[open_mode]) fd_tee0 ioctl$TEE_OPEN_SESSION(fd fd_tee0, cmd const[0x8010a402], arg ptr[inout, tee_ioctl_buf_data_session]) ioctl$TEE_INVOKE(fd fd_tee0, cmd const[0x8010a403], arg ptr[inout, tee_ioctl_buf_data_invoke]) ioctl$TEE_CANCEL(fd fd_tee0, cmd const[0x8008a404], arg ptr[in, tee_ioctl_buf_data_cancel]) ioctl$TEE_CLOSE_SESSION(fd fd_tee0, cmd const[0x8004a405], arg ptr[in, tee_ioctl_buf_data_close]) ioctl$TEE_VERSION(fd fd_tee0, cmd const[0x800ca400], arg ptr[out, tee_ioctl_buf_data_version]) ioctl$TEE_SHM_ALLOC(fd fd_tee0, cmd const[0xc010a401], arg ptr[inout, tee_ioctl_buf_data_shm_alloc]) ioctl$TEE_SHM_REGISTER(fd fd_tee0, cmd const[0xc018a409], arg ptr[inout, tee_ioctl_buf_data_shm_register]) ioctl$TEE_SHM_REGISTER_FD(fd fd_tee0, cmd const[0xc018a408], arg ptr[inout, tee_ioctl_buf_data_shm_register_fd]) ioctl$TEE_SUPPL_RECV(fd fd_tee0, cmd const[0x8010a406], arg ptr[inout, tee_ioctl_buf_suppl_recv]) ioctl$TEE_SUPPL_SEND(fd fd_tee0, cmd const[0x8010a407], arg ptr[inout, tee_ioctl_buf_suppl_send])

COMMON

#=======================================================

define TEE_IOCTL_UUID_LEN 16

tee_ioctl_param_struct { attr flags[TEE_IOCTL_PARAM_ATTR_TYPE, int64] a int64 b int64 c int64 }

TEE_IOCTL_PARAM_ATTR_TYPE = 0, 1, 2, 3, 5, 6, 7 TEE_LOGIN = 0, 1, 2, 4, 5, 6

OPEN SESSION

#=======================================================

tee_ioctl_buf_data_session { buf_ptr ptr64[inout, tee_ioctl_open_session_struct] buf_len len[buf_ptr, int64] }

tee_ioctl_open_session_struct { uuid array[int8, TEE_IOCTL_UUID_LEN] (in) clnt_uuid array[int8, TEE_IOCTL_UUID_LEN] (in) clnt_login flags[TEE_LOGIN, int32] (in) cancel_id int32 (in) session session_resource (out) ret int32 (out) ret_origin int32 (out) num_params len[params, int32] (in) params array[tee_ioctl_param_struct] (in) }

INVOKE

#=======================================================

tee_ioctl_buf_data_invoke { buf_ptr ptr64[inout, tee_ioctl_invoke_struct] buf_len len[buf_ptr, int64] }

tee_ioctl_invoke_struct { func int32 (in) session session_resource (in) cancel_id int32 (in) ret int32 (out) ret_origin int32 (out) num_params len[params, int32] (in) params array[tee_ioctl_param_struct] (in) }

CANCEL SESSION

#=======================================================

tee_ioctl_buf_data_cancel { cancel_id int32 (in) session session_resource (in) }

CLOSE SESSION

#=======================================================

tee_ioctl_buf_data_close { session session_resource (in) }

VERSION

#=======================================================

tee_ioctl_buf_data_version { impl_id int32 (out) impl_caps int32 (out) gen_caps int32 (out) }

SHM ALLOC

#=======================================================

tee_ioctl_buf_data_shm_alloc { size int64 (inout) flags const[0, int32] (inout) id int32 (out) }

SHM REGISTER

#=======================================================

tee_ioctl_buf_data_shm_register { addr int64 (in) length int64 (inout) flags const[0, int32] (inout) id int32 (out) }

SHM REGISTER FD

#=======================================================

tee_ioctl_buf_data_shm_register_fd { fd int64 (in) size int64 (out) flags const[0, int32] (in) id int32 (out) } [align[8]]

SUPPLICANT RECV

#=======================================================

tee_ioctl_buf_suppl_recv { func int32 (in) num_params len[params, int32] (inout) params array[tee_ioctl_param_struct] (inout) }

SUPPLICANT SEND

#=======================================================

tee_ioctl_buf_suppl_send { ret int32 (out) num_params len[params, int32] (in) params array[tee_ioctl_param_struct] (in) }

在模糊测试期间,引起注意的崩溃与在持有互斥锁时 task_struct 对象的释放后使用(use-after-free)有关:```
==================================================================
BUG: KASAN: use-after-free in __mutex_lock.constprop.0+0x118c/0x11c4
Read of size 4 at addr 863b0714 by task optee_example_r/244
 
CPU: 0 PID: 244 Comm: optee_example_r Tainted: G      D           5.14.0 #151
Hardware name: Generic DT based system
[<8012b204>] (unwind_backtrace) from [<8011f460>] (show_stack+0x20/0x24)
[<8011f460>] (show_stack) from [<81cf0108>] (dump_stack_lvl+0x5c/0x68)
[<81cf0108>] (dump_stack_lvl) from [<80650f04>] (print_address_description.constprop.0+0x38/0x304)
[<80650f04>] (print_address_description.constprop.0) from [<80651548>] (kasan_report+0x1c0/0x1dc)
[<80651548>] (kasan_report) from [<81d0a9b4>] (__mutex_lock.constprop.0+0x118c/0x11c4)
[<81d0a9b4>] (__mutex_lock.constprop.0) from [<81d0ada4>] (mutex_lock+0x128/0x13c)
[<81d0ada4>] (mutex_lock) from [<817424b0>] (tee_shm_release+0x4b0/0x6cc)
[<817424b0>] (tee_shm_release) from [<81303674>] (dma_buf_release+0x1b8/0x2f0)
[<81303674>] (dma_buf_release) from [<806d5ac0>] (__dentry_kill+0x4c4/0x678)
[<806d5ac0>] (__dentry_kill) from [<806d8a68>] (dput+0x630/0xba4)
[<806d8a68>] (dput) from [<8067d890>] (__fput+0x3b4/0x900)
[<8067d890>] (__fput) from [<801dd1d8>] (task_work_run+0x15c/0x230)
下载工具