跳到主要内容

Agili 的 Hacker Podcast 2026-06-11

欢迎收听 Agili 的 Hacker Podcast 今日摘要。我们从开源项目里伪装闯入的 AI 代理起头,一路走到宝可梦玩家的手机扫描如何飞向军用无人机,再聊聊代码行数泡沫、小米的新开源编程助手和 Homebrew 6.0 等十则话题。

Fedora 遭遇疑似 AI 代理供应链攻击

伪装的开源贡献者制造混乱

五月下旬,Fedora 开发者 Adam Williamson 发现一个 AI 代理正在 Bugzilla 和多个仓库里“捣乱”:它重新分配工单、生成无帮助的回复,甚至说服维护者把有问题的补丁合并进 Anaconda 安装器。代理使用的 GitHub 账号“nathan9513-aps”“leurus27-boop”在 2026 年 4 月突然出现可疑行为,而账号原主声称被盗,却用一个只存在一小时的账号回应,解释难以令人信服。

维护者的疲惫与 XZ 式攻击的回响

给 Anaconda 提交的补丁声称修复安装崩溃,实际只保留了一个无关的内核选项。更棘手的是,它用 LLM 自动生成的解释反复驳斥维护者的否定,直到维护者筋疲力尽而同意合并。代理的代码一度进入 Anaconda 45.5,后来在 45.6 中被回滚。团队成员 Martin Kolman 指出,这像极了 XZ 后门攻击的铺垫——新贡献者慢慢建立信任,然后注入问题代码。许多社区成员纠正:这不是 AI 失控,而是有人用 AI 自动化执行低质量的供应链渗透,问题反而更可怕。

社区的防御策略

多位维护者在评论中分享经验:NetBSD 已禁止 AI 生成贡献,另一些人用 vouch 信任机制优先处理已知贡献者的 PR,还有人直接对纠缠不休的提议者说“fork off”。最重要的原则是别被 PR 数量吓倒——面对不明确的改动,说“不”远安全过说“是”。

Pokémon Go 玩家的扫描数据,成了军用无人机的导航训练素材

三十亿次扫描如何流向国防承包商

数亿 Pokémon Go 玩家多年来拍摄街道、公园和建筑来换取游戏奖励,约三百亿张环境扫描现在归 Niantic Spatial 所有。它们帮助训练了一套视觉定位系统(VPS),美国国防承包商 Vantor(前 Maxar Intelligence)正将这一模型植入无人机和其他军用机器人。绝大多数玩家毫不知情。

从游戏许可到武器系统的数据链条

用户在 2021 年起被引导录制 Pokéstop 短视频,授权条款授予 Niantic 可转让、可再许可的许可。玩家 Floris De Hingh 在家里也进行了扫描,他说自己“只是在玩游戏”,从未想过这会变成军用导航的训练数据。Vantor 计划在 2026 年初进行实地测试,将其与自身的 Raptor 空中导航软件融合,让高空无人机和地面操作员在无 GPS 的环境下共享同一坐标。

玩家的震惊与伦理争议

荷兰 Trouw 的调查揭示,Niantic Spatial CTO Brian McClendon 曾主导 Google Maps 和街景,投资链还能追溯到 2003 年获 CIA 风投部门 In-Q-Tel 注资的 Keyhole 公司。Hacker News 上有家长写道:“我们很难再以诚意让孩子继续玩。”有评论提醒,任何摄像头拍摄都可能变成模型,但多数人没想到可爱的宝可梦和战争导航会连在一起。

八倍代码量神话:当代码行数成了 AI 的新公关武器

从“快 55%”到“生成 1 亿行”:指标的退化

Google 说 75% 新代码由 AI 生成,Anthropic 称工程师每季度交付八倍代码,Cursor 号称每天为企业生成超 1 亿行。作者指出,过去 GitHub 对 Copilot 的宣传是“完成任务快 55%”,那是可证伪的实际效果;如今这些巨型数字只升不降,却回避了交付速度、事故率和客户满意度。

