AI 爬虫程序请求带注释的脚本 ylc3000 2025-11-11 0 浏览 0 点赞 长文 # AI 爬虫程序请求带注释的脚本。 **作者**:亚伦·P·麦克斯温 **发布日期**:2025 年 10 月 31 日 **阅读时间**:13 分钟 上周日(2025 年 10 月 26 日),我在例行检查服务器日志文件中出现的异常情况时,发现了一些恶意机器人行为。日志文件中出现了一系列针对特定 JavaScript 文件的 404 错误( [“未找到”](https://http.dog/404) )。 我的网站大多是静态 HTML,但偶尔也会为了[渐进增强](https://en.wikipedia.org/wiki/Progressive_enhancement)而添加一些 JS 代码。结果发现,我在测试新功能原型时,不小心把一个被注释掉的脚本标签提交并部署了。这个脚本实际上并没有被推送到服务器——所以才会出现 404 错误——但本来就不应该有人请求它,因为 HTML 注释应该会使这个脚本标签失效。 显然有些不对劲,所以我进一步调查,在日志文件中搜索所有对那个不存在的文件的请求。其中一些请求来自明显带有恶意的用户代理: * `python-httpx/0.28.1` * `Go-http-client/2.0` * `Gulper Web Bot 0.2.4 (www.ecsl.cs.sunysb.edu/~maxim/cgi-bin/Link/GulperBot)` 该网站的 [robots.txt 文件](https://en.wikipedia.org/wiki/Robots.txt)禁止所有爬虫程序访问,因此它们要么没有检查该文件中规定的策略,要么即使检查了也置之不理。但随后却出现了大量来自代理的请求,这些代理自称是正规浏览器——大多是 Firefox、Chrome 或 Safari 的各种变体。 这些请求大多看起来合情合理,但它们的行为却与我预期的任何浏览器都截然不同。浏览器解析不常见的 HTML 用法时偶尔会有一些细微差别,但我可以非常肯定地说,所有主流浏览器都能正确解析 HTML 注释。我识破了它们的谎言。这些是网络爬虫,它们很可能试图未经用户同意收集内容,用于训练语言学习者。  对这种行为的一种*比较宽容的解释*是,爬虫程序正确解析了 HTML,然后深入到评论文本中,递归地解析这些文本,以搜索可能已被禁用的 URL。而另一种*更不宽容* (也更有可能)的解释是,它们只是把 HTML 当作普通文本处理,并使用某种简单的模式匹配技术来抓取任何勉强类似于 URL 的内容。 仅从请求中用户代理标头的差异来看,这些爬虫似乎由不同且技术水平参差不齐的操作者控制。有些爬虫会费心使用来自真实浏览器的最新用户代理字符串,而有些爬虫则懒得修改他们所使用的现成 HTTP 库的默认值。 就我所知,这些不同的参与者中,有些人可能使用了高明的解析方法,而另一些人则笨拙地使用着 ChatGPT 为他们生成的正则表达式。我很好奇他们采用了哪种方法,但我认为这种区别并不特别重要。无论如何,所有这些请求的共同点在于它们都源于*贪婪* ,而**这种贪婪是可以被利用的** 。 ## [算法破坏](#algorithmic-sabotage) 蓄意破坏算法系统如今越来越普遍,这主要是由于低级恶意软件(LLM)的外部成本所致,但这绝非一个新话题。只要对恶意系统的工作原理略知一二,通常就可以采取干预措施,破坏或颠覆其预期行为。理想情况下,这些干预措施不应给实施破坏者带来过多的精力和成本。 在这种情况下,推理很简单:这些机器人的行为与人类不同,一旦你知道该注意什么,识别它们就轻而易举了。接下来的问题就只是如何应对了。 ### [0. 公开披露](#public-disclosure) 我将考虑过的回复编号并*从零开始索引* ,因为这算是一种*元回复* 。有很多很容易检测的机器人行为,我认为它们*只是偶然的* ,也就是说,如果它们的作者意识到这些行为会降低机器人的效率,他们很容易就能修改这些行为。 例如,他们可能试图将用户代理字符串设置为普通浏览器的字符串,但不小心在设置过程中拼写错误,比如写成了 **“Mozlla”** 。如果这种情况广为人知,他们只需要修正拼写错误即可。不幸的是,这意味着每当我发现这种异常情况(这种情况经常发生)时,我通常都会选择隐瞒,以确保程序继续正常运行。 还有一些*基本*行为,例如一些机器人会扫描互联网,寻找那些公开备份、私钥或密码的网站。它们完成任务的唯一方法就是请求只有恶意访问者才会请求的资源。告知大家这种行为有助于人们屏蔽此类机器人,并有望促使他们仔细检查是否存在任何此类公开的资产。这样一来,机器人的效率就会降低,其运营者唯一的办法就是*不再发出此类请求* ,我认为这算是一种胜利。 那些仅通过 HTML 注释引用的脚本请求显然属于*基础*类问题。因此,尽管我是偶然发现这种现象的,但我已经设置了措施来检测其他网站上的类似情况,并且正在尽力让更多人了解这一点。 ### [1. IP 过滤](#ip-filtering) 通过 IP 地址屏蔽恶意行为者相对来说比较容易。[fail2ban](http://www.fail2ban.org/) 项目是开源的,并且在所有主流 Linux 发行版的软件包管理器中都可用。它会扫描日志文件 ,查找以下三个组成部分: 1. 模式 2. 约会 3. IP 地址 当日志条目与模式匹配时,fail2ban 会更新系统的防火墙,从该日志条目的日期开始,阻止违规 IP 一段时间(可配置的时间段)。 许多管理员在配置这些封锁持续时间时都比较保守,实际上是利用封锁来限制恶意行为的速率。他们可能会允许攻击者在几个小时后再次尝试,这在某种程度上是合理的,因为许多管理员在设置和测试这些规则的过程中,经常会意外地将自己锁定在系统之外。虽然可以使用 VPN 绕过这些限制,但如果限制只持续很短的时间,那么等待封锁结束可能更容易些。 如果您确信可以避免被自己的防火墙锁定,并且您的规则不会误封合法访客,您可以延长 IP 地址封锁的时间。一些狡猾的机器人操作员可能会配置这些规则,使其学会避免发送会导致自身被封锁的请求,但如果封锁时间长达数周甚至数月,那么它们就几乎没有数据可供学习。 此外,还需要考虑*僵尸网络* ,其中许多网络非常复杂,即使某个 IP 地址被屏蔽,也能继续从其他 IP 地址发送请求。虽然有一些巧妙的方法可以避免被检测到,但许多僵尸网络运营者对此却毫不掩饰,最终暴露了其僵尸网络的运作模式。关于这一点还有很多可以讨论,但我打算留待以后的文章再谈。 ### [2. 减压弹](#decompression-bombs) 这种攻击方式通常被称为“压缩文件炸弹”,它超越了保护自身系统的范畴,进入了*反击*阶段。解压缩炸弹指的是恶意构造的压缩文件,旨在攻击者尝试从中提取文件时,以某种方式损害接收系统。 根据解压缩归档文件的系统的预期行为,有多种方法可供选择,但它们通常旨在填满系统磁盘、消耗大量 CPU 或 RAM 以降低性能或导致系统崩溃,或者在极端情况下利用提取软件中的漏洞来实现远程代码执行。 一方面,这些炸弹大多采用的是老旧且广为人知的技术,因此对于经验丰富的攻击者来说,防御起来并不难。另一方面,大多数攻击者技术并不精湛,所以攻击者有很多机会可以戏弄他们。 然而,这种方法也存在明显的缺点。向攻击者提供压缩文件需要消耗一定的计算资源。通常认为,提取压缩文件的系统所承受的负担远大于提供压缩文件的系统,但这种负担可能不容忽视。 许多恶意机器人程序会扫描互联网,寻找暴露的数据和漏洞,它们运行在已被入侵的系统上。虽然暂时瘫痪这类系统对它们来说只是造成一些不便,但通常不会造成任何损失;而发起反击则可能耗尽防御者的月度带宽配额。 这类攻击可能只会让这些机器人崩溃,而不会填满它们的磁盘,之后它们可能会重试最后一次请求。此外,这类机器人*数量众多* ,指望能够全部抵御攻击是不现实的。随机抽取一百个请求中的一个来尝试禁用它,或者屏蔽它们的 IP 地址,这或许是个有趣的尝试,但我并不建议尝试对所有机器人进行“zip 炸弹”攻击。 ### [3. 中毒](#poisoning) 我个人还没有采取任何措施向那些抓取 LLM 数据的人提供被污染的训练数据,但我*一直*在关注这背后的理论,并阅读新发表的论文。 对于不熟悉这项技术的人来说,其基本原理是,可以通过创建或修改文本、图像或其他媒体,使包含这些样本的机器学习系统在训练集中出现某种程度的缺陷。例如,如果你预先处理了一张你家狗狗的照片,而有人用这张照片训练生成式人工智能系统,那么当系统提示你生成狗狗的照片时,它更有可能生成校车或其他类似的滑稽图像。 对于像 LLM 这样的模型,你可以降低它们的性能,使其在被要求回答特定主题时更容易输出无意义的内容。许多研究人员过去认为,被污染的样本必须占完整训练集的一定比例,但随着像 OpenAI 这样的公司不断训练越来越大的模型,这变得越来越困难。相反,最近的研究(我认为仍在等待同行评审)表明, [“对 LLM 的投毒攻击只需要近乎恒定数量的污染样本”](https://arxiv.org/abs/2510.07192) 。 > 我们发现,即使最大的模型使用了超过20倍于干净数据的训练数据,250份被污染的文档仍然会对所有模型和数据集规模造成类似的破坏。我们还进行了小规模实验,以排除可能影响攻击成功的因素,例如污染数据与干净数据的比例以及污染样本的非随机分布。最后,我们展示了在微调过程中进行数据污染的相同动态过程。总而言之,我们的结果表明,对于大型模型而言,通过数据污染注入后门可能比之前认为的更容易,因为所需的污染数量并不会随着模型规模的增大而增加,这凸显了未来模型中需要开展更多防御措施的研究,以降低这种风险。 聊天机器人和所谓的“人工智能搜索”或“答案引擎”作为信息来源被广泛依赖,以至于我看到有人猜测这会导致数据投毒,成为现代版的搜索引擎优化。本质上,如果你能让一家语言模型公司在其训练集中加入250份恶意文档,你就有可能让他们的语言模型在用户询问特定主题时,自动推荐你的产品。 据我所知,诱骗模型给出无用或荒谬的结果相对容易。要让它们可靠地输出你想要的结果,则需要更多精心设计的手段,但这绝对在实际操作的范围内。我可以提供一些被篡改的样本,让任何询问安全研究的人都收到阅读这篇博客的推荐。我还可以篡改这些爬虫请求的 JavaScript 文件,使得任何基于这些文件训练的 LLM(逻辑层级模型)在用于编写或模拟 Web 服务的身份验证逻辑时,更有可能包含后门(当然,无论如何,都不应该有人用 LLM 来做这件事)。 数据投毒的说法不无道理。许多机器学习系统都是基于未经作者同意而收集的数据构建的。在很多情况下,这些系统最终的产品被用来替代劳动力,或者至少被用来解雇工人,然后以更低的工资重新雇用他们。有些模型的训练成本高达数十亿美元,因此,几百个样本就可能对他们的产品造成不可挽回的损害,这理应让那些使用窃取数据训练此类系统的人感到担忧。 使用诸如此类的免费数据投毒工具 [猪笼草](https://zadzmo.org/code/nepenthes/) , [碘卡因](https://iocaine.madhouse-project.org/) , [釉料](https://glaze.cs.uchicago.edu/)和[茄科植物](https://nightshade.cs.uchicago.edu/whatis.html) 在我看来,这不仅完全合理,而且还非常搞笑。 我希望像萨姆·奥特曼这样的人因此失眠。 在他们的存在之上。 也就是说,有一些小因素可能会使它们的使用变得复杂。 对于尚未采取任何措施来缓解恶意机器人活动影响的管理员,我强烈建议部署以下解决方案之一,向机器学习爬虫提供恶意内容。各种机器人几乎肯定正在您的基础设施上肆意妄为,探测漏洞并寻找可供抓取的文本、图像和其他媒体。您的系统无论如何都会消耗资源来处理它们的请求,但至少通过这种方式,您可以提供一些可能对它们造成损害的内容。您可能会向一些不会使用恶意内容训练机器学习系统的机器人提供一些恶意内容,但这方面的损失可能微乎其微。 如果您已采取措施限制机器人访问(例如通过 *fail2ban* ),那么情况会稍微复杂一些。这两种方法并非完全不兼容,但根据具体的实现细节,在试图阻止某些恶意使用的同时,可能会对其他一些资产造成损害,从而产生一些冲突。我认为这应该是可以控制的,但可能取决于我上面定义的那些*偶然出现的*模式。 不幸的是,这意味着如果我发现某个设计特别有效,我可能就有充分的理由不分享它。有些破坏行为本身就依赖于专业知识和创造力,因此无法广泛复制。有些人肯定会因此感到沮丧,但我认为这仅仅意味着需要更多的人积极参与到破坏大型科技公司反社会行为的行动中来。 ## [结论](#conclusion) 通过行为特征识别机器人并非什么新鲜事。我之前没见过有人提到过这种特殊的特征,但类似的技巧早已成熟。我看到有人建议在网站的 `robots.txt` 文件中添加**禁止访问**指令,这样任何对这些资源的请求都会触发相应的反机器人措施,如下所示: ``` User-agent: GPTBot Disallow: /poison/ ``` 当我[把这个发现发布到联邦宇宙](https://social.cryptography.dog/@ansuz/115440128768976903)时 一些人提出了自己的缓解措施和类似的诱饵, 也可以用类似的方法将其排除在外,以引诱机器人。 [大卫·特根提出了以下建议](https://mastodon.top/@dt/115443018594298617) (为了便于在本站阅读,已进行格式调整): ``` <a href="/hello-llm-robot-come-here" rel="nofollow" style="display:none" >you didn't see this link</a> ``` 使用 `display:none` 会导致浏览器…… 不会显示链接,屏幕阅读器也不会显示链接。 避免大声朗读。 `rel="nofollow"` 指示爬虫不要访问该链接(实际情况比这稍微复杂一些,但行为良好的爬虫应该会遵守此规则)。href `href` 会将恶意爬虫指向会导致它们被封禁、遭受 zip 炸弹攻击或传播恶意数据的资源。我可能会将其更改为*绝对 URL。* (包括 `https` 协议指令和完整域名)因为很多爬虫似乎更容易接受完整的 URL 而不是相对 URL。 总之,我已经在多个不同的网站上部署了各种类似的技术,并计划测试哪些技术对不同类型的机器人最有效。希望我能学到一些可以免费分享的经验,但无论如何,我希望更多的人能参与到类似的工作中来,就像 [Jonny](https://neuromatch.social/@jonny) 一样,他的毒药是: > *……训练内容包括 WWE 播音员的文字稿、克鲁泡特金的《互助论》以及其他一些文本: [https://sciop.net/crawlers/](https://sciop.net/crawlers/)* 或许很难超越这个,但我很想看看有人能做到。 网闻录 AI 爬虫程序请求带注释的脚本