尝试nosemgrep与.semgrepignore仍无法跳过Semgrep检查,求解决方案
我已经在代码中添加了// nosemgrep: go.lang.security.audit.dangerous-exec-command.dangerous-exec-command注释,代码如下:
// nosemgrep: go.lang.security.audit.dangerous-exec-command.dangerous-exec-command func run(path string) error { cmd := exec.Command(path) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() }
但这个方法无效。我还配置了.semgrepignore文件,内容如下:
# Common large paths launcher/
同样没有效果。GitHub CI检查时触发如下错误:
go.lang.security.audit.dangerous-exec-command.dangerous-exec-command
Detected non-static command inside Command. Audit the input to
'exec.Command'. If unverified
user data can reach this call site, this is a code injection
vulnerability. A malicious
actor can inject a malicious script to execute arbitrary code.
Details: https://sg.run/W8lA37┆ cmd := exec.Command(path)BLOCKING CODE RULES FIRED:
go.lang.security.audit.dangerous-exec-command.dangerous-exec-command
请问该如何解决这个问题?
解决方案
调整注释位置:Semgrep的
nosemgrep注释必须紧邻触发规则的代码行,不能放在函数定义上方。修改后的代码示例:func run(path string) error { // nosemgrep: go.lang.security.audit.dangerous-exec-command.dangerous-exec-command cmd := exec.Command(path) cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr return cmd.Run() }也可以将注释放在代码同一行:
cmd := exec.Command(path) // nosemgrep: go.lang.security.audit.dangerous-exec-command.dangerous-exec-command修正.semgrepignore路径:确认文件或目录路径是否匹配目标代码位置。如果目标代码不在
launcher/下,需修改忽略路径,比如忽略单个文件:# 忽略目标代码文件 cmd/runner/exec.go检查CI配置强制规则:查看GitHub CI工作流文件(如
.github/workflows/semgrep.yml),确认是否存在强制运行该规则的配置(如--force参数)。若规则被标记为不可绕过的阻塞规则,需修改CI配置或申请规则豁免。验证规则ID准确性:确保注释中的规则ID与CI触发的完全一致,可通过本地运行
semgrep scan --list-rules查看规则的准确ID,避免拼写错误。本地测试验证:在本地执行
semgrep scan命令测试修改后的代码,确认注释或忽略规则是否生效,排除CI环境的特殊问题。
内容的提问来源于stack exchange,提问作者Abner

