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에 어떻게 합류할 수 있습니까?

누구나 코어 팀 지명과 유사한 지명 절차(similar to core team nominations)를 거쳐 PSRT에 합류할 수 있습니다. 새 구성원의 지명은 기존 PSRT 구성원이 PSRT에 제안하며, 이 지명에 대해 기존 PSRT 구성원들이 투표합니다. 지명은 1주일간 진행되는 기존 PSRT 구성원 투표에서 3분의 2 이상의 찬성표를 얻고 운영 위원회가 거부권을 행사하지 않으면 통과됩니다.

운영 위원회는 1년에 한 번 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 메일링 리스트를 트리아지합니다.

  • GitHub 팀, 메일링 리스트, Discord 채널을 포함한 PSRT 구성원 접근 권한을 관리하여 공식 PSRT 구성원 목록과 일치하도록 유지합니다.

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

  • 최종 투표 집계와 운영 위원회에 이메일로 지명 거부권을 행사할 기회를 주는 일을 포함하여 지명 선거를 진행합니다.

취약점 보고 트리아지

PSRT 구성원은 보고서가 처음 제출된 시점부터 “완료” 상태에 이를 때까지 보고서 처리를 조율합니다. 완료 상태에는 보고를 “문제 아님(non-issue)”으로 표시하는 것, GitHub에 공개 이슈를 여는 것, 또는 CVE를 동반하고 security-announce@python.org로 권고문을 보낸 패치가 병합된 것이 포함됩니다. 보고서는 PSRT가 접수한 날로부터 90일 이내에 완료 상태에 도달해야 합니다.

보고는 security@python.org를 통하거나 프로젝트의 GitHub 보안 권고문(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 보안 권고문(GitHub Security Advisories, GHSA)의 새 보고

보고가 GHSA에 들어오면, 해당 보고를 절차에 따라 진행시킬 책임을 지는 “코디네이터(Coordinator)”를 지정해야 합니다. “코디네이터” 역할은 GHSA 티켓의 “Credit”을 사용해 지정합니다(Edit > Credit을 선택한 다음 GitHub 사용자 이름과 ‘Coordinator’ 역할을 추가합니다).

중요

각 GHSA 티켓에 “코디네이터” 역할을 지정하는 것은 중요합니다. 이 메타데이터가 PSRT 구성원이 “active” according to PEP 811 상태인지를 기록하여, 비활동으로 인해 제외되는 것을 막아 주기 때문입니다.

GHSA 티켓에 코디네이터가 지정되지 않은 채 사흘 동안 아무 활동이 없으면, 릴리스 관리자나 운영 위원회 구성원이 아닌 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 이슈를 열 동기가 더 이상 없으므로, 보고자가 스스로 GitHub 이슈를 열지 않는 경우가 많다는 점에 유의하십시오. 수락과 마찬가지로 권고문은 저장소 관리자만 닫을 수 있습니다. 하지만 PSRT 구성원은 GHSA 제목 앞에 [CLOSED](일반 버그의 경우), [INVALID](스팸의 경우), [DUPLICATE](중복의 경우), 또는 [COMPLETED](권고문이 발행되어 완료된 티켓의 경우)를 붙여 PSRT 봇을 통해 보고를 닫을 수 있습니다.

취약점 보고서 해결하기

보고가 취약점으로 수락되면 조치 개발 과정이 시작됩니다. 코디네이터는 녹색 Accept as Draft 버튼(저장소 관리자)이나 PSRT 봇의 [ACCEPTED] 제목 태그를 사용해 GHSA 티켓을 ‘Draft’ 상태로 옮깁니다. 이 상태가 되면 PSRT 봇이 Python Software Foundation CVE 번호 부여 기관(CNA)에서 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 범주로 blurb를 생성하십시오. 보안 수정을 위한 공개 이슈와 풀 리퀘스트에는 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 풀 리퀘스트를 통해 취약점 수정이 main 브랜치에 병합되면 권고문을 게시해야 합니다. 권고문에는 심각도, 제목, 그리고 취약한 모듈, 함수, 동작 및 수정에 대한 짧은 설명이 필요합니다. 패치 적용이 취약점을 완화하는 유일한 방법이 아니라면, 이 짧은 설명에 완화 단계를 선택적으로 포함할 수 있습니다.

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

  • 권고문 이메일은 PSF CVE 번호 부여 기관 운영자가 받아서 CVE 레코드를 게시하는 데 사용합니다.

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

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

PSRT 봇

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

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

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

  • 제목에 [ACCEPTED] 태그가 포함되어 있으면 티켓을 ‘Triage’(트리아지) 상태에서 ‘Draft’(초안) 상태로 옮깁니다.

  • 제목에 닫기 태그([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 보안 권고문(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