如何在反序列化之前验证对象

2024-04-17

在我的代码中,我从 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 执行反序列化,保护应用程序代码,但 还有来自此类攻击的库和框架代码。


如果您查看建议中的提示部分,它指出即使实现了前瞻 ObjectInputStream,也会报告该问题。因此,即使您能够解决问题,你不会摆脱这个发现.

但是,您的代码似乎正在使用 JMS,并且使用 JMS,您无法控制反序列化。您复制和粘贴的建议可以识别这一点:

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

  • 没有公开曝光。
  • 使用身份验证。
  • 使用完整性检查。
  • 使用加密。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在反序列化之前验证对象 的相关文章

随机推荐

  • Spring MVC JSP 无法定位 Javascript 或 CSS

    这个问题似乎已经被问过几次了 但是在审查了太多次之后 我仍然看到这个问题 我的 Spring MVC 项目中的 jsp 无法找到任何 css 或 js 文件 即使它们在战争中并且给定的文件路径是正确的 根据我的配置 我看到两个错误 第一个是
  • 独立的 Visual Studio Code 工作区,针对不同的编程语言具有不同的扩展

    是否可以使用扩展分别创建不同的 Visual Studio Code 工作区 例如 工作区 1带有 C 扩展和工作区 2带有Python扩展 您可以安装扩展 然后在特定工作区上启用 禁用它们 打开工作区 在 扩展 面板中 单击每个扩展的齿轮
  • 在.VS 2015 NET 4.5中使用字符串插值和nameof

    我正在使用类似的东西 hello person and nameof arg1 在我的代码中 但在检查项目属性时 我的目标是 NET 4 5 这个可以吗 我以为这些东西是4 6引入的 该项目在我的机器上构建并运行良好 但我担心部署时会出现问
  • C# 中“decimal”类型的有趣行为

    如果我们将填充声明为 const 小数 则填充不起作用 mymoney 1 2 而你的钱 1 20 如何解释这种行为 class Program static void Main string args decimal balance 1
  • sklearn - 如何在one-hot编码时合并丢失的数据

    我试图保留数据集中包含缺失数据的行 当使用 sklearn 对一列 或多列 进行 one hot 编码时 是否可以写一个规则if currentItem null or if currentItem 0然后将输出数组设置为全0 e g A
  • 反对网站开发公司使用 JavaScript 框架的理由是什么? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我们公司构建网站和网络应用程序 我们是一家小公司 我们的开发团队总是从头开始构建 JavaScript 函数 或者从我们构建的其他网站复制 每当
  • 数组中每个索引的函数调用之间的javascript延迟[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 目标 对数组中的每个元素执行逻辑 W
  • Highcharts - 图表回流功能的问题

    这是fiddle http jsfiddle net uBUv9 6 我有问题width图表与切换侧边栏 我在SO的帮助下解决了这个问题post https stackoverflow com questions 23602167 issu
  • 使用 Azure Devops API 创建构建定义

    我们尝试使用 Azure Devops Rest API 复制另一个构建定义信息来创建构建定义 但出现以下错误 HttpError BadRequest 值不能为空 参数名称 定义 Repository Mappings Mapping S
  • 使用acts_as_paranoid插件进行软删除-验证怎么样?

    我正在尝试使用acts as paranoid 插件来软删除记录 我之前使用数据库中的标志来管理它 我知道这个插件会从搜索中省略一条记录 并查找该记录是否被软删除 我想知道的是我是否在模型中进行了验证 例如validates uniquen
  • 处理 Kafka Broker 宕机时的故障

    我有一个 Kafka 代理正在运行 消息已成功消费 但我想处理 Kafka 代理在 Kafka 消费者端出现故障的情况 我读过了this https github com spring projects spring kafka issue
  • 加快保存图像的速度 - iOS

    我正在研究更多的小型项目 这些项目稍后将包含在一个新项目中 它基本上是一个测试单元 我正在做的是创建一个AVCaptureSession然后创建一个方法OutputSampleBufferDelegate 在该方法中 我将sampleBuf
  • zlib.gzip 对于不同操作系统上的相同输入产生不同的结果

    以下代码 在 Node js v0 10 28 上 var zlib require zlib var buf new Buffer uncompressed zlib gzip buf function err result consol
  • 使用 jQuery 更正“全选”复选框

    http briancray com tests checkboxes index html http briancray com tests checkboxes index html select all 的实现方式很简单 但并不完美
  • 如何让 Iscroll 和 Lazy Load jQuery 插件一起工作?

    有没有机会让这两个插件一起工作 现在 如果我在带有图像的 div 中使用 iscroll 延迟加载将不会检测图像何时可见 Thanks EDIT 正如评论之一所述 我尝试在滚动上应用延迟加载 如下所示 onScrollMove functi
  • “Windows.Media.SpeechSynthesis”和“System.Speech.Synthesis”有什么不同?

    我正在尝试确定这两个 API 中的哪一个具有更多功能 可以在用 C 开发的专业应用程序中执行文本到语音转换 操作系统在这里不是问题 问题只是两个命名空间如何提供更多功能 高质量的声音和稳定性 有谁掌握这两种技术并可以告诉我这两个命名空间的不
  • 在 android 中启用静音模式而不触发请勿打扰

    我在这个问题上有点困难 在我的音量控制应用程序中 我尝试将系统声音配置文件设置为仅静音而不触发请勿打扰 我的应用程序有权修改 DND 设置和通知访问权限 没有任何问题 系统设置有一个静音配置文件 可以关闭免打扰 但我找不到使用音频管理器来做
  • 命令提示符中树的输出

    我希望能够使用 tree F A gt desktop file txt 命令仅输出文本文件 目前 它输出每个文件扩展名 有谁知道有一个简单的方法可以做到这一点 Tree仅接受几个命令行参数 c gt Tree Graphically di
  • 是否有类似 ICollection 的接口,但专为排序集合而设计?

    或者我可以毫无问题地使用 ICollection 吗 我的意思是 我不认为 ICollection 是为排序集合设计的 因为这可能会破坏为排序或未插入 ICollection 对象设计的应用程序 但我不知道 我会说ICollection 接
  • 如何在反序列化之前验证对象

    在我的代码中 我从 JMS 队列接收的 ObjectMessage 对象调用 getObject 方法 Fortify 报告抱怨这个 getObject 方法 其错误名称如下Dynamic Code Evaluation Unsafe De