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: http://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) < sizeof(unsigned char) - 1).
  3. Lệnh đầu tiên trong chuỗi bytecode bắt đầu tại INDEX 0.
  4. Chỉ các mã byte hợp lệ với số toán tử chính xác có thể nằm trong chuỗi ByteCode.

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

  1. Mục tiêu của một hướng dẫn nhảy phải nằm trong ranh giới mã và phải nằm trên một hướng dẫn, không bao giờ giữa một hướng dẫn và toán hạng của nó.
  2. Hoạt động của lệnh LOAD_* phải là một chỉ mục hợp lệ vào cấu trúc dữ liệu tương ứng của nó.
  3. Hoạt động của lệnh STORE_* phải là một chỉ mục hợp lệ vào cấu trúc dữ liệu tương ứng của nó.

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

  1. Mỗi hướng dẫn chỉ phải được thực thi với số lượng đối số thích hợp trong ngăn xếp giá trị, bất kể đường dẫn thực thi dẫn đến việc gọi của nó.
  2. Nếu một lệnh có thể được thực thi dọc theo một số đường dẫn thực thi khác nhau, ngăn xếp giá trị phải có cùng độ sâu trước khi thực hiện lệnh, bất kể đường dẫn được thực hiện.
  3. Không có điểm nào trong quá trình thực thi có thể ngăn xếp giá trị phát triển đến độ sâu lớn hơn so với co_stacksize.
  4. Thực thi không bao giờ rơi ra khỏi đáy của co_code.

Thực hiện

PEP này là tài liệu làm việc cho triển khai xác minh mã Python byte được viết bằng Python. Việc triển khai này không được PVM sử dụng ngầm trước khi thực hiện bất kỳ mã byte nào, nhưng sẽ được sử dụng rõ ràng bởi người dùng liên quan đến Bytecode không hợp lệ với đoạn trích sau:

import verify
verify.verify(object)

Mô -đun verify cung cấp chức năng verify chấp nhận cùng loại đối số như Tools/scripts0: Các lớp, Phương thức, Hàm hoặc đối tượng mã. Nó xác minh rằng mã byte đối tượng được hình thành tốt theo các thông số kỹ thuật của PEP này.

Nếu mã được hình thành tốt, cuộc gọi đến verify sẽ âm thầm trả về không có lỗi. Nếu gặp phải lỗi, nó sẽ ném một Tools/scripts2 mà đối số cho biết nguyên nhân của sự thất bại. Tùy thuộc vào lập trình viên có nên xử lý lỗi theo một cách nào đó hay thực thi mã không hợp lệ bất kể.

Phillip Eby đã đề xuất một thuật toán mã giả cho xác minh độ sâu ngăn xếp mã byte được sử dụng bởi việc thực hiện tham chiếu.

Vấn đề xác minh

PEP này chỉ mô tả một số lượng nhỏ các xác minh. Mặc dù thảo luận và phân tích sẽ dẫn đến nhiều hơn nữa, nhưng rất có khả năng xác minh trong tương lai có thể cần phải được thực hiện hoặc xác minh tùy chỉnh theo dự án. Vì lý do này, có thể mong muốn thêm giao diện đăng ký xác minh vào việc thực hiện thử nghiệm để đăng ký các bộ xác minh trong tương lai. Nhu cầu về điều này là tối thiểu vì các bộ xác minh tùy chỉnh có thể phân lớp và mở rộng triển khai hiện tại cho hành vi bổ sung.

Thay đổi cần thiết

Armin Rigo lưu ý rằng một số mã byte sẽ cần sửa đổi để hiệu ứng ngăn xếp của chúng được phân tích tĩnh. Đây là Tools/scripts3, Tools/scripts4 và Tools/scripts5. Armin và Guido đã đồng ý về cách sửa các hướng dẫn. Hiện tại việc thực hiện Python punts trên các hướng dẫn này.

PEP này không đề xuất thêm bước xác minh vào trình thông dịch, mà chỉ để cung cấp triển khai Python trong thư viện tiêu chuẩn để sử dụng tùy chọn. Việc thủ tục xác minh này có được dịch thành C hay không, đi kèm với PVM hoặc được thực thi theo bất kỳ cách nào được để lại để thảo luận trong tương lai.

Người giới thiệu

Bản quyền

Tài liệu này đã được đặt trong phạm vi công cộng.