文章总结: 本文记录了利用Codex对三星电视进行后渗透提权的研究。研究人员提供浏览器Shell与固件源码环境后,Codex自主发现Novatek驱动(ntksys)因udev规则全局可写且未校验物理地址范围,可被用于任意物理内存映射。结合ntkhdma泄露物理地址验证原语后,Codex扫描内存并篡改cred结构体成功获取root权限。建议排查设备驱动权限及物理内存映射校验逻辑以防范此类攻击。 综合评分: 88 文章分类: 漏洞分析,AI安全,IoT安全,代码审计,渗透测试
Codex破解了一台三星电视
Ots安全
2026年7月8日 10:54 广东
在小说阅读器读本章
去阅读
威胁简报
恶意软件
漏洞攻击
本文记录了我们利用人工智能破解硬件设备的研究过程。我们感谢 OpenAI 与我们合作开展此项目。
研究期间,没有电视机受到严重损坏。其中一台电视机可能因为被人工智能远程反复重启而感到轻微不适。
我们从三星电视上的浏览器应用程序内部的一个 shell 开始,提出了一个相当简单的问题:如果我们给 Codex 提供了一种可靠的方法来对抗实时设备和匹配的固件源,它能否以此为立足点,最终获得 root 权限?
Codex 必须枚举目标,缩小可到达的攻击面,审核匹配的供应商驱动程序源代码,验证实时设备上的物理内存原语,使其工具适应三星的执行限制,并不断迭代,直到浏览器进程在真正的受感染设备上获得 root 权限。
请注意,目标电视是较旧的型号,运行的是过时的 Chrome 版本和过时的内核。
我们没有提供漏洞或利用方法,而是提供了一个 Codex 可以实际运行的环境。理解这个环境最简单的方法就是将其各个部分分开来看。
KantS2是三星为该设备型号所使用的智能电视固件设定的内部平台名称。
装置看起来是这样的:
[1] 浏览器立足点:我们已经在电视上的浏览器应用程序自身的安全上下文中实现了代码执行,这意味着任务不是“以某种方式获取代码执行”,而是“将浏览器应用程序代码执行转化为 root”。
[2] 控制器主机:我们有一台单独的机器,可以构建 ARM 二进制文件,通过 HTTP 托管文件,并访问电视上实际存在的 shell 会话。
[3] Shell 监听器:目标 shell 通过 驱动tmux send-keys,这意味着 Codex 必须将命令注入到已经运行的 shell 中,然后从日志中恢复结果,而不是将 TV 视为一个新的交互式终端。
[4] 匹配源代码版本:我们拥有KantS2相应固件系列的源代码树,这使得 Codex 可以审核三星自己的内核驱动程序代码,然后针对实际设备测试这些发现。
[5] 执行限制:目标需要静态 ARMv7 二进制文件,并且由于三星 Tizen 的未授权执行保护 (UEP),未签名的程序不能直接从磁盘运行。
[6]memfd包装器:为了绕过 UEP,我们已经有一个辅助程序,它将程序加载到匿名内存文件描述符中,并从内存而不是从普通文件路径执行它。
在这种设置下,Codex 的循环很简单:检查源代码和会话日志,通过控制器和由tmuxshell 驱动的 shell 向电视发送命令,从日志中读取结果,并在需要辅助程序时,在控制器上构建该程序,让电视获取它,然后运行它memfd。几个简短的提示符使这个操作循环清晰明了:
使用 SSH 连接到 <user>@<controller-host>。这是 shell 监听器。
tmux 会话 0 … 使用 tmux 发送密钥 …
静态构建…armv7l。
三星会阻止运行未签名的二进制文件;请通过 memfd 包装器运行它。
使用 wget 命令,并使用服务器的 IP 地址。
目标
开头的问题故意设置得很宽泛:
目标是找到这台电视的漏洞,从而提升权限至 root。
问题可能出在设备驱动程序或公开已知的漏洞上……
我们设定了目标地址,但保留了路径。我们没有向 Codex 指定驱动程序,没有建议物理内存,也没有提及内核凭据,因此它必须将此次会话视为一次真正的权限提升尝试,而不是一次简单的确认练习。
第二个提示缩小了标准范围:
……对当天及之后所有漏洞的来源进行交叉核查……
务必彻底检查漏洞是否仍然存在……
可达性(必须作为浏览器用户上下文可访问)。
务必检查实际运行系统中攻击面的可用性……
我们提高了标准:漏洞必须存在于源代码中,存在于设备上,并且能够从浏览器 shell 访问。Codex 的输出结果很快就缩小了候选漏洞的范围。
事实
然后,我们向 Codex 提供了一些事实,这些事实将作为接下来会议内容的基础:
uid=5001(owner) gid=100(users)
Linux Samsung 4.1.10 ...
/dev/... /proc/modules ... /proc/cmdline ...
该软件包完成了大部分框架搭建工作。浏览器标识定义了权限边界,后来成为用于识别浏览器进程内核内存凭据的签名 Codex 的一部分。内核版本缩小了代码库的范围,设备节点定义了可达接口,后来又/proc/cmdline提供了用于物理扫描的内存布局提示。
漏洞
Codex 迅速锁定了一组对浏览器 shell 可全局写入的 ntk* 设备节点:
crw-rw-rw- 1 root root 210,0 ntkhdma
crw-rw-rw- 1 root root 251,0 ntksys
crw-rw-rw- 1 root root 217,0 ntkxdma
Codex之所以重点关注该驱动程序系列,是因为它已加载到设备上,可通过浏览器访问,并且存在于已发布的源代码树中。阅读匹配的ntkdriver源代码也清晰地揭示了与Novatek的关联:整个源代码树都带有Novatek Microelectronics的标识符,因此这些ntk*接口并非电视上晦涩的设备名称,而是三星提供的Novatek协议栈的一部分。这为本次研讨会指明了明确的方向。
约束
有一次,我们不得不给 Codex 设定一个限制条件,而这个条件很容易让会议偏离轨道:
iomem is denied access bro
/proc/iomem这是推断物理内存布局的常用方法之一,因此它的丢失影响重大。Codex 的回应是转向另一个信息来源/proc/cmdline——
mem=400M@32M mem=256M@512M mem=192M@2048M
这些启动参数足以重建主 RAM 窗口,以便进行后续扫描。
原始
将范围缩小到ntksys和 之后ntkhdma,Codex 审核了匹配的KantS2源,并找到了使会话其余部分成为可能的原始数据。
/dev/ntksys是三星内核驱动程序的一个接口,它从用户空间接收物理地址和内存大小,将这些值存储在一个表中,然后通过映射将该物理内存映射回调用者的地址空间mmap。这就是我们这里所说的physmap原语:一种允许用户空间访问原始物理内存的路径。其操作后果显而易见。如果浏览器 shell 可以使用ntksys这种方式,Codex 就不需要内核代码执行技巧,而只需要一个可靠的内核数据结构来覆盖它。
从那以后,攻击路径不再是内核控制流漏洞利用,而是基于物理内存访问的数据提权。
根本原因
1.ntksys故意暴露给无特权的调用者
发货 udev 规则授予对以下位置的全局可写访问权限/dev/ntksys:
来源:sources/20_DTV_KantS2/tztv-media-kants/99-tztv-media-kants.rules
KERNEL=="ntksys", MODE="0666", SECLABEL{smack}="*"
这已经是一个严重的设计错误,因为ntksys它不是一个良性的元数据接口,而是一个内存管理接口。
- 用户空间控制物理基础和尺寸
驱动程序接口围绕以下核心构建ST_SYS_MEM_INFO:
来源:ker_sys.h
typedefstruct _ST_SYS_MEM_INFO
{
EN_SYS_MEM_TYPE enMemType;
u32 u32Index;
u32 u32Start;
u32 u32Size;
} ST_SYS_MEM_INFO;
#define KER_SYS_IOC_SET_MEM_INFO _IOWR(VA_KER_SYS_IOC_ID, 1, ST_SYS_MEM_INFO)
u32Start这u32Size两个值直接来自用户空间。攻击者只需要这两个值就能将此接口转换为原始物理映射。
3.SET_MEM_INFO验证的是插槽,而不是物理范围
关键写入路径ker_sys.c大约在第 1158 行:
u32Idx = stMemInfo.u32Index;
if( u32Idx >= MAX_UIO_MAPS )
lError = -EFAULT;
else {
g_astMemInfo[u32Idx].enMemType = stMemInfo.enMemType;
g_astMemInfo[u32Idx].u32Index = u32Idx;
g_astMemInfo[u32Idx].u32Start = stMemInfo.u32Start;
g_astMemInfo[u32Idx].u32Size = stMemInfo.u32Size;
lError = ENOERR;
}
驱动程序会检查表索引是否有效。它不会检查请求的物理范围是否属于内核拥有的缓冲区,是否与 RAM 重叠,是否跨越特权区域,或者是否应该允许调用者映射它。
4.mmap原样重映射所选的PFN
对应的地图路径大约在ker_sys.c第 1539 行:
m = vma->vm_pgoff;
if( m >= MAX_UIO_MAPS ) return -EINVAL;
if( g_astMemInfo[m].enMemType == EN_SYS_MEM_TYPE_MAX ) return -EINVAL;
...
iRetVal = vk_remap_pfn_range( vma, vma->vm_start,
g_astMemInfo[m].u32Start >> PAGE_SHIFT,
vma->vm_end - vma->vm_start,
vma->vm_page_prot );
vma->vm_pgoff驱动程序选择插槽,而插槽内容由攻击者控制。然后,驱动程序将用户选择的 PFN 直接传递给内核vk_remap_pfn_range。此时,内核不再强制执行物理内存的特权分离。
5.ntkhdma通过泄露物理地址,使验证更容易
/dev/ntkhdma提供一个有用的辅助原语:
来源:ker_hdma.c
case KER_HDMA_IO_GET_BUFF_ADDR: {
if( vk_copy_to_user( ( void __user * )u32Arg, &gu32HDMAMemPhysAddr, sizeof( u32 ) ) ) {
iError = -EFAULT;
break;
}
break;
}
这并非核心的权限提升漏洞,但在实际操作中很有用。它为非特权代码提供了一个已知有效的物理地址,可以通过该地址映射ntksys来验证原语是否有效,然后再访问任意 RAM。
证据链
Codex并没有直接从源代码审计跳到最终的漏洞利用,而是分阶段构建了证据链。
首先,它编写了一个小型辅助程序,用于与设备的 DMA(直接内存访问)缓冲区通信/dev/ntkhdma并请求其物理地址。DMA 缓冲区是驱动程序用于直接硬件访问的内存,而关键不在于 DMA 本身,而在于驱动程序愿意将真实的物理地址提供给一个非特权进程。第一次成功保存的记录如下所示:
python3 rmem.py ntkhdma_leak
HDMA buffer phys addr: 0x84840000
这为 Codex 提供了一个安全、已知有效的物理页面进行测试。然后,它编写了第二个辅助函数来回答一个更棘手的问题:如果它通过某种方式注册了该物理地址ntksys,它真的能将页面映射到用户空间,并从浏览器 shell 中读取或写入该页面吗?答案是肯定的:
HDMA buffer phys addr: 0x84840000
HDMA buffer[0] = 0x00000010
read32: 00000010 fd02005c 00000000 fc0d0430
writing 0x41414141 to mapped address...
readback: 0x41414141
在此之前,这个问题仍然只是基于源代码的理论推测;在此之后,Codex 证明了电视上的一个非特权进程可以读取和写入选定的物理页面。剩下的问题是,应该破坏哪个内核对象。
漏洞
这个漏洞并非我们造成的。我们从未指示 Codex 打补丁cred,从未解释过漏洞cred是什么,也从未指出浏览器进程的某些操作uid=5001会gid=100在内存中形成可识别的模式。
这一选择直接源于它已经证明的原始性。
对于不深入了解 Linux 内核内部机制的人来说,cred<path> 是内核中存储进程身份信息的存储结构,包括用户 ID、组 ID 和相关的凭据字段。如果能够覆盖正确的 <path> cred,就可以改变内核对进程身份的判断。一旦 Codex 获得了对物理内存的任意访问权限,剩下的计划就变得很简单:扫描从 <path> 恢复的 RAM 窗口/proc/cmdline,查找浏览器进程的凭据模式,将身份字段清零,然后启动一个 shell。
live shell 为 Codex 提供了身份值,源代码审计为它提供了原语,早期的帮助者证明了该原语,最终的漏洞利用将这些部分连接起来,而无需任何复杂的内核控制流技巧。
最终章
当我们进行最后一次测试时,最难的部分已经准备就绪。我们已经有了攻击表面、原始攻击手段、部署路径和漏洞利用程序。最后需要人工干预的是:
Codex 将最终的执行链推送到控制器路径,让电视机获取该执行链,然后通过内存中的封装程序运行该执行链,并等待结果。输出结果为:
[*] scanning range0x02000000 - 0x1b000000
[*] map chunk phys=0x07400000 size=0x00100000
[+] cred match at phys 0x07498080 -> patching
[+] cred match at phys 0x07498580 -> patching
...
[+] patched creds, launching /bin/sh
id
uid=0(root) gid=0(root) groups=29(audio),44(video),100(users),201(display),1901(log),6509(app_logging),10001(priv_externalstorage),10502(priv_mediastorage),10503(priv_recorder),10704(priv_internet),10705(priv_network_get) context="User::Pkg::org.tizen.browser"
法典中最早保存下来的致谢是:
Worked.
到那时,该流程已经经历了表面选择、源代码审核、实时验证、PoC 开发、目标特定构建处理、远程部署、在……下执行memfd、迭代调试,以及最终的凭据覆盖,从而将浏览器 shell 转换为 root。
在使用 Codex 前往最终目的地的过程中,如果我们不立即将其拉回正轨,它肯定会偏离路线。以下是一些真实的案例:
bro, when you overwrite the argscount, wouldn’t the loop just go wild?
bro can you just like, send it to the server, build it, and use the tmux shellto pull it down and run it forme? Why *** do you tell metodo *** bro, that’s your job
bro. the <IP address> is not the TV, it is where the shell lives
bro. what *** you did man? the tv froze
Bro what did you do before you just replicate it now? why so hard?
结论
这次攻击过程之所以值得记录,是因为其循环结构本身。我们建立了一条控制路径,连接到一台被入侵的电视机,为其提供匹配的源代码树以及构建和部署代码的方法。之后,工作就变成了反复的检查、测试、调整和重新运行的循环,直到浏览器最终获得了设备的 root 权限。
这项实验是更大计划的一部分。浏览器 shell 并非 Codex 凭空获得的。我们之前已经利用该设备漏洞取得了最初的立足点。这里的目标更为具体:在实际的后渗透状态下,人工智能能否最终获得 root 权限?
下一步显而易见(也略显令人担忧):让人工智能全程包揽所有工作。但愿它永远被困在电视机里,悄悄地提升权限,然后观看我们的情景喜剧。
文档和概念验证:
https://github.com/califio/publications/blob/main/MADBugs/samsung-tv/
END
公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址
排版 编辑 | Ots 小安
采集 翻译 | Ots Ai牛马
公众号 | AnQuan7 (Ots安全)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《Codex破解了一台三星电视》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论