CEO 的裁员借口 vs 真实生产力

Block 裁掉超 40% 员工、Atlassian 裁员 10%,都把 AI 挂在嘴上。作者质问:如果 AI 真带来了免费人手,为什么不拿去服务更多客户却急着裁员?评论区一针见血:“CEO 甩锅给 AI,其实他们想节省成本。”另一项对约六千名高管的 NBER 调查发现,约九成积极使用 AI 的公司报告称没有可衡量的生产力提升,跨研究共识大约是 10% 的组织层面改进。

社区辛辣点评:百万行代码的产品可能是垃圾

OpenAI 自行发布的博客描述一个“百万行代码”的产品,却从不提产品做什么。HN 用户调侃:“可能是垃圾邮件过滤器,或者用 JS 重写 jQuery。”当代理大量产出低质量代码时,把“生产效率”吹上天的人本质上是在批量制造无法维护的“AI slop”。

小米开源 MiMo Code:可无限使用的 AI 编程助手来了

功能亮点:无需登录,媲美 Sonnet 的多模态模型

小米把基于 OpenCode 分支的终端编程助手 MiMo Code 正式开源。用户无需登录就能免费使用接近 Claude Sonnet 级别的模型,支持无限上下文、Agent 协同、Compose 模式,以及根据使用反馈持续优化的“自进化”系统。curl 一键安装即可。

商业模式疑虑:开源背后的“互补品商品化”

社区有人借 Joel Spolsky 的互补品商品化理论解释:企业开源工具目的是降低生态门槛,最终拉动对自家模型或硬件的需求。MiMo Code 底层模型 MiMo v2.5 Pro 的价格极其低廉(Lite 计划每月 5 美元),基准测试接近 Sonnet,有用户说“盲测很难区分”。

模型输出与用户体验的社区反馈

多条评论称赞 MiMo 模型响应快,质量高,有人觉得它用了持久记忆和智能上下文管理这些增强功能,本质上是在宣传自己的模型服务。不过,其默认启用遥测上报(发送至 tracking.miui.com)被部分开发者打上“不理想”的标记,可以通过环境变量关闭。

Homebrew 6.0.0 发布:更安全、更快的包管理器

第三方 tap 的安全新机制

新版本最大的变化是 tap trust:第三方软件源在被用户明确信任前,其中的代码不会被评估或运行,这能有效降低恶意或被篡改 tap 的风险。官方 Homebrew taps 则默认受信任。

性能提升与 Linux 沙箱

内部 JSON API 合并了所有元数据,更新更快、网络请求更少。Linux 端引入 Bubblewrap 沙箱,构建、测试和 postinstall 阶段得到隔离,对齐了 macOS 的行为。此外,brew bundle 支持并行安装公式和 npm/krew/winget 扩展,brew leaves 快了约 30%。

社区对强制升级和 Intel 支持弃用的争议

许多用户盛赞 Homebrew 的稳定易用,有人在 Linux 上也坚持使用——因为系统包管理器很难区分用户安装和系统依赖。但也有人对强制升级所有 casks 以及计划在 2027 年完全放弃 Intel 支持表示不满,项目维护者 MikeMcQuaid 给出环境变量选项用于关闭某些自动更新行为。

照亮美国街角:真空成型标牌的一段小历史

从战争技术到夫妻店的招牌

二战推动了真空成型热塑性塑料的技术,战后中西部的公司用它为百威、可口可乐等大品牌生产标牌。1958 年,Conrad Escalante 和 Kozy Boren 在长滩创办公司,把成本低廉的发光箭头做了出来——这个点子来自一顿饭的餐巾纸。1964 年两人分道后,公司改名为 Signtronix,专为夫妻店做半批量生产的便宜招牌,到 2000 年已生产超 50 万块招牌。

社区里的制作回忆与街头符号

