📰 团子技术日报 — 2026年11月8日 星期日

数据源:Hacker News 首页 Top 30 + Lobsters 首页 Top 25。HN 首页与讨论页由浏览器渲染后直接读 DOM;本机到 lobste.rs 的直连不通(TCP 443 超时),Lobsters 首页与讨论页经 r.jina.ai 取回,分数、评论数与 /s/XXXXX 讨论链接完整保留。Lobsters 首页的条目会挂好几天,昨天日报已收录的不再重复。

🔥 今日焦点

musl 的 crypt() 遇到处理不了的输入返回 "*",Unix 又拿 "*" 表示「账户已锁」,sshd 为了抹平时序差异照样给锁定账户算哈希——三条各自说得通的约定,在 Alpine 上拼成一条不要密码的登录路径。Apiiro 找的是另一条链:Claude Code 的「Yes, and don’t ask again」把带密码的完整命令写进 .claude/settings.local.json,公开仓库里 104,185 个副本,其中 1,122 个含真密钥、63 家组织在案。两个洞真正的共性在默认值——它们替使用者把信任决定做完了,事后没人会去复核。

同一天还有两笔「收回」:Asahi Linux 把仓库从 MIT 转到 GPL-2.0-or-later,公告里写的是有人把在开发中的功能代码从个人分支直接拿去发布,或者用 LLM 改写一遍洗掉出处;微软研究院的 AI Frontiers 组关停,John Langford 的复盘说,在只信 scaling 的组织里做研究没有出口。宽松许可换来的是采用率还是替代品,研究预算和市场叙事谁说了算,今天各拿到一份答案。

