当前位置: 首页 > 知识库问答 >
问题:

是否可以不安全地访问JVM未使用的对象?

姬心思
2023-03-14

我有一个问题要问这里的JVM内部专家。

在Java虚拟机中,对象内容存储在堆内存中,直到被垃圾回收为止。通常,GC是在没有更多可用内存的情况下发生的,因此如果JVM有大量可用空间,那么GC发生之前可能需要很长时间。

从安全的角度来看,您能想象有人访问JVM内存并获得堆空间的转储,在那里可以找到等待GC的未使用对象吗?

我的意思是:如果我的程序处理敏感数据,并且在执行涉及这些敏感对象的过程后,我的应用程序编码方式不会留下对这些敏感对象的引用,那么恶意软件或系统管理员能否访问堆空间并对其进行分析以找到这些敏感数据?

Scala的使用在内存管理和垃圾收集方面有什么改变吗?

共有3个答案

那铭
2023-03-14

从安全的角度来看,您能想象有人访问JVM内存并获得堆空间的转储,在那里可以找到等待GC的未使用对象吗?

是的。

有多种方法可以做到这一点,如果“坏人”有特权,或者物理访问机器。

我的意思是:如果我的程序处理敏感数据,并且我的应用程序在执行后不会留下对这些敏感对象的引用。。。

不完全是这样。但是,如果您小心,您可以编写应用程序代码,以便在不再需要敏感数据时覆盖它。然而,这前提是您知道并且可以控制JVM中包含敏感数据的所有对象。

即便如此,还是会有时间窗口,有人可以从内存中获取数据。(请注意,对于任何编程语言都是如此!)

Scala的使用在内存管理和垃圾收集方面有什么改变吗?

这没什么区别。

徐鸿达
2023-03-14

在Java中,您可以做到这一点。您可以使用jmap转储堆并在VisualVM中查看丢弃的对象。AFAIK Scala与它使用的JVM相同。

此问题的通常解决方案是在丢弃对象之前覆盖该对象。要么使用char[]或StringBuilder使对象可变,要么使用反射覆盖对象

乐正育
2023-03-14

系统管理员当然可以访问JVM内存。作为最后的资源,他/她可以转储JVM进程内存并检查它。确实,您必须信任您将在其上执行的平台。

您可以通过在字符串(不可变)上使用char[][/code>,并在离开定义这些敏感数据的范围之前用零覆盖它们,来缩短这些敏感数据在内存中未加密可用的时间窗口,但在时间跨度内,这些数据将以明文形式可用。

在较低的级别,您可以加密内存,这仍然会在某个地方留下未加密的密钥。您还可以防止内存页面被交换,这无论如何都不会阻止转储,并且可能会影响性能,如果您的应用程序使用RAM的相关部分并且系统并不完全专注于此。无论如何,这些解决方案只会保护静态数据,而且据我所知,没有JVM实现它们。

使用Scala不会有太大变化,因为这是一个特定于JVM的问题,与编译为字节码的源语言无关。

 类似资料:
  • 我一直在思考jvm安全的工作方式。原则是,jvm始终信任并运行任何本地代码。因此,从概念上讲,如果您的代码没有显式或隐式调用<code>checkpermission(permission)</code>,这意味着它永远不会失败任何安全验证。当然,所有这些验证调用通常都是在JavaAPI类中完成的,因此我们不需要为内置权限调用它们。 现在,只要您使用内置类(如<code>FileOutputStr

  • 问题内容: 我有基于json的数据结构,其中包含嵌套对象。为了访问特定的数据元素,我一直将对对象属性的引用链接在一起。例如: 如果未定义b或bc,则将失败并显示错误。但是,我想获得一个值(如果存在的话),否则只是未定义。无需检查链中每个值是否存在的最佳方法是什么? 我想尽可能地保持这种方法,所以我不必添加大量的辅助方法,例如: 要么 我也想尝试避免使用try / catch构造,因为这不是错误,因

  • 问题内容: 我需要开发一个可长期离线运行的Web应用程序。为了使它可行,我无法避免将敏感数据(个人数据,而不是您将仅存储散列数据的类型)保存在本地存储中。 我接受不建议这样做,但是我几乎没有选择要执行以下操作来保护数据: 使用斯坦福JavaScript加密库和AES-256将所有内容都加密到本地存储中 用户密码是加密密钥,未存储在设备上 通过ssl从单个受信任的服务器提供所有内容(在线时) 使用o

  • 我已经读了很多关于这个问题有多严重的文章,并且了解了在我们公司正在生产的代码中找到它的可用选项,以及更新使用易受攻击版本的服务器。 我找不到的是,如果某个特定服务器没有安装Java,即如果我以root用户身份登录并运行并获取是否该服务器完全安全,因此我可以继续? 我最初的直觉是:没有Java—没有问题。但是,GitHub发布了其企业服务器的更新,声明: 关键:Log4j库中的远程代码执行漏洞,标识

  • 我们的许多代码是遗留的,但我们正在向“大数据”后端移动,我试图传播更新的API调用,鼓励使用最新的Spring库等。我们的问题之一是应用程序层ID生成。出于我不明白的原因,一个更高的权威想要序列的biginteger。我本可以在失败的插入中使用重新生成和重新尝试使它们随机,但我确实被否决了。 附言。我仍然认为我的随机生成的想法比处理所有这些线程的东西要好。大整数是一个大得离谱的数字,两次生成相同的

  • 我的Quarkus申请一直面临一个问题。该应用程序在本地开发模式下运行时可以正常工作,但是当它作为本地映像构建时,我面临一些奇怪的问题。 遇到的错误: 访问私有intjava.util.ArrayList.size的偏移量时,不首先将字段注册为不安全访问。 org.hibernate.type.serializationexception不能反序列化 java.io.InvalidClassExc