旗舰项目 · ParanoidBSD

在这个操作系统里,权限靠 持有,而不是默认拥有

几乎每一次入侵都是同一个路子:某个程序碰到了它本不该碰的东西。ParanoidBSD 这套操作系统就是照着让它碰不到来造的。每个程序只拿到自己需要的那些,其余的不只是被禁止 — 而是根本够不着。基于 HardenedBSD,用现代 C++ 重写,原件一直摆在旁边,任何改动都能拿它对照检查。

语言C / C++23
基准HardenedBSD 15-STABLE
桌面KDE Plasma 6
最近一次推送不久前
星标—
仓库结构
pbsd/C++23 模块 — 内核核心、用户态移植、UDA、BIFROST、合成器、主题
hbsd/HardenedBSD 15-STABLE 源码 — 原件,留着当规格
kde/Plasma 6、KWin 与桌面批次要用的各个框架
tools/清单、确定性重写流程、智能体移植、Clang 辅助工具
docs/规格、安全模型、迁移状态、来源记录
scripts/适用于 Linux 的 Windows 子系统(WSL)驱动脚本、看门狗、进度控制台
大白话

一分钟说清这是什么

问题所在

一个机构跑的其他一切,底下都压着一套操作系统。大多数操作系统建在几十年的旧代码之上,允许任何程序开口要任何东西 — 准不准,系统事后才判。所以,一个人畜无害的部件里的一个缺陷,比如往屏幕上画字体的那段代码,最后能变成口令被偷。

解决办法

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/.

两种权限模型并排对比:在环境权限下,进程能够到 socket、exec 和 ptrace,只有在提出请求之后才被拒绝访问口令文件;在句柄核心下,只有它持有句柄的那个资源才叫得出名字
滑动查看完整示意图 →
检查发生在哪里。 左边,请求总是照样发出去,事后才被裁决。右边,四个操作里有三个根本没有名字可以用来提出请求,所以也就没什么可拒绝的。
交互演示

跟着一次系统调用走过核心

给进程几个句柄,挑一件让它去做的事,然后在两种权限模型之间切换。判定和推理过程都在你的浏览器里现场算出来 — 这是这套设计的教学模型,不是内核模拟器。

能力核心 — 引用监视器

进程尝试…

轨迹

进程持有的句柄

判定

等待尝试
挑一个操作,让它过一遍监视器。
可达
0
被拒
0

“可达”统计的是在当前模型下,列出的这些操作里这个进程根本能执行的有几个。在环境权限下,可达性由身份决定;在核心下,由它实际持有的句柄决定。

这是 PBSD 安全设计的教学模型,为这个页面写的。真正的核心在 pbsd/;规格在 docs/specs/.
移植

四个阶段,以及一个从不给自己背书的模型

把一套伯克利软件套件(BSD)的用户态和内核手工移植到 C++23,是十年的工作量。让语言模型重写文件来移植,则是飞快产出看着像样的垃圾的办法。PBSD 两样都不干。

ParanoidBSD 的移植流水线:清单、确定性流程、智能体循环和一道验证关卡,被打回的文件绕回循环
滑动查看完整示意图 →
一个文件是怎么变成一个移植好的文件的。 红色虚线那条路径才是要紧的部分 — 没过验证的工作会回到循环里,而不是算作进度。
第 1 阶段

清单

tools/inventory_c_sources.py 与 clang_cxx23_port.py 按难度给每个 C 文件打分,并写出 c_inventory.csv。范围上没有任何东西是靠猜的。

第 2 阶段

确定性流程

run_todo_passes.py 按第 0–4 级施加安全的机械式重写。不涉及任何模型。流程拒绝处理的东西都会记进 refusals.jsonl ,而不是硬推过去。

第 3 阶段

智能体循环

pbsd.py 用 DeepSeek Flash 填补打了桩的和被拒绝的文件,必要时以最大推理力度升级到 Pro — 默认 48 个 Flash 工作进程和 24 个 Pro 工作进程。 这就是这次 Kickstarter 众筹要资助的部分。

第 4 阶段

验证关卡

编译、ASan、UBSan、差分执行,以及在编译器中间表示(IR)这一层上的比对。一个只是能编译的文件,就是 未验证。失败的记录落在 agent_port_failures.jsonl.