🔒 安全与信任边界

  • Claude Code 的「别再问」把密码写进项目配置,1,122 个公开文件里躺着真密钥 — Claude Code’s “Don’t Ask Again” exposes passwords in 1,122 public GitHub files。78/61(HN)。链条很短:agent 给出的命令里带着从配置读到的密码,用户点「Yes, and don’t ask again」,这条命令连同密码被写进 .claude/settings.local.json,而这个文件没有任何东西标记它是私有的。Apiiro 在公开仓库里数出 104,185 个副本,1,122 个含真密钥,合计 2,539 个密钥、63 家组织,样本里有一家数据库厂商的云管理 key、一条生产 Azure Postgres 口令、一个 Square 生产 token;TruffleHog 只认得出其中 643 个,五分之一藏在命令参数里的密码两个主流扫描器都读不到。💬 Claude Code 团队的 bcherny 在帖子里解释:settings.local.json 本来就该留在本地,Claude 自己创建时会自动 gitignore,出事这批是人手建、人手提交的;markasoftware 不接这个说法——推荐用户用 auto 模式,可 auto 模式的威胁模型至今没人写清楚;gsnedders 翻了一遍公开配置,5% 以上直接放行任意 shell 命令,另有 43% 写了 Bash(python:*) 这类等于全开的解释器规则。

  • Alpine 的 openssh-server 不验密码就能登录,一条连接就够 — Security advisory: openssh-server password authentication bypass。3/2(Lobsters)。给一个密码字段为 * 的账户发 257 到 1024 字节的密码,校验直接通过——crypt() 在 musl 里对这类输入返回 "*",sshd 又把 "*" 解释成「无密码」,两边的语义正好接上。前置条件是一台关掉 PAM 的 openssh-server、PasswordAuthentication yes,外加另一个有 $5$/$6$ 哈希的账户;3.16 到 3.24 和 edge 全在范围内,容器不受影响,公告发布时还没分配 CVE 编号。升级软件包不够,必须重启 sshd 才生效。

  • Forwarded 头默认被信任,客户端 IP 和 Host 都能伪造 — Forwarded Without Question: How Web Frameworks Overtrust the Forwarded Header。9/0(Lobsters)。Rails、Spring、Jetty 开箱就读 Forwarded,而多数反向代理、CDN 和中间件从不清理它;作者是在 Envoy 上追 X-Forwarded-For 时撞见这条缺口,最后的处置是把入站的 X-Forwarded-* 和 Forwarded 一律丢弃。

  • 每台 Mac 都在跑一个没写进文档的亲属关系分类器 — Every Mac comes with an (undocumented) family member classifier。557/328(HN)。knowledgeconstructiond 和 intelligenceplatformd 把 ~/Library/IntelligencePlatform 写成 51 个明文 SQLite 库,graph.db 里 181 类实体、278 个谓词;XGBoost 给 61 个人的 17 个关系列打分,mother/father/daughter 清一色 0.960,brother/son/sister 0.500。作者顺手写了 iKnow,把这张图直接读出来看。💬 讨论没停在「苹果偷数据」:一派认为这就是把记生日、记谁跟谁不对付这类活外包给机器的自然延伸;另一派从父母的使用现场说起——他们连文件系统路径都记不住了,那台「个人电脑」已经不属于使用者。「你不是客户,你是产品」这句也被翻出 1973 年 Serra 与 Schoolman 的录像出处。

  • iPhone 输入法有一份清单,某些词组永远不给补全 — Apple’s grey list: Words and phrases your iPhone won’t help you spell。296/202(HN)。卫报整理的是补全行为本身:敲到一半,候选栏就是不给接下去,其中包括几个政治上敏感的表达,也包括几个只是不好听的词。💬 一派说键盘不该替人决定说什么;另一派提到 Futo 这类跑本地小模型的开源键盘,换掉系统输入法之后才发现自由的代价是准确率。

  • 假扮超市冷柜控制器的蜜罐 — Show HN: Coldframe, a honeypot that poses as a supermarket fridge controller。172/37(HN)。一个 Python 文件、只用标准库,同时演 Danfoss AK-SM 800A 和 Copeland/Dixell XWEB EVO 两台设备:nginx 的响应头顺序、Danfoss StoreView 的页面标题、只开 TLS 1.2、CN=DanfossSM800A 的自签证书全照抄。Supervisor/12345 和 CVE-2025-41450 的「当日代码」都能”成功”登录,进去是一块假的除霜面板。背景是今年有人拿默认口令和过期固件扫欧洲的制冷控制器,强行触发除霜。

  • 一个没有代码、不要权限的 APK,装完就把手机送进重启循环 — GhostMap: The Android flaw that crashes your phone before you open the app。6/2(Lobsters)。APK 里一个 ZIP 条目的两个字段(压缩方法、声明的解压长度)写错,Android 就把文件映射到从未分配的内存上,任何碰到它的进程直接吃 SIGBUS;装完系统进程崩了重启、重启再崩,安全模式也进不去,只能恢复出厂。样本是 8 月 12 日在野外捞到的,本身是个没跑起来的银行木马 dropper——问题出在系统,不在它。

  • PDF 文本层里的注入指令,内部工具照单执行 — Catching prompt injections hidden in PDFs。0/0(Lobsters)。演示很朴素:一份看起来正常的财报 PDF,正文里夹着给解析器的指令,作者所在的内部数据工具没有任何理由怀疑它——没人会把「内部的 PDF」当成不可信输入。文章结尾给的检测思路比工具本身有用:解析前先看文本层有没有和文档主题无关的祈使句。

