Làm thế nào để bytecode được xác minh trong JVM?Bytecode được xác minh như thế nào trong JVM?
Trả lời
Bản thân Oracle có một trang đoạn mã nhỏ về cách hoạt động here.
Về cơ bản, JRE không tin tưởng JDK. Đó là bởi vì nó không có kiến thức về trình biên dịch JDK nào đã tạo ra tệp lớp. Nó xử lý các tập tin lớp như thù địch cho đến khi xác minh.
Mở rộng trên đó, xác minh bytecode là một bước cần thiết để bảo vệ những gì mà Sun gọi là "trình biên dịch thù địch". Trình biên dịch Java của Sun đảm bảo mã nguồn Java không vi phạm các quy tắc an toàn, nhưng khi một ứng dụng nhập một đoạn mã, nó không thực sự là biết nếu đoạn mã tuân theo các quy tắc ngôn ngữ Java về an toàn. Nói cách khác, mã có thể không được sản xuất bởi trình biên dịch Java đáng tin cậy.
Trong trường hợp đó, hệ thống thời gian chạy Java trên máy của bạn phải giả định rằng phân đoạn đó là không hợp lệ và là đối tượng của nó để xác minh bytecode.
Máy ảo Java thậm chí không xem bytecode cho đến khi nó trải qua quá trình xác minh này. Làm điều này như bytecode được nạp cũng có lợi thế là toàn bộ rất nhiều kiểm tra thời gian chạy không cần phải được thực hiện mỗi khi mã được thực thi.Bởi vì nó đã được xác nhận là chính xác, nó có thể, một khi nó bắt đầu chạy, chạy nhanh hơn nếu không thì sẽ có thể.
Một rendition của sơ đồ liên kết dưới:
<<<=== Unsafe/Safe ===>>>
\
+---------------+ +-------------------+
| Java source | +--> | Class loader | --+
+---------------+ | | Bytecode verifier | |
| | +-------------------+ |
V | / |
+---------------+ | \ V
| Java compiler | Network / +-------------------+
+---------------+ | \ | JVM/JIT |
| | / +-------------------+
V | \ |
+---------------+ | / V
| Java bytecode | --+ \ +-------------------+
+---------------+ / | Operating system |
\ +-------------------+
/ |
\ V
/ +-------------------+
\ | Hardware |
/ +-------------------+
\
<<<=== Unsafe/Safe ===>>>
Nguồn thông tin tốt nhất có lẽ là phần có liên quan trong đặc điểm kỹ thuật JVM, 4.10 Verification of class Files.
Xem các liên kết để biết chi tiết, nhưng rộng rãi:
xác minh liên kết thời gian làm tăng hiệu suất của người phiên dịch. Kiểm tra chi phí mà nếu không sẽ phải được thực hiện để xác minh các ràng buộc tại thời gian chạy cho mỗi lệnh giải nghĩa có thể được loại bỏ. Máy ảo Java có thể giả định rằng các kiểm tra này đã được thực hiện. Ví dụ: Máy ảo Java sẽ biết những điều sau:
- Không có luồng tràn hoặc tràn dòng toán hạng.
- Tất cả các biến và sử dụng biến cục bộ đều hợp lệ.
- Các đối số cho tất cả các hướng dẫn của Máy ảo Java có các loại hợp lệ.
Trình xác minh cũng thực hiện xác minh có thể được thực hiện mà không cần nhìn vào mảng mã của thuộc tính Mã (§4.7.3). Séc được thực hiện bao gồm:
- Đảm bảo rằng các lớp cuối cùng không được phân loại và phương thức cuối cùng không bị ghi đè (§5.4.5).
- Kiểm tra xem mọi lớp học (trừ
Object
) có lớp cha trực tiếp hay không.- Đảm bảo rằng nhóm không đổi thỏa mãn các ràng buộc tĩnh được ghi lại; ví dụ, mỗi cấu trúc
CONSTANT_Class_info
trong hồ bơi không đổi chứa trong mụcname_index
mục của nó là chỉ số hồ bơi không đổi hợp lệ cho cấu trúcCONSTANT_Utf8_info
.- Kiểm tra tất cả tham chiếu trường và tham chiếu phương thức trong nhóm không đổi có tên hợp lệ, lớp hợp lệ và mô tả kiểu hợp lệ.
Có một vài trường hợp góc che khuất nơi đặc tả là mơ hồ hoặc hoàn toàn vi phạm bởi Hotspot VM. Nếu bạn chắc chắn rằng bytecode của bạn nên xác minh và không thể tìm ra lý do tại sao nó không, bạn cũng có thể hãy xem kho lưu trữ nguồn OpenJDK. – Antimony
Trong khi liên kết này có thể trả lời câu hỏi, tốt hơn nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở thành không hợp lệ nếu trang được liên kết thay đổi. - [Từ đánh giá] (/ review/low-quality-posts/10765467) –
@ AndréFratelli: Và quả thực nó không phải là câu trả lời tôi muốn thêm bây giờ (lưu ý rằng nó gần 7 tuổi ...). Nó không phải là một câu hỏi tôi muốn * trả lời * ngay bây giờ, thay vì đóng nó quá rộng. Tôi đã thêm * một số * chi tiết ở đây, nhưng nếu liên kết bị phá vỡ một lần nữa (nó đã được cố định hai lần ngày hôm nay, theo những cách khác nhau) nó vẫn sẽ không được hữu ích khủng khiếp. Đồng thời, trong khi câu hỏi vẫn chưa được xóa, tôi nghĩ rằng đó là một câu trả lời hữu ích để có ... –
- 1. Trách nhiệm của JVM bytecode verifier
- 2. Làm thế nào để chạy mã bytecode scala trên jvm?
- 3. NOP trong bytecode JVM được sử dụng cho là gì?
- 4. Bytecode là gì và JVM xử lý chúng như thế nào
- 5. Ngôn ngữ/thời gian hoạt động dựa trên JVM tạo ra bytecode Java như thế nào?
- 6. Tìm hiểu về Java bytecode và JVM
- 7. GroupMe đã xác minh số của tôi như thế nào?
- 8. Khóa công khai xác minh chữ ký như thế nào?
- 9. Cách đối sánh mẫu trong Scala được triển khai ở cấp độ bytecode như thế nào?
- 10. chú thích java được thể hiện như thế nào trong bytecode java
- 11. Làm thế nào tôi có thể kiểm tra mã bytecode JVM cho một chức năng clojure?
- 12. Nhận bytecode từ lớp được nạp
- 13. Làm thế nào để JVM xác minh không có tràn bộ đệm toán hạng tiềm năng khi tải một lớp?
- 14. Tính năng JVM liên tục được triển khai trong bánh như thế nào?
- 15. Scala có liên quan mạnh đến JVM như thế nào?
- 16. Tham chiếu tốt về cách scala được ánh xạ tới jvm bytecode
- 17. Xác minh ứng dụng/chữ ký của Android hoạt động như thế nào?
- 18. Tôi xác minh rằng người dùng đã cài đặt ứng dụng iPhone như thế nào?
- 19. Xác minh phương thức được gọi là
- 20. Java: Bắt Bytecode của Class tại Runtime từ bên trong JVM Cùng
- 21. khi java jvm biên dịch bytecode, mã đó đi đâu trong không gian quá trình?
- 22. Xác minh lỗi trong GCC
- 23. Khi nào cờ bộ chỉnh sửa truy cập bytecode JVM cờ 0x1000 (hex) "tổng hợp" được đặt?
- 24. Làm thế nào để sử dụng và xác minh độ chính xác quad trong gfortran?
- 25. Làm thế nào để xác minh Azure Load Balancer?
- 26. Làm cách nào để biên dịch mã assembly JVM thành bytecode?
- 27. Quy trình xử lý được xác định như thế nào?
- 28. Chính xác Thread.Sleep (TimeSpan) như thế nào?
- 29. Làm thế nào để xác minh với QTest rằng một ngoại lệ được ném?
- 30. Độc lập Bytecode Verifier
+1 cho hoang tưởng :) – dfa
Vấn đề không chỉ là trình biên dịch độc hại. Nếu ai đó thực sự cố gắng để viết một khai thác, họ có thể viết bytecode bằng tay, hoặc ít nhất là phần quan trọng. – Antimony
Nhưng trình xác minh không được bật (hoặc được thi hành) cho các lớp được nạp từ CLASSPATH địa phương đúng không? –