沙盒逃逸基础
沙盒
沙盒的基本概念
核心思想
“在隔离的容器中运行不可信代码,防止对主系统造成损害”
就像小孩子在沙盒里玩沙子一样 - 可以随意玩耍,但不会弄脏整个房间。
沙盒的主要特征
| 特征 | 说明 |
|---|---|
| 隔离性 | 与主机系统隔离,无法直接访问系统资源 |
| 受限访问 | 对文件系统、网络、硬件等访问受到限制 |
| 资源控制 | CPU、内存、磁盘使用量受到监控和限制 |
| 安全边界 | 明确的权限边界,防止越权操作 |
沙盒的常见类型
1. 编程语言沙盒
1 | # Python 沙盒示例 - 限制代码执行 |
2. 浏览器沙盒
- Web Workers: 在后台线程中运行 JavaScript
- iframe 沙盒: 限制嵌入式内容的权限
1 | <iframe sandbox="allow-scripts" src="untrusted.html"></iframe> |
3. 系统级沙盒
- Docker 容器: 应用级别的虚拟化
- 虚拟机: 完整的系统级隔离
- AppArmor/SELinux: 强制访问控制
沙盒的实际应用场景
1. 在线代码执行平台
1 | # LeetCode、HackerRank 等在线判题系统 |
2. 插件系统
1 | # 浏览器插件、IDE 插件等 |
3. 恶意代码分析
1 | # 安全实验室分析恶意软件 |
4. 区块链智能合约
1 | // Ethereum 智能合约在 EVM 沙盒中运行 |
沙盒逃逸
不同级别沙盒的逃逸难度
级别1:语言级别沙盒(最容易逃逸)
1 | # 攻击方法:利用Python反射机制 |
级别2:解释器级别沙盒(较难逃逸)
1 | # 攻击方法:寻找解释器漏洞 |
级别3:操作系统级别沙盒(很难逃逸)
1 | # 攻击方法:系统漏洞利用 |
级别4:硬件级别沙盒(极难逃逸)
1 | # 攻击方法:虚拟化漏洞 |
实际攻击场景分析
场景1:在线代码评测系统(LeetCode等)
1 | # 沙盒实现:删除危险内置函数 |
场景2:Python模板引擎(Jinja2等)
1 | # 沙盒实现:限制模板可访问的函数 |
场景3:配置化的沙盒
1 | # 沙盒实现:白名单机制 |
Python沙盒逃逸
Python沙盒逃逸主要针对的是第一种:语言级别沙盒,也就是最弱的那种。
对应的技术现实
1 | # 这种沙盒只是在Python层面做限制 |
CTF中的沙盒逃逸
1 | # 题目:计算用户输入的数学表达式,但禁用了eval |
逃逸的根本途径
1 | # 三条主要逃逸路径: |