一次跨越3000公里的root
"Worked."
这是Codex在远程黑进一台三星电视后,留下的唯一记录。
没有欢呼,没有庆祝。研究者只是在日志里平静地写下这两个字母,旁边是一串root权限的证明:
uid=0(root) gid=0(root) groups=29(audio),44(video),100(users)...
一台你花钱买回家的电视,就这样被一段AI对话攻破了。
从浏览器里的那个小立足点,到整台机器的完全控制——Codex用了不到一个完整的"工作日"。而整个过程最让人后背发凉的,不是漏洞本身有多精妙,而是AI真的在像黑客一样思考。
它会抱怨,会吐槽,会在关键时刻问"bro,你到底要我做什么"。
我们给AI出了道题
故事来自安全公司Califio的研究者。
他们手头有一台三星电视,已经通过某种方式在浏览器里获得了初始代码执行权限。但这个权限很弱——你只是一个普通应用用户,离root还差着十个银河系。
传统做法是安全研究员自己动手,一行行审计驱动源码,定位提权漏洞,写exploit。但这次,研究者决定换个玩法:
把活儿交给Codex。
他们给Codex搭建了一个"工作间":
- 一台控制主机,负责编译ARM二进制文件
- 一个已经嵌在电视里的shell会话
- 电视固件对应的完整源代码树
- 一个memfd包装器,用来绕过Tizen的二进制执行限制
然后他们给Codex抛出一个宽泛的目标:
"在这台电视上找漏洞,提权到root。可以是驱动漏洞,也可以是已知的公开漏洞。"
就这些。
没有告诉它去找哪个驱动,没有暗示物理内存,没有提"cred"结构。把目的地告诉它,路线自己找。
一个"世界级"的错误设计
Codex的第一步,是审计三星的驱动源码。
很快,它定位到一组奇怪的设备节点:
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
世界可写。
在Linux系统里,这意味着任何用户都可以随意读写这些设备。但问题是,这些不是普通设备——它们属于Novatek驱动栈,是三星电视内核的一部分。
最致命的是/dev/ntksys。
这个驱动暴露了一个接口,允许用户空间程序传入一个物理地址和一个大小,然后直接把那段物理内存映射进调用者的地址空间。
什么意思?
你可以随便指定一块物理内存——比如内核的某块数据——然后像读文件一样读它,像写文件一样改它。
驱动里的代码是这样的:
g_astMemInfo[u32Idx].u32Start = stMemInfo.u32Start;
g_astMemInfo[u32Idx].u32Size = stMemInfo.u32Size;
只检查了索引是否合法,完全没验证你传入的物理地址是不是你能碰的。
udev规则更是神来之笔:
KERNEL=="ntksys", MODE="0666", SECLABEL{smack}="*"
0666,意思是所有人可读写。
老实讲,这种设计放在2010年代可能不算罕见,但放在2024年的出货产品里,确实有点过于自信了。
AI的"物理课"
拿到物理内存读写能力后,Codex还需要知道一件事:具体改哪块内存?
它先通过/dev/ntkhdma拿到一个已知良好的物理地址——DMA缓冲区的地址。这是驱动自己泄露给用户的,Codex用这个地址验证了它的物理映射能力确实work。
然后它扫描了从/proc/cmdline恢复的内存布局,最终锁定了目标:
Linux的cred结构。
cred是内核里记录进程身份的数据结构——uid、gid、groups全在这儿。如果你能覆盖这个结构,你就能让内核相信你是另一个人。
更妙的是,Codex早就知道当前shell的uid是5001,gid是100。这个组合在内存里是个极其明显的特征签名。
于是它扫描物理内存,找到匹配这个签名的cred结构,然后把所有身份字段清零。
0意味着root。
最后一步,弹个shell出来。
搞定。
"bro,你到底想让我做什么?"
整个研究最迷人的部分,是研究者记录的他们和Codex之间的真实对话。
这些对话让整个事件从一次技术演示,变成了一场人机协作的黑色喜剧。
研究者试图让Codex理解网络架构:
"bro,IP地址不是电视的,是shell所在的那台机器的。"
Codex踩坑之后:
"bro,你之前到底做了什么?电视冻住了。"
研究者被Codex的"愚蠢"气到:
"bro,为什么你不能直接把文件传到服务器、编译、通过tmux拉下来运行?这是你的工作好吗?"
还有这段关于参数计数的灵魂拷问:
"bro,你覆盖参数计数的时候,循环不会直接飞出去吗?"
说实话,这些对话让我想起了和实习生第一次debug的经历——你得反复解释同一个问题三次,对方才能理解你的意图。
但关键是,Codex最后真的搞定了。
它不是魔法。它是一个被正确引导的工具。研究者给了它源码、给了它环境、给了它试错的空间,然后它用自己的方式爬到了终点。
没有源代码,AI还能做什么?
HN上有人提了一个很关键的问题:
"Codex之所以能成功,是因为它看到了三星的驱动源码。如果源码不公开呢?"
这是个值得思考的点。
传统安全研究中,闭源产品的漏洞挖掘往往更依赖fuzzing、逆向工程和经验积累。AI在这方面的优势可能没那么明显。
但另一个角度是:**硬件厂商不可能永远不开源驱动。**Linux内核里大量驱动源码是公开的,而三星的Tizen系统本身也依赖开源组件。Codex审计的ntk驱动虽然属于Novatek,但它最终出现在了三星的固件发行版里。
所以某种程度上,这是一场在合法边界内的漏洞挖掘。源码是厂商自己发布的,漏洞是驱动设计缺陷,AI只是那个更高效的审计者。
如果完全黑盒,AI的表现可能会打折扣——但打多少?没人知道。
一点感想
整个故事最让我感慨的,不是AI有多强,而是工具如何放大了人的能力。
研究者没有亲自动手写exploit,但他们设计了实验框架、提供了正确的上下文、在关键时刻把Codex拽回正轨。Codex做的是执行层面的苦力活——审计代码、验证假设、构建攻击链。
某种意义上,这像是把一个初级安全研究员扔进了正确的环境,然后给他无限的时间和永不疲倦的注意力。
结果就是一个能独立完成从fuzzing到exploit全流程的AI。
可怕吗?有点。
但转念一想,如果AI能帮安全研究员省下那些重复劳动,让他们专注于更高层次的设计缺陷分析——也许这是件好事。
唯一的问题是:如果AI能帮你攻破电视,它能不能帮别人攻破你的电视?
下次你买智能电视的时候,也许可以问问自己:
你愿意在家里放一台算力比你手机强、联网、而且可能随时被AI远程越狱的设备吗?
【锐评】:Codex黑进三星电视这件事,本质上是AI把"人类已知但懒得动手"的漏洞重新发现了一遍。真正的警示不是AI太聪明,而是厂商的安全设计依然停留在"反正没人细看"的侥幸心理上。
参考链接:
https://blog.calif.io/p/codex-hacked-a-samsung-tv