在我的代码中,我从 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 期)
Abstract在运行时反序列化用户控制的对象流可以允许攻击者在
服务器,滥用应用程序逻辑或导致拒绝服务。
解释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 MBean 还使用 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 惠普
企业发展LP 13
发生。
有可以轻松使用的前瞻模式的现有实现,例如 Apache
公共 IO (org.apache.commons.io.serialization.ValidatingObjectInputStream)。
始终使用严格的白名单方法来仅反序列化预期类型。黑名单方法不
建议这样做,因为攻击者可以使用许多可用的小工具来绕过黑名单。另外,请记住
虽然一些实现代码执行的类是公开的,但可能还有其他一些类是公开的
未知或未公开,因此白名单方法始终是首选。白名单中允许的任何类别
应进行审核以确保反序列化是安全的。
为了避免拒绝服务攻击,建议您重写resolveObject(Object
obj) 方法,以便计算有多少对象正在被反序列化,并在以下情况下中止反序列化:
超过了阈值。
当反序列化发生在库或框架中时(例如,当使用 JMX、RMI、JMS、HTTP 调用程序时)
上述建议没有用,因为它超出了开发人员的控制范围。在这些情况下,您可以
希望确保这些协议满足以下要求:
- 未公开曝光。
- 使用身份验证。
- 使用完整性检查。
- 使用加密。
此外,HPE Security Fortify Runtime 还提供每次运行时强制执行的安全控制。
应用程序从 ObjectInputStream 执行反序列化,保护应用程序代码,但
还有来自此类攻击的库和框架代码。