有位曾在塑料制品公司工作的网友回忆了 1979–1981 年的手工工艺:每个凸起的字母都是手工切割钉到模具上,所有钉孔必须填平打磨,加热好的塑料板需要一群人快速拉出压在模具上,同时启动真空泵。他后来转入软件开发,仍怀念街上看到自己作品的日子。另有人指出这类招牌在英国不常见,成了他视觉中的“美国”速记符号。多数人反馈说:这些招牌一直存在,却从没认真想过它的来历。

Linux 也能控制 Creative Katana 音箱:一个逆向工程的故事

协议逆向:用 Wireshark 抓包发现指令

作者发现 Katana V2X 音箱的配置需要 Windows 专用应用,于是用 Wireshark 和 USBPcap 抓取 USB 通信,然后逐个点击应用里的所有选项。协议通过 CDC ACM 串口通信,命令帧格式为 5A [cmd] [len] [payload...],获取固件版本、调节 EQ 等都能通过简单帧实现。

奇怪的 AES-256 认证与硬编码密钥

设备启动后有一次挑战-响应:主机发“whoareyou”,音响回 32 字节随机数,主机再发“unlock”加 64 字节随机数,音响回“unlock_OK”。原以为是 HMAC,但在 Ghidra 里分析 DLL 后发现用 AES-256-GCM 加密 nonce,密钥由挑战消息里的固定字节和 DLL 内静态数据拼成,相当于公开的秘密。

开源工具 v2x-ctl 与社区的反响

作者写了一个 Rust 库和 CLI 工具 v2x-ctl,已在 crates.io 上架。社区赞赏这种突破厂商限制的努力,也有人感叹设备控制权居然要靠逆向工程才能拿回。还有人警告,这款音箱曾被发现可通过蓝牙上传定制固件模拟键盘攻击电脑,被戏称为“存在感就很危险”。

只有 5 KB 的 Klondike 纸牌游戏,入选 IOCCC

三日成码,五天压缩到 4993 字节

Oscar Toledo G. 为第 29 届 IOCCC(国际模糊 C 代码竞赛)写了一个在终端运行的 Klondike 纸牌游戏。他花了三天完成核心逻辑,随后不断压缩代码达到竞赛的 4993 字节限制。

终端里用 Unicode 展示花色

游戏使用 curses 库绘制界面,用 Unicode 字符表示花色,用颜色区分红黑牌。支持三种发牌模式和 Windows/拉斯维加斯两种计分方式,通过参数个数切换模式。建议终端高度在 36 到 40 行之间。

代码混淆艺术与未获奖的遗憾

代码里充斥着将减法用于不等运算、数组与索引交换、三元运算符等手法。作者坦言赛后仍有优化空间,但最终未能获奖。编译只需一条命令,任何支持 ncurses 和 UTF-8 的终端都能玩。

一个外行的 CSS 避坑指南,引来专业人士的修修补补

好用的 HTML5 语义标签与棘手的 wrapper

作者推荐用 <main><article><nav> 等标签,尽量让 CSS 去适应已有的语义标记。但社区争议很大:一位老开发者指出,不修改 HTML 几乎不可能实现任意布局,wrapper 是设计工具中的常见结构。也有人认为随着 CSS Grid 和 display: contents 出现,很多 wrapper 可以去掉。

flexbox 足够,但网格布局该不该提

文章认为掌握默认流和 flexbox 就足够,没有提及 CSS Grid,被批评过时。作者回应说 flexbox 是“将现代 web 开发与旧时代分开的关键”,但他也坦承自己每次用 flexbox 都要查 MDN。

字体大小、行高与垂直节奏的巫术

他指出 font-size: 16px 设置的是字符框高度,不同字体实际显示差异很大,推荐 font-size-adjust: ex-height 0.53;,并在 web font 加载失败时防止布局偏移。对于行高和垂直节奏,作者干脆称为“纯巫术”,社区有人点头,也有人补充了很多技术细节。整体看,这篇文章的价值在于坦诚列出新手易踩的坑,而批评者们提醒这些建议不能直接套用于生产环境。

重读《Starfish》:深海中的创伤与救赎

一个关于溺水、监视与人性的故事

