在这个操作系统里,权限靠 持有,而不是默认拥有
几乎每一次入侵都是同一个路子:某个程序碰到了它本不该碰的东西。ParanoidBSD 这套操作系统就是照着让它碰不到来造的。每个程序只拿到自己需要的那些,其余的不只是被禁止 — 而是根本够不着。基于 HardenedBSD,用现代 C++ 重写,原件一直摆在旁边,任何改动都能拿它对照检查。
一分钟说清这是什么
一个机构跑的其他一切,底下都压着一套操作系统。大多数操作系统建在几十年的旧代码之上,允许任何程序开口要任何东西 — 准不准,系统事后才判。所以,一个人畜无害的部件里的一个缺陷,比如往屏幕上画字体的那段代码,最后能变成口令被偷。
ParanoidBSD 改的是程序一开始能开口要什么。它不在请求之后再查权限,而是先发给每个程序一份很短的清单,写明它可以碰哪些东西,别的一概叫不出名字。一处的缺陷,就不再是通往其余部分的路。
正在被要求交付用更安全语言写成的软件的国防与政府供应商。在现场一放好几年、没法快速打补丁的设备 — 工厂控制器、医疗机器、公用事业硬件。想要一套小到能从头读到尾的真实操作系统的教师与研究者。
环境权限是你打不了补丁的那个 bug
在传统的 Unix 上,一个进程并不 持有 打开
/etc/master.passwd的权利。它只是提出请求,内核事后才根据这个进程自称是谁来做决定。系统上的每一个资源,每个进程都叫得出名字。名字空间是全局的、环境性的;检查是事后才补上的。
这就是为什么字体渲染器里一个解析 bug 能变成一次凭据窃取。渲染器从来就不需要口令文件 — 但架构里没有任何东西拦着它去要。
HardenedBSD 在这方面已经做了不少正经工作:地址空间布局随机化(ASLR),每次都把程序装到不同的位置,攻击者就猜不到东西在哪;控制流完整性(CFI),不让程序被引到它根本不是为之而建的代码上;再加上源自 PaX 的各种缓解措施、SafeStack 和加固过的内存分配器。这些 PBSD 全部保留,只是换掉了底下那个问题的形式 — 从 “这个进程被允许吗?” 到 “这个进程持有指向它的句柄吗?”
回答同一次系统调用的两种方式
// Ambient authority — the traditional path int fd = open("/etc/master.passwd", O_RDONLY); // kernel walks a global namespace, then // checks uid/gid/MAC after the fact // Handle nucleus — the PBSD path auto f = dir_handle.open("master.passwd", Rights::Read); // there is no global namespace to walk. // no handle, no name, no operation.
这是差别的示意形状,不是逐条列出程序打进内核的那些调用 — 也就是它的应用程序接口(API)。权威模型在 docs/.
跟着一次系统调用走过核心
给进程几个句柄,挑一件让它去做的事,然后在两种权限模型之间切换。判定和推理过程都在你的浏览器里现场算出来 — 这是这套设计的教学模型,不是内核模拟器。
能力核心 — 引用监视器
进程尝试…
轨迹
进程持有的句柄
判定
“可达”统计的是在当前模型下,列出的这些操作里这个进程根本能执行的有几个。在环境权限下,可达性由身份决定;在核心下,由它实际持有的句柄决定。
pbsd/;规格在
docs/specs/.
四个阶段,以及一个从不给自己背书的模型
把一套伯克利软件套件(BSD)的用户态和内核手工移植到 C++23,是十年的工作量。让语言模型重写文件来移植,则是飞快产出看着像样的垃圾的办法。PBSD 两样都不干。
清单
tools/inventory_c_sources.py 与 clang_cxx23_port.py 按难度给每个 C 文件打分,并写出 c_inventory.csv。范围上没有任何东西是靠猜的。
确定性流程
run_todo_passes.py 按第 0–4 级施加安全的机械式重写。不涉及任何模型。流程拒绝处理的东西都会记进
refusals.jsonl ,而不是硬推过去。
智能体循环
pbsd.py 用 DeepSeek Flash 填补打了桩的和被拒绝的文件,必要时以最大推理力度升级到 Pro — 默认 48 个 Flash 工作进程和 24 个 Pro 工作进程。
这就是这次 Kickstarter 众筹要资助的部分。
验证关卡
编译、ASan、UBSan、差分执行,以及在编译器中间表示(IR)这一层上的比对。一个只是能编译的文件,就是
未验证。失败的记录落在
agent_port_failures.jsonl.
一次移植就是一个等价性的主张
说一个文件移植好了,就是在说新的那个行为和旧的一样。这是一个主张,而主张需要证据。一份能编译的 C++23 重写只是一个看着像样的线框;它还不是同一个小恶魔。
所以那个等号就是关卡。差分执行把两边都跑一遍,比较可观察到的行为。IR 比对检查它们对编译器来说是不是同一个意思。在其中一项通过之前,这个文件在迁移日志里一直敞着,也不计入进度 — 不管它看起来多完整。
这个仓库真正遵守的规矩
在差分验证或 IR 验证通过之前,没有哪个文件算做完
照原样移植 — 不要悄悄“修好”原件里的 bug
确定性工具优先;模型只填剩下的部分
内核里的 C++ 是独立环境的: -fno-exceptions -fno-rtti
docs/specs/KERNEL_CXX_ABI.md 里,好让贡献者不用猜就知道在内核上下文里什么是合法的。
每个模块都要有一条来源记录,才算完成
docs/PROVENANCE.md 记录了每个模块从哪来、在哪个许可证下。正是这一点让下面那段许可说明可以核实,而不只是个愿望 — 你可以一个模块一个模块地查,哪些代码源自 HardenedBSD,哪些是新的 PBSD 工作。
两个许可证,老老实实分开
新写的 PBSD 代码 — 核心、C++23 模块、工具 — 按 Imortek 的标准条款提供:GNU Affero 通用公共许可证(AGPL-3.0+),对个人使用、慈善机构、教育机构以及年收入低于 50,000 澳元的组织免费,超过这个门槛则适用分级商业授权。
源自 HardenedBSD 的代码仍然在它原本的 BSD 许可证下。它不能被重新授权,Imortek 也不声称自己有这么做。 docs/PROVENANCE.md 就是哪块归哪块的记录。
新的 PBSD 工作
pbsd/, tools/, scripts/,能力核心、UDA、BIFROST、合成器和主题。
源自 HardenedBSD
hbsd/ 以及每一个能追溯到它的移植文件。原本的条款,原本的署名。
一个更难被攻进去的操作系统
大多数入侵利用的是同一类错误:一个程序碰到了它本来就不该碰的内存。ParanoidBSD 用一门让这种错误难得多的语言,把一个受信任的系统重建了一遍,并且只把每个程序真正需要的访问权交给它。
国防与政府供应商
采购方开始要求软件用那些能挡掉整类攻击的语言来写。从零重来要花十年。这个做法是把一个已经被验证过的系统搬过去,并且为它改动的每一个文件、以及那次改动是怎么检查的,都留下书面记录。
在现场一待就是好几年的设备
工厂控制器、医疗机器、公用事业硬件。缺陷冒出来的时候,你往往没法直接推一个更新。这个做法限制的是入侵者进来之后能走多远,因为没有程序能够到交给它的东西之外。
高校与安全研究者
一个真实的操作系统,小到可以从头读到尾,旁边还摆着原件可以对照。既适合教学,也适合在一个真能跑起来的东西上试想法。
这次移植靠的是它手上没有的算力
确定性流程是免费的。填补残渣的智能体循环 — 以及给它把关的验证运行 — 不是。要的就是这个,没别的。