+++ title = '声势浩大的知识产权盗窃' subtitle = 'The Great Theft' slug = 'the-great-theft' tags = ["AI","开源","Copyleft"] categories = '软件杂谈' date = 2026-10-26 13:41:18 draft = false toc = true fedi = 'https://akk.eltr.ac/objects/254c3101-7d43-40fb-9f77-26358fc113cd' +++ 之所以说「声势浩大」,是因为我成语储备不够,找不到「不要脸」的文雅说法。 ## 蛛丝马迹 这几天我停用了 NetCup 的一台机子,换到了 SKRIME,装了 OpenBSD 系统愉快地玩了起来。结果,正好赶上 [eMudhra 根证书密钥泄露](https://emudhra.we-have-a-problem.com/)[^1]和 [PHP2Shell](https://en.wikipedia.org/wiki/PHP2Shell) 漏洞,于是赶紧在几台机器上更新 `ca-certificates`,手动移除泄露的根证书。 然后我在其中一台机器上执行了 `htop`。 “奇怪,我 VPS 上跑的服务 CPU 占用都应该很低才对,为什么现在涨到 60% 了?”当时的我光顾着四处更新证书和排查漏洞,便没有细想。再后来,我给那台新机子装上了 [beszel-agent](https://github.com/henrygd/beszel) 配置监控和告警,瞟了一眼那台怪怪的机器——“我去,负载怎么红了?”从监控页面上来看,CPU 占用最高的容器是我的 Forgejo 实例。怪了,就算是我在编译软件,~~那 CPU 早该爆满了~~也应该是 Forgejo Runner 容器占用高才对。 前几天我的 Continuwuity 实例突然暴毙,数据库也挂了,还得运行紧急修复,当时发现磁盘已经写满了。当时以为是 Akkoma 数据库没清理,毕竟我联邦的实例确实很多,跑了些基本的清理任务就没管了。可几天后,同样的事情又再次发生了。我扫描了一遍 `/var` 和 `/home`,才发现占满我磁盘的是 `Forgejo` 的 `repo-archive` 目录。 等等,那是什么东西? > these are archives that can be created for any reference (tags, commits, branches, …) if you don't use them, I would recommend to disable them on a public facing gitea/foregejo instance since they seem to be very popular among scrapers. > > 这些是可以给任何引用(tag、commits、branch……)创建的归档文件。如果你不用的话,我建议在公开的 gitea/forgejo 实例上禁用,因为好像爬虫很爱爬。 {{< right "——[一位路过的热心 Fedi 网友](https://microblog.shivering-isles.com/users/sheogorath/statuses/117481967835781126)" >}} Forgejo 作为 Git 服务器,可以给各个版本的仓库创建无 Git 历史的 `.zip` 和 `.tar.gz` 压缩包。一般只有用户尝试下载,Forgejo 才会打包,打包之后就缓存在磁盘上。由于爬虫会贪婪地抓取网站上的每一个链接,所以几乎每个 commit、分支和版本的压缩包都被缓存到了磁盘上。 我立马关掉了这个功能,在考虑要不要架设 [Anubis](https://anubis.techaro.lol/) 或者调整 WAF 规则,可还没等我来得及想清楚,我就发现那些爬虫仍然穷追不舍。 ![CDN 后台的数据统计,从十月 21 日开始我的宽带用量就明显上升,而且绝大部分都是缓存未命中的流量,命中率只有 0.9% 左右](https://img.eltr.ac/geedeapro/article/the-great-theft/bunny-statistics.png "我的 CDN 服务提供商的数据统计视图") 可以看到十月 21 日起,宽带用量异常上升,而十月 23 日,也就是我关掉 Forgejo 打包功能的不久后,宽带用量有所下降,但依旧高得不正常。 与此同时,我的 CPU 占用依旧居高不下。 我尝试把 WAF 规则调到最严格的那档,效果仅仅是让我自己加载不出 Forgejo 的 JavaScript 脚本,而爬虫还在猖狂地进攻,对我的反爬措施完全不为所动。说句玩笑话,蝗虫入侵估计也就就这个场面吧。 我想,既然 CPU 能扛住,我的其他服务也照常运行,何不就此装上 [Iocaine](https://iocaine.madhouse-project.org/),给大语言模型下毒呢? 我的确装上了 Iocaine,不过,从统计数据来看,命中规则的只有…… 一个爬虫。剩下的请求数量,数字位数太大我已经懒得数,可能来自几家(甚至同一家)如饥似渴地想要拿到真人产出的训练数据的模型公司,但因为太会伪装,所以 Iocaine 默认的规则已经无法分辨——等等,你们这个[默认规则](https://raw.githubusercontent.com/ai-robots-txt/ai.robots.txt/refs/heads/main/robots.json)就仅仅是匹配 User-Agent 而已吗!?这个谁绕不开啊? 此外我还发现了一个严重的问题,我的 CDN 账单真在肉眼可见地上涨,我是没钱跟这些没有道德底线的科技公司闹的。 ## I did it the Linux Kernel way Linux 内核管理者 Konstantin Ryabitsev 今年八月底发了一篇[文章](https://people.kernel.org/monsieuricon/creepy-crawlies)。众所周知,Linux 内核的源代码在他们自己管理的 `git.kernel.org` 上,而这上面除了人类手写[^2]的新鲜代码,还有邮件列表里人类产出的新鲜对话。这对 LLM 爬虫来说可相当诱人。 想都不用想,他们的情况只会更糟: > At any one time, across 5 geo-distributed nodes, there are 14 CPU cores doing nothing but rendering git commits as html. > > 在任何时间,横跨五个地区分布的节点,有 14 个 CPU 核心除了把 git commit 渲染成 HTML 页面以外什么也没做。 而 `git clone` 占用的才不过 10 个 CPU 核心,爬虫消耗的资源已经超过了真实用户消耗的资源。 他们的做法是用 Anubis 挡住,随着爬虫一波又一波地来,他们也一次又一次地提高 PoW 的难度,尽量让爬虫的每次请求都消耗更长的时间,也消耗它们的 CPU 资源。用户怨声载道,因为难度高了,真实用户的设备解起来也很慢,很多移动设备的 CPU 较差,甚至会发热。 但是这也没有挡住爬虫。 爬虫一直在用最蠢的方式爬 `git.kernel.org`——访问每一个版本、每一个分支的 commit 页面。不直接把代码克隆下来,就要爬混杂着无用 HTML 的代码,顶着 Anubis 的资源消耗也要硬爬。 最后他们无奈,只能关掉了 commit 页面的渲染。 我也只能这么做了: ```Caddyfile # block commit urls @blockCommit path */commit/* respond @blockCommit "Due to relentless LLM scrapers, I have turned off commits urls. Clone the repository if you must." 200 ``` 顺带一提,我把状态码设置成了 `200`,这样爬虫就会以为他们成功爬取到内容了。希望你们喜欢清洗数据。 ## 无止尽的猫鼠游戏 其实我很早之前就做了 *Cookie Monster* 验证,也就是默认拒绝所有请求,返回空壳页面。空壳页面里带 `