Hướng dẫn python bytecode virtual machine - máy ảo mã byte python

Trước tiên, bạn sẽ cần viết một trình biên dịch Python [không phải trình thông dịch], bằng bất kỳ ngôn ngữ nào, tốt nhất là Python. Lần chạy đầu tiên của trình biên dịch sẽ cần được chạy qua trình thông dịch.

Sau đó, bạn sẽ biên dịch trình biên dịch của mình với chính nó, dẫn đến một trình biên dịch gốc không cần trình thông dịch.

Sau đó, bạn có thể sử dụng trình biên dịch để biên dịch bất kỳ Python nào cho mã gốc.

Quá trình này được gọi là bootstrapping, và được nhiều người, nếu không phải là hầu hết, các trình biên dịch chính cho nhiều ngôn ngữ.

Bạn có thể đọc thêm về quy trình này tại đây: //en.wikipedia.org/wiki/bootstrapping_[compilers]

Đối với việc tạo một hệ điều hành, bạn sẽ cần phải thực hiện, ở mức tối thiểu, một trình thông dịch Python, nếu bạn muốn tránh mã được biên dịch. Nếu bạn viết một trình thông dịch Python làm vi mạch, bạn có thể viết phần còn lại của hệ điều hành trong Python. [Chỉnh sửa: Tôi đã vô tình mô tả Cleese, mà Jiaaro đã đề cập :]]

Tác giả: MICHEL PELLETIER TRƯỜNG HỢP: DEFFEREDTYPE: Tiêu chuẩn theo dõi: 17-Jun-2004Python-Version: 2.6post-History::Michel Pelletier Status:RejectedType:Standards TrackCreated:17-Jun-2004Python-Version:2.6Post-History:
Mục lục
  • trừu tượng
  • Tuyên bố
  • Động lực
  • Các ràng buộc tĩnh trên các hướng dẫn mã byte
  • Các ràng buộc tĩnh trên toán hạng hướng dẫn mã byte
  • Các ràng buộc cấu trúc giữa các hướng dẫn mã byte
  • Thực hiện
  • Vấn đề xác minh
  • Thay đổi cần thiết
  • Người giới thiệu
  • Bản quyền

trừu tượng

Tuyên bố

Động lực

Tuyên bố

Động lực

Các ràng buộc tĩnh trên các hướng dẫn mã byte

Động lực

Các ràng buộc tĩnh trên các hướng dẫn mã byte

Các ràng buộc tĩnh trên toán hạng hướng dẫn mã byte

Các ràng buộc cấu trúc giữa các hướng dẫn mã byte

Có thể hình dung, mã byte không được hình thành có thể khai thác trình thông dịch và cho phép mã byte Python thực thi các hướng dẫn máy cấp C tùy ý hoặc sửa đổi các cấu trúc dữ liệu nội bộ riêng tư trong trình thông dịch. Nếu được sử dụng khéo léo, điều này có thể lật đổ bất kỳ hình thức chính sách bảo mật nào mà ứng dụng có thể muốn áp dụng cho các đối tượng của nó.

Trên thực tế, một người dùng độc hại sẽ rất khó để tiêm mã byte không hợp lệ vào PVM cho mục đích khai thác, nhưng không phải là không thể. Các cuộc tấn công tràn bộ nhớ và các cuộc tấn công ghi đè bộ nhớ thường được hiểu, đặc biệt khi tải trọng khai thác được truyền không được mã hóa trên mạng hoặc khi một điểm yếu cho phép tệp hoặc bảo mật mạng được sử dụng làm chỗ đứng cho các cuộc tấn công tiếp theo.

Lý tưởng nhất là không có mã byte nào được phép đọc hoặc ghi các cấu trúc dữ liệu cấp C bên dưới để lật đổ hoạt động của PVM, cho dù mã byte có được chế tạo độc hại hay không. Một bước xác minh trước khi thực hiện đơn giản có thể đảm bảo rằng ByteCode không thể vượt quá/làm nền tảng cho ngăn xếp giá trị hoặc truy cập các khu vực nhạy cảm khác của không gian chương trình PVM khi chạy.

PEP này đề xuất một số bước xác nhận nên được thực hiện trên mã byte python trước khi nó được thực thi bởi PVM để nó biên dịch với các ràng buộc cấu trúc và tĩnh trên các hướng dẫn và toán hạng của chúng. Các bước này rất đơn giản và bắt được một lớp lớn mã byte không hợp lệ có thể gây ra sự cố. Cũng có một số khả năng rằng một số kiểm tra thời gian chạy có thể được loại bỏ phía trước bằng một thẻ xác minh.

Tất nhiên, không có cách nào để xác minh rằng mã byte là hoàn toàn an toàn, đối với mọi định nghĩa hoàn toàn và an toàn. Ngay cả với việc xác minh mã byte, các chương trình Python có thể và rất có thể trong tương lai sẽ bị lỗi vì nhiều lý do và tiếp tục gây ra nhiều loại lỗi thời gian chạy khác nhau, gây tử vong hay không. Bước xác minh được đề xuất ở đây chỉ đơn giản là cắm một lỗ dễ dàng có thể gây ra một lớp lớn các lỗi gây tử vong và tinh tế ở cấp độ byte.

Hiện tại, máy ảo Java [JVM] xác minh mã byte Java theo cách rất giống với những gì được đề xuất ở đây. Do đó, đặc điểm kỹ thuật của JVM phiên bản 2 [1], phần 4.8 và 4.9 được sử dụng làm cơ sở cho một số ràng buộc được giải thích dưới đây. Bất kỳ việc thực hiện xác minh mã Python nào ở mức tối thiểu phải thực thi các ràng buộc này, nhưng có thể không giới hạn ở chúng.

Các ràng buộc tĩnh trên các hướng dẫn mã byte

  1. Chuỗi bytecode không được trống. [len[co_code] > 0].
  2. Chuỗi bytecode không thể vượt quá kích thước tối đa [len[co_code]

Bài Viết Liên Quan

Chủ Đề