SyntaxFlow 语言导读
SyntaxFlow 是 Yaklang 的程序分析查询语言。它面向已经编译为 SSA IR 的程序,在统一的值、调用与依赖关系上表达分析问题。规则既可以用于交互式查询,也可以作为扫描任务中可复用的分析逻辑。
建立一个可验证的分析问题
一个规则通常从“定位什么”开始:某个符号、成员或函数调用。随后描述“需要满足哪些条件”,并决定是否继续追踪参数来源或后续使用。最终将匹配结果命名,检查结果,并报告需要关注的值。
查询的基本结构
定位表达式 → 条件过滤 → 数据流追踪 → 命名结果 → 检查与报告
这些步骤并非每条规则都必须包含。它们提供的是一种阅读和构建规则的方式,而非固定模板。
按问题查阅语法
| 分析问题 | 对应专题 |
|---|---|
| 在程序中寻找符号或调用 | 搜索与定位 |
| 检查调用的参数与返回值 | 函数调用 |
| 保存并复用中间结果 | 变量与命名 |
| 检查成员访问与调用链 | 成员与链式调用 |
| 追踪一个值的来源或用途 | 数据流运算 |
| 给匹配结果增加约束 | 条件过滤 |
| 合并、排除或比较结果集 | 集合运算 |
| 调用分析引擎的扩展能力 | NativeCall |
| 检查第三方依赖及其版本 | SCA 依赖检测 |
| 在文件内容中寻找证据 | 文件过滤 |
理解两种追踪方向
定义链追踪回答“这个值来自哪里”。从调用参数向上追踪,可以看到影响该参数的定义与输入。
使用链追踪回答“这个值被用在哪里”。从一个定义向下追踪,可以研究它如何参与后续的运算与调用。
二者是数据依赖关系上的查询。控制流中的支配关系是另一种概念,需要在控制流与支配中单独讨论。
分析能力与边界
SSA IR 为不同语言提供统一的查询对象,但不同语言、框架和版本的建模覆盖范围可能不同。遇到不完整代码、动态调用、反射或外部依赖时,应结合编译诊断与具体样例检查分析结果。
规则命中是一条可复核的证据。严谨的审计还需要确认数据来源是否可控、防护逻辑是否有效,以及相关执行路径是否满足业务条件。
建议的练习顺序
- 完成快速入门,编译一个示例项目并运行规则。
- 阅读规则文件结构,区分
desc、查询、check与alert。 - 对照规则库阅读真实规则,选择一个语法专题进行修改与验证。
- 继续阅读NativeCall 用例与数据流分析实战。
需要离线阅读时,可以使用完整语言手册。