WHY:
分布式应用程序或那些需要在客户端或文件系统上存储状态的程序,可能正在使用对象序列化,具有公共倾听器或依赖于客户端维护状态的分布式应用程序,很可能允许对序列化数据进行篡改。这种攻击可使用于二进制格式,或基于文本的格式。
1,序列化机制允许创建任意数据类型;
2,有可用于将应用程序链接在一起的类,以反序列化期间或之后改变应用程序行为,或者使用非预期的内容来影响应用程序行为;
3,应用程序或API接受并反序列化攻击者提供的恶意对象,或者应用程序使用了不具有恰当防篡改控制的序列化不透明客户端状态。
4,安全状态发送到缺失了完整性控制的不受信客户端,很容易受到反序列化的攻击。
HOW:
唯一安全的架构模式是不接受来自不受信源的序列化对象,或使用只允许原始数据类型的序列化媒体。
1,对序列化对象执行完整性检查或加密,以防止恶意对象创建或数据篡改;
2,在创建对象之前强制执行严格的类型约束;
3,隔离反序列化的代码,使其在非常低的特权环境中运行;
4,记录反序列化的丽娃情况和失败信息,如:传入的类型不是预期的类型,或者反序列处理引发的例外情况;
5,限制或监视来自于容器或服务器传入和传出的反序列化网络连接;
6,监视反序列化,当用户持续进行反序列化时,对用户进行警告。
攻击案例场景
场景 #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”;}
攻 击 者 更 改 序 列 化 对 象 以 授 予 自 己 为 a d mi n 权 限 : a:4:{i:0;i:1;i:1;s:5:“Alice”;i:2;s:5:“admin”;
i:3;s:32:“b6a8b3bea87fe0e05022f8f3c88bc960”;}