AppThreat/chennai
GitHub: AppThreat/chennai
chennai 是一个混合 AI agent 与终端用户界面,用于交互式探索代码属性图、执行数据流追踪和 AI 辅助的代码安全分析。
Stars: 4 | Forks: 2
# chennai
chennai(chen 与 ai)是一个混合 AI agent,也是一个终端用户界面(TUI),用于探索 AppThreat 的 [atom](https://github.com/AppThreat/atom) 文件。它基于 [chen](https://github.com/AppThreat/chen) 库(Code Hierarchy Exploratory Network,代码层次探索网络)构建,为静态分析、数据流追踪以及 AI 辅助的代码和安全分析提供了一个键盘驱动的交互式环境。
与传统的 SAST 引擎或通用的 LLM 聊天机器人不同,chennai 允许您直接访问底层的图查询,因此您可以在不离开终端的情况下,针对程序的结构和数据流提出任意问题。它完全在您的本地机器上运行,没有服务器后端,也不会有任何数据离开您的环境。
chennai 包含一个内置的 AI agent,它使用 atom 作为基础上下文。该 agent 可以运行 chen DSL 查询、遍历数据流路径、运行图算法、读取源代码文件,并使用 ripgrep 搜索代码,所有这些都可以通过 TUI 内部的单一聊天界面进行编排。该 agent 同时支持 Anthropic 和 OpenAI 兼容的提供商,并且可以在有或没有 LLM 的情况下工作。
## 使用场景
- 交互式探索由 atom 工具生成的 atom 文件。打开 atom 文件,无需手动编写查询即可浏览方法、调用、命名空间、标签和字面量。
- 从源到汇点的数据流分析。TUI 展示了带有分组路径、子流切换和缓解指标的数据流。
- 图算法执行,包括 PageRank、强连通分量、拓扑排序、支配树以及过程间路径查找。
- AI 辅助的漏洞分析,提供用于安全审查、代码审查、解释和追踪的斜杠命令。agent 通过引擎路由工具调用,并返回结构化的分析结果。
- 基于 REPL 的查询,支持 Tab 补全、命令历史记录,并可通过 eval 命令使用完整的 chen DSL。
## 环境要求
- 一个需要打开的 atom 文件(来自 atom 工具)。该 atom 文件是通过对代码库运行 atom 所生成的 Code Property Graph(代码属性图)。
- 如果通过 JAR 回退发行版运行引擎,则需要 Java 23 或更高版本。
- TUI 和引擎加起来至少需要 4GB 的可用内存。较大的代码库可能需要更多内存。
## 安装
chennai 以 npm 包的形式分发,并包含特定于平台的原生二进制文件。
```
npm install -g @appthreat/chennai
```
安装完成后,`chennai` 命令将全局可用。
```
chennai [options]
```
## 设置
`chennai setup` 命令会通过 npm 安装或更新所需的分析工具(cdxgen、atom、atom-parsetools):
```
chennai setup
```
这将运行 `npm install -g --ignore-scripts @cyclonedx/cdxgen @appthreat/atom @appthreat/atom-parsetools`。
### 工具发现
chennai 会按以下顺序自动检测这些工具:
| 工具 | 环境变量 | 搜索路径 |
| ------ | ------------ | ------------------------------------------------ |
| cdxgen | `CDXGEN_CMD` | PATH → `node_modules/.bin/cdxgen` → npm 全局目录 |
| atom | `ATOM_CMD` | `ATOM_CMD` → PATH |
| npm | — | PATH |
### Atom 自动生成
当您将 chennai 指向一个没有 `.atom` 文件的项目目录时,它会提示您以交互方式生成一个:
```
$ chennai /path/to/project
No .atom file found in /path/to/project
Generate one for analysis? This will:
└ 1. Run cdxgen to produce a CycloneDX SBOM
└ 2. Run atom --with-data-deps to build the atom file
Source: /path/to/project [Y/n]
```
如果未安装相关工具但存在可用的 `npm`,chennai 会在继续执行之前主动提出为您自动安装它们。
### 软件物料清单
chennai 集成了 [cdxgen](https://github.com/AppThreat/cdxgen),可自动生成并加载 CycloneDX SBOM,以便进行更深层次的依赖感知分析。当您使用源码或报告目录调用 chennai 时,它首先会查找任何现有的 `.cdx.json` 文件。如果未找到,它会调用 cdxgen 创建一个 BOM,其命名约定为 `sbom--.cdx.json`。
#### 安装 cdxgen(推荐以获得最佳体验)
```
npm install -g @cyclonedx/cdxgen
```
cdxgen 将在 PATH 中被自动检测。您也可以设置 `CDXGEN_CMD` 环境变量以指向自定义位置。安装完成后,当存在源码目录时,chennai 将在启动时自动生成 BOM。
### BOM 命令
| 命令 | 描述 |
| ------------- | --------------------------------------------------------------- |
| `bom` | 以可搜索、可排序的表格形式显示所有 BOM 组件 |
| `bom ` | 按名称、类型、版本、PURL 或许可证过滤 BOM 组件 |
BOM 数据也会被注入到 AI agent 的 prompt 中,用于安全审查和代码审查,从而提升 LLM 对第三方依赖、其许可证以及已知漏洞的理解。
### 选项
| 选项 | 默认值 | 描述 |
| -------------------- | --------------------- | --------------------------------------------------- |
| `--engine PATH` | auto | chennai-engine 二进制文件的路径 |
| `--theme dark/light` | dark | 颜色主题 |
| `--source PATH` | atom 目录 | 用于文件解析的项目源码根目录 |
| `--ask TEXT` | -- | Headless 模式:提出问题并打印答案 |
| `--provider STR` | anthropic | LLM 提供商(anthropic 或 openai) |
| `--model STR` | claude-opus-4-8 | LLM 模型名称 |
| `--api-key STR` | 环境变量 | LLM 提供商的 API key |
| `--base-url STR` | -- | 用于 OpenAI 兼容 endpoint 的自定义 API base URL |
| `--reports-dir PATH` | .chen/chennai-reports | 用于存放 markdown 报告和 BOM 文件的目录 |
| `--no-thinking` | false | 在 LLM 请求中忽略 thinking 块 |
| `--effort STR` | high | 推理力度(low、medium、high、xhigh、max) |
### 环境变量
- `CHENNAI_ENGINE`:引擎二进制文件的路径。覆盖自动检测。
- `ANTHROPIC_API_KEY`:Anthropic 提供商的 API key。
- `OPENAI_API_KEY`:OpenAI 兼容提供商的 API key。
- `CDXGEN_CMD`:cdxgen 二进制文件的路径。
- `ATOM_CMD`:atom CLI 二进制文件的路径(例如:`/path/to/atom/atom.sh`)。
- `CHENNAI_DEBUG`:设置为任意值以启用解析器诊断。
### 平台支持
| 平台 | 架构 | 引擎 | TUI |
| ------- | ---------------- | ------------- | ------------- |
| Linux | x64 (glibc) | 原生 | 原生 |
| Linux | arm64 (glibc) | 原生 | 原生 |
| Linux | x64 (musl/Alpine)| 原生 (musl) | 原生 (musl) |
| macOS | Apple Silicon | 原生 | 原生 |
| Windows | x64 | 原生 | 原生 |
其他平台则回退到引擎的 JAR 发行版,而 TUI 在可用的平台上原生运行。
## 架构
chennai 具有两个通过 stdin/stdout 上的 NDJSON 进行通信的进程。
### 引擎 (chennai-engine)
该引擎是一个基于 chen 库构建的 Scala 3 应用程序。它读取 atom 文件并对其运行查询。它在受支持的平台上以 GraalVM native-image 二进制文件的形式分发,在其他平台上则以 JAR 发行版的形式分发。
引擎在 stdin 上接收 NDJSON 请求行,并将 NDJSON 响应行写入 stdout。每个请求都有一个 id、一个命令和参数。引擎在启动时打开 atom 文件,并在整个会话期间将其保留在内存中。
### TUI (chennai)
TUI 是一个使用 ratatui 和 crossterm 的 Rust 应用程序。它将引擎作为子进程启动,打开 atom 文件,并呈现一个三面板界面:一个包含行数的摘要面板,一个用于输入的 REPL 面板,以及一个用于结果的输出面板。TUI 会自动检测引擎二进制文件的位置——默认情况下,它会在同一目录中查找 chennai-engine,然后检查标准的开发构建路径。
## 用户界面
TUI 有三个面板,可通过 Tab 和 Shift+Tab 进行切换。
### 摘要面板
显示 atom 摘要:语言、版本,以及文件、方法、调用、字面量、命名空间、注解、配置文件和依赖项的行数。在某一行上按 Enter 键会运行该类型的查询,并在输出面板中显示结果。
### REPL 面板
位于屏幕底部的命令行输入。在此处输入查询以运行它们。REPL 支持:
- 命令标签:`files`、`methods`、`calls`、`external methods`、`internal methods`、`namespaces`、`annotations`、`imports`、`literals`、`config files`
- DSL 表达式:任何 chen DSL 表达式,例如 `atom.method.name(".*Handler")`
- 标签查询:`atom.tag.name("crypto.*")`
- 流预设:`dataflows`、`reachables`、`cryptos`
- 自定义流 DSL:包含 `reachableByFlows` 或 `.df(` 的表达式
- 带有 `=` 的 DSL 前缀:强制进入原始 eval 模式,例如 `=atom.call.code(".*query.*")`
使用 Ctrl+Space 可以进行 Tab 补全。使用上和下方向键可以访问命令历史记录。
### 输出面板
显示查询结果。输出面板有以下几种显示模式:
**表格视图**:查询结果显示为可滚动、可排序的表格。按 1 到 9 键可对列进行排序。使用 / 键过滤行。按 Enter 键可打开某一行的详细信息窗格。详细信息窗格并排显示节点属性、子表(参数、局部变量)和源代码。
**流视图**:数据流路径以主从分组的形式显示。每个分组代表一条从源到汇点的路径。分组可以折叠。子流通过 `s` 键显示,而已缓解的流(通过 sanitizer 或 validator 的流)可以通过 `m` 键隐藏。
**Agent 视图**:AI agent 的输出呈现为流式转录,包含 thinking 块、工具调用和结果。返回流数据的工具结果可以安装到流视图中,以便进一步探索。
### 快捷键
| 按键 | 动作 |
| ---------------------------- | ---------------------------------- |
| q | 退出 |
| Tab / Shift+Tab | 向前/向后切换面板 |
| Up/Down (或 j/k) | 导航列表,滚动输出 |
| PageUp/PageDown (或 b/Space) | 翻页浏览列表 |
| Enter | 打开详细信息或执行命令 |
| / | 在输出面板中过滤表格 |
| 1-9 | 按列对表格进行排序 |
| s | 在流视图中切换子流 |
| m | 在流视图中切换缓解流 |
| d / r | 运行 dataflows 或 reachables 预设 |
| Ctrl+S | 将报告保存为 markdown 文件 |
## DSL 查询与遍历
完整的 chen DSL 可通过 eval 命令使用。有关所有遍历步骤和节点类型的参考文档维护在 chen 仓库的 `docs/TRAVERSAL.md` 中。atom 仓库的 `docs/lessons/` 目录下有十九个教程,涵盖了从前端设置到数据流分析和图算法的各个方面。
查询的入口点是 `atom`,代表 Code Property Graph 的根节点。常见的起点包括 `atom.file`、`atom.method`、`atom.call`、`atom.literal`、`atom.tag` 和 `atom.namespace`。这些起点可以与 `.name(".*Handler")`、`.isExternal(false)`、`.callee`、`.caller`、`.cfgNext`、`.dominatedBy` 等步骤进行链式调用。
为了进行基于类型的过滤,DSL 在任何 AST 节点上提供了 `.isCall`、`.isLiteral`、`.isIdentifier`、`.isMethod`、`.isFile` 等断言。
## 数据流分析
chennai 支持三种流预设,可通过 REPL 或摘要面板访问:
- `dataflows`:运行 reachableByFlows,从标记为 framework-input 的源指向标记为 framework-output 的汇点。
- `reachables`:使用默认的 reachables 配置运行 reachableByFlows。
- `cryptos`:运行与加密相关的数据流分析。
自定义流查询使用 `reachableByFlows` 或 `df` 步骤。例如:
```
atom.call.name(".*execute.*").reachableByFlows(atom.call.name(".*getInput.*"))
```
流视图按源-汇点对结果进行分组,显示路径中的每一个步骤,并指示具有清理或验证标签的方法。引擎支持两种到达定义求解器:默认的 Flux 求解器(低内存分配,在处理大型方法时速度很快)和一个用于比较的经典求解器。
## 图算法
通过引擎中的 `algo` 命令运行。可用的算法有:
- **PageRank**(`centrality`):根据调用图上的 PageRank 得分和入度中心性对方法进行排名。
- **强连通分量**(`scc`):在调用图中查找递归簇。
- **拓扑排序**(`toposort`):按被调用者先于调用者的顺序排列方法,并按 SCC 分组。
- **支配树**(`dominators`):基于 CFG 边计算每个方法的直接支配节点。
- **过程间路径**(`paths`):查找给定源方法与目标方法之间受 BFS 限制的调用路径。
## AI agent
当配置了 API key(通过环境变量或配置文件)后,斜杠命令将被激活。这些命令可以像任何其他命令一样在 REPL 面板中输入。
### 斜杠命令
| 命令 | 用途 |
| ------------------ | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `/security-review` | 基于可达性的漏洞分析。查找从源到汇点的污点路径,对发现的问题进行排名,并生成 markdown 报告。使用 `high` 推理力度。 |
| `/code-review` | 审查代码变更(diff 或方法)的正确性和安全性。使用 `medium` 推理力度。 |
| `/explain` | 对方法、数据流或代码结构进行自然语言解释。使用 `medium` 推理力度。 |
| `/trace` | 证明或证伪给定源与汇点之间的污点路径。使用 `high` 推理力度。 |
| `/help` | 列出可用的斜杠命令。 |
自由文本输入(不带斜杠)也会被路由到 agent 以回答临时问题。该 agent 可以访问十三种工具:atom_summary、atom_query、atom_dsl_eval、atom_flows、atom_flows_through、atom_detail、atom_algorithms、bom_query、ripgrep、read_file、git_diff、git_log 和 git_show。
agent 使用已配置提供商的流式 API,并实时渲染 thinking 块、文本增量(text deltas)和工具调用。工具结果会被截断为 48 KiB,以符合模型的 token 限制。当 agent 生成流结果时,它们会自动安装到流视图中以供交互式探索。
Agent 报告可以通过 Ctrl+S 保存为 markdown 文件。报告包含完整的转录内容、token 使用情况以及任何生成的数据流路径或分析结果。
### 离线操作
该 agent 是可选的。当未设置 API key 时,chennai 将作为完全离线的代码分析工具运行,所有查询、数据流和算法功能均可通过 REPL 访问。斜杠命令和自由文本 agent 功能仅在配置了提供商时才会激活。
## 配置
可以使用位于 `~/.config/chennai/config.toml` 的 TOML 文件、环境变量或 CLI 标志来配置 agent。CLI 标志的优先级高于环境变量,而环境变量的优先级高于配置文件。
配置文件示例:
```
provider = "openai"
model = "deepseek-chat"
api_key = "sk-..."
base_url = "https://api.deepseek.com"
effort = "high"
```
## 开发
### 前置条件
- Rust 工具链(edition 2024)
- Scala 3.8.4 和 sbt
- GraalVM Community Edition 25,用于 native-image 构建(开发可选)
### 构建
```
# Engine (staged JAR distribution)
(cd engine && sbt stage)
# Engine native image (requires GraalVM)
bash ci/native-image.sh
# TUI
(cd tui && cargo build --release)
```
### 在本地构建所有 npm 包
```
bash wrapper/nodejs/scripts/build-local.sh
```
## 许可证
MIT
标签:AI智能体, DNS重绑定攻击, MITM代理, 云安全监控, 可视化界面, 通知系统, 静态分析