沙箱逃逸漏洞
定义与原理
沙箱逃逸(Sandbox Escape)是攻击者利用沙箱环境中的安全缺陷,突破其隔离限制,获取更高权限或访问敏感系统资源的技术。沙箱的核心功能是通过资源限制、权限控制和执行隔离等手段,将潜在恶意代码与系统隔离。然而,当沙箱实现存在漏洞时,攻击者可绕过这些限制,执行未授权操作,如读取文件、执行系统命令或访问网络。
技术实现方式
- 利用沙箱配置缺陷
- 高危函数未禁用:沙箱若未移除
eval
、exec
、os
、subprocess
等模块,攻击者可直接调用危险函数。例如,通过__import__('os').system('id')
执行系统命令。- 白名单机制绕过:若沙箱仅允许预定义模块,攻击者可能通过动态导入或字符串拼接(如
b64d
.decode('rot13')解码为
os`)绕过限制。- 利用沙箱环境漏洞
- 内置对象继承链:通过
''.__class__.__mro__[-1].__subclasses__()
遍历子类,找到包含系统模块的类(如warnings.catch_warnings
的_module
属性包含sys
模块)。- 文件操作绕过:使用
types.FileType
或codecs.open
读取文件,或通过子类索引(如().__class__.__bases__[0].__subclasses__()[40]('/etc/passwd').read()
)访问敏感数据。- 利用第三方组件漏洞
- Redis Lua沙箱逃逸:Debian/Ubuntu发行版在打包Redis时,遗留了Lua沙箱中的
package
对象。攻击者可利用package.loadlib
加载动态链接库(如liblua5.1.so.0
),执行任意命令。- Node.js沙箱逃逸:通过
vm.createContext
创建的沙箱中,若未隔离process
模块,攻击者可利用this.toString.constructor
获取构造函数,进而调用process.mainModule.require('child_process').execSync('whoami')
执行命令。- 恶意代码混淆与编码
- 属性链分割:使用
getattr
或|attr()
绕过点号过滤(如request|attr('application')|attr('__globals__')['os'].system('id')
)。- 编码混淆:通过Base64、ROT13编码命令字符串(如
eval('X19pbXBvcnRfXygnb3MnKS5zeXN0ZW0oJ2lkJyk='.decode('base64'))
)绕过关键字检测。
典型应用场景
- 恶意软件分析逃逸:恶意软件检测沙箱环境后,通过延迟执行、模拟用户行为或利用沙箱漏洞隐藏攻击意图。例如,检查注册表项(如
HKEY_LOCAL_MACHINE\HARDWARE\Description\System
)或MAC地址识别虚拟机,仅在真实系统中释放恶意载荷。- Web应用攻击:在模板注入(如Jinja2 SSTI)中,通过
{{config}}
泄露密钥或利用类继承链调用os
模块。- 云服务攻击:攻击者利用容器或虚拟机沙箱的共享内核漏洞(如Dirty COW)逃逸,横向移动至其他租户环境。
防御措施与最佳实践
- 禁用高危函数:在沙箱配置中移除
eval
、exec
、os
、subprocess
等模块,清除__builtins__.__dict__
中的敏感函数。- 实施白名单机制:仅允许预定义的模块和函数,严格限制API访问权限。
- 使用专用沙箱环境:采用RestrictedPython、PyPy沙盒或Docker容器隔离,限制全局状态访问和资源使用。
- 输入过滤与静态渲染:拦截
{{
、__class__
、__import__
等敏感符号,优先使用静态模板渲染而非动态拼接。- 日志审计与行为监控:记录异常代码执行行为,实时检测沙箱内可疑操作。
- 及时更新与补丁管理:修复已知漏洞(如Redis Lua沙箱的
package
遗留问题),升级至最新版本。
案例分析
CVE-2017-5524(Plone CMS沙盒绕过):攻击者利用未过滤的Python字符串格式化方法,泄露敏感数据。
CVE-2022-0543(Redis Lua沙箱逃逸):Debian/Ubuntu发行版在Lua沙箱中遗留
package
对象,攻击者加载动态链接库执行任意命令。修复方法为在Lua初始化末尾添加package=nil
。
结语
低谷期是用来升级的
不是用来躺平的
!!!