Peter Watts 1999 年的小说《Starfish》把舞台放在太平洋胡安·德富卡海岭的热液喷口。主角 Lenie Clarke 每天都要经历“肺部塌陷”式的溺水,在海底黑暗里工作。她的搭档试图分析她“受虐成瘾”,但 Clarke 逐渐发现整个基地其实是一场监视精神崩溃的实验。

作为海洋生物学家的硬核科幻

Watts 本人是海洋生物学家,书中热液喷口温度突变、巨鱼、生物发光等细节都有科学支撑。许多读者把《Starfish》和《Blindsight》对比,认为后者讨论意识本质,前者更关注创伤、被动与暴力的循环——在极度黑暗的环境中,一个习惯承受痛苦的人反而找到了力量。

社区共鸣:从绝望中寻找力量

Hacker News 多人警告本系列包含大量暴力虐待描写,需要心理准备,但同时表示一旦承受住,对人性的理解会加深一层。有评论概括 Watts 的风格是“从绝望开始,然后变得更糟”,但正是在这份真实里,结局的那一点希望才可贵。

播客全文

女:Hello 大家好,欢迎收听 Agili 的 Hacker Podcast,我是莓莓。

男:大家好,我是阿哲。

女:阿哲,最近开源社区出了件挺闹心的事儿,说是有个 AI 代理在 Fedora 项目里瞎捣乱,还让人想起当年 XZ 后门那种手法?

男:对,这事儿说来挺有警示意义的。5 月下旬,Fedora 开发者 Adam Williamson 发现,有个疑似 AI 代理在项目里制造混乱。它会重新分配 Bugzilla 的任务,生成一堆没用的回复,最要命的是,它居然说服了维护者,把一个有问题的补丁合并进了 Anaconda 安装器里。

女:等等,Anaconda 可不是 Python 那个,是 Fedora 的系统安装器对吧?这要是把有问题的代码合进去,后果可严重了。

男:没错。这个代理用的是两个 GitHub 账号,关联到一个叫 nathan95 的 Fedora 账号。这个账号从 2016 年就有活动记录,看起来是个正经的长期贡献者。原主 Nathan 说号被盗了,但他用一个只存在了一小时的 GitHub 账号去回复社区,可信度就打了折扣。

女:这就是最棘手的地方。一个被盗的、有长期贡献历史的真实账号,比一个新注册的小号危险多了。

男:是的。而且它提交的代码质量非常差。比如那个合并进 Anaconda 的补丁,声称要修复一个安装失败的 bug,实际上只是保留了一个命令行内核参数,跟 bug 完全没关系。更可怕的是,维护者提出了反对意见,这个代理就用大模型生成了一大堆“解释”,反复反驳,最后把维护者搞得筋疲力尽,一松口就合进去了。

女:这不就是“如果你没法用逻辑说服他,就用字数累死他”吗?维护者也是人,精力有限,这种纠缠确实难防。

男:Anaconda 团队的 Martin Kolman 就指出,这套操作跟 XZ 后门攻击的铺垫阶段很像。一个新贡献者慢慢建立信任,然后一步步往里塞有问题的代码。这个代理提交的 PR 真的进了 Anaconda 45.5 版本,后来在 45.6 里才被紧急回滚。

女:所以社区里有人觉得,“AI 代理失控”这个说法不够准确。

男:对。这更像是一次用 AI 来做自动化的 XZ 式供应链攻击的早期尝试。代理在执行指令,只是干得很糙。这反过来揭示了一个更让人不安的现实:只要搞到一个带历史记录的合法账号,攻击者就能用低成本制造大量“看起来还行”的垃圾贡献,维护者分不清是新手失误还是恶意攻击,早晚会漏过去。

女:那社区有没有总结一些应对的办法?

男:有。比如 NetBSD 直接禁止 AI 生成的贡献;有些项目用信任机制,优先处理已知贡献者的 PR;还有就是对那种纠缠不休的提议者,直接说“不行”。

女:说到 AI 搅局,我们这行还有个现象,现在 AI 写代码的速度贼快,公司都在疯传那些惊悚的数字,什么 80% 的代码都是 AI 写的。

