Python 보안 대응 팀(PSRT)

Python 보안 대응 팀(PSRT)은 CPython과 pip의 취약점 보고서 처리를 담당합니다.

보안 문제 신고: https://www.python.org/dev/security/

구성원

PSRT는 아래 표에 구성원과 관리자의 전체 목록을 공개합니다.

Name

GitHub username

Notes

Adam Turner

AA-Turner

Barry Warsaw

warsaw

Admin

Bénédikt Tran

picnixz

Benjamin Peterson

benjaminp

Damian Shaw

notatallshaw

Donald Stufft

dstufft

Dustin Ingram

di

Ee Durbin

ewdurbin

Admin

Emma Smith

emmatyping

Glyph Lefkowitz

glyph

Gregory P. Smith

gpshead

Hugo van Kemenade

hugovk

Release Manager

Jacob Coffee

JacobCoffee

Jelle Zijlstra

JelleZijlstra

Kushal Das

kushaldas

Kirill Podoprigora

eclips4

Larry Hastings

larryhastings

Łukasz Langa

ambv

Release Manager

Ned Deily

ned-deily

Admin, Release Manager

Pablo Galindo Salgado

pablogsal

Release Manager

Paul McMillan

paulmcmillan

Petr Viktorin

encukou

Pradyun Gedam

pradyunsg

Savannah Ostrowski

savannahostrowski

Release Manager

Serhiy Storchaka

serhiy-storchaka

Seth Larson

sethmlarson

Admin

Stan Ulbrych

StanFromIreland

Admin

Steve Dower

zooba

Release Manager

Thomas Wouters

Yhg1s

Release Manager

Tim Peters

tim-one

William Woodruff

woodruffw

관련 명예 구성원 목록도 참조하십시오.

PSRT에 가입하려면 어떻게 해야 합니까?

누구나 코어 팀 지명과 유사한 지명 절차를 따라 PSRT에 합류할 수 있습니다. 기존 PSRT 구성원이 신입 구성원의 추천안을 PSRT에 제출하면 기존 PSRT 구성원들이 해당 추천안에 투표합니다. 일주일 동안 진행되는 기존 PSRT 구성원 투표에서 3분의 2 이상의 찬성표를 받고 운영 위원회가 거부권을 행사하지 않으면 추천이 승인됩니다.

운영 위원회는 매년 한 번 비활성 사용자를 PSRT에서 제외하라는 권고와 함께 비활성 PSRT 구성원에 관한 보고서를 받습니다. “비활성”은 직전 보고서가 작성된 이후 지난 1년 동안 취약점 보고서를 조정하거나 이에 의견을 제시하지 않은 구성원으로 정의합니다. 운영 위원회는 단순 투표로 PSRT 구성원을 제외할 수 있습니다.

릴리스 관리자 또는 운영 위원회 구성원인 PSRT 구성원은 취약점 보고서 관련 활동 여부와 관계없이 PSRT에 남을 수 있습니다.

PSRT 구성원의 책임

PSRT 구성원의 책임은 다음과 같습니다.

  • CVE ID, 패치, 조율된 공개, 엠바고 등 일반적인 소프트웨어 취약점 보고서 처리 절차를 숙지해야 합니다.

  • 보고된 취약점에 관한 엠바고 정보를 공유하거나 이를 바탕으로 행동해서는 안 됩니다. 금지되는 행동의 예로는 동료와 정보를 공유하거나 권고문 게시일 전에 공개되지 않은 완화 조치나 패치를 공개적으로 배포하는 행위가 있습니다.

  • 프로젝트에 제출된 취약점 보고서의 “조정자” 역할을 수행합니다. 조정자는 업계 표준 기한인 90일 이내에 보고서가 PSRT 절차를 거쳐 거부되거나 권고문 및 완화 조치가 공개되는 “완료” 상태에 이르도록 할 책임이 있습니다.

  • 조정자는 보고서가 취약점인지 판단하고 패치를 개발하는 데 필요한 경우 관련 코어 팀 구성원이나 트리아지 담당자를 참여시켜야 합니다. 조정자는 독립적으로 작업하기보다 각 보고서에 대해 최선의 결정을 내릴 수 있도록 코어 팀 구성원을 참여시키는 것이 권장됩니다.

  • 조정자는 CVSSv4를 사용하여 심각도를 계산하고 security-announce@python.org에서 공유할 권고문을 작성해야 합니다. PSF CVE Numbering Authority는 CVE 레코드에 이 권고문을 사용합니다.

  • 어떤 이유로든 더 이상 보고서를 진행할 수 없는 조정자는 PSRT의 다른 사람에게 조정자 역할을 위임해야 합니다.

