文章总结: 本文揭示Python加载机制中的信任盲区可被利用植入木马。攻击者利用Python启动时自动加载同目录pythonXY.zip的机制,通过zipimport将恶意模块置于搜索路径最前,替换encodings等未冻结模块实现代码执行。该攻击无需利用漏洞,仅组合正常机制即可绕过签名验证。检测方法为检查encodings.file是否指向zip内部,清理只需删除恶意zip文件。文章强调只看签名和文件完整性可能漏检此类攻击。 综合评分: 82 文章分类: 恶意软件,漏洞分析,安全意识
Python加载机制的信任盲区导致木马产生
原创
MicroPest MicroPest
MicroPest
2026年10月2日 22:19 安徽
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
一、一种新型加载木马的方式
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放在python安装目录中,如下:
运行效果如下图:当运行后自动弹出示例exe程序。
如果python311.zip中包含木马,就当python运行时会优先启动木马,隐蔽性很强。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:MicroPest MicroPest MicroPest《Python加载机制的信任盲区导致木马产生》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论