random tips on coding, ops, ...

受限的 BASH (rbash)

如果 bash 以 rbash 为程序名启动或者命令行参数有 -r 选项,则启动的这个 shell 会在某些功能上受限制.具体表现为如下操作都不能做:

  • 通过 cd 来改变工作目录
  • 设置或取消环境变量: SHELL, PATH, ENV, BASH_ENV
  • 命令名中不能包含目录分隔符 ‘/’
  • 包含有 ‘/’ 的文件名作为内置命令 ‘.’ 的参数
  • hash 内置命令有 -p 选项时的文件名参数包含 ‘/’
  • 在启动时通过 shell 环境导入函数定义
  • 在启动时通过 shell 环境解析 SHELLOPTS 的值
  • 使用 >,> , <>, >&, &>, >> 等重定向操作符
  • 使用 exec 内置命令
  • 通过 enable 内置命令的 -f 和 -d 选项增加或删除内置命令
  • 使用 enable 内置命令来禁用或启用 shell 内置命令
  • 执行 command 内置命令时加上 -p 选项
  • 通过 set +rset +o restricted 关闭受限模式

rbash 一般是指向 bash 的符号链接,如下:

$ ls -l /bin/rbash
lrwxrwxrwx 1 root root 4 May  3 13:04 /bin/rbash -> bash

通过设置 PATH 环境变量为指定的目录,可以控制用户只能执行这些目录下的命令。

需要注意的是, rbash 提供的受限环境的安全程度取决于用户能执行的命令,很多 命令都能调用外部命令,从而导致逃逸出受限环境。例如:

  • more -1 /etc/passwd,然后 !bash。 对 less, man 等命令同样有效。
  • vi 等编辑器能通过 : 执行外部命令
  • awk 'BEGIN {system("/bin/sh")}'
  • find /etc/ -name passwd -exec /usr/bin/awk 'BEGIN {system("/bin/sh")}' \;
  • echo "evil script code" | tee script.sh

如果能执行脚本,如 python, perl 等则有很多种方式启动一个 shell。

因此,通过 rbash 构建一个安全的受限环境需要花不少功夫,需要严格控制用户能 使用的命令。更安全的做法还是通过 chroot jail 等方式。


comments powered by Disqus