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
?
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. –
(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.) –
@HotLicks Đường dẫn khởi động 'là nơi có thời gian chạy Java? – Jivings