PL / Python을 신뢰할 수없는 이유는 무엇입니까?


11

문서에 따르면 :

PL / Python은 "신뢰할 수없는"언어로만 제공되므로 사용자가 수행 할 수있는 작업을 제한 할 수있는 방법을 제공하지 않으므로 plpythonu라는 이름을 갖습니다. 안전한 실행 메커니즘이 파이썬에서 개발된다면, 앞으로 신뢰할 수있는 변종 plpython을 사용할 수있게 될 것입니다.

왜 Perl과 같은 다른 언어가 아닌 파이썬을위한 안전한 실행 메커니즘을 개발하는 것이 어려운가?

답변:


13

파이썬의 객체 모델과 관련이 있습니다. 안전하지 않은 객체에 대한 참조를 얻는 방법은 항상 있습니다. 문제점에 대한 정보와 다음에 대한 정보 는 rexec 모듈 문서문서제한된 실행 장을 참조하십시오 .

제한 사항은 PostgreSQL 자체와 관련이 없으며 CPython 인터프리터 구현 또는 Python 자체 자체에 내재되어 있습니다.

Perl, Java, JavaScript 및 Lua와 같은 다른 언어는 런타임을 확인했습니다. 이들 중 대부분은 일련의 보안 문제에 직면 해 있습니다. 이러한 제한된 실행 환경은 가능한 모든 탈옥 공격으로부터 보호하기가 매우 어렵습니다.

rexec는 많은 목적을 위해 "충분히"적합하기 때문에 PostgreSQL이 반 신뢰할 수있는 파이썬 인터프리터를 추가하는 것을 막을 방법은 없습니다. PostgreSQL은 거의 대부분의 경우에만 관심이있는 경향이 없습니다. 슈퍼 유저 전용으로 표시된 경우에만 허용되지만 특정 사용자에게 항상 액세스 권한을 부여 할 수 있습니다. 신뢰할 수없는 파이썬보다 낫습니다.

개인적으로 저는 PL / V8 또는 이와 유사한 것이 미래라고 생각하며 핵심에서 지원되는 방향으로 가고 싶습니다.

또한 C #, VB.NET, IronPython으로 작성된 "안전한"어셈블리 또는 해당 주제에 대해 많은 것을 할 수 없었던 모든 것을로드 할 수있는 신뢰할 수있는 Mono에 대한 아이디어를 모호하게 살펴 보았습니다 .


나는 이것이 이것이 신뢰할 수없는 것으로 여겨지는 이유로 본 적이 없다. 기본적으로 Java, V8, TCL, R 및 기타는 신뢰할 수없는 것으로 간주됩니다. Perl이 신뢰할 수있는 유일한 이유는 bc PostgreSQL과 함께 신뢰할 수있는 Perl 버전을 제공하는 것입니다 postgresql.org/docs/11/plperl-trusted.html
TheSteve0

1
@ TheSteve0 당신은 그것을 그렇게 보지 못했을 수도 있지만, 그것이 그렇게 된 이유입니다. PostgreSQL은 plpythonu를 가지고 있었으며 rexec, 위의 링크와 같이 본질적으로 안전하지 않은 Python 모듈을 사용하지 않는 후에 제거되었습니다 . PyPi를 사용하는 plpython이 Pg가 사용할 수있는 제한된 모드를 제공 할 수 있다고 생각합니다. 나는 많은 일이 있는지 보지 않았다. "Perl의 신뢰할 수있는 특별한 버전"에 대해서도 틀 렸습니다. 사실 완벽하게 평범한 Perl이며, plperl과 plperlu에 동일한 해석기가 사용됩니다. 차이점은 런타임 구성입니다.
Craig Ringer

@ TheSteve0 plperl은 런타임에 Perl 인터프리터 인스턴스를 다르게 구성합니다. 참조 plperl.c을 Gorey에서 세부 사항을 위해, 특별히 pp_require_safe하고 plperl_trusted_init. 나는 제한된 Perl 실행의 진정한 안전에 대해 많은 의견을 가질만큼 충분하지 않습니다. 신뢰할 수있는 Lua 버전을 보거나 JavaScript 통역사 인 더 나은 마인드와 입양을 원합니다. 그러나 우리가 가진 것은 지금 plperl입니다.
Craig Ringer

@ TheSteve0 BTW, Java 또는 Groovy 코드를 사용하는 Java JVM 또는 C # 또는 VB.NET을 사용하는 Mono VM은 런타임에 강력한 샌드 박스 및 보안 관리 기능이 있으므로 상당히 의미가있는 것 같습니다. 예를 들어 Java의 SecurityManager. 그러나 불행히도 두 런타임은 모두 무거운 시작, 스레드, 기본적으로 실행되는 모든 실행 모델을 사용합니다.이 모델은 PostgreSQL의 경량 프로세스-기본적으로 아무것도없는 포크 ()-실행없는 모델에는 적합하지 않습니다. 그들은 실제로 포크 할 수 없습니다. 따라서 PostgreSQL에서는 매우 효과적으로 사용할 수 없습니다.
Craig Ringer

여기 독자들은 포크 () 런타임에서 모노를 다시 사용하여 모노 프로젝트에서 작성한이 GitHub 문제에 관심이있을 수 있습니다 : github.com/mono/mono/issues/11857
Craig Ringer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.