Actenon/actenon-scan
GitHub: Actenon/actenon-scan
actenon-scan 是一款专注于 AI Agent 执行安全的防御性静态分析扫描器,用于检测 Agent 工具边界中缺少权限校验的不可逆危险操作。
Stars: 0 | Forks: 0
# actenon-scan

[](https://pypi.org/project/actenon-scan/)
[](https://pypi.org/project/actenon-scan/)
[](LICENSE)
**阻止 AI agent 执行其未获授权的重大操作。**
`actenon-scan` 是一款防御性的静态分析扫描器,用于发现**执行漏洞**:即在没有对代码路径进行预先权限或凭证校验的情况下,从 AI agent 工具边界即可触达重大且不可逆操作(支付、删除、部署、访问授权)的代码位置。
可以把它看作是 Bandit 或 Semgrep —— 但只专注于一个问题:**Replit 事件,即 agent 执行了本不该执行的破坏性操作。**
## 快速开始
```
pip install actenon-scan
actenon-scan scan .
```
输出示例:
```
actenon-scan: 3 finding(s) in 3 file(s) (scanned 47 file(s))
refund_tool.py
8:4 [HIGH] PAY-STRIPE-REFUND (payments)
stripe.Refund.create(payment_intent=payment_id, amount=amount)
confidence: high
Guard this payment call with actenon proof verification. See: https://github.com/Actenon/actenon-permit
delete_tool.py
14:4 [HIGH] DATA-DELETE-SQL (data_destruction)
'DELETE FROM {table_name}'
confidence: high
Guard this destructive call with actenon proof verification. See: https://github.com/Actenon/actenon-permit
```
## GitHub Action (SARIF + PR 内联注解)
```
name: actenon-scan
on: [pull_request]
jobs:
scan:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: Actenon/actenon-scan@v0.1.1
with:
path: .
fail-on: medium
# SARIF is automatically uploaded to GitHub code scanning
# — inline PR annotations appear automatically
```
SARIF 输出可以在 GitHub 代码扫描中原生呈现 —— 内联注解会自动显示在 PR diff 中。
## 判定原理
当 **SINK** 同时满足 **AGENT-REACHABLE** 且 **UNGUARDED** 时,将触发 **finding**。
| 信号 | 含义 | 检测方式 |
|---|---|---|
| **SINK** | 调用重大/不可逆操作(退款、DELETE FROM、kubectl apply、IAM 授权) | 基于调用名称 + SQL 字符串字面量进行 AST 模式匹配 |
| **AGENT-REACHABLE** | 该 sink 位于已注册的 agent 工具内(`@tool`、`@mcp.tool`、`@server.tool`、工具包装器,或继承自 `BaseTool` 的类) | AST 装饰器/包装器/类检测 |
| **UNGUARDED** | 在同一函数内,通往 sink 的路径上没有预先的权限/凭证校验 | 对防护调用(`verify_proof`、`authorize`、`check_permission`)或防护装饰器进行词法前置检查 |
如果 sink 不是 agent 可达的(例如,它位于一个没有导入 agent 框架的普通脚本中),则不会触发 finding。这能保持较低的误报率。
如果 sink 已被防护(在同一函数中,它之前出现了 `authorize()` 或 `verify_proof()` 调用,或者该函数带有防护装饰器),则不会触发 finding。
## 修复方法
当 `actenon-scan` 标记出一个 finding 时,修复方法是在重大操作调用之前添加一个**绑定凭证的权限校验**:
```
# BEFORE (已标记)
@tool
def process_refund(payment_id: str, amount: int):
stripe.Refund.create(payment_intent=payment_id, amount=amount)
# AFTER (已清理)
@tool
def process_refund(payment_id: str, amount: int):
from actenon import verify_proof
verify_proof(action="refund", target=payment_id, amount=amount)
stripe.Refund.create(payment_intent=payment_id, amount=amount)
```
该扫描器可以识别 **Actenon 防护**(`verify_proof`、`require_proof`、`actenon.*`)以及**通用防护**(`authorize`、`check_permission`、`require_approval`)。因此,即使您不使用 Actenon,添加防护也能消除该 finding —— 这款工具对非 Actenon 用户也非常实用。
- **[actenon-kernel](https://github.com/Actenon/actenon-kernel)** — 开放式凭证网关
- **[actenon-permit](https://github.com/Actenon/actenon-permit)** — 开发者优先的签发器 + PDP + 代理
## 抑制
如果某个 finding 属于误报,可以通过内联方式将其抑制:
```
# actenon-scan: ignore[PAY-STRIPE-REFUND]
stripe.Refund.create(...)
```
或者使用 baseline 来抑制已知的 finding:
```
actenon-scan scan . --format json > baseline.json
# Future runs 抑制这些:
actenon-scan scan . --baseline baseline.json
```
## CLI
```
actenon-scan scan [--format pretty|json|sarif] [--fail-on none|low|medium|high]
[--config config.json] [--baseline baseline.json]
[--include GLOB]... [--exclude GLOB]...
actenon-scan rules # list active rules
actenon-scan init # write a default config
actenon-scan --version
```
## 退出码
- `0` — 没有达到或超过 `--fail-on` 阈值(默认:`medium`)的 finding
- `1` — 存在达到或超过阈值的 finding
这使得该工具可用于 CI 门禁。
## 检测到的 Sinks (v1)
| 类别 | 严重性 | 示例 |
|---|---|---|
| payments | HIGH | stripe refund/charge/payout、braintree、adyen、通用的 `refund()`/`charge()` |
| data_destruction | HIGH | `DELETE FROM`、`DROP TABLE`、`shutil.rmtree`、`os.remove`、S3 `delete_object` |
| deployment | HIGH | `subprocess.run(["kubectl", ...])`、terraform、helm、ansible |
| access_control | HIGH | `put_user_policy`、`attach_role_policy`、`create_access_key`、IAM mutations |
| communication | MEDIUM | `sendmail`、Twilio `messages.create`、Slack `chat.postMessage` |
规则可通过 JSON/YAML 配置进行扩展。请参阅 `actenon-scan init`。
## 许可证
Apache-2.0。详见 [LICENSE](LICENSE)。
## 贡献
请参阅 [CONTRIBUTING.md](CONTRIBUTING.md)。安全披露:请参阅 [SECURITY.md](SECURITY.md)。
标签:AI安全, Chat Copilot, DLL 劫持, GitHub Actions, LNA, Python, SAST, 大语言模型, 无后门, 盲注攻击, 自动化payload嵌入, 自动笔记, 逆向工具, 静态代码扫描