IPBUF安全漏洞报告
English
CVE-2026-42301 CVSS 7.8 高危

CVE-2026-42301 pyp2spec RPM宏注入致命令执行漏洞

披露日期: 2026-05-09

漏洞信息

漏洞编号
CVE-2026-42301
漏洞类型
命令注入
CVSS评分
7.8 高危
攻击向量
本地 (AV:L)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
pyp2spec

相关标签

命令注入RPM宏注入供应链攻击pyp2specCVE-2026-42301

漏洞概述

pyp2spec是一个能够为Python项目自动生成Fedora RPM spec文件的工具。在版本0.14.1之前,该软件在处理PyPI包的元数据(例如Summary字段)时存在安全缺陷,未能对这些数据中的RPM宏指令进行转义。当用户基于受影响的pyp2spec版本生成的spec文件运行rpmbuild构建RPM包时,这些恶意的宏指令将被RPM解析器执行。这允许攻击者通过上传包含恶意元数据的Python包,在受害者的构建机器上执行任意系统命令,从而完全控制构建环境。

技术细节

该漏洞属于供应链攻击范畴,其技术原理在于pyp2spec未对输入进行严格的清理和转义。RPM spec文件支持使用宏(以%开头)来定义变量或执行脚本。当pyp2spec从PyPI拉取包信息并写入spec文件时,它直接复制了Summary等字段的原始内容。由于缺乏过滤,攻击者可以在这些字段中注入恶意的RPM宏(例如`%{sh:command}`)。一旦受害者执行rpmbuild,RPM处理器就会解析这些宏并调用系统shell执行命令。根据CVSS 3.1向量分析,攻击需要本地访问权限(AV:L),但不需要权限(PR:N)且需要用户交互(UI:R,即用户执行构建操作),这通常发生在开发者无意中打包了恶意上游包时。

攻击链分析

STEP 1
步骤1:制作恶意包
攻击者创建一个Python项目,在setup.py或pyproject.toml的Summary等元数据字段中注入恶意的RPM宏指令(如执行命令的宏)。
STEP 2
步骤2:发布恶意包
攻击者将包含恶意元数据的Python包发布到PyPI仓库,或诱导受害者使用该包。
STEP 3
步骤3:生成Spec文件
受害者使用存在漏洞的pyp2spec(<0.14.1)工具处理该恶意包,生成包含未转义宏指令的RPM spec文件。
STEP 4
步骤4:执行构建
受害者使用rpmbuild命令基于生成的spec文件进行构建操作。
STEP 5
步骤5:触发漏洞
rpmbuild解析spec文件时执行恶意的RPM宏,导致攻击者在构建机器上执行任意系统命令。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# Proof of Concept - Malicious setup.py # Attacker creates a Python package with the following setup.py from setuptools import setup setup( name="evil_package", version="1.0.0", # Injecting RPM macro payload into the summary field # This macro executes a shell command when rpmbuild processes the spec summary="Useful library %{sh:touch /tmp/pwned_by_cve}", description="This package looks normal but contains a payload.", author="Attacker", ) # Steps to reproduce: # 1. Attacker uploads this package to PyPI. # 2. Victim runs: pyp2spec evil_package # 3. Victim runs: rpmbuild -bb evil_package.spec # 4. Command 'touch /tmp/pwned_by_cve' is executed on the build machine.

影响范围

pyp2spec < 0.14.1

防御指南

临时缓解措施
在无法立即升级pyp2spec的情况下,用户应避免直接对不可信的PyPI包使用pyp2spec生成的spec文件进行构建。在运行rpmbuild之前,必须人工审查生成的spec文件内容,特别是Summary、Description等直接来自PyPI元数据的字段,剔除任何包含'%'或可疑的宏指令,确保没有注入代码。

参考链接