2017-08不安全的反序列化
不安全的反序列化会导致远程代码执行。即使反序列化缺陷不会导致远程代码执行,攻击者也可以利用它们来执行攻击,包括:重播攻击、注入攻击和特权升级攻击。
应用程序脆弱吗?
如果反序列化进攻者提供的敌意或者篡改过的对象将会使将应用程序和API变的脆弱。
两种主要类型的攻击:
1111111 如果应用中存在可以在反序列化过程中或者之后被改变行为的类,则攻击者可以通过改变应用逻辑或者实现远程代码执行攻击。我们将其称为对象和数据结构攻击。
222222 典型的数据篡改攻击,如访问控制相关的攻击,其中使用了现有的数据结构,但内容发生了变化。
序列化应用的对象:
远程和进程间通信(RPC / IPC)
连线协议、Web服务、消息代理
缓存/持久性
数据库、缓存服务器、文件系统
HTTP cookie、HTML表单参数、API身份验证令牌
防御
唯一安全的架构模式是:
不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体。
如果上述不可能的话,考虑使用下述方法:
1111111执行完整性检查,如:任何序列化对象的数字签名,以防止恶意对象创建或数据篡改。
222222在创建对象之前强制执行严格的类型约束,因为代码通常被期望成一组可定义的类。绕过这种技术的方法已经被证明,所以完全依赖于它是不可取的。
333333如果可能,隔离运行那些在低特权环境中反序列化的代码。
444444记录反序列化的例外情况和失败信息,如:传入的类型不是预期的类型,或者反序列处理引发的例外情况。
555555限制或监视来自于容器或服务器传入和传出的反序列化网络连接。
666666监控反序列化,当用户持续进行反序列化时,对用户进行警告。
攻击案例场景
**场景#1:**一个React应用程序调用了一组Spring Boot微服务。作为功能性程序员,他们试图确保他们的代码是不可变的。他们提出的解决方法是序列化用户状态,并在每次请求时来回传递。攻击者注意到了“R00”Java对象签名,并使用Java Serial Killer工具在应用服务器上获得远程代码执行。
**场景#2:**一个PHP论坛使用PHP对象序列化来保存一个“超级”cookie。该cookie包含了用户的用户ID、角色、密码哈希和其他状态:
a:4:{i:0;i:132;i:1;s:7:"Mallory";i:2;s:4:"user";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}
攻击者更改序列化对象以授予自己为admin权限:
a:4:{i:0;i:1;i:1;s:5:"Alice";i:2;s:5:"admin";
i:3;s:32:"b6a8b3bea87fe0e05022f8f3c88bc960";}