在运行时对用户控制的对象流进行反序列化,会让攻击者有机会在服务器上执行任意代码、滥用应用程序逻辑和/或导致 Denial of Service。

在这里插入图片描述

Abstract:

在运行时对用户控制的对象流进行反序列化,会让攻击者有机会在服务器上执行任意代码、滥用应用程序逻辑和/或导致 Denial of Service。

Explanation:

Java 序列化会将对象图转换为字节流(包含对象本身和必要的元数据),以便通过字节流进行重构。开发人员可以创建自定义代码,以协助 Java 对象反序列化过程,在此期间,他们甚至可以使用其他对象或代理替代反序列化对象。在对象重构过程中,并在对象返回至应用程序并转换为预期的类型之前,会执行自定义反序列化过程。到开发人员尝试强制执行预期的类型时,代码可能已被执行。

在必须存在于运行时类路径中且无法由攻击者注入的可序列化类中,会自定义反序列化例程,所以这些攻击的可利用性取决于应用程序环境中的可用类。令人遗憾的是,常用的第三方类,甚至 JDK 类都可以被滥用,导致 JVM 资源耗尽、部署恶意文件或运行任意代码。

某些 Spring 服务导出工具会在传输层后台使用 Java 序列化。这些服务的示例包括 RMI、JMSInvoker 和 HTTPInvoker。

例 1: RMIServiceExporter 暴露 TestService 方法。

<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.remoting.rmi.RmiServiceExporter">
    <property name="serviceName" value="TestService"/>
    <property name="service" ref="testService"/>
    <property name="serviceInterface" value="example.TestService"/>
    <property name="registryPort" value="1199"/>
</bean>

例 2: JMSInvokerServiceExporter 暴露 TestService 方法。

<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.jms.remoting.JmsInvokerServiceExporter">
        <property name="serviceInterface" value="example.TestService"/>
        <property name="service" ref="testService"/>
</bean>

例 3: HTTPInvokerServiceExporter 暴露 TestService 方法。

<bean id="testService" class="example.TestServiceImpl"/>
<bean class="org.springframework.remoting.httpinvoker.HttpInvokerServiceExporter">
        <property name="serviceInterface" value="example.TestService"/>
        <property name="service" ref="testService"/>
</bean>
Instance ID: 33720C3BC89BFC973841923D44225B8D
 
Priority Metadata Values:
 
            IMPACT: 5.0
 
            LIKELIHOOD: 3.2
 
Legacy Priority Metadata Values:
 
            SEVERITY: 5.0
 
            CONFIDENCE: 5.0
 
 
Remediation Effort: 4.0

Recommendations:

如果可能,在没有验证对象流的内容的情况下,请勿对不可信数据进行反序列化。为了验证要进行反序列化的类,应使用前瞻反序列化模式。

对象流首先将包含类描述元数据,然后包含其成员字段的序列化字节。Java 序列化过程允许开发人员读取类描述,并确定是继续进行对象的反序列化还是中止对象的反序列化。为此,需要在应执行类验证和确认的位置,子类化 java.io.ObjectInputStream 并提供 resolveClass(ObjectStreamClass desc) 方法的自定义实现。

在这种情况下,理想的方法是将预期的类加入白名单,但在某些情况下,此方法不一定可行。对于复杂的对象图结构,黑名单方法更适合。请谨记,尽管用于执行代码的某些类已公开,但是还可能存在其他未知或未公开的类,因此,白名单方法始终都是首选方法。为避免 Denial of Service,建议您覆盖 resolveObject(Object obj) 方法,以便计算要进行反序列化的对象数量,并在超过阈值时中止反序列化。

在库或框架(例如,使用 JMX、RMI、JMS、HTTP Invoker 时)中执行反序列化时,上述建议并不适用,因为它超出了开发人员的控制范围。在这些情况下,您可能需要确保这些协议满足以下要求:

  • 未公开披露。
  • 使用身份验证。
  • 使用完整性检查。
  • 使用加密。

此外,每当应用程序通过 ObjectInputStream 执行反序列化时,HPE Security Fortify Runtime(HPE Security Fortify 运行时)都会提供要强制执行的安全控制,以此同时保护应用程序代码以及库和框架代码,防止遭到此类攻击。

References:

[1] HPE Security Fortify Application Defender, http://www8.hp.com/us/en/software-solutions/appdefender-application-self-protection/

[2] Oracle, Java Serialization, https://docs.oracle.com/javase/tutorial/jndi/objects/serial.html

[3] IBM, Look-ahead Java deserialization, http://www.ibm.com/developerworks/library/se-lookahead

[4] OWASP, Deserialization of untrusted data, https://www.owasp.org/index.php/Deserialization_of_untrusted_data

[5] Standards Mapping - Common Weakness Enumeration, CWE ID 502

[6] Standards Mapping - FIPS200, SI

[7] Standards Mapping - NIST Special Publication 800-53 Revision 4, SI-10 Information Input Validation (P1)

[8] Standards Mapping - OWASP Mobile Top 10 Risks 2014, M7 Client Side Injection

[9] Standards Mapping - OWASP Top 10 2004, A6 Injection Flaws

[10] Standards Mapping - OWASP Top 10 2007, A2 Injection Flaws

[11] Standards Mapping - OWASP Top 10 2010, A1 Injection

[12] Standards Mapping - OWASP Top 10 2013, A1 Injection

[13] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1, Requirement 6.5.6

[14] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2, Requirement 6.3.1.1, Requirement 6.5.2

[15] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0, Requirement 6.5.1

[16] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0, Requirement 6.5.1

[17] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1, Requirement 6.5.1

[18] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2, Requirement 6.5.1

[19] Standards Mapping - SANS Top 25 2009, Insecure Interaction - CWE ID 116

[20] Standards Mapping - Security Technical Implementation Guide Version 3.1, APP3510 CAT I, APP3570 CAT I

[21] Standards Mapping - Security Technical Implementation Guide Version 3.10, APP3510 CAT I, APP3570 CAT I

[22] Standards Mapping - Security Technical Implementation Guide Version 3.4, APP3510 CAT I, APP3570 CAT I

[23] Standards Mapping - Security Technical Implementation Guide Version 3.5, APP3510 CAT I, APP3570 CAT I

[24] Standards Mapping - Security Technical Implementation Guide Version 3.6, APP3510 CAT I, APP3570 CAT I

[25] Standards Mapping - Security Technical Implementation Guide Version 3.7, APP3510 CAT I, APP3570 CAT I

[26] Standards Mapping - Security Technical Implementation Guide Version 3.9, APP3510 CAT I, APP3570 CAT I

[27] Standards Mapping - Security Technical Implementation Guide Version 4.1, APSC-DV-001480 CAT II, APSC-DV-001490 CAT II, APSC-DV-002560 CAT I

[28] Standards Mapping - Web Application Security Consortium Version 2.00, Improper Input Handling (WASC-20)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值