LD_LIBRARY_PATH在Python的os.environ中找不到。

5

在Python中遇到了LD_LIBRARY_PATH的问题,但是我无法在Python解释器中获取它。我正在使用以下版本的Python:

$ Python 2.6.6 (r266:84292, Jul 22 2015, 16:47:47)[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2

>>> import os
>>> print os.environ['LD_LIBRARY_PATH']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.6/UserDict.py", line 22, in __getitem__
raise KeyError(key)
KeyError: 'LD_LIBRARY_PATH'

但是在Shell中,LD_LIBRARY_PATH有值:

echo $LD_LIBRARY_PATH
/var/test/lib

不知道为什么LD_LIBRARY_PATH被忽略了?

当我手动导出测试变量'MY_TEST'时,我可以看到它。

$exprot MY_TEST=/var/
>>> print os.environ['MY_TEST']
/var/

但是如果我导出LD_LIBRARY_PATH:

    $export LD_LIBRARY_PATH=/var
     >>> print os.environ['LD_LIBRARY_PATH']
     Traceback (most recent call last):
     File "<stdin>", line 1, in <module>
     File "/usr/lib64/python2.6/UserDict.py", line 22, in __getitem__
     raise KeyError(key)
     KeyError: 'LD_LIBRARY_PATH'

有人知道为什么吗?


1
发现 Python 可执行文件的 SELinux 位被设置后,“LD_LIBRARY_PATH” 将被忽略。 - user2641335
1个回答

0

当使用exec执行另一个程序时,Linux会“清理”环境中的某些内容,以防止可能存在安全问题的更改。其中一个可能存在问题的内容是库路径,因为它可能被用作攻击向量,例如:

  • 查找任何由root拥有并设置了setuid位的可执行文件。
  • 查找使用的共享库(以及其中的函数)。例如,假设是printf
  • 创建一个包含打开独立进程中的终端/ shell的printf函数的共享库,然后等待其退出。
  • 更改LD_LIBRARY_PATH,使您的库的位置成为其中的第一项。
  • 运行特权可执行文件。

因为路径在标准位置之前搜索,所以现在您拥有完整的根权限shell,因为它是由具有这些权限的进程启动的。

清洗可以防止利用此漏洞。在SELinux之前,我相信用户/组ID和有效用户/组ID被用来决定是否需要进行清洗。SELinux引入了一个标志的概念,内核会为相关的安全更改设置该标志。


这是你尽量避免在root用户的PATH变量中任何地方放置.的原因。如果这样做,就有可能让root以完全权限运行一些任意用户创建的脚本。

例如,如果我在我的主目录中创建一个ls脚本,然后告诉管理员当当前目录是我的主目录时,ls返回一些奇怪的字符,那么他们首先要做的事情就是检查它:

root$ cd /home/paxdiablo
root$ ls

如果他们愚蠢地设置了一个路径.:all/other/paths,那就完了,伙计 :-)

我的ls脚本会创建一个新用户,拥有与root相同的权限,但密码由我知道,然后运行真正的ls,以使管理员相信没有问题。管理员会称我为白痴并关闭工单,但我已经在系统中留下了后门。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接