背景
随着 AI 能力的不断提升,AI 在代码审计领域已经有了一席之地。我也尝试过去设计不同方法论的审计 skill 去让大模型从不同的角度对代码进行审计,但之前的审计流程编排大多都是串联的,或者说是大阶段串联,每个阶段内部并联执行。这种编排方式也有一定的局限性,当你想设计更为灵活和复杂的流程时,流程梳理起来会变得“糊成一团”,且容易发生耦合的情况。因为每个环节通过文本内容指向下一个环节,在不断迭代的过程中由于缺乏框架性的设计而变得难以梳理。所以,就抱着“能不能做一个调理清晰的执行流程”这个想法,尝试性地用 DAG (有向无环图)的形式构造了一个简单的审计 Skill。
项目地址:https://github.com/ACaiSec/acai-dag-auditor
项目介绍
目前项目的内容只是为了展示架构的使用,所以比较简单,一共 5 个 node:
- env_setup:根据开发框架下载依赖库,完成编译
- project_parsing:根据编译内容以及合约代码对项目的函数调用与业务流程进行解析与总结
- business_flow_analysis:分析合约项目在业务流程层面的安全问题
- fund_flow_analysis:分析合约在资金层面的安全问题
- summary_output:问题去重,确认,输出漏洞报告
其中 3 和 4 是并行执行的。

每个节点首先都需要在 workflow.dag.yaml 文件中进行登记(max_parallel_nodes 为最大并行数量):
version: 1
name: solidity_auditruntime:max_parallel_nodes: 2nodes:- id: env_setupmodule: nodes/env_setup- id: project_parsingmodule: nodes/project_parsing- id: fund_flow_analysismodule: nodes/fund_flow_analysis- id: business_flow_analysismodule: nodes/business_flow_analysis- id: summary_outputmodule: nodes/summary_output
为了避免 context 占用过高,每个 node 都采用 sub-agent 的形式进行调用,调用结果通过输出文件进行返回。所以每个节点之间的关系(在 DAG 中对应 edge 的概念)根据是节点间的输入输出文档进行关联,比如:Node1 的输出文档为 node1-output.md,Node2 的输入文档也是 node1-output.md,那么就认为存在一条 Node1 --> Node2 的边。
每个节点的输入输出文档定义在节点目录下的 node.yaml 文件中实现,比如
上游节点 project_parsing 的输出内容定义为
outputs:- name: project_overviewpath: project_overview.mdformat: markdowndescription: High-level project summary, contract roles, and business flow- name: call_graphpath: call_graph.yamlformat: yamldescription: Compressed call graph per ast_compress_template.yaml- name: business_flowspath: business_flows.yamlformat: yamldescription: Structured function call chains for each business flow
而它的下游节点 business_flow_analysis 的输入定义,刚好为上游节点的输出。
artifacts:output_dir: ./acai-dag-auditor/artifacts/business_flow_analysis/inputs:- name: project_overviewsource: upstream:project_parsingpath: project_overview.mdrequired: truedescription: Project architecture, contract roles, and business flow- name: business_flowssource: upstream:project_parsingpath: business_flows.yamlrequired: truedescription: Structured function call chains for each business flow- name: call_graphsource: upstream:project_parsingpath: call_graph.yamlrequired: truedescription: Compressed call graph with function call edges and risk annotations
当上游节点执行完毕,且目录中所输出的文件满足了下游节点的输入文件要求时,Agent 将会启动 sub-agent 执行下游节点的任务。
整个项目最核心的内容就介绍完了,接下你就可以根据你自己的需求设计和添加各种节点,搭建你自己的审计流程。
后记
因为这个项目是先有一个想法,然后根据这个想法来实现的一个 demo。可能想法并不成熟,实现过程中也有很多没考虑到的地方。就当是一个积聚内心想法的分享,也非常希望大家能够交流一下看法,毕竟现在很难找到一个交流的平台和社区,长时间的闭门造车最终也只能是在不断的自我否定中止步不前。尤其是现在 AI 时代,分享自己的想法变得困难重重,初步的浅显的想法提出来好像不如 AI 生成的质量高,深刻的详细的想法提出来下一秒就会为别人的 AI 所用。然后大家都开始用 AI 生成内容了,反正质量不会太差,你嫖走得到的也是 AI 的内容,分享也渐渐的变得没意思了。