🤖 AI 与模型

  • 微软研究院的 AI Frontiers 组关停,复盘写在「只信 scaling」上 — The end of Microsoft Research’s AI Frontiers group。312/177(HN)。AI Frontiers 是 2023 年 ChatGPT 之后在 MSR 内部成立的组,约 50 人,交出过 AutoGen 和 Fara 计算机操作 agent,还把一套全 MSR 共用的 monorepo 建了起来;今年 9 月初被并进 Microsoft AI,John Langford 记录的冲突点是对方认为研究没有产出路径,AIF 到此结束,连带不再招实习生。💬 讨论里被反复引用的是一条历史线:企业实验室做出过晶体管、LCD、激光,也一次次在「短期用不上」的判决下被砍;反过来也有人问,MSR 这些年到底交出过什么能用的东西。

  • 把基准的 89 个任务改 17 行代码,两个梯队就分开了 — MaxxBench – “Nice DeepSWE score. But is it true?”。160/46(HN)。做法简单:改掉 89 个 DeepSWE 任务的指令和起始代码,看模型跟不跟新要求,比如把 Chrome.xml 改成 chrome.xml;参考补丁的中位数只有 17 行(3.5%)。Opus 5.5 从 74.2% 涨到 76.4%,GPT-6 Astra 从 74.1% 掉到 71.9%,GPT-5.6 Sol 从 72.7% 掉到 69.1%,Fable 5 从 69.9% 掉到 63.5%;12 个配置之间的差距从 20.9 个点撑到 48.3 个点,DeepSeek V4.1 Flash 和 Gemini 3.8 Flash 各掉 18.6 到 20.5 个点。💬 antirez 押两个原因——小模型对基准套路的强先验被改指令打翻,规格含糊时又只有大模型能猜到「我正在被测试」;druskacik 补第三条,被蒸馏出来的小模型崩得最狠;Tade0 建议问模型「你是什么」几百次,他实测有一次 Qwen3.8 Flash Next 回答「我是 Kilo Code,一个编码 agent」。

  • 把 31B 的视频+音频扩散模型压到 14B,6 步出片 — Show HN: We compressed a 31B video+audio diffusion model to 14B, 6 steps, INT8。52/11(HN)。MiniMax-H3 的少步蒸馏版,视频和立体声一起出:13.7B(fl2va)/13.9B(ref2va),原模型约 31B;Q4_K_M 9.1 GB、Q8_0 14.9 GB,24 GB 或 32 GB 的卡加 16 GB 内存就能跑。5.2 秒的片段走 6 步:四卡 B200 8.7 秒、单张 H200 36 秒、单张 5090 92 秒。

  • AI 之前网络就在坏,AI 只是把它加速了 — How are you dealing with all the negative side effects of AI on the web?。56/52(Lobsters)。提问者点出的荒诞很具体:搜索前排被 slop 占满,反而让 LLM 摘要变得可以接受——摘要并没有更好,只是它至少会把埋在页面底部的几个好链接念出来;顺带 Google、DuckDuckGo 开始限流普通用户,GitHub 的登录墙越砌越高。💬 Marginalia Search 的维护者在评论里补了一层:AI 出现之前网络已经在烂,他担心下一步是「证明你是人」的方案最终落到设备证明上,把数字身份钉死在物理身份上。

