Security 我可以信任我的环境变量吗?
我正在Security 我可以信任我的环境变量吗?,security,bash,unix,environment-variables,Security,Bash,Unix,Environment Variables,我正在bash中编写一个实用程序集,它有一个公共库。我编写的每个脚本都必须有一块代码,用于确定库相对于可执行文件的路径。不是实际的代码,而是一个示例: #!/bin/bash DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" . $DIR/../lib/utilities/functions 我有一个好主意,用一个环境变量来指示库的位置,而不是试图搜索库的序言 #!/bin/bash . $TOOLS_LI
bash
中编写一个实用程序集,它有一个公共库。我编写的每个脚本都必须有一块代码,用于确定库相对于可执行文件的路径。不是实际的代码,而是一个示例:
#!/bin/bash
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. $DIR/../lib/utilities/functions
我有一个好主意,用一个环境变量来指示库的位置,而不是试图搜索库的序言
#!/bin/bash
. $TOOLS_LIBRARY_PATH
我可以使用包装程序来设置环境变量,也可以在自己的路径中设置。也许有更好的方法来组织bash
工具集,但问题是:
我可以信任我的环境变量吗?
这是其中一个,我从未真正思考过的问题。当用其他语言编程时,路径被用来查找库(例如,LD_LIBRARY_PATH
,PYTHONPATH
,PERLLIB
,RUBYLIB
,类路径
,节点路径
),但我从来没有停下来思考过这是多么不安全
事实上,LD\u LIBRARY\u PATH
必须阻止它的使用。如果分别调用Ruby和Perl库路径环境变量的安全机制,则会忽略它们
到目前为止我的想法
- 用户可以将
设置为他们选择的库,但该实用程序将在他们的uid下运行。他们可以直接使用TOOLS\u PATH\u LIBRARY
运行恶意库bash
- 我的工具
有些东西。有人可以将他们的sudo
设置为可以利用这一点的东西。但是,这些工具不是通过工具\u路径\u库
运行的,它们只是在这里和那里调用sudo
。用户必须是sudo
在任何情况下,他们都可以直接调用sudoer
sudo
- 如果我不能信任
,那么我就不能信任TOOLS\u PATH\u LIBRARY
。所有程序调用必须使用绝对路径PATH
- 我见过shell程序对绝对程序使用别名,因此不要调用
,而是使用变量,如ls
。据我所知,这是为了防止用户将程序默认值重新定义为别名。请参阅:ls=/bin/ls
- Perl将所有环境变量视为“受污染”,这是一种不祥的预感,这就是为什么我试图对环境风险进行推理
- 一个用户不可能更改另一个用户的环境,除非该用户是root用户。因此,我只关心用户更改自己的环境以升级权限。见:
更新:使用环境变量指定库和可执行文件的路径有哪些安全问题?虽然各种程序中都存在防止修改环境变量的机制,但底线是,不,您不能信任环境变量。安全问题是非常基本的:
任何时候,只要用户可以更改预期执行的内容,就会出现漏洞被利用的可能性 举个例子,看一看。因此,对包含setuid或setgid二进制文件的文件系统具有写访问权限的弱势攻击者可以利用此漏洞升级其权限。它涉及用户正在修改的环境变量 是另一个例子,不涉及SUID二进制文件。在谷歌上搜索“glibc cve environment”,看看人们可以通过修改环境变量来做什么。很狡猾 你的担忧可以归结为你的陈述: 用户可以将TOOLS\u PATH\u LIBRARY设置为他们选择的库,但该实用程序将在他们的uid下运行。他们可以直接用bash运行恶意库 这里的关键词-运行他们的恶意库。这假定他们的库也由UID拥有 这是一个安全框架将为您带来很多好处的地方。我写的一篇文章专门关注这个问题,你可以在这里找到: 模块停止对可写或不属于受信任用户(root)的文件执行execve/mmap/mprotect调用。只要他们不能将恶意代码放入受信任用户拥有的文件/目录中,他们就不能以这种方式利用系统
如果使用SUID二进制或包含这些变量的SUDO,您可能会考虑启用“偏执”和“严格”选项,甚至阻止root信任非根二进制二进制文件。 我应该提到,这种受信任的路径执行方法保护使用二进制文件和共享库的直接执行。它对解释语言几乎没有什么作用(如果有的话),因为它们解析字节码而不直接执行。因此,您仍然需要对
PYTHONPATH
、PERLLIB
、CLASSPATH
等进行一定程度的关注,并使用您提到的语言安全机制。简短回答:
假设用户能够运行自己选择的程序和代码,您不必相信他们提供给您的任何东西,包括环境。如果帐户在某些方面受到限制(没有shell访问权限,没有对允许执行的文件系统的写访问权限),这可能会改变情况,但只要您的脚本只做用户自己可以做的事情,为什么要防止恶意干扰
详细回答: 安全问题至少要考虑两个单独的问题:
- 我们需要防范什么,防范谁?
- (密切相关的问题:我们的程序实际上可以做什么?它可能会破坏什么?)
- 我们怎么做
# One way to get home directory of util_user
DIR=$(/usr/bin/awk -F: '$1 == "util_user" {print $6}' /etc/passwd)
# Another way which works in BASH and Kornshell
[ -d ~util_dir ] && DIR=~util_dir
# Make sure DIR is set!
if [ -z "$DIR" ]
then
echo "Something's wrong!"
exit
fi