2012-03-11 70 views
7

Tôi đang cố gắng hiểu mô hình bảo mật được sử dụng khi JVM được yêu cầu tải các lớp.Mô hình bảo mật lớp học Java

Từ đặc tả JVM trên Hộp cát, tôi được cho rằng thực hiện JVM chuẩn nên duy trì ít nhất một khác ClassLoader, độc lập với primordial ClassLoader. Điều này được sử dụng để tải các tệp lớp ứng dụng (ví dụ từ một classpath được cung cấp).

Nếu lớp được yêu cầu từ ClassLoader đó không phải là ở đó là không gian tên, java/lang/String ví dụ, sau đó nó sẽ chuyển yêu cầu đến nguyên thủy ClassLoader, mà cố gắng để tải các lớp từ API Java, nếu nó không có ở đó thì nó ném một số NoClassDefFoundError.

Tôi có nghĩ rằng nguyên thủy ClassLoader chỉ tải các lớp từ không gian tên Java API và tất cả các lớp khác được tải thông qua triển khai ClassLoader riêng biệt?

Và điều này làm cho tải lớp an toàn hơn vì có nghĩa là lớp độc hại không thể giả mạo làm thành viên của API Java (giả sử java/lang/Virus) vì đây là vùng tên được bảo vệ và không thể sử dụng trong ClassLoader hiện tại ?

Nhưng có bất kỳ điều gì để ngăn các Lớp Java API bị thay thế bởi các lớp độc hại hoặc sẽ được phát hiện trong khi xác minh class?

+0

Về cơ bản là chính xác. ClassLoader "nguyên thủy" được gọi là "boot ClassLoader" và nạp các lớp từ "classpath boot". Việc bảo vệ được chi trả bởi điều này là hợp lý "mạnh", miễn là "nhân viên bảo mật" điều khiển lời gọi JVM (ví dụ, dòng lệnh), nơi đường dẫn lớp khởi động được chỉ định. –

+0

(Một vài JVM có bảo mật bổ sung trên đường dẫn lớp khởi động, yêu cầu các JAR có thuộc tính đặc quyền.) –

+0

@HotLicks Đường dẫn khởi động 'là nơi có thời gian chạy Java? – Jivings

Trả lời

7

Vì lý do lịch sử, tên được sử dụng cho trình tải lớp có chút khác biệt. Trình nạp lớp khởi động nạp các lớp hệ thống. Trình nạp lớp hệ thống, theo mặc định, tải các lớp từ đường dẫn lớp chứ không phải các lớp hệ thống. Các lớp hệ thống nằm trong jre/lib (chủ yếu là trong rt.jar), các thư mục được xác nhận và bất cứ nơi nào được thêm vào thông qua -Xbootclasspath.

Trên Sun/Oracle JRE, rt.jar chứa các lớp có gói bắt đầu bằng java., Javax., Sun., Com.sun., Org.omg, org.w3c và org.xml.

Mã không đáng tin cậy (bao gồm cả cấu hình) sẽ không thể thêm vào các lớp hệ thống. Một số tên gói có tiền tố có thể bị hạn chế thông qua một thuộc tính bảo mật. Java. tiền tố được bảo vệ đặc biệt chống lại vì lý do phi kỹ thuật.

Thông thường trình nạp lớp sẽ ủy nhiệm cho cha mẹ trước khi xác định một lớp mới, ngăn không cho bất kỳ lớp nào từ trình nạp tổ tiên bị thay thế. Java EE khuyến cáo (mặc dù lệnh cấm Java SE) có một số trình nạp lớp thích lớp riêng của chúng, thường là sử dụng API cập nhật hơn hoặc triển khai khác. Điều này cho phép che khuất các lớp, nhưng chỉ khi nhìn qua bộ nạp đó (và các con của nó). Tất cả các lớp khác tiếp tục liên kết với bản gốc.

+3

Bạn có âm thanh như JVM Spec. 'Vì lý do lịch sử' là lý do của họ cho tất cả mọi thứ;) – Jivings

+0

Cảm ơn điều này, rất hữu ích. – Jivings

+0

+1 "vì lý do lịch sử" – Javier

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