我正在编写一个bash具有公共库的实用程序集合.我编写的每个脚本都必须有一段代码,用于确定库相对于可执行文件的路径.不是实际的代码,而是一个例子:
#!/bin/bash
DIR="$( cd -P "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. $DIR/../lib/utilities/functions
Run Code Online (Sandbox Code Playgroud)
我没有尝试搜索库的前导码,而是使用环境变量来指示库的位置.
#!/bin/bash
. $TOOLS_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
我可以使用包装器程序来设置该环境变量,或者我可以在我自己的路径中设置它.可能有更好的方法来组织bash工具集,但问题是:
我可以信任我的环境变量吗?
这是其中之一,我从来没有真正考虑过这类问题.当其他语言编程,路径是用于查找库(例如LD_LIBRARY_PATH,PYTHONPATH,PERLLIB,RUBYLIB,CLASSPATH,NODE_PATH),但我从来没有停下来想想怎么可能是不安全的.
事实上,LD_LIBRARY_PATH有为什么LD_LIBRARY_PATH不好阻止其使用.如果调用其安全机制,则忽略Ruby和Perl库路径环境变量,$SAFE并分别调用-T(污染模式).
到目前为止我的想法......
TOOLS_PATH_LIBRARY为他们选择的库,但该实用程序将在他们的uid下运行.他们可以简单地直接运行他们的恶意库bash.sudo有些东西.有人可以将他们设置TOOLS_PATH_LIBRARY为利用这一点的东西.但是,这些工具不是通过sudo它们运行的,它们只是sudo在这里和那里调用.用户必须是sudoer任何情况下,他们可以直接打电话sudo.TOOLS_PATH_LIBRARY,那我就不能相信PATH.所有程序调用都必须使用绝对路径.ls使用调用,而是使用变量,比如LS=/bin/ls.根据我的阅读,这是为了防止用户将程序默认值重新定义为别名.请参阅:路径,功能和安全性.Bash脚本最佳实践.
. …