🇰🇷 한글 설명
PIA의 토큰 검증 과정에서 OIDC discovery 문서 내의 jwks_uri를 검증 없이 사용하여 임의의 호스트로 GET 요청을 보낼 수 있는 취약점입니다. 허용된 발행자(Issuer)가 조작된 URI를 제공할 경우, PIA는 HTTPS가 아닌 평문 HTTP를 포함하여 공격자가 지정한 임의의 네트워크 위치로 요청을 전송할 수 있습니다. 이 과정은 서명 검증 전에 발생하므로 인증되지 않은 상태에서도 SSRF 공격이 가능합니다.
💡 쉬운 설명
신뢰할 수 있는 서비스가 가짜 주소를 알려주면, 보안 프로그램이 그 주소로 몰래 접속을 시도하게 만드는 결함입니다. 이를 통해 공격자는 보안 프로그램의 내부 네트워크를 탐색하거나 정보를 빼낼 수 있습니다.
🇺🇸 원문 (English)
PIA's token verification (`verify_token` in `pia/oidc.py`) fetches the OIDC discovery document of an allowlisted issuer and then follows the `jwks_uri` contained in that response without parsing it as a URL, comparing it against the approved issuer's origin, or requiring HTTPS — the only check is that the field is non-empty (`pia/oidc.py:42-52`). An approved identity provider — and every registered per-project Jenkins instance under `https://ci.eclipse.org/<project>/oidc` is a separate such party (`pia/models.py`) — can therefore direct PIA to issue a GET request to an arbitrary host and port, including over plaintext `http`, from PIA's own network position. The fetch happens before any signature is verified, as a side effect of an unauthenticated `POST /v1/upload/sbom` request that is ultimately rejected with 401.
📍 영향받는 시스템
PIA (pia/oidc.py 및 pia/models.py 관련 로직 포함 버전)
⚔️ 공격 벡터
신뢰된 OIDC 발행자가 조작된 jwks_uri를 포함한 discovery 문서를 반환하여 PIA가 임의의 내부/외부 서버로 SSRF 요청을 보내도록 유도
🛡️ 대응 방법
jwks_uri를 URL로 파싱하여 허용된 발행자의 도메인과 일치하는지 확인하고, 반드시 HTTPS 프로토콜만 사용하도록 검증 로직을 추가해야 합니다.
🔧 검증 코드
출력된 코드 라인에서 jwks_uri를 가져온 후 URL 유효성 검사 및 HTTPS 강제 로직이 누락되었는지 확인합니다.
grep -r "def verify_token" pia/oidc.py