2016-09-30 300 views
3

在我的代码中,我从从JMS队列接收的ObjectMessage对象中调用getObject()方法。 Fortify报告抱怨这个getObject()方法的错误名称是Dynamic Code Evaluation: Unsafe Deserialization。 基本上它说,我不应该反序列化不可信数据而不验证对象流的内容。以下是代码。 我应该如何以及使用什么方法来摆脱Fortify报告错误。如何在反序列化之前验证对象

if (message instanceof ObjectMessage) { 
    ObjectMessage objMessage = (ObjectMessage) message; 
    Object objReportMessage = objMessage.getObject(); 
.... 

这里是Fortify的报告的问题与建议。然后它将这个错误指向上面的代码objMessage.getObject();

动态代码评价:不安全反序列化(1号)

摘要 反序列化用户控制对象流在运行时可允许攻击者在 服务器,滥用应用逻辑执行任意代码或导致拒绝服务。

说明 Java序列变成对象图入含有物体本身和 必要的元数据至从字节流重建他们的字节流。开发人员可以在反序列化Java对象的过程中创建自定义代码以帮助 ,甚至可以用 不同的对象或代理替换反序列化的对象。定制的反序列化过程发生在对象返回到应用程序并转换为预期类型之前的对象 重建期间。到 开发人员尝试执行预期类型时,代码可能已经执行。 自定义反序列化例程在可序列化类中定义,它们需要存在于运行时类路径中,并且不能由攻击者注入,因此这些攻击的可利用性取决于应用程序环境中可用的类 。不幸的是,可能会滥用常见的第三方类或甚至JDK类来耗尽JVM资源,部署恶意文件或运行任意代码。 某些协议在传输层幕后使用Java序列化。 RMI和JMX是这些协议的例子。

示例1:下面是一个可公开暴露的RMI接口的示例,其中包含一个或多个参数为 的方法。当远程调用这些方法时,参数将在 服务器上反序列化,从而允许攻击者注入恶意对象图。

public interface MyService extends java.rmi.Remote { 
public Object doSomething (Object arg0) throws RemoteException; 
public Object doSomethingElse (Object arg0, Object arg1) throws 
RemoteException; 
... 
} 

实施例2:JMX的MBeans还使用Java序列来发送呼叫参数。在下面的例子中, MyManagedBean类方法将暴露给客户端。

MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); 
ObjectName name = new ObjectName("com.example:type=MyManagedBean"); 
MyManagedBean mbean = new MyManagedBean(); 
mbs.registerMBean(mbean, name); 

建议 如果可能的话,不要,而不用验证对象流的内容反序列化不可信数据。为了使 验证被反序列化的类,应该使用先行反序列化模式。 对象流将首先包含类描述元数据,然后包含它们的 成员字段的序列化字节。 Java序列化过程允许开发人员阅读类描述,并决定是继续对象的反序列化还是中止它。为此,需要 子类java.io.ObjectInputStream并提供 resolveClass(ObjectStreamClass desc)方法的自定义实现,其中类验证和验证应该是 2016年9月29日下午5:09 版权所有2015 Hewlett Packard Enterprise Development LP 13 发生。 可以很容易地使用先行模式的现有实现,例如Apache Commons IO(org.apache.commons.io.serialization.ValidatingObjectInputStream)。 始终使用严格的白名单方法来仅反序列化预期类型。建议黑名单方法不是 ,因为攻击者可以使用许多可用的小工具绕过黑名单。另外,请记住 ,尽管某些实现代码执行的类是众所周知的,但可能有其他未知或未公开的 ,因此总是首选白名单方法。应对白名单 中允许的任何课程进行审核,以确保反序列化的安全性。 为了避免拒绝服务攻击,建议您覆盖resolveObject(Object obj)方法,以便计算有多少个对象正在被反序列化,并在超出阈值时终止反序列化。 当反序列化发生在库或框架中(例如,当使用JMX,RMI,JMS,HTTP Invokers)时,上述建议没有用,因为它超出了开发人员的控制范围。在这些情况下,您可能需要确保这些协议符合以下要求: - 未公开公开。 - 使用验证。 - 使用完整性检查。 - 使用加密。 此外,每当 应用程序从ObjectInputStream执行反序列化时,HPE Security Fortify Runtime都会执行安全控制,保护应用程序代码,但也保护库和框架代码免受此类攻击。

+0

你不能,而且这个消息不能认真地表示这一点。 – EJP

+0

是的,我在网上找不到任何有用的东西,也许我理解错了,或者Fortify报告没有正确认识到问题。我刚刚编辑了这篇文章,并附上Fortify报告中的问题,请你帮我看一下吗?谢谢。 –

回答

3

看看ValidatingObjectInputStream。基本上,您将允许进行反序列化的类列入白名单(您应该根据所收集的信息来了解这些类)。然后验证器将检查元数据到序列化数据并拒绝不在白名单内的任何类。

3

如果您从建议中看到提示部分,即表示即使实施了前瞻ObjectInputStream,也会报告问题。因此,即使您能够解决问题,您也不会摆脱发现

但是,它看起来像您的代码使用JMS和JMS,您不控制反序列化。这是通过复制和粘贴的建议承认:

当反序列化发生在图书馆的地方,或框架(例如使用JMX,RMI,JMS,HTTP调用时),上述建议是没有用的,因为它超出了开发人员的控制。在这些情况下,您可能需要确保这些协议符合以下要求:

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

因此,您的真正解决方法是确保遵循这四个要点。你将不得不对你的连接进行研究,并且根据你的要求和限制,这可能是不可能的。