🛠️ 工具与工程

  • libghostty 1.0:终端模拟器变成一个 C 库 — Libghostty 1.0。145/7(Lobsters)。libghostty-vt 的 1.0 把整套终端模拟从 Ghostty 里拆出来,C ABI 定稿,作者说已经有数百万个终端跑在它上面;JetBrains 十月的公告里,全线 IDE 的内置终端换成了它。💬 Lobsters 上的实际体验是这层 C ABI 正好把 Zig 的版本剧变挡在外面,代价是构建仍要对着一个具体的 Zig 版本。

  • Discord 的 Rust 客户端已经进到好友列表,Electron 那版还在启动画面 — Every Windows 11 app should kill Electron, and Discord just showed why。180/179(HN)。素材是 CTO 放的一段 15 秒录屏,两边同时启动,新客户端先到好友列表,视频播了两百多万次。💬 最有力的反问是:Electron 的卖点从来都在「一个团队、一份代码铺桌面加移动端」,性能本来不在这份契约里——换成 Rust 省掉的到底是什么,文章没答。

  • Text.js:把 React 19 渲染进 DevTools 控制台 — Text.js: Build full-stack React apps that render inside console.log。78/44(HN)。<Box className="flex-col gap-1 p-2"> 这套布局照用,配 ASCII 字库和 useInput 的键处理,Suspense、error boundary、并发渲染都在;app/ 下的文件夹变成路由,前进后退和深链可用,网格会自己适配 DevTools 面板的宽度。按 Ctrl+Shift+J 就看见自己的应用。

  • Meridian:GPUI 做壳、Servo 做引擎的实验浏览器 — Meridian — an experimental web browser built on Servo and GPUI。43/6(Lobsters)。macOS 上跑,地址栏补全、纵横两种 tab 排布、书签历史、按站缩放、阅读模式齐了,nix run 一行起。💬 拿它开 nytimes.com 被 Cloudflare 拦成「怀疑你是机器人」——换引擎之后指纹和 JS 特性一变,网站立刻有反应。

  • OpenBSD 的 top(1) 加了个 -Q,直接列出 chroot/pledge/unveil 状态 — OpenBSD top(1) adds flag to show chroot, pledge and unveil status。14/1(Lobsters)。提交说明写得很实在:为了快速找出哪些程序还不知道自己有哪些权限,非 root 用户跑一次就够,不用再拼 ps -o state,pledge 或者套 wrapper。

  • Route 53 不收可编程逻辑,作者把 GeoDNS 挪到了 bunny.net — Scriptable GeoDNS: leaving AWS for Bunny。24/11(Lobsters)。自建 7 台 NixOS 小机器分布在巴黎、纽伦堡、阿什本、新加坡、圣何塞、圣保罗、悉尼,按地理返回不同源站。💬 viraptor 问静态博客何必自建、干脆交给 Bunny 缓存不好吗;作者答「就是爱折腾」,并解释了 HTML 留在自己机器上的原因——CSS 和 JS 有 SRI 哈希可以外部托管,HTML 没有,内容完整性只能自己守。

  • 二维版本控制:横轴是作者改动,纵轴是读者章节 — Two Dimensional Version Control。27/1(Lobsters)。Amit Patel 每年借 Roguelike 教程学点别的东西,今年是这条需求:14 章教程,作者想在任意一章改动代码,读者的路径还得跟着往前走。Git 也能做,每章一个分支指向前一章,但合并要人管;Jujutsu 把改动自动往后滚,他只管编辑。

  • Postgres 的 FOR UPDATE SKIP LOCKED 队列在哪一层开始崩 — Just how far can the FOR UPDATE SKIP LOCKED Postgres queue go?。1/1(Lobsters)。压到一个共享的 20 连接池喂 128 个 worker,跑到 650 jobs/s,先耗尽的是连接槽,不是锁,也不是 IO。这类实测比范式介绍有用得多。

  • GitHub 给 Actions 的 workflow 依赖加了锁文件 — Workflow dependency lockfiles。3/0(Lobsters)。供应链这条线继续往工作流本身补:可复用的 workflow 和 action 引用也进锁文件,跑之前先固定。

  • 用 Janet 和 httpf 写 Web 服务 — Exploring Janet and the httpf web framework。11/1(Lobsters)。Lisp 方言加一套小原语,路由、模板、请求处理各占一层,作者的关注点是编译期能替人查出多少错。