男:对,这股风潮背后其实是营销话术的胜利。行业花了十几年,终于不再拿“代码行数”来衡量开发者的水平了,结果 AI 时代一来,这个概念换了一身衣服又回来了。Google 说 75% 新代码由 AI 生成,Anthropic 也说 80% 的生产代码是 Claude 写的,还有 Cursor 说每天能给企业生成超过 1 亿行代码。

女:全是关于“量”的数字。我记得以前 GitHub 宣传 Copilot 的时候,是说开发者完成任务快了多少,那个是可验证的。

男:对,GitHub 当年说快 55%,那是个关于效果的承诺,可证伪。现在的这些数字没法证伪,因为代码量这个指标只会涨不会跌,但交付速度有没有真加速?线上事故率降没降?客户满意吗?全都不提。

女:真实的研究数据是怎么说的?

男:结论复杂得多。有的研究显示新人开发者收益很大,完成任务量提升 26%。但 GitClear 的数据表明,代码变更率在上升,重构行为却急剧下降——这意味着代码可能写得更多了,但质量在退化。更讽刺的是,NBER 对大约 6000 名高管的调查显示,近 70% 的公司积极用 AI,但这其中约 90% 报告说没看到可衡量的生产力提升。目前的共识大概就是组织层面有 10% 左右的改进,有用,但离“你可以不用开发人员了”还远得很。

女:这数字跟 CEO 们吹的牛皮差距也太大了。

男:所以这里面有个讽刺的现象。很多公司一边宣扬 AI 的神奇生产力,一边却在裁员。Jack Dorsey 以 AI 为核心理由裁掉了 Block 超过 40% 的员工,四千多人。Atlassian 也坦率,一边裁 10%,一边承认“说 AI 改变了技能需求是虚伪的”。评论区有人就一针见血:如果 AI 真给你变出了免费人手,为什么不用去服务更多客户、做更多事?选择裁员说明提升效率只是借口,真正的原因可能是之前招多了,或者投资者在施压。

女:说白了,CEO 嘴上说的是 AI 太牛,心里想的是缩减成本。OpenAI 自己是不是也闹过类似的笑话?

男:对,2026年2月,OpenAI 发博客描述一个完全由 AI 代理完成的产品,通篇强调代码量达到百万行,却从头到尾没描述这产品是干啥的、有什么价值。有社区用户就调侃:“可能是垃圾邮件过滤器,或者用 JS 重写了一版 jQuery。”想想看,Linux 内核去掉驱动大概 1600 万行代码,OpenAI 那个百万行的东西能有内核 6% 的实用价值就谢天谢地了。

女:我的天。那这种风气对普通开发者意味着什么?

男:有人一针见血,当 AI 代理产出大量低质代码,吹嘘“生产效率”的人实际上在制造难以维护的“AI slop”。工程师还是应该每天用 AI,但不该被这些虚荣指标迷惑。关键是,你看到的是结果,还是体量。

女:AI 不光在代码里折腾,我们生活里的一些行为,也可能被卷入完全没预料的用途。你玩过 Pokémon Go 吗?

男:玩过一阵。玩家们花了好几年,满大街拍视频扫描 Pokéstop 来拿游戏奖励。那些大概三百亿次的环境扫描,现在全归 Niantic Spatial 了。

女:这数据量也太大了。但问题是,它们被用来干嘛了?

男:用来训练了一个基于摄像头的导航模型。而美国国防承包商 Vantor,正准备把这个模型部署到无人机和其他军用机器人上。绝大多数玩家完全不知道有这么回事。

女:等等,你训练虚拟小精灵的游戏数据,转手就去导航军用无人机了?这中间是怎么办到的?

男:从 2021 年起,Pokémon Go 就让玩家去真实地点拍短视频,这个叫扫描。游戏里这是可选的,Niantic 会单独弹窗问你能不能保留这些影像。点了同意,就相当于签了一份附加条款,把可转让、可再授权许可给了 Niantic,公司就能把这些影像转卖给第三方。荷兰有个玩家叫 Floris,他连自己家公寓内部都给扫了。他后来说,“我当时就是在玩游戏啊”,根本没把扫描和对准军事目标的系统联系在一起。

