HuTa0kj/codient
GitHub: HuTa0kj/codient
一款基于 LLM 的可控流程驱动型代码审计智能体,通过多阶段流水线和双向污点追踪在大型代码库中自动化定位安全漏洞。
Stars: 0 | Forks: 0
# Codient
代码审计智能体
## 扫描模式
| 模式 | 审计权限范围 | 说明 |
| ------ | ------------ | ---------------------------- |
| `fast` | 无需认证 | 仅审计无需登录即可访问的路由 |
| `deep` | 登录权限 | 覆盖普通用户可触及的所有路由 |
| `full` | 全部接口 | 审计所有路由,包括管理员路由 |
## 工作流程
Codient 采用多阶段流水线架构,分为项目分析和数据流分析两个子图:
### 项目分析
graph LR
A[项目总览分析] --> B[认证机制分析]
B --> C[路由发现]
C --> D[路由统计校验]
D --> E[数据库分析]
| 阶段 | 说明 |
|------|------|
| 项目总览分析 | 识别编程语言、Web 框架(前端/后端)、目录结构及各目录用途 |
| 认证机制分析 | 识别认证方式(Session / JWT / OAuth 等)和权限模型(中间件 / 装饰器 / RBAC 等) |
| 路由发现 | 发现所有 API 路由,提取路径、HTTP 方法、权限等级和功能描述 |
| 路由统计校验 | 校验路由文件是否存在,过滤无效条目,统计权限分布 |
| 数据库分析 | 识别数据库类型、ORM 框架、连接配置和配置文件路径 |
### 数据流分析
graph LR
A[路由筛选] --> B[Source 识别]
A --> C[Sink 识别]
B --> D[正向污点追踪]
C --> E[反向污点追踪]
D --> F[正向污点审查]
E --> G[反向污点审查]
F --> H[结果汇总]
G --> H
| 阶段 | 说明 |
|------|------|
| 路由筛选 | 根据当前扫描模式(fast / deep / full),按路由权限等级过滤待审计的路由 |
| Source 识别 | 扫描路由源码,识别所有用户可控输入参数 |
| Sink 识别 | 扫描路由源码,识别所有危险函数调用 |
| 正向污点追踪 | 从 Source 出发,追踪用户可控参数是否到达 Sink |
| 反向污点追踪 | 从 Sink 出发,回溯危险函数的参数是否来自用户可控输入 |
| 污点审查 | 使用不同模型独立验证追踪结果,修正或驳回有误的链路 |
| 结果汇总 | 合并正向与反向审查通过的数据流,去重后统一存储 |
## 设计哲学
代码审计是一个高精度、长链路的任务——Agent 需要在数百万行代码中准确定位攻击面,任何一步的偏差都会被下游放大。Codient 的设计围绕一个核心问题展开:如何让 LLM 在复杂工程任务中保持稳定输出。
### 模型调度
模型能力是一切的上限。Codient 不追求"一个模型打天下",而是将能力分层匹配到任务复杂度上。
- 按任务分级调度:项目结构分析等需要强推理能力的阶段交给高能力模型,简单任务交给快速模型
- 控制模型上下文规模:过大的输入会稀释模型的注意力,过大的输出会引入噪声——每个阶段只接收必要的前置信息
- 抑制模型循环:温度过低、工具过多、无关工具调用都会导致模型陷入重复行为,通过中间件在运行时检测并中断
### 上下文工程
LLM 的输出质量与它看到的上下文直接相关。Codient 的策略是让模型只看到它需要看到的。
- 子 Agent 隔离:复杂任务拆解为独立子 Agent,每个子 Agent 拥有自己的工具集和文件系统视图,仅返回精简的结构化数据——父流程不承载中间过程
- 工具最小化注入:拒绝全局工具导入,每个阶段仅注入该阶段实际需要的工具,减少模型在工具选择上的决策负担
- SKILL 预选:多 SKILL 场景下,仅加载相关 SKILL,而非全局加载
- 工具预选:多工具的情况下,使用单独的预选节点选取合适的工具
- 长任务拆分:将大范围扫描任务拆分为可独立执行的子步骤,每步有明确的输入和输出契约
- 数据摘要:给大模型数据前需要提炼和精简,通过去重、合并等方法筛除噪音,只给最核心的部分
### 流程约束
用代码约束替代提示词期望。模型是概率系统,不该承担确定性保证。
- 流程硬约束:任务走向由 StateGraph 编排决定,而非依赖模型"理解"提示词后自觉遵循——流程即代码
- 可验证的中间产物:每个阶段的输出都是结构化数据并存储 YAML 文件,可被下游解析、校验、统计,而非自由文本
- 拒绝自我检查:模型审查自己的输出存在自我一致性偏差——Codient 选择用下游阶段的解析和校验来发现上游问题,而非让模型自己纠错
- 运行时健壮性:模型调用次数限制、工具重试与指数退避、工具循环检测——所有边界条件都有对应的策略兜底
- 确定性兜底:可以使用代码约束和验证的场景就不使用大模型
## 架构设计
- Agent 框架: 基于 Deep Agents 构建,每个审计阶段相互独立,配备虚拟文件系统和工具集
- 工作流编排: 使用 LangGraph StateGraph 管理多阶段流水线
- 工具系统: Agent 支持任务生成、 `read_file`、`glob` 、`ls` 等工具,以及自定义工具
- 中间件: 支持模型请求限制、工具请求限制、模型循环检查、工具过滤等多项中间件
- 可观测性: 支持 LangSmith Tracing
## SKILLS
SKILL 是 Agent 在审计过程中可调用的领域知识模块,以 `SKILL.md` 为入口描述扫描策略,搭配 `references/` 目录下的参考文档提供语言/框架级别的精确匹配规则。
| SKILLS | 说明 | 阶段 |
|------|------|------|
| php-source-scanner | PHP 项目 Source 扫描,覆盖原生 PHP 及 ThinkPHP、Laravel、CodeIgniter、Yii、Symfony 等框架 | 数据流分析 |
| php-sink-scanner | PHP 项目 Sink 扫描,覆盖原生 PHP 及主流框架的危险函数识别 | 数据流分析 |
| taint-tracer | 语言无关的污点追踪方法论,指导正向和反向污点分析 | 数据流分析 |
## 安装
# 使用 uv 安装(推荐)
uv sync
# 或使用 pip
pip install -e .
## 配置
复制示例配置文件并填写:
cp example.config.yaml config.yaml
`config.yaml` 配置说明:
models:
- id: glm-5
name: GLM-5
api_key: "your-api-key"
base_url: "https://api.example.com/v1"
temperature: 0.1
- id: deepseek-v4-flash
name: DeepSeek-V4-Flash
api_key: "your-api-key"
base_url: "https://api.example.com/v1"
temperature: 0.1
extra_body: { "thinking": { "type": "disabled" } }
# 为每个审计阶段指定使用的模型
workflows:
- name: overall-analysis
model:
main: GLM-5
- name: route-discovery
model:
main: GLM-5
- name: database-analysis
model:
main: DeepSeek-V4-Flash
# LangSmith 追踪(可选)
langsmith:
tracing: true
endpoint: "https://api.smith.langchain.com"
api_key: "your-langsmith-key"
project: "codient"
## 使用
# 指定项目名称
uv run codient run --workspace /path/to/project --project_name my_app
# 查看版本
codient version
### CLI 参数
| 参数 | 缩写 | 说明 | 默认值 |
|------|------|------|--------|
| `--workspace` | `-w` | 目标项目所在目录 | 当前目录 |
| `--project_name` | `-p` | 项目名称(仅允许字母数字和下划线) | workspace 目录名 |
| `--debug` | `-d` | 开启 debug 日志 | false |
| `--mode` | `-m` | 审计模式(fast/deep/full) | fast |
## License
[MIT](LICENSE)
标签:LLM, Unmanaged PE, 云安全监控, 对称加密, 自动化审计, 逆向工具, 静态分析