PSRT 관리자의 책임

운영 위원회가 관리자로 지정한 PSRT 구성원에게는 다음과 같은 추가 책임이 있습니다.

  • security@python.org 메일링 리스트를 트리아지합니다.

  • PSRT 구성원의 정식 목록과 동기화되도록 GitHub 팀, 메일링 리스트, Discord 채널을 포함한 PSRT 구성원 접근 권한을 관리합니다.

  • 매년 비활성 PSRT 구성원 목록이 포함된 보고서를 운영 위원회에 제공합니다.

  • 최종 투표 집계와 운영 위원회가 이메일을 통해 추천에 거부권을 행사할 기회 제공을 포함하여 추천 선거를 진행합니다.

취약점 보고서 트리아지

PSRT 구성원은 신고가 처음 제출된 때부터 “완료” 상태에 이를 때까지 조율합니다. 완료 상태에는 신고를 “문제 아님”으로 표시하거나, GitHub에 공개 이슈를 개설하거나, CVE가 할당되고 security-announce@python.org로 보안 권고가 전송된 패치가 병합된 상태가 포함됩니다. 신고는 PSRT가 접수한 날로부터 90일 이내에 완료 상태에 도달해야 합니다.

신고는 security@python.org 또는 프로젝트의 GitHub Security Advisory(GHSA) 티켓 시스템을 통해 시스템에 접수됩니다. GHSA를 사용하는 프로젝트의 경우, security@python.org로 접수된 신고의 신고자에게 GHSA를 사용하여 신고 다시 제출하기를 요청해야 합니다.

          ┌────────────────────────┐
          │  Received a report...  │
          └──┬──────────────────┬──┘
             │                  │
┌────────────▼──────────────┐ ┌─▼──────────┐
│ ..via security@python.org │ │ ..via GHSA │
└────────────┬──────────────┘ └─┬──────────┘
             │                  │
┌────────────▼──────────────┐   │
│  PSRT admin reviews email │   │
└───┬───────────────────┬───┘   │
    │                   │       │
┌───▼────┐         ┌────▼───┐   │
│ Reject │         │ Accept │   │
└────────┘         └────┬───┘   │
                        │       │
┌───────────────────────▼───┐   │
│   PSRT asks reporter to   │   │
│       open via GHSA       │   │
└────────────┬──────────────┘   │
             │                  │
          ┌──▼──────────────────▼──┐
          │ GHSA in state 'Triage' │
          └────────────────────────┘

GitHub Security Advisories(GHSA)의 새 신고

신고가 GHSA에 접수되면 절차를 진행할 책임을 맡을 “Coordinator”를 지정해야 합니다. “Coordinator” 역할은 GHSA 티켓의 “Credit”을 사용하여 할당합니다(Edit > Credit을 선택한 후 GitHub 사용자 이름과 ‘Coordinator’ 역할을 추가합니다).

중요

각 GHSA 티켓에 “Coordinator” 역할을 할당하는 것은 중요합니다. 이 메타데이터에는 PSRT 구성원이 비활동으로 인해 제외되지 않도록 “active” according to PEP 811인지가 기록되기 때문입니다.

조정자가 지정되지 않은 채 GHSA 티켓이 3일 동안 처리되지 않으면, 릴리스 관리자나 운영 위원회 위원이 아닌 PSRT 구성원이 PSRT 봇에 의해 조정자로 자동 지정됩니다. 조정자가 절차를 완료할 수 없다면 PSRT에서 대체 조정자를 찾아 GHSA 티켓을 다시 할당해야 합니다.

                 ┌────────────────────────┐
                 │ GHSA in state 'Triage' │
                 └─┬────────────────────┬─┘
                   │                    │
┌──────────────────▼─────────┐ ┌────────▼───────────────────┐
│                            │ │   After 3 days idle,       │
│    PSRT member volunteers  │ │   Coordinator is assigned  │
│    as Coordinator          │ │   automatically by bot     │
└──────────────────┬─────────┘ └────────┬───────────────────┘
                   │                    │
                 ┌─▼────────────────────▼─┐
                 │  GHSA update 'Credit'  │
                 │  field to Coordinator  │
                 └────────────┬───────────┘
                              │
                 ┌────────────▼───────────┐
                 │ Coordinator determines │
             ┌───┤    whether report...   ┼───┐
             │   └────────────┬───────────┘   │
             │                │               │