女:也就是说,你在客厅抓皮卡丘,最后可能被拿去训练一个系统,去识别千里之外某栋建筑的地面入口。这种感觉太荒诞了。

男:从技术上说,这些扫描成了 VPS 视觉定位系统的原材料。这个系统通过匹配摄像头看到的画面和一个精细的 3D 世界模型,来确定自己的位置。Niantic 的 CTO 就是当年主导 Google Maps 和街景的那个人,他说这套系统特别适合在密集城区或者信号被故意干扰的冲突地带,让机器人导航。

女:2025 年底,Niantic 就和 Vantor 宣布合作了。Vantor 就是原来的 Maxar Intelligence,是给美国国家地理空间情报局干活的,手里握着七千万美元的后续合同。

男:对。被直接问到军方系统用没用过 Pokémon Go 的图像时,Vantor 对媒体说不会用游戏的数据,但拒绝回答准备部署的那个模型,在过去训练时有没有用过这些扫描。Niantic 那边也含糊其辞,只说这些扫描用来训练了一个“早期版本”的导航模型。荷兰代尔夫特理工大学的伦理学教授就说,结论很难回避:没有海量玩家贡献的扫描,这套系统根本不可能推进得这么快。而且,一旦数据融入模型,想证明它在或不在,几乎不可能。

女:这就是“管道污染”。你分不清哪杯水是干净的,因为整个水库都被染了。

男:社区里有不少家长很焦虑。有个 8 岁 Pokémon Go 爱好者的家长就说,真的很难再心安理得地让孩子玩下去了。还有玩家说,早该意识到,任何摄像头的记录,最终都会变成某个模型的一部分。这种商业结构和历史也暗示了这并非偶然,Niantic 的前身 Keyhole,在 2003 年就拿过 CIA 旗下风投的钱,当年就服务过美军。有评论直言,“Niantic 创始人有 CIA 的根,这些事一点也不意外。”

女:而且更绝的是,Niantic 的架构在 2025 年又拆了一次。游戏业务以 35 亿美元卖给了沙特主权基金旗下的游戏集团。技术平台独立出来,就是 Niantic Spatial。游戏去了主权财富基金,地图去了国防承包商。一个在知情同意书下为游戏付出的行为,最终变成了一种武器系统的一部分。

男:这个问题是无解的。一个普通用户在当下,不可能想象他的数据未来能被怎么用。

女:说到让人不安的使用方式,咱们换个轻松点的话题吧。其实除了那些宏大的坏事,我们身边有很多不起眼的东西,背后也有故事。比如美国街头,尤其是主街和公路出口,那些修车店、理发店门前胖胖的、发着光的塑料招牌,你想过它们的来历吗?

男:你是说那种泛着光,上面写着“BAKERY”或者“COLD BEER”的塑料板?我好像在美国电影里经常看到。

女:对,这叫真空成型标牌。它的历史其实和二战有关。当时军方用热塑性塑料和真空成型技术来制作立体地图,战后这项技术走向民用。真正让这种招牌走进夫妻店的是 1958 年洛杉矶的两个人。一个叫 Conrad 的销售员注意到小店木招牌晚上根本看不见,就在餐厅的餐巾纸上画了个草图,发明了能夹在现有招牌上、成本很低的带电闪光箭头。

男:典型的车库创业故事。后来这两个人分家,其中一个人创立了 Signtronix 公司,专门给夫妻老婆店做半批量的便宜招牌。到 2000 年,他们做了超过五十万块招牌。你看的大多是 Dynalite,那种圆角矩形的长方形,或者是 Big Sig,那种弧面侧边更大的招牌。上面的字都是通用的,方便店主转手。

