oritera/Cairn
GitHub: oritera/Cairn
基于黑板架构和事实-意图图的通用状态空间搜索引擎,通过多 Agent 自主探索在未知解空间中搜索路径,首个验证场景为自主渗透测试并取得竞赛优异成绩。
Stars: 643 | Forks: 34

# Cairn
### 不仅是 AI 渗透测试 —— 迈向通用状态空间搜索
Cairn 是一个通用的问题解决引擎。
它不定义角色,也不定义工作流。给定一个起点和一个目标,它会在未知的状态空间中搜索出一条路径。
AI 渗透测试就是此类问题之一 —— 并且是已被验证的问题。
## 什么是 Cairn?
渗透测试从根本上说是**在近乎无限的状态空间中进行有向搜索**:
- **起点**:已知的(目标 IP,目标系统)
- **目标**:已定义的(获取 shell,夺取 flag)
- **路径**:未知的
这种结构并非渗透测试所独有。漏洞研究、数学证明、CTF 挑战 —— 任何具有明确起点、明确成功条件以及介于两者之间的未知路径的问题,都具有相同的结构。
Cairn 就是为这类问题而构建的。渗透测试是它已被验证的第一个领域。
该引擎基于带有显式事实-意图图的**黑板架构**构建。它只需要三个原语:
| 概念 | 含义 |
|---------|---------|
| **Fact (事实)** | 写入看板的已确认的、客观的发现 |
| **Intent (意图)** | 已声明的探索方向,尚未执行 |
| **Hint (提示)** | 随时注入的人类判断;在下次读取时被 Agent 吸收 |
该图从 `origin` 向 `goal` 增长。每一个新的 Fact 都是一块垫脚石;每一个 Intent 都是迈向未知的一步。
Agent Worker 运行 OODA 循环 —— 观察完整的图,根据当前状态进行定向,决定下一步的意图,采取行动进行探索 —— 并将它们的发现作为新的 Fact 写回。Worker 没有固定的角色。任务是在运行时根据图的当前状态生成的,而不是从预定义的职位描述中生成的。
Agent 完全通过共享看板(Stigmergy)进行协调。没有直接通信。没有信息孤岛。
## Cairn 运行展示
https://github.com/user-attachments/assets/e557b1ac-dda4-41cb-87dd-9d56dbf05133
## 工作原理
三种任务类型,全部由同一个 Worker 执行:
| 任务 | 作用 | 输出 |
|------|-------------|--------|
| **Bootstrap (引导)** | 在项目启动时,尝试直接解决问题 | Fact + 可能的 Complete |
| **Reason (推理)** | 读取完整的图:目标是否达成?接下来应该探索什么? | Complete / 新的 Intent / no-op |
| **Explore (探索)** | 声明一个 Intent,执行探索,报告发现 | 一个 Fact |
系统架构:
```
┌──────────────────────────────────┐
│ Cairn Server │
│ Facts + Intents + Hints │
└─────────────────┬────────────────┘
│
Read / Write API
│
┌─────────────────┴────────────────┐
│ Dispatcher │
│ Schedules tasks, manages │
│ containers, writes protocol │
└──────────┬───────────────┬───────┘
│ │
┌───────────────┴──┐ ┌──────┴──────────────┐
│ Worker Container│ │ Worker Container │
│ (Project A) │ │ (Project B) │
│ ┌────┐ ┌────┐ │ │ ┌────┐ ┌────┐ │
│ │ W. │ │ W. │ │ │ │ W. │ │ W. │ │
│ └────┘ └────┘ │ │ └────┘ └────┘ │
└──────────────────┘ └─────────────────────┘
```
**Cairn Server** 仅维护图的一致性。
**Cairn Dispatcher** 读取图,调度任务,启动和关闭 Worker 容器,并且是协议的唯一写入者。每个项目都有自己的 Worker 容器;多个 Agent Worker 在其中并发运行。Agent Worker 只接收一个 prompt 并返回结构化的输出。
## 结果
**腾讯云黑客马拉松 · AI 渗透测试挑战赛 · 第二届**
610 支队伍 · 1,345 名参赛者 · 汇聚中国顶尖高校与安全企业
| 指标 | 数值 |
|--------|-------|
| 解决的问题 | **54 / 54 —— 唯一 AK 的团队** |
| 最终排名 | 第 3 名 |
## 延伸阅读
-
最强 AI 渗透智能体:TCH 腾讯云黑客马拉松智能渗透测试挑战赛(第二届)唯一 AK 战队赛后复牌
-
无径之径:Cairn AI 从渗透测试到通用问题求解
## 开始使用
**前置条件**
- macOS 或 Linux
- Python ≥ 3.12
- Docker
### 拉取所需镜像
两种设置方法都需要 Worker 容器镜像:
```
docker pull --platform=linux/amd64 ghcr.io/oritera/cairn-worker-container:latest
```
### Docker Compose(推荐)
拉取用于构建 Cairn 的基础镜像:
```
docker pull ghcr.io/astral-sh/uv:python3.13-trixie
```
编辑 `dispatch.yaml` 并填入你的 LLM 端点和 API 密钥,然后启动两个服务:
```
docker compose up --build
```
这会在端口 `8000` 上启动 `cairn-server`,并在服务器通过健康检查后启动 `cairn-dispatcher`。Dispatcher 从项目根目录挂载 `dispatch.yaml`,并通过主机套接字连接到 Docker。数据会持久化到 `./datas/cairn/`。
### 手动设置
编辑 `dispatch.yaml` 并填入你的 LLM 端点和 API 密钥,然后:
```
# 启动服务器
uv run --project cairn cairn serve
# 运行 dispatcher
uv run --project cairn cairn dispatch --config dispatch.yaml
# 仅运行启动健康检查
uv run --project cairn cairn dispatch --config dispatch.yaml --startup-healthcheck-only
```
## 免责声明
Cairn 是一个通用的问题解决引擎。尽管它支持渗透测试、CTF 解题、安全评估和漏洞研究工作流,但其仅旨在您拥有明确授权的环境中运行。
您需对如何使用本项目负全部责任。未经所有者或运营者明确的事先许可,请勿将 Cairn 用于针对系统、网络、应用程序或数据的操作。未经授权的安全测试、漏洞利用或数据访问可能是非法的,并可能造成损害。
本项目的开发者和贡献者不对因使用而产生的任何误用、滥用、损害、损失或法律后果表示认可或承担责任。使用本项目即表示您同意确保您的活动符合您所在司法管辖区的所有适用法律、法规、合同义务以及专业或组织政策。
## ⚖️ 许可证
本项目基于 **GNU AGPLv3** 进行授权,用于个人和教育用途。
**商业用途**:如果您希望在商业或专有环境中使用本项目,且不受 AGPL-3.0 开源义务的约束,**请联系我获取商业许可证**。
**贡献**:通过提交 Pull Request,您同意您的贡献可以在 AGPL-3.0 和本项目的商业许可证下使用。
标签:Chaos, CISA项目, LLM Agent, PE 加载器, TCH, Web报告查看器, 事实-意图图谱, 人工智能, 反取证, 图搜索算法, 大语言模型应用, 安全评估, 情报收集, 数学证明, 漏洞研究, 状态空间搜索, 用户模式Hook绕过, 红队自动化, 结构化查询, 网络安全, 网络安全审计, 腾讯, 自动化安全, 自动化渗透测试, 请求拦截, 路径发现, 逆向工具, 通用问题求解引擎, 问题解决, 隐私保护, 黑板架构