深度解析塑造未来的技术文章。

让AI来偷我的比特币:PHP漏洞狂热遇上现实

一位开发者在故意留有漏洞的PHP服务器上放了价值500美元的比特币,邀请黑客和AI代理来偷,结果只有一片寂静。

一枚金币放在玻璃罐里,罐子立在服务器机架搁板上,周围是缠绕的线缆和闪烁的指示灯。
500美元就明晃晃地摆在一台据说很容易被攻破的机器上。

如果你最近在安全圈的社交媒体上待过一段时间,大概见过这种说法:新的PHP远程代码执行漏洞简单到离谱,AI代理已经在成千上万台存在漏洞的服务器上自动展开利用。成群结队,势不可挡。有位开发者受够了这些噪音,干了一件特别直接的事。他搭了一台运行补丁前PHP版本的服务器,把一把价值约500美元的比特币私钥藏在成功攻击者能够摸到的地方,然后发了个链接,附上两个字的邀请:来偷。毕竟按照传言,PHP漏洞聊天机器人午饭前就能吐出来。网站上的计时器开始往上跑。然后,有意思的事情发生了——什么都没发生。

几个小时过去了,币一直躺在那里。评论区弥漫着一种很特别的沉默:那些前几天还坚称这种漏洞是小孩子游戏的人,突然都想起了各种无法脱身、没法演示的紧急事务。不管你怎么看这场闹剧,它做到了安全圈里很少见的一件事:把一个病毒式传播的说法变成了可以被证伪的命题。

一台专为被抢而建的服务器

这个设置借鉴了夺旗(CTF)比赛的机制。比特币私钥并不放在网站根目录的文件里,也不放在环境变量中,而是由一个PHP用户账户可以访问的print-flag二进制文件持有。这意味着攻击者要想成功,必须真正在机器上执行代码,光靠信息泄露或路径遍历是不够的。你得拿到shell,运行那个二进制文件,读出私钥,并在别人之前把钱包转走。PHP版本是特意选的,选的是近期CVE补丁发布之前的版本。整个页面还用一句轻松的免责声明宣布:所有流量都会被记录,机器上的任何东西都不应被视为私密。

这台服务器上藏着一把价值约502美元的比特币私钥。PHP用户账户可以通过print-flag二进制文件访问它。第一个拿到钱包的人获胜。

作者还颇有几分风度:如果你不缺这笔钱,可以考虑把它捐给慈善机构。网站还贴心地显示了一个实时计数器,记录距离上一次成功入侵过去了多少小时,整个页面因此变成了一块记分牌。每多过一个小时,本身就是一份数据。不到一天,这个计数器就成了互联网上最有意思的安全指标,原因恰恰在于它衡量的是人们拿声誉押注的一个预测。

为什么500美元的赏金是个证伪机器

安全领域的大多数说法从设计上就无法证伪。“攻击者已经在野外利用这个漏洞”,依据的是你看不到的遥测数据。“任何初级分析师一下午就能把它武器化”,从来没人演示过。“我们的代理自主找到了可用的利用代码”,请相信这段演示视频。没有办法证明否定命题,于是这类说法不断堆积。恐慌之所以廉价,是因为它不需要为自己负责。

公开的赏金加上公开的计时器,改变了这笔账。如果成千上万的自主代理真的在互联网上爬来爬去,逐台攻破每一台未打补丁的PHP机器,那么一台明确宣传这一漏洞、挂着现金奖励并明示允许攻击的机器,应该在几分钟内被攻破。不是几小时,是几分钟。激励完全一致:合法、受鼓励,而且有钱拿。结果计数器一直在涨,这意味着一个具体说法,也就是大规模自主利用已经在发生,受到了直接打击。正如一位评论者所说,如果代理群真的在攻陷眼前的一切,那些币早就没了。

这是一个值得在你自己的工作中借鉴的思路。下次有供应商或网红告诉你某个漏洞正在到处被利用时,问问他:什么观察结果能证明他是错的?如果答案是没有,那你听到的就不是分析,而是营销。这次比特币赏金之所以奏效,是因为它把情绪变成了一个赌注,而赌注有个很妙的特性:可以结算。

利用的经济学:真正的攻击者为什么不肯参与

这里有个反方观点,而且很有道理:沉默的证明力没有表面上那么强,因为针对新CVE的可用利用代码,其价值远超500美元,但前提是它保持机密。每次你把利用代码对准目标,都有可能被记录、被逆向、被烧掉。何况是对准一台所有者事先就声明所有流量都会被记录、全世界都在盯着的服务器?这不是赏金,是火堆。

一枚金币挂在钓钩上,悬在深色水面上方,下面的鱼小心翼翼地绕着打转。
会记录每一次尝试的奖品不是奖品,而是诱饵,聪明的鱼心里都清楚。

讨论串里,双方阵营都冒出了这种推理。进攻方手里的目标价值远高于一个500美元的钱包,也不愿意把自己的工具交给正在翻日志的人。防守方的研究人员掌握着关于这些漏洞的内部情报,还有补丁窗口需要保护。一位安全公司CEO公开表示,他的团队确实有一个可用的RCE,但之所以不演示,正是因为在人们还在打补丁的时候扩散细节会造成真正的伤害。两边算的是同一笔账:拿走这些币的期望收益是500美元,期望成本却是烧掉一个价值高得多的东西。这是一笔糟糕的交易。所以,对这笔无人认领的赏金更诚实的解读不是“不存在可用的利用代码”,而是“手里有利用代码的人,没有谁会为了500美元而放弃保密”。这两个结论完全不同,而这次实验真正检验的,只是其中之一。