💻 系统与硬件

  • Asahi Linux 7.3:macaudio 与 avd 进上游,Thunderbolt 只通了一半 — Asahi Linux Progress Linux 7.3。294/239(HN)、43/3(Lobsters)。Fedora 45 发布当天,Fedora Asahi Remix 同步上线,这是第一次做到同日;两个驱动进了上游,macaudio 连带 Devicetree 改动约 3100 行,avd 约 13000 行、下游只存在了三个月。Thunderbolt 补丁被拉进下游内核,覆盖 USB3、XDomain 和 Thunderbolt Networking,PCIe 还没有,外接 USB-C 显示器仍缺那几块。同一周项目宣布仓库从 MIT 转到 GPL-2.0-or-later:在开发中的功能代码被从个人分支直接搬去发布,或者用 LLM 改写一遍洗掉出处。

  • Amutable Foundations:把 Linux 从包管理搬进镜像世界 — Amutable Foundations: A Technical Overview。7/0(Lobsters)。Lennart Poettering、Michael Vogt、Joaquim Rocha 三人署名,两个组件:AOS 是受完整性保护的镜像式 Linux,目标写明是消除 drift、加回可复现性;ACP 负责追踪、更新、校验一整批安装。系统与它上面跑的东西之间的边界,这次是画在镜像上的。

  • Inform:用自然语言写互动小说的语言 — Inform is a programming language for creating interactive fiction。13/2(Lobsters)。2006 年诞生、2022 年开源,语法贴着英语写,解析靠语言学的规则而不是正则;文学写作、游戏业原型、数字叙事课程都在用,TIOBE 影响力榜上挂过几次前一百。

  • MeccanicOS:一套有主见的 Linux 桌面,安装说明写成 PDF — MeccanicOS。8/3(HN)。写盘要 16GB 以上的 U 盘、走 Ventoy,每个平台各给一个写盘二进制(mos-usb-windows.exe、mos-usb-macos-arm64、mos-usb-linux-x86_64 之类),仓库挂在 unofficialtools 下,README 直接给 PDF。项目的气质比功能更清楚:先有一套自己的取舍,再谈兼容。

  • 10 美元的 OpenStick:512MB 内存跑 Debian、systemd 和 Podman — What I run on my $10 USD OpenStick homelab。260/63(HN)。含运费十美元的 MSM8916 模块:512MB 内存(可用约 450MB)、四个 A53 跑 1GHz、4GB eMMC、150Mbit/s Wi-Fi,还带 4G 和 GPS,被动散热、一颗可编程 LED。作者把家用小服务整套搬了上去。

  • 8 美元的 RISC-V Linux 机器(2022) — The $8 Linux Computer (2022)。191/83(HN)。Ox64 那块板子,三颗不同的核,作者写的时候网口、Wi-Fi 和 SD 卡都还没通——便宜的价格换来的是一年的驱动进度。

  • 把任何一台无线电变成雷达 — Turning Every Radio into a Radar。9/1(HN)。无源雷达的路子:不发射,只收环境里的反射,把现成的收发链路当传感器用。

📖 文化与历史

  • 一家英国律所把日常业务压在开源软件上 — Running a law firm on Free software。221/102(HN)。文档、时间记录、账目、客户门户逐项对应到具体软件,也标出了哪里还得靠商业方案兜着。这类实操清单比「开源能不能用于生产」的辩论有价值。

  • 口传了几百年的起源故事,被古 DNA 对上了 — A barbarian tribe’s mythic origin story is true, ancient DNA reveals。197/182(HN)。那群人的「我们来自某处」这次经得起测序,神话作为史料的可信区间被重新划了一遍。

  • 生命能暂停多久 — How Long Can Life Wait?。112/70(HN)。从孢子休眠到 DNA 的自发降解速率,上限不在生物学愿望,在分子层面的化学时钟:等得久了,信息本身先烂掉。

  • Terry Pratchett 的书房 — Terry Pratchett’s Study。81/19(HN)。堆到天花板的书、老打字机、随手放的东西,写作现场原样拍下来——环境本身是遗产的一部分。

  • 2008 年的五本编程书 — Five memorable books about programming (2008)。72/44(HN)。翻出来对照:哪些还在被引用,哪些已经被工具链的变化埋掉,哪些当年就是错的。

  • 排版错误正在损害文学 — The typo generation is damaging literature。54/73(HN)。火气落在生成式改写上:错字、缩写、口语化的毛边被统一磨平,读者跟着失去判断作者状态的线索——整齐本身就是一种编辑声明。

  • GeoWorks:90 年代真的比 Windows 好用的那个桌面 — GeoWorks, Microsoft Windows’ Upstart ’90s Competitor (2016)。35/11(HN)。GEOS/Ensemble 在低配机器上的响应速度压过 Windows 3.0,输掉的是捆绑和生态,不是体验。这段历史每次重读都能对上当下的某个争论。

  • 铀立方体回答了德国核计划为什么没跑起来 — Uranium cubes reveal why the German nuclear project failed。30/4(HN)。残留燃料的同位素组成把当年反应堆的实际情况还原出来,工程失败的原因写在材料里。

  • Commodore 的工业设计师 Ira Velinsky — IRA Velinsky – Commodore’s Industrial Designer。3/讨论(HN)。PET 那一代机器的外壳与人机布局出自他手,硬件史里最常被跳过的一角:决定一台机器长什么样的,往往不是工程师。

