我有一个向其传递文件名的函数,假设文件名采用以下格式 'abc-zyx-anony-detect-v1.zip' ,它可以包含特殊字符,如 _ 或 -
现在,当我们对其运行 semgrep 扫描时,扫描显示错误为
javascript.lang.security.audit.detect-non-literal-fs-filename.detect-non-literal-fs-filename
Detected function `artFacts` enter fs module. An attacker could potentially control the
location of this file, to include going backwards in the directory with '../'. To address
this, ensure that user-controlled variables in file paths are validated.
为了解决这个问题,我阅读了几篇文章并尝试了指定的方法来解决该问题,我尝试过的方法是
1.尝试删除在路径之前添加的../../,但不幸的是这不起作用
public async artFacts(artfact:Artfact): Promise<Artfact> {
const artfactName = artfact.getName();
const getName = artfactName.replace(/^(\.\.(\/|\\|$))+/, '')
fspromise.readFile(path.join(`${envConfig.artfacts_container_path}`,getName)){
//some logic
}
}
const artfactName = artfact.getName();
const getName = artifactName.replace(/^(\.\.(\/|\\|$))+/, '')
const realPath = await fspromise.realpath(path.join(`${envConfig.artfacts_container_path}`,getName));
fspromise.readFile(path.join(`${envConfig.artfacts_container_path}`,realPath)){
//some logic
}
- 在上述方法中尝试规范化路径,但这种方法也没有成功
有人可以指导我如何解决此 semgrep 扫描问题吗?提前感谢您的帮助。
最佳答案
detect-non-literal-fs-filename semgrep 规则跟踪函数参数是否传递给 fs
文件处理函数,例如 readFile
。您的代码示例中确实是这种情况。
此规则未指定任何清理程序,这将使 semgrep 识别该值是安全的。因此,无论您如何操作 artfactName
,semgrep 仍然会在您的代码上触发。在这种情况下,semgrep 规则不够智能,无法检测到您已解决问题。此 semgrep 规则旨在向您指出可能存在的漏洞,您应该亲自调查它以确定它是否仍然是一个问题。
artfactName.replace(/^(\.\.(\/|\\|$))+/, '')
这会删除行末尾的 ../
、..\
和 ..
。这不足以解决问题。考虑一下文件名 ....//somefile.txt
会发生什么; ../
被删除,结果是 ../somefile.txt
。
也许更好的方法是在检测 ../
时抛出错误,或者获取最后一个 /
之后的所有内容。
关于javascript - 需要帮助修复 'ensure that user-controlled variables in file paths are validated' semgrep 扫描问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73852239/