Python sandboxing là khó . Python vốn dĩ không thể hướng nội, ở nhiều cấp độ.
Điều này cũng có nghĩa là bạn có thể tìm thấy các phương thức xuất xưởng cho các loại cụ thể từ chính các loại đó và xây dựng các đối tượng cấp thấp mới , sẽ được trình thông dịch trực tiếp chạy mà không giới hạn.
Dưới đây là một số ví dụ về việc tìm các cách sáng tạo để thoát ra khỏi hộp cát Python:
Ý tưởng cơ bản là luôn tìm cách tạo ra các loại Python cơ bản; các hàm và các lớp và thoát ra khỏi trình bao bằng cách yêu cầu trình thông dịch Python thực thi mã byte tùy ý (không được kiểm tra!).
Điều tương tự và nhiều hơn áp dụng cho exec
câu lệnh ( exec()
hàm trong Python 3).
Vậy bạn muốn:
Kiểm soát chặt chẽ việc biên dịch byte của mã Python hoặc ít nhất là xử lý hậu kỳ mã byte để loại bỏ mọi quyền truy cập vào tên bắt đầu bằng dấu gạch dưới.
Điều này đòi hỏi kiến thức sâu sắc về cách trình thông dịch Python hoạt động và cách cấu trúc mã byte của Python. Các đối tượng mã được lồng nhau; Ví dụ , mã byte của mô-đun chỉ bao gồm cấp độ câu lệnh cao nhất, mỗi hàm và lớp bao gồm chuỗi mã byte riêng của chúng cộng với siêu dữ liệu, có chứa các đối tượng mã byte khác cho các hàm và lớp được lồng vào nhau.
Bạn cần lập danh sách trắng các mô-đun có thể được sử dụng. Cẩn thận.
Một mô-đun python chứa các tham chiếu đến các mô-đun khác . Nếu bạn nhập os
, có một tên cục bộ os
trong không gian tên mô-đun của bạn tham chiếu đến os
mô-đun. Điều này có thể dẫn một kẻ tấn công xác định đến các mô-đun có thể giúp chúng thoát ra khỏi hộp cát. Các pickle
mô-đun, ví dụ, cho phép bạn tải đối tượng mã bất kỳ ví dụ, vì vậy nếu bất kỳ con đường thông qua module danh sách cho phép dẫn đến các pickle
mô-đun, bạn có một vấn đề vẫn còn.
Bạn cần hạn chế nghiêm ngặt hạn ngạch thời gian. Ngay cả mã trung tính nhất vẫn có thể cố gắng chạy mãi mãi, buộc tài nguyên của bạn.
Hãy xem RestrictedPython , công cụ này cố gắng cung cấp cho bạn quyền kiểm soát mã byte nghiêm ngặt. RestrictedPython
chuyển đổi mã Python thành một cái gì đó cho phép bạn kiểm soát tên, mô-đun và đối tượng nào được cho phép trong Python 2.3 đến 2.7.
Nếu RestrictedPython
đủ an toàn cho mục đích của bạn không phụ thuộc vào chính sách bạn thực hiện. Không cho phép truy cập vào tên bắt đầu bằng dấu gạch dưới và liệt kê hoàn toàn danh sách trắng các mô-đun sẽ là một sự khởi đầu.
Theo tôi, tùy chọn thực sự mạnh mẽ duy nhất là sử dụng một Máy ảo riêng biệt, một máy không có quyền truy cập mạng vào thế giới bên ngoài mà bạn phá hủy sau mỗi lần chạy. Mỗi tập lệnh mới được cung cấp một VM mới thay thế. Theo cách đó, ngay cả khi mã quản lý thoát ra khỏi hộp cát Python của bạn (điều không thể xảy ra), tất cả những kẻ tấn công đều có quyền truy cập trong thời gian ngắn và không có giá trị.