┌────────────▼─┐ ┌────────────▼───────────┐ ┌─▼─────────────┐
│..is a invalid│ │  ..is a bug, but not   │ │..is a security│
│  or non-issue│ │    security relevant   │ │     issue     │
└────────────┬─┘ └────────────┬───────────┘ └─┬─────────────┘
             │                │               │
             │   ┌────────────▼───────────┐   │
             │   │   Coordinator opens a  │   │
             │   │   public GitHub issue  │   │
             │   └─┬──────────────────────┘   │
             │     │                          │
  ┌──────────▼─────▼───────┐     ┌────────────▼───────────┐
  │ Close the GHSA ticket  │     │  GHSA in state 'Draft' │
  └────────────────────────┘     └────────────────────────┘

신고가 취약점인지 판단하기

조정자는 신고를 검토하여 티켓을 문제 아님, 보안 취약점이 아닌 문제 또는 보안 취약점 중 하나로 판정합니다. 조정자가 판정하는 데 코어 팀 전문가의 도움이 필요한 경우, 해당 전문가를 GHSA 티켓의 ‘Collaborators’로 추가할 수 있습니다. 승인된 보안 취약점은 GHSA의 ‘Draft’ 상태로 이동합니다. 저장소 관리자만 보안 권고를 승인할 수 있지만, PSRT 구성원은 GHSA 제목 앞에 [ACCEPTED]를 붙여 PSRT 봇을 통해 신고를 승인할 수 있습니다.

신고가 취약점이 아닌 경우 조정자는 필요에 따라 공개 GitHub 이슈를 개설한 후 GHSA 티켓을 닫습니다. CVE가 할당되지 않으면 신고자가 직접 GitHub 이슈를 개설할 유인이 더 이상 없으므로, 신고자가 직접 이슈를 개설하지 않는 경우가 많다는 점에 유의하십시오. 승인할 때와 마찬가지로 저장소 관리자만 보안 권고를 닫을 수 있지만, PSRT 구성원은 GHSA 제목 앞에 [CLOSED] (일반 버그), [INVALID] (스팸), [DUPLICATE] (중복) 또는 [COMPLETED] (보안 권고가 발행되어 완료된 티켓)를 붙여 PSRT 봇을 통해 신고를 닫을 수 있습니다.

취약점 신고 조치

신고가 취약점으로 승인되면 수정 개발 절차가 시작됩니다. 조정자는 녹색 Accept as Draft 버튼(저장소 관리자)이나 PSRT 봇의 [ACCEPTED] 제목 태그를 사용하여 GHSA 티켓을 ‘Draft’ 상태로 이동합니다. 이 상태가 되면 PSRT 봇은 Python Software Foundation CVE 번호 부여 기관에서 CVE ID를 자동으로 할당하고 임시 비공개 포크를 생성합니다.

취약점이 승인되면 조정자는 보안 권고를 발송하고 GHSA 티켓을 닫기 전에 다음 세 가지를 준비해야 합니다.

  • CVSSv4를 사용하여 계산한 심각도.

  • 수정 사항을 포함하며 공개 GitHub 이슈와 함께 병합된 풀 리퀘스트.

  • 보안 권고 제목과 취약점에 대한 간략한 설명.

심각도 점수 산정

모든 상황에서 소프트웨어가 어떻게 사용되는지 알 수 없으므로 취약점의 심각도를 객관적으로 평가하기는 어려울 수 있습니다. 심각도는 최악의 가상 시나리오가 아니라 예상되거나 알려진 사용 방식을 기준으로 계산합니다.

PSRT와 PSF CNA는 취약점의 심각도를 계산하는 데 CVSSv4를 사용합니다. GHSA 티켓은 티켓 UI 내에 CVSSv4 계산기를 제공합니다. GitHub의 기본값은 CVSSv3이므로, 티켓 UI에서 점수를 계산하기 전에 점수 산정 알고리즘을 CVSSv4로 변경하십시오. PSRT 운영의 모든 측면과 마찬가지로, 코디네이터는 다른 PSRT 구성원에게 심각도 계산에 관한 도움을 요청하는 것이 권장됩니다.

비공개로 패치 개발하기

보고서가 수락되면 PSRT 봇이 해당 권고를 위한 임시 비공개 포크를 자동으로 생성하므로 패치 개발을 시작할 수 있습니다. 저장소 관리자가 GHSA 티켓 내의 Start a temporary private fork 버튼을 선택하거나 보고자가 이 버튼을 선택하여 포크를 더 일찍 생성할 수도 있습니다. Git 저장소의 크기 때문에 이 포크 저장소를 생성하는 데 몇 분이 걸릴 수 있습니다. 포크가 생성되면 모든 PSRT 구성원 또는 GHSA 협업자가 포크를 복제하고 수정 사항을 개발한 후 브랜치를 푸시할 수 있습니다.

