Montanalabs/ondos-lang
GitHub: Montanalabs/ondos-lang
Ondos 是一门将信任与能力融入类型系统的注入安全编程语言,通过编译期检查结构性证明程序不存在 prompt injection 漏洞。
Stars: 1 | Forks: 0
Ondos
一种将信任与能力作为类型系统中一等公民的语言。
Prompt injection 是不可表示的 —— 这是编译时的结构性拒绝,而非启发式判断。
## 为什么需要它
Prompt injection 是 AI agent 决定性的安全漏洞:不受信任的内容 —— 例如
一个网页、一封邮件或一个工具的返回结果 —— 携带了指令,而 agent 执行了这些指令。
如今,人们通常通过过滤器、正则表达式以及*通常*会拒绝执行的大模型来对抗它。Ondos
则将其变成了一种**类型系统属性**:不受信任的数据是*被污染的*(tainted),而被污染的
数据**无法**触及特权操作、驱动控制流,或被视作
受信任的数据,除非它首先通过显式的 `extract` 边界进入一个闭合(有限)的
类型中。存在此类漏洞的程序根本无法编译。其旗舰级应用是
**注入安全的 AI agent**。
## 20秒了解核心理念
```
grant delete
type FileId = Home | Trash | Temp
let page = fetch
# UNTRUSTED data — tainted
quarantined { # the only place tainted -> trusted, and only
let id = extract(page) # into a CLOSED type (a finite value set)
}
privileged { # holds capabilities; may never touch tainted data
delete(id) # OK: `id` is trusted and clamped to a FileId
}
```
尝试直接调用 `delete(page)` 会被检查器拒绝 —— `page` 中注入的指令
永远无法成为 `delete` 的参数。而且在运行时,编译后的二进制文件会将
`extract` 的输出重新限制为该闭合类型,因此不符合规范的有效注入载荷(payload)会在
信任边界处被拒绝(深度防御)。
## 它所强制执行的内容
四个**后果维度**,均经过静态检查且可组合:
- **信任(Trust)** —— 被污染的数据无法触及 sink、改变条件分支,或在未经 `extract` 处理前被信任。
- **成本(Cost)** —— 每个能力(capability)都有对应的成本,以及一个程序 `budget`(递归/循环受限)。
- **可逆性(Reversibility)** —— 不可逆的操作需要一个显式的 `commit` 代码块。
- **置信度(Confidence)** —— 提取出的值带有确定性下限,sink 可以对此提出要求。
此外还有**能力**:按程序授予,是一等公民的值,你可以将其传递、
通过 `using` 向内衰减,或通过 `allow` 批量禁止。
## 安装
**macOS, Linux, WSL:**
```
curl -fsSL https://montanalabs.ai/ondos-lang/install.sh | bash
```
该过程会获取源代码,通过 C 编译器构建工具链,并将统一的
`ondos` 命令(以及 `check`, `ondosc`, `ondoc`, `ondos-pkg`, `ondos-lint`, `ondos-fmt`)
添加到你的 PATH 中。仅需要 C 编译器 —— **不需要 Node.js, Rust 或 Python**。它还
会将 Ondos 语法高亮扩展安装到它能找到的每一个编辑器中(VS Code,
Cursor, …)。
使用 `ONDOS_VERSION` 来固定一个可复现的 [release](https://github.com/Montanalabs/ondos-lang/releases) —— 当你的平台存在对应的预编译二进制文件时,它也会使用**预编译二进制文件**(速度快,免编译),否则会回退到从源码构建:
```
curl -fsSL https://montanalabs.ai/ondos-lang/install.sh | ONDOS_VERSION=latest bash
```
默认情况(未指定 `ONDOS_VERSION`)会跟踪 `main` 分支并从源码构建。无论哪种方式,
`ondosc` 都需要 C 编译器来编译*你的*程序 —— 因为 Ondos 会生成 C 代码。
## 开始一个项目
```
ondos new myapp && cd myapp # scaffolds ondos.toml + an injection-safe main.wave + .gitignore
ondos add mathx 1.2.0 # record a dependency (caret ^1.2.0)
ondos info # project metadata (author, license, …) + dependencies
ondos run main.wave # check (gate on SAFE), compile, and run
ondos serve service/ # serve a multi-module service over HTTP (path → route, body → input)
```
(`ondos init` 会在当前目录执行相同的操作。)
`ondos` 是统管整个工具链的 CLI:
```
ondos check app.wave # prove injection-safe -> SAFE / UNSAFE
ondos build app.wave -o app # compile to a standalone native executable
ondos fmt app.wave # format in place — a file or a whole dir (--check for CI)
ondos lint app.wave # cleanliness + ondoc doc-consistency
ondos version # print the toolchain version
ondos help # list all commands
```
如果你
更喜欢直接调用它们,每个子命令也是一个独立的二进制文件(`check`, `ondosc`, `ondos-fmt`, …)。
## 自托管与原生
Ondos 是**自托管**的:它的 lexer、parser、注入安全检查器、编译器、
package manager、linter 和 formatter 都是**用 Ondos 编写的**(`examples/*.wave`)。
编译器生成 **C** 代码,因此 Ondos 程序会成为独立运行的原生可执行文件,
并且整个工具链仅靠 **C 编译器** 即可构建。编译器和检查器
以生成的 C 代码形式签入(`native-codegen/ondosc.c`, `native-codegen/checker.c`)
并且是**自举的**:`ondosc` 将其自身的 Ondos 源码重新编译为字节完全相同的
`ondosc.c`。唯一非 Ondos 的代码是一个约 300 行的 C 运行时垫片(shim)以及 libc。
## 文档
- **示例库** —— 200 个自包含的注入安全项目(189 个应用 + 11 个混合服务,每个都包含一个安全/漏洞对以及演示),涵盖 10 个领域,现位于同级目录的 `ondos-examples/` 库中(每一个注定都会成为其独立的仓库)
- **[注入安全的 agent](docs/injection-safe-agent.md)** —— 核心动机指南
- **[Packages](docs/package-manager.md)** —— `ondos-pkg` 依赖管理器
- **[Linter](docs/linter.md)** —— `ondos-lint` 整洁度 + ondoc 文档一致性检查
- **[Formatter](docs/formatter.md)** —— `ondos-fmt` 规范化布局
- **[API 参考](docs/api/README.md)** —— stdlib + 工具链
- **[ondoc](docs/ondoc.md)** —— 文档约定
- **[威胁模型](docs/threat-model.md)** —— 工具链能够防范及无法防范的内容
## 构建与测试
```
native-codegen/bootstrap.sh # build with cc (compiler + checker + pkg + lint + fmt), verify the self-hosting fixpoint
native-codegen/test.sh # native regression + linter + formatter suites
```
## 状态
**预览版。** 其核心安全性主张由检查器的设计和原生
回归测试套件提供支撑 —— 它**尚未**经过外部审计。请将 `SAFE` 的结论视为
强有力的工程主张,而非经过审计的保证。请参阅
[docs/threat-model.md](docs/threat-model.md) 和 [SECURITY.md](SECURITY.md)。
## 贡献与安全
欢迎贡献 —— 请参阅 [CONTRIBUTING.md](CONTRIBUTING.md) 和我们的
[行为准则](CODE_OF_CONDUCT.md)。发现了可靠性漏洞或安全漏洞?请
按照我们的 [安全策略](SECURITY.md) 私下报告,而不是公开提出
issue。
## 许可证
[Apache-2.0](LICENSE) © Montana Labs.标签:客户端加密, 类型系统, 编程语言, 编译器