Cairn 是一个开源的“通用问题求解引擎”:你给它起点(Origin)和目标(Goal),它在一个完全未知的状态空间里自己找路径。渗透测试只是它第一个被验证的场景,底层是黑板架构 + Fact/Intent 图,没有预设角色,没有固定流程,多 Worker 通过共享图协作。

项目地址:
https://github.com/oritera/Cairn1. Cairn的目标
官方一句话概括:Cairn 是一个通用问题求解引擎,它不定义角色,也不预设工作流。给定初始状态与目标状态,在未知的状态空间中搜索出一条路径。
这类问题的共同特征:
有明确的起点:已知目标系统、当前状态、已知条件
有明确的终点:拿到shell、拿到 flag、完成证明、达到某个配置
中间路径未知:没有现成SOP,只能边探索边决定下一步
渗透测试、漏洞研究、CTF 解题、数学证明……都属于这种“起点–终点明确,路径未知”的问题。Cairn 就是为这一类问题设计的。
2.核心设计
2.1 三个原语:Fact / Intent / Hint
Cairn 把所有信息抽象成三类:
Fact:已经确认的客观事实,写入黑板后全局可见
Intent:准备探索的方向,还没执行,只是“意图”
Hint:人类随时可以注入的判断,下次 Worker 读取时会被吸收
整个系统围绕一个Fact/Intent 图演化:
Fact 是已经踩实的“石板”
Intent 是向未知迈出的“试探脚”
Hint 是人从旁边喊的一句话:“这块值得深挖”“这边大概率死路”
图从Origin 逐渐长向 Goal,新 Fact 是踏脚石,新 Intent 是向未知迈的一步。
2.2 Worker:没有固定角色,只看图下菜碟
Cairn 的 Worker 没有预设角色(不是“信息收集 Agent”“漏洞利用 Agent”这种),而是统一跑一个 OODA 循环:
Observe:读整张图(Fact + Intent + Hint)
Orient:判断当前状态,目标是否已经达成
Decide:决定下一步 Intent(或者判定完成)
Act:执行 Intent,把结果写回 Fact
任务也不是预定义的岗位,而是运行时根据图当前状态动态生成。谁有空、谁有能力,谁就领Intent 去执行。
2.3 协作方式:蚁群式“留信息素”,而不是互相对话
Worker 之间不直接通信,只通过黑板协作(Stigmergy,蚁群式协作):
·A Worker 写下 Fact / Intent,相当于留下信息素
·B Worker 读到后,可以沿着这条路径继续扩展,也可以绕开走别的路
好处:
·没有信息孤岛:所有信息都在图上
·没有强耦合:Worker 挂了、加新的,都不影响全局
·天然支持并发:多个Worker 同时在不同分支上探索
3.系统架构
架构很简单,核心三件套:
·Cairn Server:只负责维护 Fact/Intent/Hint 图的一致性
·Cairn Dispatcher:读图、调度任务、起停 Worker 容器、写协议
·Worker Container:每个项目一个容器,里面可以跑多个 Worker,支持 Claude Code / Codex / Pi 等后端
┌──────────────────────────────────┐│ 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. │ ││ └────┘ └────┘ │ │ └────┘ └────┘ │└──────────────────┘ └─────────────────────┘
要点:
·Server 只管图,不业务逻辑
·Dispatcher 是“总管”,决定什么时候Reason / Explore / Bootstrap
·Worker 只被喂prompt + 当前图,返回结构化输出,无状态
4. 三类任务
Worker 执行的任务只有三类:
任务类型 | 作用 | 输出 |
Bootstrap | 项目刚启动时,尝试直接从Origin 冲 Goal | Fact + 可能的 Complete |
Reason | 读整张图:判断Goal 是否达成,下一步该做什么 | Complete / 新 Intent / no-op |
Explore | 认领一个Intent,执行探索,把结果写回 Fact | 一个Fact |
一个典型生命周期:
1.创建项目:Origin + Goal 写入图
2.Bootstrap:Worker 尝试直接完成 Goal,大多会失败,但会留下初始 Fact
3.Reason:Worker 判断 Goal 没达成,决定下一步 Intent
4.Explore:Worker 执行某个 Intent,产生新 Fact
5.回到3,不断循环,直到某个 Reason 判定 Complete
5. 实战表现
Cairn 在第二届 TCH·腾讯云黑客松智能渗透挑战赛上,作为唯一一支AK(All-Killed,解掉所有题)战队,最终总排名第三:
参赛队伍:610 支战队、1345 名选手
成绩:54 / 54 题全部解决,唯一AK
关键点:系统在比赛当天凌晨才首次完整上线,没有专门训练、没有专门调参、没有领域专用工具、没有预定义角色
更详细的实战复盘,作者在《无径之径:Cairn AI 从渗透测试到通用问题的求解》里有讲设计理念和比赛细节。
6. 部署
前置条件:Python ≥ 3.12、Docker。
6.1 Docker部署
第一步,拉取工作容器镜像:
docker pull ghcr.io/oritera/cairn-worker-container:latest第二步,Docker Compose 启动:
docker compose up --build然后编辑dispatch.yaml填入你的LLM API Key,系统就会自动运行。
Web界面:http://localhost:8000,
API 文档:http://localhost:8000/docs
6.2 手动方式
编辑好dispatch.yaml 后:
·启动 server
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
最后,若要正式上线使用,务必做到以下几点:严格限制在授权环境内运行;配置完善的成本监控与频率限制机制;保留人工审核及任务中断功能。
-- END --
夜雨聆风