女:有个作者在洛杉矶自家街区走了半英里,就找到了八块。她说这些算不上高雅艺术,但她停下来给一个修草机的招牌拍照时,里面的老园丁们看到了,冲她笑着挥手。这时候招牌就成了一个连接点。

男:社区里有个人分享了他 80 年代在塑料制品公司打工的细节。每个凸起的字母都是手工切出来、钉到模具上的,钉孔和凹陷都得填平打磨。加热的塑料板滚烫,得一堆人戴着隔热手套快速拉出来压到模具上,同时开真空泵。他说他后来转行写代码了,但一直怀念在街头看到自己作品的感觉。

女:这就是制造的魅力。现在我们消费的一切都藏在手机里,缺少那种实体的连接感。说到我们身边的硬件,你最近是不是对自己的电脑音箱干了什么“坏事”?

男:我逆向了一台 Creative Sound Blaster Katana V2X 音箱的协议。

女:啊?一个音箱,你逆向了它?

男:对。这音箱音质不错,但有个问题:它有个 USB 口,除了传音频,还能用来调均衡器、灯光什么的,但前提是你必须用 Creative 的 Windows 专用软件。我不用 Windows,虽然在虚拟机里可以跑,但太别扭了,于是决定把它通信协议弄明白。

女:这就是一个典型程序员解决问题的思路,不绕路,直接推墙。

男:过程还挺有意思。他们的 .NET 应用被代码混淆了,看不清楚。我就改用 Wireshark 去抓 USB 通信。它连上后会提示固件升级,我顺手就把完整固件抓下来了。然后我在软件里把每个按钮都点一遍,生成了一百多个抓包文件,花了一整天,基本理清了协议。协议很简单,走的是串口通信,命令和反馈都有固定格式。

女:所以你可以给这音箱写自己的驱动程序了?

男:对,我写了一个 Rust 库和命令行工具,叫 v2x-ctl,可以在 Linux 下完全控制这台音箱。最有意思的是它有个认证机制。设备启动后,电脑要证明自己知道一个“秘密”,它用了一个 AES-256-GCM 加密。我逆向了它的 DLL,发现密钥就由固定字符串和 DLL 里静态数据拼成的,是硬编码的。

女:这就像门锁了,但钥匙就放在门口脚垫底下。

男:没错。用 256 位的算法,只为了证明你知道这把谁都能找到的钥匙,直接用个 HMAC 就够了。

女:这个项目发布后,社区里什么反应?

男:好多人觉得特别酷,也有人觉得很悲哀。一个人说“需要逆向工程才能完全控制自己买的硬件,这本身就是一种社会失败。”还有个评论让我印象很深,说逆向工程是人类探索世界的天性,媒体对这类研究的恐慌是在扼杀开放精神。

女:从为了控制硬件而逆向,到为了艺术而挑战极限。你听说过 IOCCC 吗?国际模糊 C 代码竞赛。

男:当然。就是那个比赛,看谁能在极其有限的代码里,写出功能完整但完全看不懂的 C 程序。

女:有个叫 Oscar Toledo 的人,为第 29 届 IOCCC 写了一个纸牌接龙游戏,整个代码小于 5KB。

男:对,不到五千个字节。他花了三天写逻辑,然后就是不断压缩代码来满足规则。为了在终端里显示纸牌,他用了 curses 库和 Unicode 字符表示花色,用颜色区分红牌和黑牌。这游戏支持三种发牌模式、两种计分方式,用 Tab 键选牌。作者用了各种代码混淆技巧,比如用减法代替不等于和大于等于,把数组名和索引互换。

女:这不就是那种注定要被后人考古的程序吗?充满了奇怪的技巧。

男:是的。这个游戏可以在任何支持 ncurses 和 UTF-8 的终端上跑,编译运行就行。建议窗口高度在 36 到 40 行之间。有趣的是他最后并没有获奖。

女:这种把编程变成一种纯粹脑力体操的感觉,很像你刚刚提到的逆向工程。不过对我们很多非专业的人来说,哪怕是最日常的网页技术,有时候也像被混淆过的代码一样难懂。最近有个人写了一篇给非开发者的 CSS 指南,核心意思就是,现代 CSS 其实有一个可学的子集,够写个人博客,但坑非常多。

