今日 Agili 的 Hacker Podcast 聚焦技术自主权、性能工程与底层系统安全:从欧洲政府转向 NixOS 办公生态,到 Go 跨平台 SIMD 的编译器设计;从 Windows 驱动内核提权实战,到 AI 公司因道德条款受挫的法律裁决。
荷兰政府基于 NixOS 构建微软替代方案
DAWO 项目的四大支柱
荷兰内政部等机构联合开源界推进名为 DAWO 的项目,旨在构建基于 NixOS(以声明式配置和可重现性著称的 Linux 发行版)的自主数字办公环境,降低对微软专有生态的单一依赖。该项目将环境拆分为四大可审查组件:
- 操作系统:以 DAWO-NixOS 为基础的标准化工作站配置,实现工作环境的代码化管理;
- 云基础设施:支持自主部署与验证的云端底座;
- 协作工具:提供开放的即时通信、协同文档与日常办公方案;
- 人工智能组件:集成开放可控的本地化 AI 能力。
欧洲公共部门探索主权技术已现协同趋势。法国政府此前也推出了加固安全系统 Sécurix 与面向桌面办公的 Bureautix 项目。
推进阻力与行业惯性
社区讨论指出,大科技公司在桌面系统中增加数据遥测、强制在线账户以及探索广告植入,促使公共部门寻求供应链自主权。推进该方案的核心难点在于企业 IT 体系的技能惯性与现有兼容链条。主流流程长期与微软的 Active Directory(活动目录服务)、Office 文档格式和 Teams 协同网络绑定,如何让 NixOS 架构在复杂行政网络中平稳对接业务是后续检验的关键。
M6 Mac Mini 在 86Box 上模拟 600MHz Pentium II 与 Voodoo 3
硬件底层模拟与负载测试
86Box 在底层模拟老式 PC 的 CPU 时序、总线、显卡和声卡。这类精细模拟的开销主要落在单一主机线程上。测试者在搭载 M6 芯片的 Mac Mini 上运行 86Box 6.0 构建版,引入针对 ARM 主机的 CPU 改进和 Voodoo 显卡 ARM64 JIT(即时编译器)。模拟配置为运行 Windows 98 SE 的 Slot 1 架构主机,配备 256MB 内存与 16MB 显存的 Voodoo 3 显卡。
测试结合了 Cinebench 2000 的渲染、后台 Winamp 播放 PCM WAV 音频以及长达 7 至 8 分钟的 3DMark 2000 SE 演示,以不出现爆音且速度维持 100% 为达标标准。M4 Mac Mini 稳定上限为 500MHz,M6 Mac Mini 则在 550MHz 与 600MHz 下均保持全程平稳运行,最高稳定频率比 M4 高出 20%。当频率推至 650MHz 时出现音频下溢。
频率监控与真实硬件差异
在 600MHz 模拟测试中,M6 的两个性能核平均主频在 4,710MHz 至 4,788MHz 之间,整颗芯片总体占用率不超过 26%。测试中模拟的 450MHz Pentium II 在 Cinebench 2000 中获得 7.02 CB,比真实物理芯片记录(4.35 CB)高出约 61%。86Box 官方对此解释过,模拟器并未追求完整的微架构周期精确,而是微调时序参数以贴近真实表现。操作系统开发者已开始利用此平台调试针对老硬件架构定制的内核,省去频繁烧录实机的过程。
Go 语言引入平台无关的 SIMD 实验性支持
两层式 API 架构
Go 官方博客介绍了 Go 1.26 与 1.27 引入的实验性 SIMD(单指令多数据流,允许单条指令并行处理多个数据的硬件特性)支持。过去在 Go 中调用 SIMD 需编写汇编或承担 cgo 跨语言调用开销。Go 团队采取两层设计:先推出面向特定架构的底层包 archsimd(支持 amd64 的 AVX、arm64 的 NEON 及 WebAssembly),随后在 Go 1.27 推出跨平台的高层抽象包 simd。
跨平台向量支持的难点在于不同架构的位宽差异,x86 支持 128、256 和 512 位,NEON 为 128 位,而 ARM SVE 与 RISC-V RVV 则采用运行时可变长度向量。Go 借鉴 Google Highway 库的思路,移除固定大小向量类型,提供 simd.Float32s 等动态向量,API 仅收录通用指令交集,缺失指令通过其他 SIMD 指令或软模拟补齐。
编译器消除抽象开销
Go 编译器在前端通过 AST(抽象语法树)重写机制消除开销。编译器为调用 simd 的函数生成针对 128、256、512 位或软模拟的特化版本,并将平台判断外提至循环之外,避免热路径上的动态派发。开发者可通过 GODEBUG=simd=... 手动指定运行时的向量长度偏好。在 WebAssembly 环境下的调色测试中,通用 simd 相比手写 archsimd 仅慢约 11%,但比标量代码快了约 5 倍。团队计划在 Go 1.28 中补充归约操作并适配 ARM SVE。
突破 Avast 杀毒软件内核驱动沙箱(第二部分)
双重提取漏洞与堆喷射
安全团队 SAFA 发布了 Avast 内核驱动漏洞 CVE-2025-13032 的利用链分析。漏洞位于 aswSnx 驱动,源于内核处理用户态传入的 _UNICODE_STRING 时两次读取其 Length 字段:第一次读取用于分配分页池(Paged Pool,可换出至磁盘的内核内存区)缓冲区,第二次读取用于数据复制。攻击者通过多线程并发在极短窗口内篡改长度字段,诱发分页池溢出。
攻击者将利用目标选定为管理异步 I/O 的 I/O Ring 对象。虽然 I/O Ring 本身位于非分页池,但其预注册缓冲区指针数组 RegBuffers 分配在分页池中。攻击者利用段堆的低碎片堆机制完成堆喷射,制造内存空洞并触发漏洞,使溢出数据精准落入相邻空间,篡改 RegBuffers 指针指向用户态伪造结构。
获取任意读写与环境清理
通过伪造缓冲区结构并调用 IoRingReadFile 与 IoRingWriteFile,攻击者绕过内存检查获得内核任意读写原语。利用 I/O Ring 自动生成的内存描述符列表(MDL),利用代码泄露了当前进程的 _EPROCESS 结构体地址。
为防止系统发生蓝屏,利用链修复了受损的 ProcessBilled 字段,通过全局 Cookie 与异或运算复原块头部;同时递增伪造结构的引用计数,规避内核析构时尝试释放用户态虚拟内存。最终攻击者将 SYSTEM 进程的访问令牌复制到自身进程,完成提权。社区讨论指出,现代安全软件为深度拦截引入了庞大的内核驱动,自身也构成了攻击面。
美国上诉法院维持将 Anthropic 列为供应链风险的裁决
谈判分歧与定性背景
美国哥伦比亚特区联邦巡回上诉法院以 2 比 1 投票结果,维持了五角大楼将 Anthropic 列为“供应链风险”的决定。该裁决禁止美军及国防承包商在军用项目中使用 Claude 模型。
纠纷始于 2025 年下半年。双方就 Claude 部署到军方 GenAI.mil 平台谈判时,军方要求在合法用途下拥有无限制访问权限,Anthropic 则要求保留约束条款,明确禁止模型用于全自动武器系统或国内监控。谈判破裂后,美国国防部将 Anthropic 认定为供应链风险。巡回法院认为,权衡模型受限停机等国家安全风险的裁量权属于防长,未超出法律授权范围。
法律争议与产业链外溢
社区观点分歧明显。支持方认为军方在战时需要确定性,无法依赖可能在战术行动中撤回访问权限的商业软件。反对方则指出,《供应链安全法》设立初衷是针对外国敌对势力的后门与恶意破坏行为,将一家因道德条款拒绝提供未受限功能的本土企业列入供应链黑名单,偏离了法规本意。由于国防外包链条广泛,该裁决意味着外包商在日常管理或编写基础界面时使用 Claude 也可能面临违规风险。
git-bug:嵌在 Git 内部的分布式离线缺陷追踪器
无工作区污染的存储设计
git-bug 是一个直接集成在 Git 内部的分布式、离线优先缺陷追踪器。它利用 Git 底层的对象数据库存储工单数据,不会在项目工作区中生成文件。克隆代码仓库即可同步完整的缺陷数据库和历史记录,所有工单操作在本地毫秒级完成。
协同方面,团队成员通过 git bug push 与 git bug pull 同步数据。底层基于 DAG(有向无环图)模型与独立规范,确保多方离线编辑后合并的数据一致性。
终端与桥接生态
git-bug 在单体 Go 二进制文件中内置了终端界面(TUI)和本地 Web 界面,Web 模式下兼备本地代码浏览器功能。为了兼容外部工具链,它支持与 GitHub、GitLab、Jira 和 Launchpad 建立双向工单导入导出桥接。近期 Linux 基金会已在补丁管理工具 b4 和 kernel.org 定制版 cgit 中展示了对 git-bug 的集成支持,为去中心化项目协作提供了轻量级底座。
Ink & Switch 实验室上线十周年交互式主页
Tenfold 交互展示
研究人机界面的独立实验室 Ink & Switch 迎来成立十周年,在主页上线了名为 Tenfold 的交互展示。Tenfold 对应实验室名称的十个字母,拖拽光标可实时改变声音合成器与图形光栅的参数。每个字母由团队成员基于各自实验构建,字母 C 还内置了一个微型弹幕游戏。
该实验室聚焦于构建放大人类智能的工具,长期深耕四大方向:本地优先软件(Local-first Software,数据本位与多端协作兼顾)、可塑软件(Malleable Software,支持用户自由改动工具机制)、可编程墨水以及跨介质的通用版本控制。其研究成果已衍生出基于 CRDT(无冲突复制数据类型)的开源协作库 Automerge 以及可视画布工具 Allume。
在 Haskell 中原生写入 Parquet 列式存储文件
原生列式写入实现
DataHaskell 团队在开源库 Dataframe 中实现了原生的 Parquet(开源列式存储文件格式)写入器,解决了 Haskell 处理大规模数据帧时依赖 CSV、JSON 或裸二进制串导致的吞吐缓慢与互操作问题。写入器提供 writeParquet 与底层调优函数 writeParquetWithOptions。
Parquet 结构由末尾元数据及一系列行组(Row Group)构成,行组由列块(Column Chunk)与数据页(Data Page)细分组成。写入器通过固定行数的外层批次与内层子批次推进处理,以逼近目标行组大小并降低簿记开销。
内存布局与系统调用优化
为了绕过外部函数接口(FFI)开销,写入器使用 Haskell 原生的固定内存(pinned ByteArray)直接操作裸指针。在扩容时手动分配新固定内存并交由垃圾回收器释放旧内存;写盘时将缓冲区切分为 256 KiB 的块,以降低系统调用频率并减少页缓存抖动。当前实现支持 Snappy 压缩与原生纯文本编码,团队计划后续引入两阶段写入机制,将临时数据溢出至外存,以降低生成超大行组时的内存压力。
播客全文
女:Hello 大家好,欢迎收听 Agili 的 Hacker Podcast,我是莓莓。
男:大家好,我是阿迪。
女:阿迪,最近欧洲那边在数字主权上动作挺大的。荷兰政府牵头做了一个叫 DAWO 的项目,准备把公务员的办公电脑全换成基于 NixOS(以声明式配置和高度可重现性著称的 Linux 发行版)的系统,甚至连云底座和办公协同都要换成开源的。
男:是的,他们想系统性摆脱对微软这类专有软件的单一依赖。整个项目分了四个支柱:操作系统、云基础设施、协同工具,还有本地化的 AI。这在欧洲不是个案,法国之前也基于 NixOS 搞了面向政府办公的 Bureautix 和加固版 Sécurix。
女:听起来很理想,但我做产品的第一反应是,政府里那些用惯了 Windows 和 Office 的普通工作人员,真的能适应吗?
男:其实技术从业人员交流时经常提到,最终用户的操作习惯反而是最容易调整的。真正的难点在于后台的技术支持体系,像微软的 Active Directory(活动目录服务,一种集中管理用户和网络资源的体系),还有积累了十几二十年的文档格式、内部宏脚本和协作流。要让 NixOS 的声明式配置稳定对接这套庞大的旧网络,运维团队的技能转换成本极高。
女:确实,历史包袱太重了。说到底层系统的控制力,很多极客对软硬件的掌控欲真的能发挥到极致。最近有人在最新的苹果芯片上测试了一个叫 86Box 的老 PC 模拟器。
男:86Box 的玩法很硬核,它不是简单的软件兼容层,而是去模拟真实的硬件时序。比如奔腾二代 CPU 的总线、PCI 声卡、Voodoo 3 显卡等。这类模拟特别吃主机的单核高频性能。测试者拿 M6 芯片的 Mac Mini 跑 Windows 98,把奔腾二代超频模拟到 600MHz,全程跑 3DMark 和 Winamp 播放 WAV 音频,音频缓冲区一次都没有溢出。
女:600MHz 的奔腾二代在当年算神机了吧?不过既然只是模拟,为什么大家对那一点点爆音或者卡顿这么敏感?
男:因为 86Box 模拟的是硬件时钟。一旦主机单核算力跟不上,老声卡的缓冲区就会断流,产生爆音。不过也正因为它是时钟微调而不是完全的微架构周期精确,模拟出的 600MHz 奔腾二代在 Cinebench 2000 里跑出来的分数,差不多赶上了真实的 800MHz 奔腾三代。现在不少写老硬件内核的开发者直接拿它当调试台,省去了来回往真机里烧录代码的麻烦。
女:把老硬件的行为摸得这么透,确实需要底层硬功夫。说到底层性能,Go 语言在 1.26 和 1.27 里终于把实验性的 SIMD(单指令多数据流,一种允许 CPU 单条指令并行处理多个数据的硬件特性)端上来了?
男:对,Go 过去要用 SIMD,要么手写汇编,要么走 cgo 调 C 代码,跨语言调用的开销很大。这次官方搞了两层设计:底层是面向特定硬件的 archsimd 包,上层是跨平台的 simd 包。他们参考了 Google Highway 的思路,没有把向量长度硬写进类型里,而是做成动态向量类型,比如 Float32s。
女:这听起来像是在各种处理器的不同规格之间找了一个公约数?
男:可以这么理解。x86 的向量宽度从 128 位到 512 位都有,ARM NEON 是固定的 128 位,而 SVE 和 RISC-V 还是可变长度。Go 编译器在前端通过 AST(抽象语法树,代码语法结构的树状表现形式)重写,自动生成针对不同位宽的特化代码,把分支判断提到循环外面。在 WebAssembly 的图像调色测试里,跨平台 simd 比手写特化只慢了 11%,但比普通的标量代码快了整整 5 倍。
女:这对于本地跑语音模型或者处理图像来说,门槛一下子降低了。不过聊到底层,有些复杂的底层机制不仅用来提速,也可能成为安全攻防的战场。最近 Avast 杀毒软件的一个内核驱动漏洞利用分析挺受关注的。
男:那是 CVE-2025-13032。问题出在驱动处理用户态传入的结构体时,先后读了两次长度字段。这种双重提取(Double-fetch,即内核多次从用户态读取同一未经缓存的内存导致数据竞争)给攻击者留出了竞态窗口:第一次读的时候是个小数字,紧接着另起一个线程把数字改成超大值,导致内核只申请了小缓冲区,却拷进去了超额数据,在分页池里触发了堆溢出。
女:内核代码这么容易被用户态的数据骗过去吗?
男:只要两次读取之间内存没有加锁或缓存,就有可能被卡时间差。研究人员利用 Windows 的 I/O Ring 对象做堆喷射,拿到内核任意读写,最后顺着进程链表定位到 SYSTEM 权限的令牌,复制给自己完成提权。有安全研究者就感慨,杀毒软件为了做行为拦截把庞大的驱动塞进内核,本身反而成了巨大的攻击面。
女:感觉就像为了防贼把防盗门做得极厚,结果锁芯本身留了个大缝隙。很多事情现实起来总比理论上复杂,就像最近加州讨论的富豪税和土地税一样。
男:加州那个提案原本想五年内对富豪征收一次性 5% 的财富税,预计每年筹集 200 亿美元。但资产和人是会移动的,提案还在走流程,拉里·佩奇、彼得·蒂尔包括扎克伯格等富豪就已经把户籍或者资产迁出加州,预估的 2 万亿美元税基缩水了快一半。
女:所以土地经济中心的研究员就建议改征 LVT(土地价值税,即仅对土地本身价值征税,不对地上建筑物征税)?毕竟土地搬不走。
男:是的,模型算出来加州全州的土地价值大约有 8.14 万亿美元,洛杉矶一个县的土地价值就超过全加州富豪的资产总和。只要收 0.25% 的土地税,就能补上那 200 亿缺口。但反对声音也很现实:如果附近的公共设施把地价炒高了,靠固定退休金生活的老人根本交不起地税,可能会被逼着卖房搬家。
女:这种生活上的不确定感确实会让普通人恐慌。虽然理论上可以设计自住房免税或者延期到卖房时再结算,但在具体执行时,税负会不会被房东转嫁到租金上,大家分歧依然很大。
男:政策落地的阻力往往就在这些现实生活的缝隙里。不过退回到技术世界,很多开发者在面对复杂世界时,更喜欢构建完全掌控在自己手里的工具,比如 Ink & Switch 实验室。
女:Ink & Switch 居然已经成立十周年了!他们主页上做了一个叫 Tenfold 的交互页面,拖动鼠标能直接改变音频合成器和图形的参数,有的字母甚至还藏着弹幕小游戏。
男:他们这十年一直在推“本地优先”(Local-first)和“可塑软件”(Malleable Software)的概念。比如开源的 Automerge,利用 CRDT(无冲突复制数据类型,支持跨设备离线编辑并自动合并的数据结构)来实现完全不需要中心服务器的多人协作。用户的数据就在本地硬盘上,网络断了照样用,恢复连接自动同步。
女:把数据所有权还给用户,听着就很安心。说到离线和本地优先,我最近看到一个叫 git-bug 的项目,也是这种思路。
男:它非常纯粹,直接把 Bug 工单系统塞进了 Git 本身的对象数据库里。你在本地克隆了代码仓库,同时也就把所有的缺陷历史克隆下来了。新建 Bug、评论、打标签都在本地完成,用 git bug push 和 pull 来同步。
女:这太适合经常在飞机上或者网络不稳定时写代码的工程师了。平时想看进度,它还自带了终端界面和本地 Web 界面,甚至能跟 GitHub 或者 Jira 做双向数据同步。
男:Linux 内核社区的维护者都在会议上演示过把它集成到补丁工作流里。它用有向无环图来保证多人离线改动后的合并一致性,这种去中心化的协作体验,让 Git 终于不只是管代码,连项目事务也能脱离单一商业平台的托管。
女:说到平台托管和商业依赖,五角大楼和 Anthropic 的官司最近有了新判决。特区联邦巡回上诉法院以 2 比 1 维持了把 Anthropic 列为“供应链风险”的决定。
男:这起争议起于去年下半年。Anthropic 拿了国防部 2 亿美元的合同,但在 Claude 部署到军方系统时,Anthropic 坚持原则,禁止将模型用于全自动武器和针对本国公民的大规模监控。五角大楼要求无限制访问,双方谈崩后,军方直接把 Anthropic 定性为供应链风险,禁止军方和所有国防承包商使用 Claude。
女:直接扣一个“供应链风险”的帽子,这对一家美国本土的 AI 创业公司来说影响太大了。
男:是的,法院多数意见认为国防部长有权评估国家安全风险,比如担心 AI 模型因安全限制在战时意外停机。但反对意见指出,“供应链风险”这项法规最初是针对外国敌对势力的后门和间谍行为设立的,拿它来惩罚一家在合同条款上坚守道德底线的本土公司,更像是行政权力的报复。而且国防承包链条极长,外包商哪怕只是拿 Claude 写个界面代码,都可能面临合规风险。
女:商业公司守着安全红线,军方要的是战时的绝对控制,这种张力在未来只会越来越大。聊了这么多沉重的话题,我们看点轻松的调剂一下。你最近逛过 2DWillNeverDie 这个网站吗?
男:逛过,满屏都是纯手绘的经典 2D 像素精灵图(sprite,二维游戏中用于表示角色或物体的位图图像)。从 Game Boy 的绿屏点阵,到《街头霸王》《洛克人》的动作帧重绘,甚至敲上经典的科乐美秘技“上上下下左右左右 B A”还能触发彩蛋。
女:看到那些一帧一帧手绘的动作,真的能感受到当年的画师在极其有限的硬件分辨率和发色数里,抠细节抠出来的工匠感。现在 3D 游戏画面越来越逼真,但有时候反而不如老像素图能给大脑留下想象空间。
男:很多开发者聊到这个现象时提到一个有趣的视角:二维平面的空间探索在直觉上更清晰,就像数学里的波利亚随机游走定理(即在二维网格上的随机游走最终必定回到起点),它天然适合做回廊和解谜设计。而且像素艺术往往带着极强的小团队个人烙印,不像现代 3D 大作,很多时候更像是工业流水线和商业委员会妥协出来的产物。
女:说到这种在受限环境里抠细节的精神,Haskell 社区最近也有个硬核进展。DataHaskell 团队在他们的 Dataframe 库里写了一个原生的 Parquet 列式存储写入器。
男:Haskell 过去在数据处理上挺吃亏的,动不动就只能导出成 CSV、JSON 或者裸二进制串,吞吐慢不说,还很难跟 Python、Spark 这些现代数据科学工具互通。Parquet 是一种列式存储格式,内部包含行组和数据页,要做高效写入,就得在内存里平衡压缩率和磁盘 I/O。
女:我听一些看代码的工程师说,这个写入器的代码风格甚至不太像传统的 Haskell?
男:确实,为了极致性能并绕过跨语言调用的开销,作者用了大量的可变字节数组和固定内存,直接操作裸指针写入磁盘,代码里充满了命令式的循环和状态引用。虽然跟大家印象中纯粹无副作用的函数式风格不太一样,但正是这种务实的系统级写法,让 Haskell 生态补齐了大数据生态的关键拼图。
女:在理想的纯粹与现实的吞吐之间找到一条路,这大概就是工程师们最擅长的事。今天从政府办公系统的自主权,聊到芯片模拟、底层架构,再到像素艺术与数据存储,信息量还挺饱满的。
男:技术的世界就是这样,既有对过去的深情怀念,也有对底层控制权的执着追求。
女:感谢大家的收听。如果喜欢我们的播客,欢迎使用通用型播客客户端订阅 Agili 的 Hacker Podcast,我们下期见。
男:下期见。
参考链接
- Dutch governments builds alternative for Microsoft based on NixOS
- Pentium II at 600Mhz with Voodoo 3 Emulated on 86Box with M6 Mac Mini
- Platform-independent SIMD in Go
- California is chasing wealth that has feet
- 2DWillNeverDie
- Ink and Switch interactive homepage
- Git-bug: Distributed, offline-first bug tracker embedded in Git
- Entering and Breaking the Avast Antivirus Sandbox Part 2
- U.S. appeals court upholds designation of Anthropic as supply chain risk
- Writing Parquet files using Haskell
