2012-10-04 61 views
5

在Linux機器(以及最可能的Unix機器)中生成的java堆轉儲限制了訪問權限。該堆只能由進程的所有者讀取(ACL掩碼設置爲600)。我明白這是出於安全原因。但是,我無法找到任何引用或解釋行爲的文檔。任何人都可以指向我的文檔(如果有的話)?另外,有什麼方法可以覆蓋這種行爲?Java堆轉儲權限

+1

不是一個完整的答案二進制文件,但線程轉儲可以包含**真的**機密信息,包括您的數據庫密碼。所以你最好讓他們安全。 –

+0

用'chmod'覆蓋它... ...? –

回答

-1

堆轉儲由作爲特定用戶運行的JVM進程寫入。就像任何文件由任何創建的Linux進程一樣,它將由該用戶擁有。

如果你想要實際的文檔,here it is。請參閱O_CREAT下的說明。

+0

我不相信這是由同一用戶創建任何其他文件。在我的環境中,我有umask用戶設置爲022.當我使用touch創建文件時,則文件權限爲644(rw-r-r-)。實際上,即使由java進程生成的日誌文件也具有umask指定的權限。但是,堆轉儲爲600(rw ----)。我相信JVM由於安全問題(bcos堆可能含有敏感數據)或使用導致此問題的系統調用而迅速設置permssns。我正在尋找解釋它的文檔以及用來覆蓋它的任何方法(h-dump不是optn之後的chmod) –

4

如果您對深度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 }