搜索定位:搜索符号或方法名
在进行代码审计或安全分析时,快速准确地定位感兴趣的代码片段至关重要。本文将介绍如何利用 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
开头,且后跟大写字母的方法,如 getName
、getInfo
等。
5. 使用 Glob 格式
对于更模糊的搜索,例如查找所有包含 config
字眼的变量或方法,可以使用 Glob 格式:
*config*;
此规则将匹配所有包含 config
的标识符,无论其前后如何。
6. 搜索常量
对于硬编码的常量、敏感信息或配置信息,可以进行精准或模糊匹配。常量搜索支持三种格式:regexp
、glob
、exact
。使用前缀 r
、g
、e
来指定格式,并支持 heredoc 和 QuotedString。例如:
g"a*"
e<<<CODE
password
CODE
实战中注意事项
审计通用代码时避免具体指明参数名
提示: 编写 SyntaxFlow 规则时,尽量避免指定具体的参数名。这提高了规则的通用性和适用范围,尤其在处理多项目或多技术栈时尤为重要。
具体说明:参数命名可能因项目或技术栈不同而有所变化。如果规则中包含具体的参数名,其适用性将受限。使用通用的匹配模式(如 *
或正则表达式)能够提升规则的灵活性。
赋值语句不会中断数据流
提示: 在 SSA(静态单赋值)的形式下,赋值语句不会中断数据流。每个变量在生命周期内只被赋值一次,即使存在看似重新赋值的操作,实际会引入新的变量。
具体说明:在 SSA 中,重新赋值会创建新的变量,这简化了数据流分析。即便是复杂的链式调用,多次赋值操作也不会影响数据流的追踪,确保分析结果的准确性。