2012-04-23 51 views
12

Tôi đang cố giải quyết các đường dẫn chuẩn cho tất cả các tệp trong cây thư mục, nhưng vì một số lý do nó sẽ không giải quyết chúng (và liên tục mã bảo mật JVM sẽ giải quyết đúng liên kết tượng trưng) FilePermission và gây ra lỗi bảo mật).java sẽ không liên tục giải quyết các liên kết tượng trưng trên Linux

Env:

$ java -version 
java version "1.6.0_23" 
OpenJDK Runtime Environment (IcedTea6 1.11pre) (6b23~pre11-0ubuntu1.11.10.2) 
OpenJDK 64-Bit Server VM (build 20.0-b11, mixed mode) 

Một liên kết tượng trưng nổi tiếng trong hệ thống là /usr/share/java/gnome-java-bridge.jar:

$ ls -l /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar 
lrwxrwxrwx 1 root root 50 2012-02-24 13:39 /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar -> ../../../../../../share/java/gnome-java-bridge.jar 

Đoạn mã dưới đây sẽ giải quyết liên kết tượng trưng nổi tiếng này :

String symlinkedFilePath = 
    "/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar"; 

File symlinkedFile = new File(symlinkedFilePath); 

System.out.println(symlinkedFile.getAbsolutePath()); 
System.out.println(symlinkedFile.getCanonicalPath()); 

nhưng sản xuất:

/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar 
/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar 

Một thử nghiệm hơn nữa, bằng cách sử dụng đoạn mã sau, đôi khi sẽ trở lại đúng đối với việc kiểm tra sự cho phép, nhưng đôi khi sẽ trả về false:

String symlinkedFilePath = 
    "/usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar"; 

File symlinkedFile = new File(symlinkedFilePath); 

FilePermission recursivePermission = new FilePermission(
    symlinkedFile.getParentFile().getParent() + "/-", "read"); 

FilePermission filePermission = new FilePermission(
    symlinkedFile.getAbsolutePath(), "read"); 

System.out.println(recursivePermission); 
System.out.println(filePermission); 
System.out.println(
    "Can read symlink: " + recursivePermission.implies(filePermission)); 

Kết quả điển hình là:

(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read) 
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read) 
Can read symlink: true 

nhưng khi gỡ lỗi, nếu tôi bước qua việc tạo tệp FilePermission trên tệp đích, nội bộ đường dẫn được giải quyết cho liên kết tượng trưng và kết quả đầu ra là:

(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/- read) 
(java.io.FilePermission /usr/lib/jvm/java-6-openjdk/jre/lib/ext/gnome-java-bridge.jar read) 
Can read symlink: false 

Vấn đề là trong ngữ cảnh của ứng dụng trong đó việc kiểm tra quyền thực sự diễn ra, liên kết tượng trưng luôn được giải quyết bởi đối tượng FilePermission, nhưng không bao giờ bởi các cuộc gọi của riêng tôi tới file.getCanonicalPath() như được minh họa ở trên.

Điều này có hợp lý với bất kỳ ai không?

+1

Bạn có thể gửi báo cáo lỗi; Tôi không thể tạo lại vấn đề 'getCanonicalPath()' ban đầu với cả openjdk hoặc jdk mặt trời trên hệ thống Ubuntu 11.04 của tôi. – sarnold

+0

sarnold, bạn có đang sử dụng phiên bản OpenJDK chính xác không? Tự hỏi liệu có lẽ đó là vấn đề trong bản phát hành cụ thể không. hơn nữa, tôi chỉ phát hiện ra rằng tôi có thể nhận được các đường dẫn kinh điển để giải quyết 100% thời gian nếu tôi đặt -Dsun.io.useCanonCaches = false hoặc -Dsun.io.useCanonPrefixCache = false nhưng điều đó có vẻ kỳ quặc. – Ray

+0

Tôi xin lỗi vì tôi không nghĩ đến số phiên bản; 'java -version' báo cáo' OpenJDK Runtime Environment (IcedTea6 1.10.6) (6b22-1.10.6-0ubuntu1) '' OpenJDK 64-Bit Server VM (xây dựng 20.0-b11, chế độ hỗn hợp) '. – sarnold

Trả lời

4

Một đồng nghiệp của tôi đã xác nhận vấn đề trên OpenJDK 6u23, nhưng không phải trên bất kỳ phiên bản nào trước hoặc sau.Điều đó đang được nói, vì vấn đề này có

A) một công trình xung quanh theo hình thức sở hữu hệ thống

-Dsun.io.useCanonCaches=false 
OR 
-Dsun.io.useCanonPrefixCache=false 

B) xuất hiện để được giải quyết trong xây dựng sau (U24)

dường là động lực nhỏ để đào sâu hơn.

0

Trong Unix, liên kết tượng trưng là tệp "đặc biệt", với quyền riêng của nó.

Thực tế là bạn đã đọc quyền trên liên kết tượng trưng không ngụ ý bạn sẽ có nó cho tệp được liên kết.

Đoán của tôi ở đây là bạn đang chạy chương trình với tư cách người dùng có thể đọc liên kết tượng trưng chứ không phải tệp thực.

Khi vào chế độ gỡ lỗi, bạn kích hoạt cuộc gọi đến một số phương pháp thay đổi trạng thái bên trong của đối tượng FilePermission để nó giải quyết tệp thực và do đó trả lại cho bạn "false".

Khi bạn nhận được "true", nó chỉ cho bạn biết rằng bạn có thể đọc liên kết tượng trưng.

Ở vị trí của bạn, tôi sẽ kiểm tra sự cho phép trong hồ sơ này: - /usr/share/java/gnome-java-bridge.jar

và hai thư mục: -/usr/share -/usr/share/java

+0

Cả tệp và liên kết tượng trưng đều "đọc" cho "khác" vì vậy điều này có vẻ không phải là vấn đề, cũng như các thư mục trong cấu trúc phân cấp. – Ray

Các vấn đề liên quan