如何让Semgrep规则捕获函数参数传递的可解析值?
调整Semgrep规则以捕获参数传递的
classicName值 要检测通过函数/构造函数参数传递的classicName值,核心是利用Semgrep的数据流分析能力追踪参数来源,结合模式匹配覆盖不同传递场景。以下是具体的规则调整方案:
核心思路
通过metavariable-analysis启用字符串数据流追踪,配合metavariable-pattern和pattern-inside限定参数上下文,确保识别从输入参数到classicName赋值的完整路径,同时验证最终值是否匹配.*hello.*正则。
完整规则示例
rules: - id: detect-classic-with-hello-name languages: [typescript] message: 检测到classicName包含"hello"的Classic实例 severity: WARNING patterns: # 主模式:匹配new X.Classic调用,且配置对象中包含classicName字段 - pattern: new $X.Classic($ARGS, {..., classicName: $Y, ...}) # 覆盖三种$Y的来源场景 - any: # 场景1:硬编码字符串直接匹配正则 - metavariable-pattern: metavariable: $Y pattern: "\"*hello*\"" # 场景2:类实例属性,来自构造函数参数 - all: - metavariable-pattern: metavariable: $Y pattern: this.$PROP - pattern-inside: | class $CLASS { constructor($PROP: string) { this.$PROP = $PROP; } $METHOD() { ... } } # 场景3:当前函数的入参 - all: - metavariable-pattern: metavariable: $Y pattern: $ARG - pattern-inside: | function $FUNC($ARG: string) { ... } # 关键:追踪$Y的数据流,验证最终值匹配正则 - metavariable-analysis: metavariable: $Y analyzer: string regex: ".*hello.*"
规则各部分说明
- 主模式:定位所有
new $X.Classic调用,且配置对象中存在classicName赋值。 - 多场景覆盖:用
any组合三种常见的$Y来源,确保不遗漏硬编码、类实例属性、函数参数的情况。 - 数据流分析:
metavariable-analysis会自动追踪$Y的所有可能来源,验证最终传入的字符串是否匹配.*hello.*,哪怕值是通过多层参数传递过来的。
注意事项
- 确保使用Semgrep v1.20及以上版本,该版本开始支持
metavariable-analysis的字符串追踪功能。 - 可根据实际代码结构调整
pattern-inside的模板,比如支持箭头函数、类的私有属性、不同的参数传递方式。 - 如果需要减少误报,可以给
pattern-inside添加更精确的类型或命名约束,比如限定$PROP的命名规则。
内容的提问来源于stack exchange,提问作者Nikhil Verma
相关产品推荐
相关产品推荐

