iamved/stoa-agent-risk
GitHub: iamved/stoa-agent-risk
一款本地优先的静态扫描工具,自动发现代码库中的 AI agent 并拦截新引入的高置信度安全风险。
Stars: 0 | Forks: 0
# Stoa
**[stoa-agent-risk.dev](https://stoa-agent-risk.dev)** · [案例研究](https://stoa-agent-risk.dev/case-study) · [在线演示报告](https://stoa-agent-risk.dev/demo-report) · [PyPI](https://pypi.org/project/stoa-agent-risk/)
**一款本地优先的 AI agent 清单和风险扫描器**,能够识别 agent
候选对象并提供支持证据,映射其能力和集成情况,
并防止新引入的高置信度严重风险进入
代码库。
Stoa 对 Python、JavaScript 和 TypeScript 代码库进行静态扫描 —— 无需
运行时 hooks,无需上传,无需账号。
## Stoa 的功能
- **发现潜在的 AI agent**(LangChain、LangGraph、CrewAI、AutoGen、
LlamaIndex、OpenAI Agents SDK、PydanticAI、Bedrock Agents、Semantic Kernel、
LiteLLM 以及原始 provider 调用),使用加权证据,并准确展示
检测到每个候选对象的*原因*。
- **映射 provider、框架、集成和功能** —— 例如,一个
具有支付访问权限、数据库读取权限和 Slack 消息传递功能的
agent 候选对象。
- **检测高置信度风险**:硬编码的凭证、硬编码的
密码、插值 SQL、被吞没的异常、不安全的 HTTP、缺失的
请求超时以及控制审查 prompt。
- **生成本地报告**:适合管理者查看的独立 HTML 报告
和确定性的、带版本的 JSON 注册表。
- **默认仅拦截新引入的关键发现** —— 现有的
技术债绝不会阻碍无关的 pull request。
Stoa 报告的是*候选对象*和*证据*,而非确定性结果。“未观察到控制”
prompt 仅作为审查提示,并非已证实的漏洞。
## 快速开始
```
pipx install stoa-agent-risk
cd my-repository
stoa scan .
open stoa-report.html
```
`stoa scan .` 会写入 `stoa-report.html` 和 `stoa-registry.json`,并且除非配置了拦截机制,否则将以退出代码 0 退出
(仅报告模式)。该 JSON 也设计为可供
编程助手读取:
```
stoa scan . --json stoa-registry.json
```
## GitHub Actions
```
stoa init github
```
这将创建(不会覆盖现有文件 —— 使用 `--force` 进行
覆盖):
- `.github/workflows/stoa.yml` —— 完整历史 checkout、固定版本的 Stoa 安装、
全代码库扫描、与 PR 基础分支的 diff、GitHub annotations、
job 摘要、上传的 HTML/JSON artifacts,以及一个**仅**
在 PR 引入新的高置信度严重发现时才会失败的拦截机制。
- `.stoaignore` —— gitignore 风格的路径排除。
- `stoa.toml` —— 带有文档化默认值的配置。
## CLI
```
stoa scan [PATH]
--html PATH HTML report (default stoa-report.html)
--json PATH JSON registry (default stoa-registry.json)
--base GIT_REF enable diff-aware behavior (e.g. origin/main)
--strict fail on all unsuppressed high-confidence criticals
--fail-on {none,high,critical}
--fail-on-new {none,high,critical} applies with --base
--github-annotations emit ::error/::warning workflow commands
--summary-file PATH write a GitHub job-summary Markdown file
--config PATH explicit stoa.toml
--no-git skip git metadata
--include / --exclude extra path patterns (repeatable)
--verbose / --quiet
```
退出代码:`0` 拦截通过 · `1` 拦截失败 · `2` 参数或
配置无效 · `3` 扫描器执行错误。
只有符合拦截条件规则(SEC001、SEC002)的高置信度发现才会导致
扫描失败;SQL 插值、网络和审查 prompt 规则仅报告而
不进行拦截,因为静态正则表达式分析无法证明其可利用性。
## 屏蔽
内联屏蔽,在同一行或上一行,始终带有明确的规则 ID:
```
# stoa: ignore[SEC003] 来自内部 enum 的受信任 identifier
query = f"SELECT * FROM {table_name}"
```
```
const endpoint = "http://staging.internal.corp"; // stoa: ignore[NET001]
```
文件级屏蔽:
```
# stoa: ignore-file[CTRL001,CTRL002]
```
被屏蔽的发现会被计算并显示在报告中 —— 绝不会
被静默丢弃。不存在全局的 `ignore-all`。
## 配置
代码库根目录下的 `stoa.toml`(显示的所有值均为默认值):
```
fail_on = "none" # gate on all findings at/above this severity
fail_on_new = "critical" # gate on newly introduced findings (with --base)
max_file_bytes = 1000000
follow_symlinks = false
respect_gitignore = true
ignore_paths = [ # merged with built-in defaults (node_modules, dist, …)
"tests/snapshots/**",
]
[severity] # per-rule severity overrides
NET001 = "info"
[rules] # per-rule enable/disable
CTRL003 = false
```
`.stoaignore` 使用 gitignore 语法进行路径排除。测试和 fixtures
*不会*被默认忽略 —— 在这些地方进行密钥扫描仍然很有用 ——
但它们在 agent 检测中的权重会被降低,并且适用
占位符密钥启发式规则。
## 规则
| 规则 | 标题 | 默认严重程度 | 是否拦截? |
|---|---|---|---|
| SEC001 | 可能的硬编码 API 凭证 | critical | 是(仅限高置信度) |
| SEC002 | 可能的硬编码密码 | high(高置信度时为 critical) | 是(仅限高置信度) |
| SEC003 | 插值 SQL 语句 | high | 否 |
| REL001 | 被吞没的异常 | medium | 否 |
| NET001 | 不安全的非本地 HTTP endpoint | medium | 否 |
| NET002 | 未观察到请求超时 | medium | 否 |
| CTRL001–003 | 未观察到 Auth / 验证 / 速率限制控制 | info | 从不 |
## 安全模型
- **本地优先。** 任何源代码都不会被上传;Stoa 不会进行网络
调用,也不收集任何遥测数据。
- **密钥在序列化前会被屏蔽。** 检测到的凭证在
匹配到的瞬间就会被替换为 `prefix…[REDACTED:sha256-fingerprint]`;原始
值永远不会出现在终端输出、JSON、HTML、
annotations、摘要或日志中。
- 静态分析存在**误报和漏报**。发现结果是用于
审查的证据,而非最终结论。
## Schema 稳定性
JSON 输出已版本化且以添加为主 —— 请参阅 [SCHEMA.md](SCHEMA.md)。
使用者必须忽略未知字段。字段名 `autonomy_level`、
`loss_scenarios`、`liveness_state`、`policy_lines` 和 `exposure_class` 是
为未来版本保留的。请将 `stoa-registry.json` 视为 CI artifact;
不建议将其提交到代码库中。
## 局限性
- 基于正则表达式和模式;没有 AST 或语义分析。
- 没有运行时行为:能力证据无法证明某个代码路径
会被执行,且调用点并非 API 调用计数。
- 没有跨代码库或组织级的基础设施可见性:“在此文件中未观察到”的
控制可能存在于其他地方。
- 没有明确的归属权推断 —— “最后修改者”只是提交历史,
而不是归属权;CODEOWNERS 支持涵盖了 GitHub 模式语法中常见的 gitignore 风格子集
(区分顺序,最后匹配优先;不支持括号
字符类和按文件分区语法)。
- 仅支持 Python、JavaScript 和 TypeScript。
- 仅参考代码库根目录下的 `.gitignore` 和 `.stoaignore`。
## CI 绕过注意事项
- 该工作流从 PyPI 安装**固定版本**的 Stoa 发布版,而不是
从 pull request 执行扫描器代码,因此 PR 无法修改
扫描器来绕过强制执行。
- 使用 CODEOWNERS 和分支保护来保护 `.github/workflows/stoa.yml`、`stoa.toml` 和 `.stoaignore`
—— 修改这些文件的 PR 可能会削弱
拦截机制,因此这些修改需要经过审查。
- 内联屏蔽(`# stoa: ignore[...]`)会改变拦截机制看到的内容;
请像审查任何其他与安全相关的更改一样审查它们。
## 开发
```
python -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/pytest
```
## 许可证
MIT —— 请参阅 [LICENSE](LICENSE)。
标签:云安全监控, 后端开发, 数据可视化, 逆向工具, 静态分析, 风险扫描