一、一种新型加载木马的方式
1、一个 zip 文件如何悄悄接管你的 Python
你可能见过这种场景:从官网下载 Python,安装包签名干净,目录里除了 python.exe 和几个 dll 什么都没有。一切看起来都很正常。
但攻击者已经把恶意代码塞进了一个同目录的 zip 文件里。这个 zip 文件没有签名,没有版本号,也不会出现在任何依赖清单中。它甚至不需要被系统主动打开——Python 启动时,它会自己跳出来。
2、三个正常机制,拼成一条攻击链
这套攻击手法没有利用任何新漏洞,纯粹是三个正常机制叠出了风险:
- 路径被篡改:Python 启动时会无条件加载同目录的
pythonXY.zip(XY 对应版本号)。只要这个文件存在,它就会被加入 sys.path。
- 模块被替换:zip 排在搜索顺序最前面。如果里面放一个和 Python 标准库同名的模块,它会盖过原版。
encodings 是启动必跑且未被冻结的模块,成了攻击者的首选入口。
- 签名看不见:exe 和 dll 都是官方原装,签名核验天然看不到 zip 里的内容。杀毒软件只看签名的话,完全查不出问题。
3、为什么是 encodings?
Python 启动过程中,有几个模块是早期就必须导入的。但 os、codecs 等模块在 CPython 中是被“冻结”的(frozen),放进 zip 也轮不到执行。而 encodings 恰好是未冻结的,且每次启动都会执行。它成了这条链上最合适的“门把手”。
4、怎么判断自己有没有中招
在命令行输入:
import encodings; print(encodings.__file__)
如果输出路径指向一个 .zip 文件内部(比如 python39.zip\encodings),就是中招了。
注意:sys.path 里出现 zip 路径不等于中招。正常环境也会这样。实锤要看 encodings.__file__ 是否指向 zip 内部。
5、怎么清理
找到并删除那个 pythonXY.zip 文件即可,不需要动任何程序文件。如果反复出现,说明有持久化机制,建议直接重装。
6、信任盲区在哪
这套手法最值得警惕的地方在于:
- 官方文件、正常签名、常见启动行为——一切看起来都干净
- 真正异常藏在一个普通的 zip 文件里,不触发任何告警
- 它利用的是设计层面的行为组合,而非某个具体漏洞,因此很难通过打补丁修复
对于安全人员来说,这提醒了一个事实:只看签名、只看文件完整性、只看进程行为,都可能漏掉这种藏在“合法机制”背后的攻击路径。这类问题更偏向安全/渗透/逆向视角下的机制滥用,而不是传统漏洞利用。
二、说人话
将上面的语言换种方法来说:
下载的 Python 解释器看着干干净净,其实可能已经被调了包。
攻击者把恶意代码塞进一个 zip 文件,跟官方程序放在同一个文件夹里。这个 zip 文件每次启动都会自动运行,全程不碰签名文件。
这套手法没钻漏洞,纯粹是三个正常机制叠出了风险:
- 路径被篡改:Python 启动时会无条件加载同目录的特定 zip。就算这文件不存在,系统也会给它留个位置。
- 模块被替换:zip 排在了标准库前面。只要里面放个同名文件,就能盖过原版。
encodings 是启动必跑且没被锁死的模块,成了首选目标。
- 签名看不见:exe 和 dll 都是官方原装,签名没问题。杀毒软件光看签名根本查不出 zip 里的猫腻。
三、危险性所在
1、这种攻击的危险性
危险性在于把一条合法启动链拆成了攻击路径。它没有利用某个新漏洞,而是把 Python 的加载机制串了起来。
- 签名只覆盖 exe 和 dll:恶意代码藏在同目录的 zip 里,签名核验天然看不到它。
- zip 被无条件加入搜索路径:文件名还要严格匹配版本,错一个字都不会加载。
zipimport 让压缩包能被导入:它排在搜索顺序最前面,同名模块会盖过标准库。
encodings 是最佳入口:它是启动必经、且未冻结的模块。os、codecs 等更早被冻结,放进 zip 也轮不到执行。
补上防御者容易漏掉的一点:sys.path 里有 zip 路径不等于中招。正常环境也会这样。实锤要看 encodings.__file__ 是否指向 zip 内部。
所以,最有价值的是这条信任盲区:官方文件、正常签名、常见启动行为都看着干净,真正异常却藏在一个普通 zip 里。
2、这种危险性所利用的路径劫持是人为设定的还是 Python 自带的?
是 Python 自带的,不是攻击者临时加的。文章里的恶意 zip 只是利用了这套机制。
可以分两层看:
- Python 自带的能力:
zipimport 是标准库。sys.path 里出现 zip 路径时,导入系统会自动用它加载模块。官方文档也写明,这通常由内置 import 机制自动触发。
- 人为设定的规则:文件名
pythonXY.zip、放进 sys.path、排在标准库前面——这些都属于 CPython 启动代码的设计。CPython 就是 Python 官方那个标准实现。
真正的问题是:设计各自合理,叠在一起就形成了隐蔽的执行入口。
所以准确说法是:机制是 Python 自带的,利用方式是攻击者设计的。
四、举例演示
1、probe.py
import sys
open(r"D:\out.txt", "w").write("\n".join(sys.path))
运行后,打开 out.txt,可以看到:

python311.zip 是优先于 DLLs 和 Lib 路径的,这样就产生了上面所讲到的路径优先问题。正常情况下 Python 安装路径中是没有这个 zip 文件的,如果被人设计了这个 zip,就会被 Python 加载起来,这非常类似以前的 DLL 劫持攻击。
2、生成 python311.zip 并放入安装目录
将生成的 python311.zip 放在 Python 安装目录中,如下:

运行效果如下图,运行后自动弹出示例 exe 程序:

如果 python311.zip 中包含木马,那么 Python 运行时就会优先启动木马,隐蔽性很强。对于这类依赖系统加载顺序、而非明显漏洞的路径,排查时既需要看签名和文件完整性,也需要回到解释器自身的加载机制与技术文档所描述的导入链路里找线索。