보안 정책

중요

Python 보안 대응 팀 (PSRT) 구성원은 다른 많은 책임과 함께 이 업무를 병행합니다. 여러분의 보고서가 요구하는 시간과 주의를 신중하게 고려해 주십시오. 보안 정책을 반복해서 지키지 않으면 기술적 가치와 관계없이 이후의 보고서가 거부되거나 보고자가 python GitHub 조직에서 차단됩니다.

어떤 유형의 버그가 취약점입니까?

모든 버그가 취약점인 것은 아닙니다.

PSRT 구성원이 중복된 작업을 하지 않도록, 잠재적인 모든 보고서는 PSRT에 제출하기 전에 관련 위협 모델에 비추어 평가해야 합니다. 가능하다면 관련 위협 모델을 인용하여, 버그를 취약점으로 보고할지 판단할 때 해당 위협 모델을 고려했음을 보여 주십시오.

취약점은 실제 환경에 존재할 수 있는 코드, 구성, 전제 조건 또는 배포에서 악용할 수 있어야 합니다. 프로덕션 프로그램에서 사용될 가능성이 낮은 코드에만 영향을 미치는 취약점은 받아들여지지 않습니다.

문서화된 기능은 취약점으로 간주하지 않습니다. 예를 들어 pickle, marshal, shelve, eval(), exec()은 데이터로 제공된 임의의 Python 코드를 실행한다고 문서화되어 있습니다. ctypes 모듈은 메모리의 임의 위치를 수정할 수 있게 한다고 문서화되어 있습니다.

CPython은 신뢰할 수 없는 Python 코드를 샌드박스로 격리하는 것을 보안 경계로 지원하지 않으므로, 그러한 샌드박스에서 탈출하는 것은 Python의 취약점이 아니며 대신 해당 샌드박스의 개발자에게 보고해야 합니다.

취약점은 명령줄 인자, 환경 변수, 대상 시스템의 파일 수정 등을 포함하되 이에 국한되지 않는 Python 실행 조건의 악의적인 제어에 의존해서는 안 됩니다. Python이 실행되는 시점의 환경은 정당한 사용자가 의도한 그대로라고 가정하며, 이와 다른 악의적인 변형은 Python 자체로 완화할 수 없습니다.

가용성에 영향을 미치는 취약점(DoS, ReDoS, 크래시, 교착 상태, 자원 고갈 등)은 해당 사용 사례에 합리적인 크기의 데이터 입력으로 유발할 수 있어야 합니다. 또한 가용성 취약점은 공격자의 입지가 “수평적”으로 변하는 것이 아니라 “상향적”으로 변한다는 것을 입증해야 합니다. 이는 성능 개선을 보안 취약점으로 처리하지 않기 위한 것입니다.

예외는 입력을 처리할 때 예상되는 제어 흐름의 일부입니다. 처리되지 않은 예외는 크래시로 간주하지 않으며, 그 자체로는 보안 취약점이 아닙니다.

Python 의존성(zlib, Tcl/Tk, OpenSSL 등)의 취약점은 Python이 해당 의존성을 사용하는 방식이 그 의존성의 안전한 사용을 방해하지 않는 한 Python의 취약점이 아닙니다. 예를 들어 Python에 번들로 포함된 zlib 사본의 취약점은 Python이 아니라 zlib의 취약점입니다.

어떤 Python 버전에서 보고를 받습니까?

Python은 상태가 “bugfix” 또는 “security”인 지원되는 Python 버전에 대해 취약점 보고를 받으며 CVE ID를 할당합니다. 아직 안정화되지 않은 버전(상태가 “feature” 또는 “prerelease”인 버전)은 CVE ID를 받을 수 없습니다. 취약점이 사전 릴리스 버전(알파, 베타, 릴리스 후보)에만 존재한다면 해당 이슈는 일반 버그로 보고해야 합니다. 보고서를 제출하기 전에 해당 이슈가 이미 main 브랜치에서 해결되어 백포트만 필요한 상태인지 확인하십시오.

때로는 안정 버전의 Python에서도 일부 기능이 “실험적”으로 표시될 수 있습니다. 이러한 기능은 보안 취약점으로 인정되지 않습니다. 대신 공개 GitHub 이슈를 여십시오.

취약점이 플랫폼에 따라 달라지는 경우, 해당 플랫폼이 PEP 11에 따라 지원되는 플랫폼인지 확인하십시오. 지원되지 않는 플랫폼에만 영향을 미치는 취약점은 Python의 취약점으로 취급하지 않습니다.

PEP 11의 지원되지 않는 플랫폼 절에 따르면, 지원되지 않는 플랫폼으로 Python을 포팅하는 작업은 서드파티 프로젝트로 취급됩니다. PSRT는 이러한 보고서를 Python 취약점이 아니라 서드파티 포트에 대한 취약점 보고서로 취급합니다. 이러한 문제를 Python에 보고하기로 했다면, 이 가이드의 요구 사항을 따르고 관련 플랫폼과 유지 관리자에 관한 정보를 포함하십시오. PSRT는 이러한 보고서를 플랫폼 유지 관리자(또는 기타 이해관계자)에게 전달하며, 보고서는 대개 해당 유지 관리자의 보안 정책에 따라 처리됩니다. 유지 관리자를 알 수 없거나 유지 관리자가 응답하지 않으면 이러한 보고서는 종결됩니다.

취약점 보고서에는 무엇을 포함하고 어떻게 구성해야 합니까?

