Skip to content

工作原理

AION 只跑一条流水线:扫描 → 检测 → 修复 → 验证 → 出 PR。其余功能(漂移检测、 watch 循环)都复用同一套检测与修复内核。

1. 构建仓库上下文

在判断某处是否有风险之前,AION 先提取一份轻量的仓库画像:

  • import 与主导框架用法
  • 鉴权装饰器(只识别真正像鉴权的那些)
  • 数据库访问模式
  • 函数名
  • 可能的 ORM 和 HTTP 客户端约定

有了上下文,AION 就能把 finding 落到你的代码写法上,而不只是通用规则命中。

2. 检测问题

检测结合:

  • 安装了 Semgrep 时运行 semgrep --config p/python
  • 仓库特定的回退启发式规则
  • 对上下文敏感的 finding 使用可选的 LLM 解释

可处理的结果会被升级为 incident,带上严重级别、置信度、证据、修复策略和验证策略。

3. 生成确定性补丁产物

对支持的问题类型,AION 生成确定性补丁,而不是就地改写仓库。每个产物都包含原始内容、 补丁内容、统一 diff、所应用的 plan,以及静态校验标记。

支持的确定性修复:

问题类型 修复方式
hardcoded_secret 把字面量改为 os.getenv(...)
raw_sqlite_query cursor.execute 改为参数化调用
insecure_yaml_load yaml.loadyaml.safe_load
command_injection shlex.quote 包裹 os.system f-string 变量
subprocess_shell_injection shlex.quote 包裹 subprocess(... shell=True) 变量
eval_injection eval(...)ast.literal_eval(...)
weak_cryptography hashlib.md5hashlib.sha256

missing_auth_decorator 会被检测,但只报告——上报给人工,绝不自动打补丁。

4. 验证

每个补丁在变成 Pull Request 之前,都必须先通过一道独立的验证门:

  • 语法 —— 补丁内容必须能作为 Python 解析。
  • 断言 —— 用 AST 检查确认具体的修复确实生效(例如 cursor.execute 现在已参数化、 secret 现在已是 os.getenv 查找)。这与生成补丁的正则相互独立。
  • Semgrep 重扫 —— 安装了 Semgrep 时,打补丁后的文件必须重扫干净。

判定结果是 verified_fixunsafe_patchneeds_human_review 之一。 只有 verified_fix 才会继续走向 Pull Request。

5. 出 PR

auto-update 为每个已验证修复开一个 Pull Request,套用 .aion.yaml 中的标签、 评审者、指派人和目标分支,并遵守 open_pull_requests_limit。任何不是已验证修复的内容 都会留给人工复核,而不会提交。

每个 PR 正文都会附上一段平白语言解释——这段代码原本的风险、修复改了什么、 是否影响运行时行为——让评审者能快速放心地合并。aion repair 在本地运行时 也会打印同样的解释。

6. 漂移检测与 watch 循环

同一套检测/修复内核驱动持续监控。

漂移检测

aion snapshot 在某个时间点捕获安全指纹(文件哈希 + 问题 + 健康分)。aion drift 把当前状态与该基线对比,识别回归并计算健康分变化。

状态 默认位置
快照 .aion/snapshots/

健康分是 0.0–1.0 的指标:1.0 表示没有已知问题;分数越低,反映相对仓库规模的问题严重度与数量越高。

知识库

每次修复都会把结果(按问题类型与策略记录成功/失败)写入 .aion/knowledge/patterns.jsonaion status 会展示这份历史。它是修复表现随时间变化的审计记录。

watch 模式

aion watch 跑外层循环:轮询 → 检测漂移 → 自动修复已验证项 → 记录 → 刷新基线。

7. 边界

AION 产出补丁产物和 Pull Request。它不会在线热修生产代码,不接入 WAF/网关/feature-flag/部署系统,也不处理运行时事件流。当前版本只支持 Python。