python 库劫持:原理、利用与防御
Python 库劫持(Library Hijacking)是一种常见的权限提升或持久化攻击手段。其核心逻辑在于利用 Python 解析器加载模块时的搜索路径优先级,诱使程序加载攻击者伪造的恶意模块,而非合法的标准库或第三方库。
一、 Python 模块搜索机制
了解劫持的前提是掌握 Python 的sys.path加载顺序。当执行import语句时,Python 会按以下优先级依次查找:
- 当前脚本目录:执行脚本(如
python test.py)所在的文件夹优先级最高。 - PYTHONPATH 环境变量:用户手动设置的附加搜索路径。
- 标准库路径:Python 安装时的内置库目录(如
/usr/lib/python3.x)。 - 第三方库路径:通过 pip 安装的模块所在目录(
site-packages)。
二、 库劫持的实现方式
如果攻击者拥有目标系统的高优先级路径写入权限,即可实施劫持。
1. 目录种植(Path Planting)
这是最简单的方式。若目标脚本admin.py中引用了import os,攻击者只需在admin.py同级目录下创建一个名为os.py的文件。由于当前目录优先级最高,Python 会忽略系统标准库,直接运行攻击者的os.py。
2. 环境变量污染
通过修改PYTHONPATH环境变量,攻击者可以强制 Python 优先从其控制的目录(如/tmp)中搜索模块。
- 示例:设置
PYTHONPATH=/tmp,并将恶意模块放入/tmp中。
三、 恶意代码构造
劫持成功后,攻击者通常会编写后门代码。为了不让程序崩溃(暴露攻击),恶意脚本通常会在执行攻击逻辑后,再通过绝对路径加载真正的原始库。
常规劫持示例:
importos# 提权逻辑:复制 bash 并赋予 SUID 权限os.system("cp /bin/sh /tmp/sh; chmod u+s /tmp/sh")若劫持目标正是 os 库:
为避免递归导入错误,可使用subprocess替代:importsubprocess# 为系统 bash 增加 SUID 权限subprocess.run(["chmod","+s","/bin/bash"])
四、 防御与安全建议
- 权限控制:严格限制生产环境和敏感脚本所在目录的写入权限,防止被植入非法
.py文件。 - 清理环境变量:在运行关键脚本前,重置或清理
PYTHONPATH,避免被外部注入。 - 使用绝对路径:在极其敏感的场景下,检查
sys.path的合法性。 - 运行参数:使用
python3 -I(Isolated mode) 运行脚本。该模式会忽略环境变量和当前工作目录,强制使用隔离的标准搜索路径,能有效防御此类劫持攻击。
