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:
 
 
 
[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)
 
 
 
 

Dynamic Code Evaluation:Unsafe Deserialization 动态代码评估:不安全反序列化的更多相关文章

  1. Fortify漏洞之Dynamic Code Evaluation: Code Injection(动态脚本注入)和 Password Management: Hardcoded Password(密码硬编码)

    继续对Fortify的漏洞进行总结,本篇主要针对  Dynamic Code Evaluation: Code Injection(动态脚本注入) 和 Password Management: Har ...

  2. Fortify Audit Workbench 笔记 Dynamic Code Evaluation: Code Injection

    Dynamic Code Evaluation: Code Injection Abstract 在运行时中解析用户控制的指令,会让攻击者有机会执行恶意代码. Explanation 许多现代编程语言 ...

  3. Dynamic Code Evaluation:Code Injection 动态代码评估:代码注入

  4. Dynamic Code Evolution for Java dcevm 原理

    在hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. 有两个概念需要 ...

  5. static 静态代码块 动态代码块 单例

    1. 共享,不属于对象,属于类,类成员变量,任何一个类的对象都有该属性,一旦被修改,则其他对象中的该属性也被更改. 2. 类中方法是static的,可以通过类名直接访问,不用new一个该类的对象. 3 ...

  6. 由阿里巴巴一道笔试题看Java静态代码块、静态函数、动态代码块、构造函数等的执行顺序

    一.阿里巴巴笔试题: public class Test { public static int k = 0; public static Test t1 = new Test("t1&qu ...

  7. 执行C#动态代码

    执行C#动态代码 using System; using System.Data; using System.Configuration; using System.Text; using Syste ...

  8. java动态代码的实现以及Class的卸载 (转至http://dustin.iteye.com/blog/46393)

    JavaWorld一篇题为 Add dynamic code to your application 的文章介绍了如何使用动态代理技术使普通的java源代码具有像jsp一样的动态编译效果,十分有趣.  ...

  9. 在Mac上使用Visual Studio Code开发/调试.NET Core代码

    .Net Core 1.0终于发布了,Core的一大卖点就是跨平台.这个跨平台不只是跨平台运行,而且可以跨平台开发.今天抽空研究了下在Mac下如何使用VS Code来开发.NET Core程序,并且调 ...

随机推荐

  1. 痞子衡嵌入式:恩智浦i.MX RTxxx系列MCU启动那些事(8)- 从Serial(1-bit SPI) NOR恢复启动

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是恩智浦i.MX RTxxx系列MCU的1-bit SPI NOR恢复启动. 在前几篇里痞子衡介绍的Boot Device都属于主动启动的 ...

  2. JAVA中空指针异常报错的几种可能坑你的情况

    一.局部变量覆盖掉其他变量导致无法使用. 在做Java客户管理的项目的时候,eclipse报出了个空指针异常的错误,但反复检查也并没感觉出错误,调用的数组给它初始化而且赋值了,但是编译器很顽强的报了一 ...

  3. 工作流Activity组件值数据传递获取问题

    如图:先简单说一下大致过程 通过具体的菜单节点,加载具体的指令组件.本着低耦合的原件,需要将核查组件从指令组件重拆分出来,作为单独的组件根据业务需要拖拽到指令组件中.但是具体业务方面核查组件一方面需要 ...

  4. 转:Spring配置文件<context:property-placeholder>标签使用漫谈

    <context:property-placeholder>标签提供了一种优雅的外在化参数配置的方式,不过该标签在Spring配置文件中只能存在一份!!! 众所周知,Spring容器是采用 ...

  5. lodash.memoize

    目录 _.memoize(func, [resolver]) 举例1: 获取J(1000000)的值 举例2: 斐波那契数列F(1000)的值 _.memoize(func, [resolver]) ...

  6. MyBatis_多表关联查询_resultMap_单个对象_N+1方式实现

    mapper 层 提供 StudentMapper 和 ClazzMapper, StudentMapper 查询所有学生信息, ClazzMapper 根据编号查询班级信息. 再 StudentMa ...

  7. leaflet图斑历史时空播放(附源码下载)

    前言 leaflet 入门开发系列环境知识点了解: leaflet api文档介绍,详细介绍 leaflet 每个类的函数以及属性等等 leaflet 在线例子 leaflet 插件,leaflet ...

  8. 2019牛客全国多校第八场A题 All-one Matrices(单调栈)

    题意:让你找最大不可扩展全1子矩阵的数量: 题解:考虑枚举每一行为全1子矩阵的的底,然后从左到右枚举:up[i][j]:表示(i,j)这个位置向上可扩展多少,同时还有记录每个位置(i,j)向左最多可扩 ...

  9. 度及拓扑图的使用-UESTC1958学霸周选课

    学霸周选课 Time Limit: 1000 MS     Memory Limit: 128 MB Submit Status 众所周知周大爷不仅编程了得,专业课成绩更是名列前茅,恰巧又到了选课的季 ...

  10. latex常用技巧

    画表格 \usepackage{multirow} \begin{tabular}{cccc} \hline \multicolumn{4}{c}{学生信息}\\ \hline 班级& 姓名& ...