git clone https://github.com/python/cpython-ghsa-abcd-efgh-ijkl.git
cd cpython-ghsa-abcd-efgh-ijkl
git checkout -b advisory-fix-1

# (develop a fix)

git add ...
git commit -m "Fix"
git push origin advisory-fix-1

이후 GHSA 티켓 내에서 풀 리퀘스트를 열어 비공개로 검토할 수 있습니다. PSRT 내에 패치 개발 또는 검토에 필요한 전문 지식이 없다면 코디네이터는 필요에 따라 코어 팀 전문가를 GHSA의 협업자로 추가하여 패치를 개발하고 검토할 수 있습니다. 코디네이터가 반드시 직접 패치를 개발할 책임이 있는 것은 아니며, 필요에 따라 전문가를 참여시켜 패치가 적시에 개발되도록 할 책임만 있습니다.

패치가 승인되면 공개 GitHub 이슈와 풀 리퀘스트를 열 수 있습니다. 공개 풀 리퀘스트를 위해 Security 범주의 블러브를 생성하십시오. 보안 수정 사항에 관한 공개 이슈와 풀 리퀘스트에는 type-security 레이블을 사용해야 합니다.

GHSA 풀 리퀘스트에서 패치 파일을 빠르게 가져오려면 다음과 같이 풀 리퀘스트 URL에 .patch를 추가할 수 있습니다.

curl https://github.com/python/cpython-ghsa-abcd-efgh-ijkl/pull/1.patch \
     --output ghsa-abcd-efgh-ijkl.patch

그런 다음 이 패치를 적용하여 공개 GitHub 저장소에 푸시할 수 있습니다.

git remote -v
origin    ssh://git@github.com/.../cpython (fetch)
origin    ssh://git@github.com/.../cpython (fetch)

git checkout -b branch-name
git apply ./ghsa-abcd-efgh-ijkl.patch
git push origin branch-name

중요

CPython의 백포트 인프라는 백포트된 패치를 추적하는 데 사용됩니다. 취약점 수정 사항의 백포트를 정확하게 추적하려면 CVE당 하나의 GitHub 이슈를 사용하십시오. 새 CVE의 경우 이전 이슈와 관련이 있더라도 수정된 버전을 정확하게 추적하려면 새 GitHub 이슈를 여십시오.

중요

저장소 관리자는 GHSA 내의 녹색 Publish advisory 또는 Merge pull request 버튼을 선택해서는 안 됩니다. 권고는 메일링 리스트에 게시되며, GHSA 내의 Merge pull request 버튼은 모든 지속적 통합 및 브랜치 보호 단계를 우회합니다. 대신 공개 풀 리퀘스트를 사용하십시오.

권고 게시하기

취약점 수정 사항이 공개 GitHub 풀 리퀘스트를 통해 메인 브랜치에 병합되면 권고를 게시해야 합니다. 권고에는 심각도, 제목, 그리고 취약한 모듈, 함수, 동작 및 수정 사항에 대한 간략한 설명이 필요합니다. 패치를 적용하는 것 외에도 취약점을 완화할 방법이 있다면 이 간략한 설명에 완화 단계를 선택적으로 포함할 수 있습니다.

  • 제목, 심각도 및 설명을 포함하여 권고 템플릿을 사용한 이메일을 security-announce@python.org 메일링 리스트로 보내십시오.

  • 권고 이메일은 PSF CVE 번호 지정 기관 운영자가 수신하며 CVE 레코드를 게시하는 데 사용됩니다.

  • 아직 보안 업데이트를 받는 모든 Python 브랜치에 대해 백포트 절차를 시작하십시오. 릴리스 관리자가 릴리스 전에 찾을 수 있도록 각 백포트 풀 리퀘스트에 type-securityrelease-blocker 레이블을 추가하십시오.

권고 이메일을 보낸 후 GHSA 티켓을 닫을 수 있습니다. 저장소 관리자만 권고를 직접 닫을 수 있으므로, PSRT 구성원이 GHSA 제목 앞에 [COMPLETED]를 붙이면 PSRT 봇이 티켓을 닫습니다.

PSRT 봇

관련 PSRT 봇은 위에서 설명한 GHSA 워크플로의 일부를 자동화하는 GitHub App입니다. GitHub에서는 저장소 관리자만 보안 권고를 수정할 수 있으므로, 봇을 통해 모든 PSRT 구성원이 제목 태그를 사용하여 보고서를 절차에 따라 진행할 수 있습니다.

