ทำไม PL / Python ไม่น่าเชื่อถือ


11

ตามเอกสาร:

PL / Python มีเฉพาะภาษาที่ "ไม่น่าเชื่อถือ" ซึ่งหมายความว่ามันไม่ได้มีวิธี จำกัด การใช้งานสิ่งที่ผู้ใช้สามารถทำได้และจึงตั้งชื่อว่า plpythonu ตัวแปรที่เชื่อถือได้ plpython อาจมีให้ใช้ในอนาคตหากกลไกการดำเนินการที่ปลอดภัยได้รับการพัฒนาใน Python

ทำไมมันยากที่จะพัฒนากลไกการดำเนินการที่ปลอดภัยสำหรับ Python แต่ไม่ใช่สำหรับภาษาอื่นเช่น Perl?

คำตอบ:


13

ต้องทำอย่างไรกับโมเดลวัตถุของ Python - มีวิธีการอ้างอิงวัตถุที่อาจไม่ปลอดภัยอยู่เสมอ ดูเอกสารประกอบโมดูล rexecและบทบังคับใช้ของเอกสารสำหรับข้อมูลบางอย่างเกี่ยวกับปัญหารวมถึง:

ข้อ จำกัด ไม่ใช่สิ่งที่เกี่ยวข้องกับ PostgreSQL ของตนเอง แต่มีอยู่ในการใช้งานล่าม CPython หรือแม้แต่ภาษา Python

ภาษาอื่นบางภาษาได้ตรวจสอบ runtimes เช่น Perl, Java, JavaScript และ Lua ส่วนใหญ่ของพวกเขาประสบปัญหาด้านความปลอดภัยเช่นสภาพแวดล้อมการปฏิบัติที่ จำกัด ดังกล่าวเป็นเรื่องยากมากที่จะป้องกันการจู่โจมแหกคุกที่เป็นไปได้ทั้งหมด

ไม่มีอะไรจะหยุด PostgreSQL จากการเพิ่มล่าม Python แบบ semitrusted เนื่องจาก rexec นั้น "ดีพอ" สำหรับหลาย ๆ วัตถุประสงค์ PostgreSQL ไม่ได้มีแนวโน้มที่จะกระตือรือร้นในเรื่องส่วนใหญ่เท่านั้นค่อนข้างดีพอบางที มันอาจจะได้รับการยอมรับก็ต่อเมื่อทำเครื่องหมาย superuser เท่านั้น แต่คุณสามารถให้สิทธิ์การเข้าถึงแก่ผู้ใช้บางรายได้ มันจะดีกว่า Python ที่ไม่น่าเชื่อถือ

โดยส่วนตัวฉันคิดว่า PL / V8 หรือที่คล้ายกันเป็นอนาคตที่นี่และอยากจะเห็นว่ามันเคลื่อนไปสู่การได้รับการสนับสนุนในแกนกลาง

ฉันได้สำรวจแนวคิดของโมโนที่เชื่อถือได้อย่างชัดเจนซึ่งสามารถโหลดแอสเซมบลี "ปลอดภัย" ที่เขียนใน C #, VB.NET, IronPython หรืออะไรก็ตามแต่ไม่สามารถทำอะไรได้มากมายในหัวข้อนั้น


ฉันไม่เคยเห็นสิ่งนี้มาเป็นเหตุผลว่าทำไมจึงถือว่าไม่น่าเชื่อถือ ตามค่าเริ่มต้น Java, V8, TCL, R และอื่น ๆ ถือว่าไม่น่าเชื่อถือ เหตุผลเดียวที่ Perl เชื่อถือได้คือ bc พวกเขาจัดส่ง Perl รุ่นที่เชื่อถือได้พิเศษด้วย PostgreSQL postgresql.org/docs/11/plperl-trusted.html
TheSteve0

1
@ TheSteve0 คุณอาจไม่เคยเห็นมาก่อน แต่นั่นเป็นสาเหตุว่าทำไม PostgreSQL เคยมี plpythonu และมันถูกลบออกหลังจากที่เลิกใช้งานrexecโมดูลPython ว่าไม่ปลอดภัยโดยเนื้อแท้ตามที่ลิงก์ด้านบน ฉันคิดว่าบางที plpython ที่ใช้ PyPi อาจสามารถส่งโหมด จำกัด ที่ Pg สามารถใช้งานได้ ฉันไม่ได้ดูว่ามีงานมาก คุณไม่ถูกต้องเกี่ยวกับ "รุ่นพิเศษที่เชื่อถือได้ของ Perl" ด้วยเช่นกัน - ในความเป็นจริงแล้ว Perl ธรรมดาอย่างสมบูรณ์แบบ, ล่ามเดียวกันนี้ใช้สำหรับ plperl และ plperlu ข้อแตกต่างคือการกำหนดค่ารันไทม์
Craig Ringer

@ TheSteve0 plperl กำหนดค่าอินสแตนซ์ล่าม Perl ต่างกันที่รันไทม์ ดูplperl.cสำหรับรายละเอียด Gorey โดยเฉพาะและpp_require_safe plperl_trusted_initฉันไม่รู้พอที่จะมีความเห็นมากมายเกี่ยวกับความปลอดภัยที่แท้จริงของการบังคับใช้ Perl แบบ จำกัด ฉันต้องการดูรุ่นที่เชื่อถือได้ของ Lua หรือเพื่อให้ได้สติปัญญาและการยอมรับที่ดีขึ้นซึ่งเป็นล่าม JavaScript ที่เชื่อถือได้ แต่สิ่งที่เรามีก็คือตอนนี้
Craig Ringer

@ TheSteve0 BTW, Java JVM โดยใช้โค้ด Java หรือ Groovy หรือ Mono VM ที่ใช้ C # หรือ VB.NET ดูเหมือนจะเหมาะสมกว่าเนื่องจากทั้งสองช่วงเวลามีแซนด์บ็อกซ์และคุณลักษณะการจัดการความปลอดภัยที่แข็งแกร่ง SecurityManager ของ Java เช่น แต่น่าเสียดายที่ทั้งสอง runtimes ใช้รุ่นการเรียกใช้งานที่มีน้ำหนักมาก, แบบเธรด, แบบแบ่งใช้ทุกอย่างโดยค่าเริ่มต้นซึ่งเป็นแบบที่ไม่ดีสำหรับกระบวนการที่มีน้ำหนักเบาของ PostgreSQL ซึ่งเป็นแบบแยกส่วนที่ไม่มีค่าเริ่มต้น พวกเขาไม่สามารถแยก () ได้จริงๆ ดังนั้นเราจึงไม่สามารถใช้งานได้อย่างมีประสิทธิภาพใน PostgreSQL
Craig Ringer

ผู้อ่านที่นี่อาจสนใจปัญหา GitHub นี้ที่ฉันทำในโครงการโมโนอีกครั้งโดยใช้ Mono in fork () ระหว่าง runtimes: github.com/mono/mono/issues/11857
Craig Ringer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.