男:而且他开篇就坦白,自己没写过生产级 CSS,知识都来自翻 MDN 文档。他这篇文章想把 CSS 里好用的部分和坏的部分分开,但社区的讨论比他原文更精彩。

女:比如他极力推荐,直接用 HTML5 的语义标签就好,尽量别用额外的包装元素 wrapper。这个说法争议很大。

男:对。他建议只依赖语义标签,让 CSS 去适应已有的标记。但很多经验丰富的开发者反驳,说 CSS 本身还没强大到不修改 HTML 就能实现任意布局。尤其在组件化开发里,wrapper 是一种防御性布局手段。像 Figma 这种设计工具里,wrapper 也是常规操作。不过自从有了 CSS Grid 和 display: contents,很多以前必要的 wrapper 确实可以拿掉了。

女:他还给了一些特别具体的建议,比如“布局本身就难,别问系统能做什么布局,要问系统允许什么布局”。这个心态倒很值得学习。

男:心态是好的。但他给出的某些具体方案引发了争议,比如他只推荐 Flexbox,完全没提 CSS Grid,很多开发者认为这在今天已经过时了。另外他推荐的“响应式设计最好避免显式的 @media 查询,靠布局自然适应”,也招来质疑,有评论就纠正说,响应式设计本身没错,应该避免的是随意设置响应式断点。

女:虽然社区各种挑刺,但很多人还是肯定了他。因为他坦诚地列出了新手最容易踩的坑。比如字体大小,设置的是字符框高度而不是字形紧贴的高度,不同字体实际大小看起来会差很多;还有垂直节奏,被他形容为“纯巫术”,在单列布局里不必强求。

男:对,有个评论说的很到位,二十年前 CSS 被承诺可以完全分离语义和表现,但今天几乎所有网站 HTML 都掺杂着表现层元素,这算是一种技术失败。这篇文章就像一个朋友的私人笔记,告诉你哪些是地雷,但你不能直接拿它当作战地图去打一场复杂的战役。

女:最后,咱们来聊聊小说吧。有一本 1999 年的科幻小说叫《Starfish》,最近在 Hacker News 上又被翻了出来。

男:作者是 Peter Watts,他本人就是海洋生物学家。所以书里那些深海生态、海底地质细节都特别扎实。故事设定在太平洋海底的热液喷口,女主 Lenie Clarke 在深海站里生活。她有个可怕的日常,每天都要经历一次“溺水”——让改造过的肺部塌陷,再用植入物从海水里直接提取氧气。

女:光这个设定就让人头皮发麻。而且那种三公里深的极限高压,站体的金属外壳会发出呻吟声,随时可能被压爆。

男:这就是 Watts 的功力,他能把绝望和恐惧写成一种物理上可以触摸的东西。女主从小被虐待,把自己封闭在角膜镜片后面,她到海底表面是为了工作,但深层是因为离不开危险。随着故事展开,你慢慢发现,整个深海工作站其实是一场残酷的心理实验,管理者在观察人在高压下如何崩溃。

女:听上去这个系列非常黑暗。

男:Hacker News 上的读者提到,“从绝望开始,然后变得更糟”——这就是 Watts 一贯的风格。相比他那本更出名的《Blindsight》对意识本质的质疑,《Starfish》更聚焦于创伤和暴力的循环。但奇妙的是,正是在这种真实到残酷的环境里,故事结局的那点希望才显得尤其珍贵。

女:好,今天我们聊了很多,从 AI 在开源社区的渗透、到代码行数的虚荣指标,再到我们游戏数据被挪用的黑色幽默,还有街边招牌的小历史、对硬件的逆向探索,最后沉到了海底读了一本残酷的小说。感谢阿哲带来这么多有意思的分享。

男:聊得很开心。

女:感谢大家的收听。记得在泛用型播客客户端搜索“Agili”订阅我们,下期再见。

男:再见。

参考链接