봇은 매시간 실행되며(또는 수동으로 실행되며), 열려 있는 각 GHSA 티켓에 대해 다음 작업을 수행합니다:

  • PSRT GitHub 팀을 공동 작업자로 추가하여 구성원이 새 보고서에 접근할 수 있게 합니다.

  • 제목에 [ACCEPTED] 태그가 포함되어 있으면 티켓을 ‘트리아지’에서 ‘초안’ 상태로 이동합니다.

  • 제목에 종료 태그 중 하나([CLOSED], [INVALID], [DUPLICATE], 또는 [COMPLETED])가 있으면 티켓을 닫습니다.

  • 수락된(‘Draft’) 티켓의 경우 임시 비공개 포크가 아직 없으면 생성하고 CVE ID를 예약합니다.

태그는 대소문자를 구분하지 않으며 제목의 어느 위치에나 표시될 수 있지만, 눈에 잘 띄도록 제목 앞에 붙입니다.

코드 서명 인증서 보고서 처리

Python은 Azure Trusted Signing 및 Apple Developer ID 인증서를 사용하여 바이너리에 서명합니다. 코드 서명 인증서가 “침해됨” 또는 “인증서로 서명된 악성 코드”로 보고되면 Python 보안 대응 팀은 보고자에게 다음 정보를 요청해야 합니다:

  • 인증서로 서명된 바이너리의 체크섬.

  • 인증서로 서명된 바이너리의 서명.

코드 서명 인증서 폐기로 인한 불필요한 사용자 혼란과 잦은 변경을 방지하려면 모든 보고서는 인증서 폐기 같은 파괴적 조치를 취하기 전에 PSRT가 독립적으로 검증할 수 있어야 합니다. PSRT는 이 정보를 바탕으로 다음과 같은 조사 단계를 수행하여 보고서를 검증할 수 있습니다:

  • 관련 Azure Pipelines 실행에서 아티팩트를 다운로드하고 보고된 체크섬 목록과 대조하여 확인합니다.

  • 서명의 유효성을 검증합니다. 과거 보고서에는 Python 코드 서명 인증서에서 생성된 것으로 주장하는 서명이 포함되어 있었지만, 유효하지 않았습니다.

  • Azure Pipelines 및 Azure Trusted Signing 감사 로그에서 침해 징후를 확인합니다.

PSRT가 침해 징후나 잘못 서명된 바이너리를 발견한 경우에만 인증서를 폐기하고 권고를 게시합니다. 침해가 보고된 경우, 관련성이 있다면 예방 조치로서 PSRT는 보고된 정보를 검증하지 않고도 다음과 같은 비파괴적 조치를 취할 수 있습니다:

  • 코드 서명과 관련된 비밀 정보를 교체합니다(Azure Trusted Publishing용 TrustedSigningSecret).

  • 서명 인증서에 접근할 수 있는 계정의 암호를 재설정합니다.

응답 템플릿

이 응답 템플릿은 위 절차의 여러 지점에서 메시지를 작성할 때 지침으로 사용해야 합니다. 그대로 보낼 필요는 없으며, 현재 맥락에 맞게 필요에 따라 자유롭게 수정하십시오.

GitHub Security Advisories를 사용하여 제출

Thanks for submitting this report.
We use GitHub Security Advisories for triaging vulnerability reports,
please review our security policy before submitting:

https://devguide.python.org/security/policy/

Then submit your report here:

https://github.com/python/cpython/security/advisories/new

취약점 보고서 거부

Thanks for your report. We've determined that the report doesn't constitute
a vulnerability. Let us know if you disagree with this determination.
If you are interested in working on this further, you can optionally open a
public issue on GitHub.

중복 보고서 거부

Thanks for your report. We've determined that this submission is a duplicate
of an issue that is already being tracked internally. Please refrain from
public disclosure until the issue has been resolved.

권고 이메일

Title: [{CVE-YYYY-XXXX}] {title}

There is a {LOW, MEDIUM, HIGH, CRITICAL} severity vulnerability affecting {project}.

{description}

Please see the linked CVE ID for the latest information on affected versions:

* https://www.cve.org/CVERecord?id={CVE-YYYY-XXXX}
* {pull request URL}

명예 회원

이전에 PSRT 위원으로 활동했던 회원들입니다.

Name

GitHub username

Notes

Anthony Baxter

Release Manager

Christian Heimes

tiran

Georg Brandl

birkenfeld

Huzaifa Sidhpurwala

Jesse Noller

Mark Hammond

mhammond

Nam Nguyen

Neal Norwitz

Trent Mick