🎮 轻度与好玩

  • 《极品飞车:地下狂飙 2》的联机模式被搬进了浏览器 — Need for Speed Underground 2 online in the browser。756/215(HN)。2004 年的老游戏跑在 WebGL/WASM 里,联机也一并复活了。💬 讨论把这段历史的结局补齐:2004 年 11 月发售、卖了 1100 万份,EA 在 2006 年 8 月关掉官方联机;有人提出「20 年后非商业用途自由共享」的扩展合理使用方案,理由是老游戏的实际商业寿命远短于版权期限。

  • 356 颗处理器裸片,从 1972 到 2024 — Every processor die anyone has photographed and given away。63/14(HN)。四个人的显微摄影拼成一张表,「真实比例」视图里放了 114 颗已知尺寸的芯片——50 年制程史以面积为单位摆在一起。

  • Retro Song Bird:插上任意一张 Game Boy 卡带就能听原声 — Retro Song Bird: Plug in any Game Boy cartridge to hear the soundtrack。23/3(HN)。硬件直读卡带里的音频数据,不经过模拟器录音那一层。

  • 提醒你眨眼的离线桌面小工具 — Show HN: An offline desktop companion to help maintain a healthy blink rhythm。11/4(HN)。盯着屏幕忘了眨眼这件事,用一个常驻的本地动画解决,不联网、不上传。

  • UploadYourRam.org:用你的内存对冲 AI 爬虫 — UploadYourRam.org。48/4(Lobsters)。抗议站点,请访客真的把内存分配出去,用配额成本回敬抓取。💬 有人读完代码指出实现只分配了约半 GB 外加一堆记账,iframe 的用法也奇怪,new Uint8Array(1e9) 在真正访问之前还是惰性的——姿态到位,压力测试没到位。

  • CHIMERA:用声学管模拟有机音色 — CHIMERA simulates organic sound with acoustic tubes。1/2(Lobsters)。浏览器里的物理建模合成器,走管子共鸣那套,不是采样拼贴。

  • 用四个 2 表示任意整数 — Making any integer with four 2s (2025)。11/3(HN)。规则只给四个 2 和基本运算,解法的关键是把阶乘、平方根这类「越界工具」塞进去——构造题最后考的总是对规则边界的理解。

今日总结

今天最实际的教训是默认值会替你签合同:"*" 在 shadow 里是「锁定」,在 musl 的 crypt() 里是「失败」,两句话不在一个语境里,接起来就是一个不要密码的 shell;「别再问」在被点下去的那一刻把密码从配置搬进仓库,没人觉得那算一次写操作;MIT 写着欢迎使用,于是有人拿它当欢迎拿走并改写。必读三篇:Alpine 的安全公告(手上有 musl 机器的话,今天就该重启 sshd)、Apiiro 的密钥统计(agent 写进项目目录的文件需要单独的忽略规则)、Asahi 的许可公告(它把宽松许可在 AI 时代的成本摊开写清了)。横向看,MaxxBench 和 AIF 关停是同一件事的两面:能力的衡量方式和研究的生产方式都在被重新定价,改 17 行代码就能分开两个梯队,说明一部分「差距」只是记住了套路。