Skip to main content

SyntaxFlow 语言导读

SyntaxFlow 是 Yaklang 的程序分析查询语言。它面向已经编译为 SSA IR 的程序,在统一的值、调用与依赖关系上表达分析问题。规则既可以用于交互式查询,也可以作为扫描任务中可复用的分析逻辑。

建立一个可验证的分析问题​

一个规则通常从“定位什么”开始:某个符号、成员或函数调用。随后描述“需要满足哪些条件”,并决定是否继续追踪参数来源或后续使用。最终将匹配结果命名,检查结果,并报告需要关注的值。

查询的基本结构
定位表达式 → 条件过滤 → 数据流追踪 → 命名结果 → 检查与报告

这些步骤并非每条规则都必须包含。它们提供的是一种阅读和构建规则的方式,而非固定模板。

按问题查阅语法​

分析问题对应专题
在程序中寻找符号或调用搜索与定位
检查调用的参数与返回值函数调用
保存并复用中间结果变量与命名
检查成员访问与调用链成员与链式调用
追踪一个值的来源或用途数据流运算
给匹配结果增加约束条件过滤
合并、排除或比较结果集集合运算
调用分析引擎的扩展能力NativeCall
检查第三方依赖及其版本SCA 依赖检测
在文件内容中寻找证据文件过滤

理解两种追踪方向​

定义链追踪回答“这个值来自哪里”。从调用参数向上追踪,可以看到影响该参数的定义与输入。

使用链追踪回答“这个值被用在哪里”。从一个定义向下追踪,可以研究它如何参与后续的运算与调用。

二者是数据依赖关系上的查询。控制流中的支配关系是另一种概念,需要在控制流与支配中单独讨论。

分析能力与边界​

SSA IR 为不同语言提供统一的查询对象,但不同语言、框架和版本的建模覆盖范围可能不同。遇到不完整代码、动态调用、反射或外部依赖时,应结合编译诊断与具体样例检查分析结果。

规则命中是一条可复核的证据。严谨的审计还需要确认数据来源是否可控、防护逻辑是否有效,以及相关执行路径是否满足业务条件。

建议的练习顺序​

  1. 完成快速入门,编译一个示例项目并运行规则。
  2. 阅读规则文件结构,区分 desc、查询、check 与 alert。
  3. 对照规则库阅读真实规则,选择一个语法专题进行修改与验证。
  4. 继续阅读NativeCall 用例与数据流分析实战。

需要离线阅读时,可以使用完整语言手册。