BSD 小恶魔出现了两次:左边是原版的红色吉祥物,右边是同一个形象渲染成的青色线框,中间是一个等号
一张图讲完这个项目。同一个小恶魔,同一个形状,用另一种表示重建 — 而那个等号是必须挣来的部分,一个文件一个文件地,靠差分验证挣。BSD Daemon © Marshall Kirk McKusick。
“等于”必须意味着什么

一次移植就是一个等价性的主张

说一个文件移植好了,就是在说新的那个行为和旧的一样。这是一个主张,而主张需要证据。一份能编译的 C++23 重写只是一个看着像样的线框;它还不是同一个小恶魔。

所以那个等号就是关卡。差分执行把两边都跑一遍,比较可观察到的行为。IR 比对检查它们对编译器来说是不是同一个意思。在其中一项通过之前,这个文件在迁移日志里一直敞着,也不计入进度 — 不管它看起来多完整。

让这件事站得住脚的规矩是: 模型不为自己背书。它提议,确定性工具裁决。仓库里每一条不可谈判的规矩都是为了保住这条边界 — 这也是为什么光靠在推理上多花钱,并不能把这次移植跑得更快。
不可谈判的规矩

这个仓库真正遵守的规矩

在差分验证或 IR 验证通过之前,没有哪个文件算做完
能编译一律当作未验证。一个移植好的文件,要么在差分执行下产生与 HardenedBSD 原件完全相同的可观察行为,要么在 IR 层面对得上。两样都没过的文件在迁移日志里一直敞着,也不计入进度数字。
照原样移植 — 不要悄悄“修好”原件里的 bug
HardenedBSD 代码树就是行为规格。如果原件有缺陷,移植就把这个缺陷一起复现出来,因为差分测试分不清一次修复和一次回归。改进放到之后再做,单独记录,这样改动是看得见、可复查的,而不是埋在一次翻译里面。
确定性工具优先;模型只填剩下的部分
机械式重写由每次运行行为都完全一样的脚本来做。模型只用在残渣上 — 清单里打了桩的条目,以及确定性流程拒绝处理的文件。这让移植的大部分保持可复现、可审计,也把模型输出限制在人本来也得手写的那些部分上。
内核里的 C++ 是独立环境的: -fno-exceptions -fno-rtti
内核核心不能依赖托管的 C++ 运行时。不用异常,不用运行时类型信息(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 就是哪块归哪块的记录。

完整许可条款 →
AGPL-3.0+ & 商业

新的 PBSD 工作

pbsd/, tools/, scripts/,能力核心、UDA、BIFROST、合成器和主题。

BSD(未改动)

源自 HardenedBSD

hbsd/ 以及每一个能追溯到它的移植文件。原本的条款,原本的署名。

这是给谁用的

一个更难被攻进去的操作系统

大多数入侵利用的是同一类错误:一个程序碰到了它本来就不该碰的内存。ParanoidBSD 用一门让这种错误难得多的语言,把一个受信任的系统重建了一遍,并且只把每个程序真正需要的访问权交给它。

01

国防与政府供应商

采购方开始要求软件用那些能挡掉整类攻击的语言来写。从零重来要花十年。这个做法是把一个已经被验证过的系统搬过去,并且为它改动的每一个文件、以及那次改动是怎么检查的,都留下书面记录。

02

在现场一待就是好几年的设备

工厂控制器、医疗机器、公用事业硬件。缺陷冒出来的时候,你往往没法直接推一个更新。这个做法限制的是入侵者进来之后能走多远,因为没有程序能够到交给它的东西之外。

03

高校与安全研究者

一个真实的操作系统,小到可以从头读到尾,旁边还摆着原件可以对照。既适合教学,也适合在一个真能跑起来的东西上试想法。

在这里看到你自己的情况了吗? 它现在已经开放测试,而它是为哪些人做的,那些人的反馈才是真正会改变它的。 成为测试用户 →
Kickstarter 众筹进行中 · 2026 年 11 月 12 日截止

这次移植靠的是它手上没有的算力

确定性流程是免费的。填补残渣的智能体循环 — 以及给它把关的验证运行 — 不是。要的就是这个,没别的。