Tại sao PL / Python không đáng tin cậy?


11

Theo các tài liệu:

PL / Python chỉ có sẵn dưới dạng ngôn ngữ "không đáng tin cậy", có nghĩa là nó không cung cấp bất kỳ cách nào để hạn chế những gì người dùng có thể làm trong đó và do đó được đặt tên là plpythonu. Một biến thể plpython đáng tin cậy có thể trở nên khả dụng trong tương lai nếu một cơ chế thực thi an toàn được phát triển bằng Python.

Tại sao chính xác là khó phát triển một cơ chế thực thi an toàn cho Python mà không phải cho các ngôn ngữ khác như Perl?

Câu trả lời:


13

Nó liên quan đến mô hình đối tượng của Python - luôn có cách để tham chiếu đến các đối tượng có thể không an toàn. Xem tài liệu mô-đun rexecchương thực thi hạn chế của tài liệu để biết một số thông tin về các vấn đề, cũng như:

Các hạn chế không liên quan gì đến bản thân PostgreSQL, chúng vốn là bản triển khai trình thông dịch CPython hoặc thậm chí có thể là ngôn ngữ Python.

Một số ngôn ngữ khác đã kiểm tra thời gian chạy, như Perl, Java, JavaScript và Lua. Hầu hết trong số họ đã phải đối mặt với một loạt các vấn đề bảo mật vì môi trường thực thi hạn chế như vậy rất khó để bảo vệ chống lại tất cả các khai thác bẻ khóa có thể.

Thực sự không có gì ngăn cản PostgreSQL thêm trình thông dịch Python bán tự động, vì rexec là "đủ tốt" cho nhiều mục đích. PostgreSQL không có xu hướng quan tâm đến chỉ có thể - hầu hết là tốt - đủ - có thể. Nó chỉ có thể được chấp nhận nếu được đánh dấu chỉ là siêu người dùng, nhưng sau đó bạn luôn có thể cấp quyền truy cập cho nó cho người dùng cụ thể. Nó sẽ tốt hơn Python không đáng tin cậy.

Cá nhân tôi nghĩ rằng PL / V8 hoặc tương tự là tương lai ở đây, và muốn thấy nó tiến tới việc được hỗ trợ trong cốt lõi.

Tôi cũng mơ hồ khám phá ý tưởng về một Mono đáng tin cậy có thể tải các hội đồng "an toàn" được viết bằng C #, VB.NET, IronPython hoặc bất cứ điều gì nhưng không thể làm được gì nhiều về chủ đề đó.


Tôi chưa bao giờ xem đây là một lý do tại sao nó được coi là không đáng tin cậy. Theo mặc định, Java, V8, TCL, R và các thứ khác được coi là không đáng tin cậy. Lý do duy nhất Perl được tin cậy là bc họ gửi phiên bản Perl đáng tin cậy đặc biệt với
PostgreQuery

1
@ TheSteve0 Có thể bạn chưa từng thấy nó như vậy, nhưng đó là lý do tại sao nó lại như vậy. PostgreSQL đã từng có plpythonu và nó đã bị xóa sau khi rexecmô-đun Python không còn bảo mật, như được liên kết ở trên. Tôi tưởng tượng có lẽ một con trăn sử dụng PyPi có thể cung cấp một chế độ hạn chế mà PG có thể sử dụng. Tôi không nhìn xem có nhiều việc không. Bạn cũng không đúng về "phiên bản đáng tin cậy đặc biệt của Perl" - thực tế nó là Perl hoàn toàn bình thường, cùng một trình thông dịch được sử dụng cho plperl và plperlu. Sự khác biệt là cấu hình thời gian chạy.
Craig Ringer

@ TheSteve0 plperl cấu hình các phiên bản trình thông dịch Perl khác nhau khi chạy. Xem plperl.c để biết chi tiết về gorey, cụ thể pp_require_safeplperl_trusted_init. Tôi không biết đủ để có nhiều ý kiến ​​về sự an toàn thực sự của việc thực thi Perl bị hạn chế. Tôi muốn thấy một phiên bản đáng tin cậy của Lua hoặc để có được tư duy và chấp nhận tốt hơn, một trình thông dịch JavaScript đáng tin cậy. Nhưng những gì chúng ta có là plperl cho bây giờ.
Craig Ringer

@ TheSteve0 BTW, Java JVM sử dụng mã Java hoặc Groovy hoặc Mono VM sử dụng C # hoặc VB.NET dường như rất có ý nghĩa vì cả hai thời gian chạy đều có các tính năng quản lý bảo mật và hộp cát mạnh mẽ. Ví dụ như SecurityManager của Java. Nhưng thật không may, cả hai thời gian chạy đều sử dụng các mô hình thực thi khởi động nặng, phân luồng, chia sẻ mọi thứ theo mặc định, không phù hợp với mô hình fork (không có lỗi mặc định) của PostgreQuery. Họ không thực sự ngã ba () có thể. Vì vậy, chúng tôi không thể sử dụng chúng rất hiệu quả trong PostgreSQL.
Craig Ringer

Độc giả ở đây có thể quan tâm đến vấn đề GitHub này mà tôi đã thực hiện trong dự án Mono đang sử dụng Mono in fork () ing runtimes: github.com/mono/mono/issues/11857
Craig Ringer
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.