OWASP/appsec-agent
GitHub: OWASP/appsec-agent
基于 Claude Agent SDK 构建的 TypeScript AppSec 代理工具包,通过多种 AI 代理实现代码审查、威胁建模、代码修复和 QA 验证等应用安全任务的自动化。
Stars: 4 | Forks: 1
# AppSec Agent (TypeScript)
一个提供 AI 驱动的应用程序安全 (AppSec) 任务代理的 TypeScript 包,基于 Claude Agent SDK 构建。它有助于自动化日常的应用程序安全操作并简化工作流程。
**📦 可在 npm 上获取**:通过 `npm install appsec-agent` 进行安装
**🌐 正在寻找完整的 Web 仪表板?** 请查看 [**AI Threat Modeler**](https://github.com/yangsec888/ai-threat-modeler/) —— 这是一个父应用程序,将 `appsec-agent` 打包到 Docker化 的 Next.js + Express 技术栈中,包含身份验证、交互式的威胁感知数据流图 (Data Flow Diagram) 画布、风险登记表导出 (PDF/CSV/JSON) 以及聊天 UI。这是无需编写代码即可使用此代理的最简单方法。
## 🚀 功能
- **AI 驱动的 AppSec 自动化**:利用 Claude 的功能进行应用程序安全防护
- **多种代理类型**:简单查询、代码审查、PR 审查、威胁建模(包含对抗性二次审查)、代码修复、QA 验证等
- **工具权限管理**:高级工具权限回调,为受信任的操作提供绕过模式
- **代码审查能力**:自动检测代码中的安全和隐私问题
- **模块化代理架构**:易于针对特定用例进行扩展和自定义
- **简单的集成**:基于 Claude Agent SDK 构建,实现无缝 AI 集成
- **生产就绪**:具有适当错误处理和配置的稳定包
- **适用于 Web 应用的线程安全**:专为 Web 应用中的并发使用而设计,具有隔离的实例状态
- **全面的测试**:完整的测试覆盖率,包括针对 Web 应用场景的并发测试
## 📋 目录
- [安装](#installation)
- [快速开始](#quick-start)
- [配置](#configuration)
- [可用的代理](#available-agents)
- [Web 应用使用](#web-application-usage)
- [架构](#architecture)
- [使用示例](#usage-examples)
- [开发](#development)
- [测试](#testing)
- [相关项目](#related-projects)
## 🛠 安装说明
### 前置条件
- Node.js 18.0 或更高版本
- npm 或 yarn
- Anthropic API key
### 步骤 1:安装 appsec-agent
从 npm 安装该包:
```
$ npm install appsec-agent
```
或者,如果您更喜欢全局安装(以便直接使用 CLI 命令):
```
$ npm install -g appsec-agent
```
该包包含预构建的 JavaScript 文件,因此使用时无需进行构建步骤。
## ⚡ 快速开始
### 1. 设置环境变量
将这些内容添加到您的 shell 配置文件(`.bashrc`、`.zshrc` 等)中:
```
# Anthropic API 配置
export ANTHROPIC_API_KEY="your-anthropic-api-key"
export ANTHROPIC_BASE_URL="https://api.anthropic.com"
```
### 2. 运行您的第一个代理
您可以使用 CLI 命令运行代理:
```
# 如果全局安装
$ agent-run
# 如果本地安装,使用 npx
$ npx agent-run
# 或者使用特定选项运行
$ npx agent-run -r simple_query_agent
```
## 🔧 配置
可以通过环境变量和配置文件对代理进行配置。关键配置选项包括:
- `ANTHROPIC_API_KEY`:您的 Anthropic API key(Claude 提供商必需)
- `ANTHROPIC_BASE_URL`:API endpoint URL(默认:https://api.anthropic.com)
- `AGENT_PROVIDER`:模型提供商 —— `claude`(默认)或 `codex`(选择性加入)。使用 `--provider` 覆盖。
- 在 `conf/appsec_agent.yaml` 中为每个角色配置 `max_turns`(例如 `threat_modeler` 为 **100**)。使用 `--max-turns ` 覆盖任何角色。
配置文件:`conf/appsec_agent.yaml`
### 模型提供商 (v3.0.0+)
所有角色均通过提供商中立的 `RoleSpec` 运行。在运行时选择后端:
```
# Claude(默认)— 使用 Anthropic API / Claude Agent SDK
$ npx agent-run -r code_reviewer -s ./src -m sonnet
# Codex(可选启用)— 使用 @openai/codex-sdk;接受 gpt-* / o* model ids
$ npx agent-run -r threat_modeler -s ./src -f json --provider codex -m gpt-4.1
```
设置 `AGENT_PROVIDER=codex` 或传递 `--provider codex`。对于支持的角色,MCP server 连接 (`--mcp-server-url`) 在这两个提供商上均可工作。
## 🤖 可用的代理
### 简单查询代理 (`simple_query_agent`)
一个通用的 AppSec 助手,可以:
- 回答与安全相关的问题
- 协助安全分析任务
- 提供安全最佳实践的指导
- 交互式查询处理
- 搜索和分析文件目录(使用 `--src_dir` 选项)
### 代码审查代理 (`code_reviewer`)
一个专门用于自动化代码分析的代理,可以:
- 审查代码中的安全漏洞
- 检测代码库中的隐私问题
- 生成全面的安全报告
- 支持多种输出格式(Markdown、JSON、XML、CSV、XLSX)
- 分析整个项目目录
- 使用高级工具:Read、Grep 和 Write 功能
- 通过 `-c/--context` 接收部署上下文,用于特定环境的分析
- 通过 `-d/--diff-context` 实现 **专注于 PR 的审查模式**,优化 token 使用
### 代码修复代理 (`code_fixer`)
一个专门用于生成精确安全修复的代理,可以:
- 通过 `--fix-context` 接收带有完整代码上下文的安全发现
- 生成最小化、有针对性的修复以解决漏洞
- 返回结构化的 JSON 输出 (`FixOutput`),包含修复后的代码、行号、解释和置信度
- 保留原始缩进和代码功能
- 支持在之前的修复验证失败时的重试工作流
- 当提供 `--src_dir` 时,使用 `Read` 和 `Grep` 工具获取额外的源代码上下文
### QA 验证代理 (`qa_verifier`)
一个专门用于验证安全修复的代理,可以:
- 运行项目的测试套件以验证安全修复不会破坏功能
- 分析测试失败以确定是由修复引起的还是原本存在的
- 提供结构化的 JSON 结论 (`QaVerdict`),包含通过/失败状态、失败详情和建议
- 通过带有安全限制的受限 Bash 工具执行 shell 命令
- 支持自定义测试命令、设置命令和环境变量
- 接收部署上下文以进行环境感知验证
### PR 审查器 (`pr_reviewer`)
`code_reviewer` 的一个专注于 PR 的变体,针对 diff 上下文进行了优化:
- 具备与 `code_reviewer` 相同的安全分析能力,专门针对 Pull Request diff 进行了调优
- 当使用 `-d/--diff-context` 时,**默认启用 PR diff 分块**(参见 [PR 分块](#pr-chunking-large-prs))
- 当提供 `--mcp-server-url` 时支持 MCP 感知(`queryFindingsHistory`、`queryImportGraph`、`queryCodebaseGraph`、`queryRuntimeEnrichment`)
### 威胁建模器 (`threat_modeler`)
一个专门用于全面威胁建模的代理,可以:
- 生成结构化的 **`threat_model_report` JSON**(DFD + STRIDE 威胁 + 风险登记表)或传统的多文件 ASCII 交付物
- 对 DFD 执行 STRIDE 方法的威胁建模
- 创建带有修复计划的详细风险登记表报告
- 当证据确认时,通过可选的 **`source_locations`** (`file`、`line_numbers`、`symbol`、`snippet`) 将 DFD 节点、威胁和风险锚定到源代码 (v3.1.0)
- 分析代码库中的安全威胁和漏洞
- 默认情况下最多运行 **100 次工具使用轮次**(可在 yaml 中配置或通过 `--max-turns` 配置)
### 威胁对抗器 (`threat_adversary`, v3.1.0)
用于威胁建模的对抗性二次审查 —— 从首轮报告中过滤掉无根据的威胁:
- 输入:通过 `--adversarial-context` 传入的首轮 `threat_model_report` JSON
- 输出:过滤后的 `threat_model_report` JSON(相同的 schema)输出到明确的 `-o` 路径
- 仅保留具有具体攻击路径和确认的 `source_locations` 的威胁;丢弃通用的、已缓解的或无根据的项目
- 在过滤后重新协调风险登记表和 `metadata` 计数
- 使用与 `threat_modeler` 相同的模型提供商和 `max_turns` 默认值
## 📖 使用示例
### 基本查询
```
# 交互式查询 agent
$ npx agent-run
# 带有源代码目录上下文的查询 agent
$ npx agent-run -r simple_query_agent -s /path/to/source
```
### 代码审查示例
```
# 审查当前目录中的代码
$ npx agent-run -r code_reviewer
# 审查特定源代码目录
$ npx agent-run -r code_reviewer -s /path/to/source
# 自定义输出文件和格式
$ npx agent-run -r code_reviewer -o security_report.html -f html
# 使用部署上下文进行审查以获得更具针对性的分析
$ npx agent-run -r code_reviewer -s ./src \
-c "AWS Lambda function in production VPC, handles user authentication via API Gateway, processes PII data"
# 带有合规性上下文的 Kubernetes 微服务
$ npx agent-run -r code_reviewer -s ./payment-service \
-c "Kubernetes microservice on GKE, PCI-DSS compliant environment, internal service mesh only"
# 带有访问上下文的内部工具
$ npx agent-run -r code_reviewer -s ./admin-cli \
-c "Internal CLI tool run by DevOps, requires VPN access, elevated AWS IAM permissions"
```
`-c/--context` 选项提供部署和环境信息,帮助代理:
- 专注于特定环境的漏洞(例如,Lambda 事件注入、K8s secrets 暴露)
- 考虑已经到位的基础设施缓解措施
- 根据实际的威胁环境确定调查结果的优先级
- 推荐适合所述架构的最佳实践
### 专注于 PR 的代码审查(Diff 上下文模式)
对于 Pull Request 审查,使用 `-d/--diff-context` 选项提供一个仅包含更改代码的 JSON 文件。通过将审查重点放在实际更改上而不是整个代码库,这大大减少了 token 的使用。
```
# 使用 diff 上下文审查 PR
$ npx agent-run -r code_reviewer -d pr-diff.json
# 需要时与源代码目录结合以获取完整的文件访问权限
$ npx agent-run -r code_reviewer -d pr-diff.json -s ./src
# 带有额外的部署上下文
$ npx agent-run -r code_reviewer -d pr-diff.json -c "Production API, handles PII"
```
Diff 上下文 JSON 文件应遵循以下结构:
```
{
"prNumber": 123,
"baseBranch": "main",
"headBranch": "feature/auth",
"headSha": "abc123def456",
"owner": "your-org",
"repo": "your-repo",
"files": [
{
"filePath": "src/auth/login.ts",
"language": "typescript",
"fileType": "modified",
"imports": "import bcrypt from 'bcrypt';",
"hunks": [
{
"startLine": 42,
"endLine": 55,
"beforeContext": "// Previous context",
"changedCode": "+const password = req.body.password;",
"afterContext": "// Following context",
"containingFunction": "async function login(req, res)"
}
]
}
],
"totalFilesChanged": 1,
"totalLinesAdded": 10,
"totalLinesRemoved": 5
}
```
**注意:** 如果在未指定 `code_reviewer` 角色的情况下提供了 `--diff-context`,将会显示警告,因为该选项仅适用于代码审查。
#### PR 分块(大型 PR)
当 PR diff 超过模型的上下文限制时,**分块** 会将 diff 拆分为多个批次,审查每个批次,然后将报告合并为一个输出文件。
- **配置**(在 `conf/appsec_agent.yaml` 中):PR diff 分块选项位于 **`pr_reviewer.options`** 下,并且当您使用 `pr_reviewer` 角色配合 `-d/--diff-context` 时 **默认开启**。`code_reviewer` 角色默认不开启分块。
- `diff_review_max_tokens_per_batch`:例如 `150000`(0 或省略 = 不分块)
- `diff_review_max_batches`:例如 `3`(每次运行的批次上限)
- `diff_review_max_files`:可选的审查文件数量上限;其余将被跳过
- `diff_review_exclude_paths`:可选的要排除的路径模式列表(例如 `["src/analytics/*"]`)
- **CLI**(覆盖配置):`--diff-max-tokens `、`--diff-max-batches `、`--diff-max-files `、`--diff-exclude `(可重复)
当使用分块时,合并后的报告可能包含一个 **已跳过** 部分,列出被排除或超过批次限制的文件。总 API 成本将按批次和总计进行记录,并且(对于 JSON 报告)包含在 `meta.total_cost_usd` 中。
```
# 使用 -d 时,pr_reviewer 默认开启 chunking
$ npx agent-run -r pr_reviewer -d pr-diff.json
# 或者在使用 code_reviewer 时通过 CLI 启用 chunking(覆盖配置)
$ npx agent-run -r code_reviewer -d pr-diff.json --diff-max-tokens 150000 --diff-max-batches 3
```
#### 对抗性二次审查 (`pr_adversary`)
在 `pr_reviewer` 运行之后,父应用可以调用 **二次审查**,丢弃没有具体失败/利用路径的调查结果。输入是一个列出候选调查结果的 JSON 文件;输出是一个 **过滤后** 的 `security_review_report`(与主 PR 报告的 schema 相同)。
```
# 过滤候选发现(JSON 输入 → JSON 输出)。可选:使用相同的 PR diff 作为上下文。
$ npx agent-run -r pr_adversary --adversarial-context candidates.json -s ./repo -f json \
-o adversarial_code_review_report.json
# 可选:包含 diff 上下文(大型 diff 在 prompt 中会被截断)
$ npx agent-run -r pr_adversary --adversarial-context candidates.json --diff-context pr-diff.json -s ./repo -f json
```
- **`--experiment-enabled`:** 为此审查添加更严格的误报指令;对于 `pr_reviewer`,当您的集成器传递此标志时,也会收紧初始的 diff 审查。
#### 全仓库对抗性误报过滤器 (`fp_adversary`, v2.8.0)
`pr_adversary` 的 Lane-2 对应项:`pr_adversary` 重新过滤 PR 范围内的调查结果,而 `fp_adversary` 作用于整个仓库首轮 `code_reviewer` 的调查结果,并针对每个调查结果发出一个 **结论**(`confirm` 或 `dismiss`),包含 0-1 的数字置信度和具体的依据。输出的结构是一个专用的 `fp_adversary_report`(与 `security_review_report` 不同),以便父应用可以将低置信度的驳回路由到“预驳回” UI 状态,并且仅在高于操作员配置的置信度阈值时才自动驳回。
```
# Full-repo 误报过滤器 — 相同的 --adversarial-context flag,不同的输入/输出 schema。
$ npx agent-run -r fp_adversary --adversarial-context fp_in.json -s ./repo -f json \
-o fp_adversary_report.json
```
**输入结构**(`findings[].fingerprint` 是往返的 key;这四个姿态字段和 `similar_dismissed` 先例数组都是可选的,但推荐使用):
```
{
"findings": [
{
"fingerprint": "fp-sha256-of-cwe-file-snippet-line",
"id": "SEC-001",
"title": "SQL injection",
"file": "src/db.ts",
"description": "…",
"severity": "HIGH",
"confidence": "MEDIUM",
"cwe_id": "CWE-89"
}
],
"project_summary": "A Next.js SaaS app",
"security_context": "Prisma ORM with parameterized queries",
"deployment_context": "Vercel, multi-tenant",
"developer_context": "PHI handling rules apply to user_data",
"similar_dismissed": [
{ "fingerprint": "fp-old", "file": "src/db.ts", "cwe": "CWE-89", "dismissal_reason": "Prisma parameterized query" }
],
"metadata": { "project_name": "parent-app" }
}
```
**输出结构:**
```
{
"fp_adversary_report": {
"verdicts": [
{
"fingerprint": "fp-sha256-of-cwe-file-snippet-line",
"verdict": "dismiss",
"confidence": 0.92,
"rationale": "Prisma parameterized query mitigates; no concrete bypass path observed.",
"cost_usd_estimate": 0.001
}
]
}
}
```
`fp_adversary` 是 MCP 感知的:在运行时传递 `--mcp-server-url` 会公开 `queryFindingsHistory`、`queryImportGraph`、`queryCodebaseGraph` 和 `queryRuntimeEnrichment`,以便代理在确认之前可以验证可达性。
**输入文件结构**(每个调查结果的最少要求:`id`、`title`、`file`、`description`):
```
{
"findings": [
{
"id": "SEC-001",
"title": "…",
"file": "src/a.ts",
"description": "…",
"severity": "HIGH",
"confidence": "HIGH",
"recommendation": "…"
}
],
"pr_number": 123,
"head_sha": "abc123"
}
```
### 代码修复示例
```
# 修复 fix context JSON 文件中描述的漏洞
$ npx agent-run -r code_fixer --fix-context fix_context.json
# 使用源代码目录作为额外上下文
$ npx agent-run -r code_fixer --fix-context fix_context.json -s ./src
# 自定义输出文件
$ npx agent-run -r code_fixer --fix-context fix_context.json -o my_fix.json
```
修复上下文 JSON 文件应遵循以下结构:
```
{
"finding": {
"title": "SQL Injection",
"severity": "HIGH",
"cwe": "CWE-89",
"owasp": "A03:2021",
"file": "src/db.ts",
"line": 42,
"description": "User input directly concatenated into SQL query",
"recommendation": "Use parameterized queries",
"category": "Injection"
},
"code_context": {
"language": "typescript",
"imports": "import { db } from './database';",
"vulnerable_section": "const result = db.query(`SELECT * FROM users WHERE id = ${userId}`);",
"vulnerable_section_start": 40,
"vulnerable_section_end": 44,
"full_file_with_line_numbers": " 40| const result = db.query(...);",
"indentation_guidance": "Use 2-space indentation"
},
"security_guidance": "Use parameterized queries to prevent SQL injection.",
"learned_examples": "",
"negative_examples": "",
"custom_instructions": "",
"chain_of_thought": false
}
```
代理返回一个结构化的 `FixOutput`:
```
{
"fixed_code": "const result = db.query('SELECT * FROM users WHERE id = ?', [userId]);",
"start_line": 42,
"end_line": 42,
"explanation": "Replaced string interpolation with parameterized query to prevent SQL injection",
"confidence": "high",
"breaking_changes": false
}
```
### QA 验证示例
```
# 通过运行项目的测试来验证安全修复
$ npx agent-run -r qa_verifier --qa-context qa_context.json
# 使用源代码目录作为额外上下文
$ npx agent-run -r qa_verifier --qa-context qa_context.json -s ./src
# 自定义输出文件
$ npx agent-run -r qa_verifier --qa-context qa_context.json -o qa_verdict.json
```
QA 上下文 JSON 文件应遵循以下结构:
```
{
"pr_url": "https://github.com/owner/repo/pull/42",
"test_command": "npm test",
"test_framework": "jest",
"setup_commands": "npm ci",
"timeout_seconds": 120,
"block_on_failure": true,
"deployment_context": "Production Kubernetes cluster",
"environment_variables": {
"NODE_ENV": "test"
}
}
```
代理返回一个结构化的 `QaVerdict`:
### 威胁建模器示例
```
# 结构化 JSON 报告(推荐用于集成)
$ npx agent-run -r threat_modeler -s /path/to/source -f json -o threat_model_report.json
# 传统的多文件 ASCII 交付物(默认 markdown)
$ npx agent-run -r threat_modeler -s /path/to/source
# 带有部署上下文以应对特定环境的威胁
$ npx agent-run -r threat_modeler -s ./api -f json \
-c "AWS Lambda in VPC, handles PII, SOC2 Type II scope"
# 覆盖最大 tool-use 轮次(threat_modeler 默认为 100)
$ npx agent-run -r threat_modeler -s ./src -f json --max-turns 50
```
当代理能够将它们落实到 Read/Grep 证据中时,JSON 报告可能会在 DFD 节点、威胁和风险上包含可选的 `source_locations`:
```
{
"threat_model_report": {
"threat_model": {
"threats": [
{
"id": "THREAT-001",
"title": "SQL injection in user lookup",
"source_locations": [
{
"file": "src/db/users.ts",
"line_numbers": "42-44",
"symbol": "findUserById",
"snippet": "const q = `SELECT * FROM users WHERE id = ${id}`;"
}
]
}
]
}
}
}
```
#### 威胁对抗性二次审查 (`threat_adversary`, v3.1.0)
在 `threat_modeler` 运行之后,调用 **二次审查**,丢弃没有具体的、基于代码的攻击路径的威胁。输入是首轮报告;输出是过滤后的 `threat_model_report`(相同的 schema)。
```
# 过滤候选威胁(JSON 输入 → JSON 输出)
$ npx agent-run -r threat_adversary --adversarial-context threat_model_report.json \
-s ./repo -f json -o threat_model_adversary_report.json
# 可选:与第一轮相同的部署上下文
$ npx agent-run -r threat_adversary --adversarial-context threat_model_report.json \
-s ./repo -f json -c "AWS Lambda, handles PII"
```
**输入结构**(最低要求:包装首轮报告):
```
{
"threat_model_report": {
"data_flow_diagram": { "nodes": [], "flows": [], "trust_boundaries": [] },
"threat_model": { "executive_summary": "…", "threats": [] },
"risk_registry": { "summary": "…", "risks": [] },
"metadata": { "total_threats_identified": 0, "total_risks_identified": 0 }
}
}
```
空的 `threats` 数组会在不调用模型的情况下短路;输入将原封不动地写入 `-o`。
### 列出可用角色
```
$ npx agent-run -l
```
### 版本信息
```
$ npx agent-run -v
```
**注意**:如果您全局安装了该包,您可以直接使用 `agent-run` 而不是 `npx agent-run`。
## 🌐 Web 应用使用
此包设计为线程安全的,适用于可能并发处理多个请求的 Web 应用。
### 关键线程安全特性
- **实例隔离**:每个 `AgentActions` 和 `AgentOptions` 实例维护隔离的状态
- **对话历史隔离**:对话历史按实例存储,防止请求之间的交叉污染
- **工具使用日志管理**:工具使用日志是私有的,可以在请求之间清除
- **工作目录安全**:每个请求仅捕获一次工作目录,以防止竞态条件
### Web 应用的最佳实践
1. **为每个请求创建新实例**:始终为每个 HTTP 请求创建一个新的 `AgentActions` 实例:
```
import { AgentActions, AgentArgs, loadYaml } from 'appsec-agent';
app.post('/api/query', async (req, res) => {
const confDict = loadYaml('conf/appsec_agent.yaml');
const args: AgentArgs = {
role: 'simple_query_agent',
environment: 'default',
verbose: false
};
// Create new instance per request
const agentActions = new AgentActions(confDict, 'default', args);
// Use agentActions for this request only
const result = await agentActions.simpleQueryClaudeWithOptions(req.body.query);
res.json({ result });
});
```
2. **清除工具使用日志**:如果重用 `AgentOptions` 实例,请在请求之间清除日志:
```
const agentOptions = new AgentOptions(confDict, environment);
// ... use agentOptions ...
agentOptions.clearToolUsageLog(); // Clear before next request
```
3. **显式传递工作目录**:使用文件操作时,请显式传递工作目录:
```
import { validateOutputFilePath } from 'appsec-agent';
// In web application context
const workingDir = process.cwd(); // Capture once per request
const outputPath = validateOutputFilePath('report.md', workingDir);
```
### 线程安全保证
- ✅ 安全:为每个请求创建新实例
- ✅ 安全:使用已捕获的工作目录
- ❌ 不安全:在多个请求之间重用同一实例
- ❌ 不安全:在并发环境中多次调用 `process.cwd()`
## 🏗 架构
AppSec AI Agent 采用模块化架构构建,由几个关键组件组成:
### 核心组件
- **`AgentActions`**:处理与 Claude 代理的异步交互,包括简单查询、代码审查和威胁建模。每个实例维护隔离的对话历史。
- **`AgentOptions`**:管理不同代理类型的配置、工具权限和权限模式。提供带有 getter 和 clear 方法的私有工具使用日志记录。
- **`utils`**:用于文件操作、YAML 加载和项目管理的实用函数,具有线程安全的路径验证
- **`agent-run`**:用于运行代理的命令行界面脚本
### 文件结构
```
appsec-agent/
├── src/
│ ├── agent_actions.ts # Agent interaction logic
│ ├── agent_options.ts # Agent configuration management
│ ├── main.ts # Main application logic
│ ├── utils.ts # Utility functions
│ ├── schemas/
│ │ ├── security_report.ts # JSON schema for code review reports
│ │ ├── threat_model_report.ts # JSON schema for threat model reports (incl. source_locations)
│ │ ├── threat_adversary_pass.ts # Input/prompt helpers for threat_adversary second pass
│ │ ├── fp_adversary_pass.ts # Input/output schema for fp_adversary role
│ │ ├── security_fix.ts # JSON schema for code fixer output
│ │ └── qa_context.ts # JSON schema for QA verifier verdict
│ ├── tools/
│ │ └── bash_tool.ts # Restricted Bash tool for QA verifier
│ └── __tests__/
│ ├── concurrency.test.ts # Concurrency and thread-safety tests
│ └── ... # Other test files
├── bin/
│ └── agent-run.ts # CLI script (TypeScript source)
├── dist/ # Compiled output (generated)
│ ├── src/ # Compiled library code
│ └── bin/
│ └── agent-run.js # Compiled CLI entry point
├── conf/
│ └── appsec_agent.yaml # General configuration file
├── package.json
├── tsconfig.json
└── README.md
```
### API 参考
#### AgentOptions 方法
- `getToolUsageLog()`:返回工具使用日志的副本(只读访问)
- `clearToolUsageLog()`:清除工具使用日志(对 Web 应用很有用)
- `toolPermissionCallback()`:处理工具权限请求
- `getSimpleQueryAgentOptions()`:获取简单查询代理的选项
- `getCodeReviewerOptions()`:获取代码审查器的选项
- `getThreatModelerOptions()`:获取威胁建模器的选项
- `getThreatAdversaryOptions()`:获取威胁对抗性二次审查的选项
- `getDiffReviewerOptions()`:获取专注于 PR diff 的代码审查器的选项
- `getCodeFixerOptions()`:获取代码修复代理的选项(始终使用 JSON schema 输出)
- `getQaVerifierOptions()`:获取 QA 验证代理的选项(Read、Grep、Bash 工具 + JSON schema 输出)
#### Diff 上下文函数
- `validateDiffContext(data)`:验证 diff 上下文 JSON 结构,包含全面的字段验证
- `formatDiffContextForPrompt(context)`:将 diff 上下文格式化为用于 AI 分析的 prompt
#### 路径验证函数
- `validateInputFilePath(filePath, baseDir)`:验证输入文件路径的安全性
- `validateOutputFilePath(filePath, baseDir)`:验证输出文件路径以防止目录遍历
- `isSafePath(filePath, allowAbsolute)`:检查路径是否免受遍历攻击
## 🛠 开发
本节面向希望为该包做出贡献或在本地进行修改的开发人员。
### 设置开发环境
1. 克隆仓库:
```
$ git clone
$ cd appsec-agent
```
2. 安装依赖:
```
$ npm install
```
3. 构建项目:
```
$ npm run build
```
这会将 TypeScript 源代码文件编译到 `dist/` 目录中的 JavaScript。
### 构建包
```
# 构建 package
$ npm run build
# 清理构建产物
$ npm run clean
```
### 从源码运行
在开发过程中,您可以直接从源码运行代理:
```
# 使用 ts-node(无需构建)
$ npx ts-node bin/agent-run.ts
# 或者先构建,然后运行
$ npm run build
$ node dist/bin/agent-run.js
```
## 🧪 测试
该项目包括全面的测试覆盖率,包括针对 Web 应用场景的并发测试。
### 运行测试
```
# 运行所有测试
$ npm test
# 在 watch 模式下运行测试
$ npm run test:watch
# 运行带有覆盖率的测试
$ npm run test:coverage
# 运行特定的测试文件
$ npm test -- concurrency.test.ts
```
### 测试覆盖率
- **单元测试**:所有组件的核心功能
- **集成测试**:端到端代理工作流
- **并发测试**:Web 应用使用下的线程安全验证
- 对话历史隔离
- 工具使用日志隔离
- 并发文件操作
- 竞态条件预防
- 内存泄漏预防
### 测试结果
所有测试均通过,包括:
- ✅ 跨越 40 个套件的 644 个总测试
- ✅ 针对 Web 应用使用的并发和线程安全覆盖
- ✅ Diff 上下文验证、威胁模型 / 威胁对抗 schema 以及提供商一致性测试
- ✅ 核心功能的全面覆盖
## 🔗 相关项目
### [AI Threat Modeler](https://github.com/yangsec888/ai-threat-modeler/) — 父应用程序
`appsec-agent` 驱动着 [**AI Threat Modeler**](https://github.com/yangsec888/ai-threat-modeler/),这是一个用于 AppSec 自动化的完整开源 Web 应用。如果您希望通过精致的 UI 而不是 CLI 或库 API 来使用这些代理,父应用是推荐的入门方式。
亮点:
- 🐳 使用 `docker-compose up -d --build` 实现 **一键设置**
- 🖥️ **Next.js Web 仪表板**,具有身份验证(JWT、bcrypt、基于角色的访问)以及管理员管理的 Anthropic API 凭据
- 🧵 **威胁建模工作流** —— 上传一个仓库 ZIP,并获得结构化的 JSON 威胁模型(由 `appsec-agent` v1.6+ 驱动),包含基于代码的 `source_locations` 和可选的对抗性过滤(`threat_adversary`,v3.1.0+):
- 交互式的威胁感知 **数据流图**(带有平移/缩放、搜索、过滤器、信任边界的 React Flow 画布)
- 带有 STRIDE 类别和严重性徽章的可排序威胁表
- 具有交叉引用威胁 ID 的风险登记表
- 导出为 **PDF**(带有嵌入式矢量 SVG 的 DFD 和威胁模型)、**CSV**(风险登记表)或 **原始 JSON**
- 💬 **聊天界面**,具有持久的对话历史记录,由 `appsec-agent` 交互模式提供支持
- 📚 位于 `/api-docs` 的 **OpenAPI 3.0 / Swagger** 文档
- 🧪 全面的后端、前端和 Playwright E2E 测试覆盖
快速开始:
```
git clone https://github.com/yangsec888/ai-threat-modeler.git
cd ai-threat-modeler
docker-compose up -d --build
# 然后打开 http://localhost:3000 (默认登录:admin / admin)
```
有关完整详情,请参阅 [AI Threat Modeler README](https://github.com/yangsec888/ai-threat-modeler/blob/main/README.md) 和 [SETUP.md](https://github.com/yangsec888/ai-threat-modeler/blob/main/SETUP.md)。
## 📚 参考
- [AI Threat Modeler(父应用)](https://github.com/yangsec888/ai-threat-modeler/)
- [Claude Agent SDK 文档](https://docs.claude.com/en/api/agent-sdk)
- [Anthropic API 文档](https://docs.anthropic.com/)
- [Claude Code 文档](https://docs.anthropic.com/claude-code)
## 📄 许可证
该项目基于 [Apache License 2.0](LICENSE) 授权 —— 有关详情,请参阅 `LICENSE` 文件。
## 👥 作者
**Sam Li** - *初始工作* - [yang.li@owasp.org](mailto:yang.li@owasp.org)
*为 AppSec 社区倾注 ❤️ 打造*
标签:MITM代理, TypeScript, 人工智能, 威胁建模, 安全插件, 暗色界面, 用户模式Hook绕过, 聊天机器人, 自动化攻击, 请求拦截