跳到主要内容

搜索定位:搜索符号或方法名

在进行代码审计或安全分析时,快速准确地定位感兴趣的代码片段至关重要。本文将介绍如何利用 SyntaxFlow 的词法与符号搜索功能,从变量名和方法名入手,实现高效的代码审计。

词法与符号搜索简介

SyntaxFlow 提供强大的词法与符号搜索功能,允许用户直接定位特定的变量名、方法名或函数名。这在代码审计和安全分析中尤为重要,因为它能帮助开发者迅速找到感兴趣的代码片段。

语法规则

filterItemFirst
: nameFilter # NamedFilter
| '.' lines? nameFilter # FieldCallFilter
;

nameFilter: '*' | identifier | regexpLiteral;

具体案例解析

1. 搜索特定的变量名

如果需要查找代码中所有使用 documentBuilder 变量的地方,可以使用以下 SyntaxFlow 查询:

documentBuilder;

这条规则将匹配代码中所有 documentBuilder 变量的实例。

2. 搜索方法调用

要找到所有调用 parse 方法的位置,可以使用以下查询:

.parse;

通过 . 前缀,指定搜索的是方法或属性名,而非变量名。

3. 结合变量名和方法调用

若需精确定位 documentBuilder.parse(...) 的调用位置,可以结合变量和方法名进行搜索:

documentBuilder.parse;

此查询将定位所有在 documentBuilder 对象上调用 parse 方法的代码位置。

4. 使用正则表达式进行模糊搜索

如果不确定具体的方法名,或者希望查找符合特定模式的所有方法,可以使用正则表达式。例如,查找所有以 get 开头的方法调用:

.get*;

或者使用更精确的正则表达式:

/(get[A-Z].*)/;

这将匹配所有以 get 开头,且后跟大写字母的方法,如 getNamegetInfo 等。

5. 使用 Glob 格式

对于更模糊的搜索,例如查找所有包含 config 字眼的变量或方法,可以使用 Glob 格式:

*config*;

此规则将匹配所有包含 config 的标识符,无论其前后如何。

6. 搜索常量

对于硬编码的常量、敏感信息或配置信息,可以进行精准或模糊匹配。常量搜索支持三种格式:regexpglobexact。使用前缀 rge 来指定格式,并支持 heredoc 和 QuotedString。例如:

g"a*"

e<<<CODE
password
CODE

实战中注意事项

审计通用代码时避免具体指明参数名

提示

提示: 编写 SyntaxFlow 规则时,尽量避免指定具体的参数名。这提高了规则的通用性和适用范围,尤其在处理多项目或多技术栈时尤为重要。

具体说明:参数命名可能因项目或技术栈不同而有所变化。如果规则中包含具体的参数名,其适用性将受限。使用通用的匹配模式(如 * 或正则表达式)能够提升规则的灵活性。

赋值语句不会中断数据流

提示

提示: 在 SSA(静态单赋值)的形式下,赋值语句不会中断数据流。每个变量在生命周期内只被赋值一次,即使存在看似重新赋值的操作,实际会引入新的变量。

具体说明:在 SSA 中,重新赋值会创建新的变量,这简化了数据流分析。即便是复杂的链式调用,多次赋值操作也不会影响数据流的追踪,确保分析结果的准确性。