Java堆转储权限

11

在Linux机器上生成的Java堆转储文件(很可能也适用于Unix机器)具有受限访问权限。堆只能被进程所有者读取(ACL掩码设置为600)。我理解这是出于安全原因。但是,我找不到任何参考或解释此行为的文档。是否有人可以指向文档(如果有的话)?此外,是否有办法覆盖这种行为?


2
虽然不是完整的答案,但线程转储可能包含非常机密的信息,包括您的数据库密码。因此,最好保护它们的安全。 - Tomasz Nurkiewicz
2个回答

5
如果您对JVM的深度内部感兴趣,可以查看OpenJDK的源代码。
这里是HeapDumper服务的链接:http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/9b0ca45cd756/src/share/vm/services/heapDumper.cpp 如果您深入挖掘,您会看到JVM正在创建具有S_IREAD | S_IWRITE的二进制文件。
 4373 // create binary file, rewriting existing file if required
 4374 int os::create_binary_file(const char* path, bool rewrite_existing) {
 4375   int oflags = O_WRONLY | O_CREAT;
 4376   if (!rewrite_existing) {
 4377     oflags |= O_EXCL;
 4378   }
 4379   return ::open64(path, oflags, S_IREAD | S_IWRITE);
 4380 }

0

堆转储是由JVM进程编写的,该进程作为特定用户运行。就像任何Linux进程创建的任何文件一样,它将归该用户所有。

如果您想要实际的文档,在这里查看O_CREAT下的描述。


我不相信它像创建同一用户的任何其他文件那样简单。在我的环境中,我为用户设置了umask为022。当我使用touch创建文件时,文件权限为644(rw-r-r-)。实际上,甚至Java进程生成的日志文件也具有由umask指定的权限。然而,堆转储始终为600(rw----)。我认为JVM是明确设置权限以确保安全性(因为堆可能包含敏感数据)或使用导致此情况的系统调用。我正在寻找解释它的文档以及任何覆盖它的方法(在h-dump之后进行chmod不是一个选项)。 - Abhilash Koneri
@AbhilashKoneri,问得有点晚了,但你成功覆盖了这个行为吗? - susenj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接