防止 bash 脚本中的目录遍历漏洞

Prevent directory traversal vulnerability in bash script

如何在参数包含目录名称的 bash 脚本中防止目录遍历攻击?

示例:

$STAGE=
$APP=
deploy.sh dist/ /opt/apps/"$STAGE"/"$APP"

$STAGE$APP 变量是从外部设置的。攻击者可以使用 "..".

将其更改为任意路径

我知道通常的解决方案是将目录字符串与 returns 绝对路径的函数结果进行比较。但是我找不到现成的解决方案,也不想提出自己的解决方案。

该脚本应该运行作为只具有访问必要目录权限的用户。

是这样的吗?

#! /bin/bash

STAGE=
APP=

expectedParentDir="/opt/apps/"

function testDir(){
  arg=
  if [[ ! -f $arg ]]
  then
      echo "File $arg does not exist."
      exit 1
  fi
  rpath=$(realpath $arg)
  if [[ $rpath != ${expectedParentDir}* ]]
  then
   echo "Please only reference files under $expectedParentDir directory."   
   exit 2
  fi
}

testDir /opt/apps/"$STAGE"/"$APP"

... deploy ...

调用示例[​​=16=]

test.sh "../../etc/" "passwd"
Please only reference files under /opt/apps/ directory.
------------
test.sh "../../etc/" "secret"
File /opt/apps/../../etc//secret does not exist.
  1. 使用 -f 测试文件是否存在,如果目标必须是目录,则使用 -d
  2. 使用realpath解析路径
  3. 使用== ${expectedParentDir}*查明解析的路径是否以预期的字符串开头