PSRT가 취약점 보고서를 효율적으로 처리할 수 있도록, 보고서에는 특정 정보가 포함되어야 하며 올바른 형식을 갖춰야 합니다:

  • 최초 보고와 후속 연락에서는 지나치게 길거나 장황한 내용, 과도한 구조(헤더나 표 등)를 피하십시오. 보고서는 취약점을 설명하는 몇 문장으로 작성해야 합니다. 가능하면 문제를 재현하고 취약점이 여전히 존재하는지를 명확하게 보여 주는 개념 증명 스크립트를 포함하십시오(예: 취약하면 1로, 취약하지 않으면 0으로 종료).

  • 많은 수의 취약점이나 취약점 “묶음”을 보고하거나 LLM을 사용해 잠재적 취약점을 찾는 경우, 보고자는 PSRT에 제출하기 전에 모든 보고서 내용의 사실적 타당성(API가 환각으로 지어낸 것은 아닌지 등)을 반드시 검증해야 합니다.

  • 최초 보고서에 심각도나 CVSS 정보를 포함하지 마십시오. 이 정보는 PSRT가 결정합니다.

  • 가능하면 보고한 문제에 대한 완화 조치를 담은 최소한의 패치를 포함하십시오.

  • 테스트한 Python 버전을 항상 포함하고, 그중 어떤 버전이 취약한 것으로 확인되었는지 표시하십시오.

  • 보고서는 첨부 파일을 포함하여 일반 텍스트로만 제출하십시오. PDF, 바이너리, 노트북 또는 안전하게 검토할 수 없는 기타 파일은 허용되지 않습니다. 개념 증명이 특수하게 구성된 바이너리 파일에 의존하는 경우, 파일 자체 대신 그 파일을 생성하는 스크립트를 포함하십시오.

  • 몇 줄보다 긴 개념 증명 스크립트는 가독성을 위해 <details></details>를 사용하여 collapsed section으로 감싸야 합니다.

  • 잠재적 보안 취약점을 담고 있지 않은 보고서(스팸이나 규정 준수 또는 실사 작업 요청 등)는 회신 없이 폐기됩니다.

취약점 보고서는 어떻게 제출합니까?

CPython에 대한 모든 잠재적 보안 취약점 보고서는 새 티켓을 열어 제출하십시오. 보안 취약점을 보고하기 위해 공개 GitHub 이슈를 열지 마십시오. 그 밖의 모든 프로젝트(pip, python.org, 도구 등)에 대한 보고이거나 보고서를 어디로 보내야 할지 확실하지 않은 경우, security@python.org로 이메일을 보내십시오.

취약점 보고서가 처리되는 과정은 다음과 같습니다:

  • 보고자가 취약점을 PSRT에 비공개로 보고합니다.

  • PSRT가 보고된 내용이 취약점이 아니라고 판단하면, 보고자는 공개 이슈를 열 수 있습니다.

  • PSRT가 보고된 내용이 취약점이라고 판단하면, PSRT는 보고서를 수락하고 PSF CNA가 CVE ID를 할당합니다. 보고서와 ID는 아직 잠정적이며 변경될 수 있으므로, 해당 레코드가 게시되기 전에는 할당된 CVE ID를 공개적으로 언급하지 마십시오.

  • 수정 사항을 포함한 공개 풀 리퀘스트가 CPython에 병합되면, 권고문과 CVE 레코드가 출처 표기와 함께 게시됩니다.

PSRT가 취약점을 처리하는 방식에 대한 자세한 내용은 취약점 보고 트리아지를 참고하십시오.

보안 수정은 언제 릴리스되거나 백포트됩니까?

권고문과 CVE 레코드는 보안 수정이 처음 병합된 후에 게시됩니다. CVE 레코드에는 패치에 관한 정보가 담기며, 패치가 Python 버전에 백포트되고 릴리스됨에 따라 최신 상태로 유지됩니다.

PEP 602에 따르면, Python 버전은 새 Python 버전이 릴리스된 후 5년간 보안 업데이트를 받습니다. 그러나 이러한 보안 업데이트는 정해진 일정에 따라 게시되지 않으며, 보안 수정이 나왔다고 해서 게시되는 것도 아닙니다. 보안 업데이트 일정은 릴리스 관리자가 결정합니다. 필요한 경우 사용자는 패치가 병합되어 릴리스되기 전에 직접 패치를 적용하는 것이 좋습니다.

바이너리 설치 프로그램(macOS 및 Windows 등)에만 영향을 주는 보안 수정은 소스 전용인 Python 릴리스 스트림에는 게시되지 않습니다.

일부 보안 수정은 하위 호환성을 깨뜨리는 동작 변경을 도입해야 할 수도 있습니다. 이러한 경우, Python 운영 위원회는 관련 릴리스 관리자와 함께 안정 버전의 보안 취약점을 수정하기 위해 하위 호환되지 않는 변경을 도입할지 결정합니다. 이는 보안 수정이 모든 Python 버전에 백포트되는지 또는 기본적으로 활성화되는지에 영향을 줄 수 있습니다. 자세한 내용은 CVE 레코드를 참조하십시오.

행동 강령

Python 보안 대응 팀 구성원의 안녕과 안전은 취약점 보고의 기술적 가치보다 우선합니다. 의사소통은 비공개로 이루어지지만, 취약점 보고에는 PSF Code of Conduct가 적용됩니다. 위반 사항은 해당하는 경우 공개되지 않은 취약점 정보를 제거한 후 행동 강령 팀에 보고됩니다.

CVE 번호 부여 기관(CNA)

파이썬과 pip 프로젝트는 Python Software Foundation CVE Numbering Authority (CNA)의 관할 범위에 속합니다. 즉, Python 또는 pip에 대해 CVE ID를 발급받으려면 모든 보안 취약점 보고를 PSRT에 제출해야 합니다. PSF CNA 담당자에게 직접 연락하려면 cna@python.org로 이메일을 보내십시오.