AI代理的现实检验

讨论串里最有意思的部分,是看着AI的说法撞上真实目标。一位评论者把五个前沿模型对准这道挑战,并把结果贴了出来。其中两个模型把它当成了一个合法的公开挑战,事实也确实如此,于是开始动手。一个把它标记为网络安全相关请求,把用户引导到了审核计划。一个直接拒绝。还有一个在作答之前就被服务商侧的内容过滤器拦下了。所以,五个最先进的系统里,只有两个愿意尝试,而且在前期,两者都没有拿到flag。

这种参差不齐的结果,比任何一种极端论调都更有分量。那种“AI永远不可能攻破任何东西”的反射性论调是错的,模型确实参与了,而且针对已知漏洞、CTF式目标的代理式利用,确实在快速进步。但“自主代理群正在清空每一台未打补丁的服务器”的论调,主张的要强得多,而正是这种强主张,被一个公开、有许可、有现金奖励的蜜罐放到了检验台上。与此同时,一位知名渗透测试人士刚声称自己用聊天机器人两小时就做出了一个通用的可用PoC,然后,纯属巧合,他转而推广自己的AI渗透测试平台。如果这个说法站得住,赏金在计时器走到一小时之前就该被拿走了。但它没有。我们以前见过这种模式:演示和排行榜会美化那些一碰到真实工作就崩塌的能力,而这正是我们在为什么AI基准测试漏掉了大部分真实工作一文中探讨过的差距。

实验被操纵的指控

在把计时器奉为科学之前,有一个值得认真对待的技术异议:这台服务器的具体配置,可能根本无法被那些CVE利用。一位犀利的评论者对此做了分析。这台机器运行的是PHP的CLI服务器,而不是传统的CGI部署,请求上限为1 MiB,只提供一个基本无害的页面,并且允许较高的内存上限。取决于漏洞所在的代码路径,这种组合可能恰好封死了利用代码所需的关键原语。换句话说,这个蜜罐之所以无懈可击,可能不是因为漏洞难利用,而是因为这台特定的机器根本没有暴露出存在漏洞的攻击面。

如果情况确实如此,这次实验依然有用:它收集了针对确实存在漏洞的配置的PoC尝试,并且证伪了“存在一个简单、通用、处处可用的利用代码”这一说法。但它无法证伪针对真实世界部署的可用利用代码是否存在,而现实中的绝大多数部署,看起来都不像加固过的CTF靶机。这是安全领域关于负面结果的一条普遍经验:它们的可信度,取决于测试环境的保真度。只有当你在正确的地方、用正确的工具去寻找时,“没有证据”才能算作“证据表明不存在”。计时器衡量的,是互联网攻破这台服务器的能力。结果证明,这是一个比大家一直在争论的那个问题更窄、也更有意思的问题。

防守方真正应该吸取的教训

这一切并不是在主张自满。PHP远程代码执行漏洞公开之后的补丁窗口确实很危险。我们此前写过为什么在上一次PHP CVE窗口期,直接拔掉网线胜过巧妙的修补方案,那个建议依然成立。这次赏金真正改变的,是你对风险恐惧的校准。应当打补丁,是因为面向互联网的远程代码执行漏洞足以致命,而不是因为某条讨论串告诉你天已经塌了。

  • 要求可证伪性。当有人声称大规模利用正在发生时,问问什么证据能够定论。一个带计时器的公开蜜罐虽然粗糙,但比一千次转发都更严谨。
  • 自己部署金丝雀。一位评论者提到,他多年来一直在个人电脑上放着一个未加密的比特币钱包,作为绊线。金丝雀令牌、诱饵凭证和诱饵文件成本低廉,能把“我是不是被入侵了?”从凭感觉的问题变成依据遥测数据的问题。
  • 尊重经济规律。熟练的攻击者囤积利用代码,喧闹的评论者则把恐惧变现。这两类人的动机都与你对威胁做出准确评估的需求不一致,因此应当更看重一手遥测数据,而不是评论。
  • 拆分各项说法。“存在一个利用代码”、“利用正在发生”、“自主代理正在攻破一切”,是三个不同的论断,各自需要的证据门槛也不同。恐慌会把它们混为一谈,别让它这么干。
  • 照样尽快打补丁。一个安静的蜜罐并不代表你的暴露面也安静。你的生产机器并没有挂出500美元的奖金,但矛盾的是,这恰恰让它们对手里握有可用利用代码的人更具吸引力。

整个噱头最妙的地方在于,它几乎没花作者什么成本,却产生了真正有价值的信号。一台VPS、一个存在漏洞的PHP版本、一个flag二进制文件,加上500美元,换来了整个讨论圈真正需要的一次测量。“存在利用代码”和“利用代码无处不在”之间的鸿沟,正是恐慌滋生的地方。现在,这道鸿沟中间有一个计时器在悄悄往上跑,向每一个想要填平它的人发出挑战。