forked from wooyunwang/Fortify
-
Notifications
You must be signed in to change notification settings - Fork 0
/
动态代码评估:不安全的反序列化
10 lines (10 loc) · 1.94 KB
/
动态代码评估:不安全的反序列化
1
2
3
4
5
6
7
8
9
10
如果可能,在没有验证对象流的内容的情况下,请勿对不可信数据进行反序列化。为了验证要进行反序列化的类,应使用前瞻反序列化模式。
对象流首先将包含类描述元数据,然后包含其成员字段的序列化字节。Java 序列化过程允许开发人员读取类描述,并确定是继续进行对象的反序列化还是中止对象的反序列化。为此,需要在应执行类验证和确认的位置,子类化 java.io.ObjectInputStream 并提供 resolveClass(ObjectStreamClass desc) 方法的自定义实现。
已有易于使用的前瞻模式实现方式,例如 Apache Commons IO ( org.apache.commons.io.serialization.ValidatingObjectInputStream)。始终使用严格的白名单方法,以仅允许对预期类型进行反序列化。不建议使用黑名单方法,因为攻击者可以使用许多可用小工具绕过黑名单。此外,请谨记,尽管用于执行代码的某些类已公开,但是还可能存在其他未知或未公开的类,因此,白名单方法始终都是首选方法。应审计白名单中允许的任何类,以确保对其进行反序列化是安全的。
为避免 Denial of Service,建议您覆盖 resolveObject(Object obj) 方法,以便计算要进行反序列化的对象数量,并在超过阈值时中止反序列化。
在库或框架(例如,使用 JMX、RMI、JMS、HTTP Invoker 时)中执行反序列化时,上述建议并不适用,因为它超出了开发人员的控制范围。在这些情况下,您可能需要确保这些协议满足以下要求:
- 未公开披露。
- 使用身份验证。
- 使用完整性检查。
- 使用加密。
此外,每当应用程序通过 ObjectInputStream 执行反序列化时,HPE Security Fortify Runtime(HPE Security Fortify 运行时)都会提供要强制执行的安全控制,以此同时保护应用程序代码以及库和框架代码,防止遭到此类攻击。