我有一个函数,我把文件名传递给它,假设文件名是‘abc-zyx-anony- pass 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
}请有人指导我如何解决这个扫描问题,谢谢您的帮助。
发布于 2022-09-28 08:33:05
检测-非文字-fs-文件名 semgrep规则跟踪函数参数是否传递给fs文件处理函数,例如readFile。这确实是您的代码示例中的情况。
此规则没有指定任何杀菌剂,这将使semgrep认识到该值是安全的。因此,无论您如何操作artfactName,semgrep仍然会触发您的代码。在这种情况下,semgrep规则不够聪明,无法检测到您已经解决了问题。这个semgrep规则旨在指出您可能存在的漏洞,您应该自己查看它,以确定它是否仍然是一个问题。
artfactName.replace(/^(\.\.(\/|\\|$))+/, '')这将移除行尾的../、..\和..。这不足以解决这个问题。考虑一下文件名....//somefile.txt发生了什么;../被删除了,结果是../somefile.txt。
也许更好的方法是在检测../时抛出一个错误,或者在上一个/之后获取所有信息。
https://stackoverflow.com/questions/73852239
复制相似问题