javascript - 需要帮助修复 'ensure that user-controlled variables in file paths are validated' semgrep 扫描问题

标签 javascript node.js semgrep

我有一个向其传递文件名的函数,假设文件名采用以下格式 '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/

    相关文章:

    javascript如何重新排列二维数组坐标?

    javascript - 使用 jQuery 删除两个 html 标签之间的文本

    node.js - 获取 MongoDB + Express + NodeJS + React

    javascript - NodeJS Promises 无法编辑现有的 'model'

    javascript - 在node.js中,如果使用createReadStream()还需要response.end()

    semgrep - Semgrep 如何处理两个冲突的类型化元变量类?

    javascript - 如何使用javascript根据html中其他字段的值填充表单字段

    javascript - 多级导航选项卡

    python - Semgrep:寻找错误的导入