Google 개발자 문서 사이트에서 발견한 9만 달러 RCE 취약점
원제 I Found a $90k Remote Code Execution Vulnerability in Google
102 포인트댓글 46

Key Point
Flask 세션 서명 키가 쿠키 페이로드에 평문으로 노출되고 pickle 역직렬화가 비즈니스 로직에 포함된 구조로, 여러 Google 서비스에 걸쳐 원격 코드 실행이 가능했던 심각한 취약점이다.
핵심 요약
- Google 개발자 문서 사이트의 OAuth2 플로우를 조사하던 중 1,200바이트 규모의 Flask 세션 쿠키를 발견했고, 이는 기대보다 훨씬 컸다.
- 쿠키는 zlib 압축된 JSON으로 인코딩되었으며, 내용이 암호화되지 않아 pickle 직렬화된 OAuth2WebServerFlow 객체와 Google의 OAuth client_id, client_secret을 평문으로 담고 있었다.
- client_secret이 Flask의 쿠키 서명 키로도 사용되고 있었으며, hmac과 sha1을 이용해 재계산하면 서명이 바이트 단위로 일치했다.
- 세션의 무결성이 손상되어 공격자가 유효한 서명으로 임의의 세션을 위조할 수 있었고, pickle.loads()가 위조된 쿠키의 내용을 역직렬화하면서 RCE가 발생했다.
- 공격자가 CSRF 토큰을 임의로 선택한 후 time.sleep() 호출 등의 pickle 페이로드를 주입하면 서버가 이를 실행했으며, 응답 시간으로 코드 실행을 확인했다.
- 유효한 서명이 없거나 서명이 변조되면 요청이 거부되었으므로, 서명된 쿠키 + pickle.loads 조합이 유일한 공격 경로였다.
- 같은 발행 키가 firebase.google.com, developer.android.com, source.android.com, docs.partner.android.com 등 여러 DevSite 배포에서도 유효했다.
- 해결책으로 노출된 OAuth 시크릿 회전 및 모든 세션 폐기, 각 배포별 독립적인 고엔트로피 Flask SECRET_KEY 도입, 서버 측 보관으로 전환, pickle을 JSON 같은 데이터 포맷으로 교체가 필요했다.
- 2026년 8월 6일 보고, 8월 7일 심사 및 수용, 8월 27일 $90,000 보상 결정(S0 RCE $75,000 기본료 × 1.2 보상), 10월 7일 수정 완료.