
보안 연구자 사이먼 쾨크(Simon Koeck)가 12일 공개한 원문 분석에 따르면, 구글 개발자 문서 플랫폼 DevSite의 OAuth 인증 과정에서 세션 쿠키 위조가 원격 코드 실행(RCE)으로 이어질 수 있었다. 연구자는 구글 계정에 로그인하지 않아도 공격 경로에 접근할 수 있었다고 설명했다.
공개된 처리 이력에는 8월 6일 취약점 신고, 7일 접수 및 인정, 27일 보상 결정이 기록돼 있다. 보상액은 9만달러다. 연구자가 밝힌 수정 완료 시점은 10월 7일이며, 이번 글은 수정 이후 공개된 기술 분석이다.
문제의 출발점은 브라우저로 전달되는 Flask 세션 쿠키였다. 연구자는 쿠키를 분석해 OAuth 인증 흐름을 담은 객체와 OAuth 클라이언트 비밀값을 확인했다. 이 비밀값은 세션 쿠키의 서명을 검증하는 키와도 같았다. 서버만 알고 있어야 할 서명키가 이용자에게 전달되는 데이터 안에 들어 있던 셈이다.
서명은 데이터가 바뀌었는지 확인하는 장치다. 하지만 키가 노출되면 외부에서도 서버가 유효하다고 판단할 서명을 만들 수 있다. 연구자는 원래 쿠키의 서명을 다시 계산해 일치 여부를 확인하고, 확보한 키로 서명한 세션이 서버에서 받아들여지는 것을 검증했다고 밝혔다.
위조된 세션이 코드 실행으로 이어진 이유는 인증 콜백이 쿠키에 담긴 객체를 Python의 pickle 형식으로 복원했기 때문이다. Python 공식 문서도 신뢰할 수 없거나 변조될 수 있는 pickle 데이터를 복원하면 임의 코드가 실행될 수 있다고 경고한다. 이번 사례에서는 서명키 노출로 데이터의 신뢰성을 보장하던 전제가 무너졌다.
연구자는 운영 서버에서 일반 명령을 실행하는 대신, 응답을 일정 시간 지연시키는 방식으로 실행 가능성을 검증했다고 설명했다. 지연 시간에 맞춰 서버 응답이 늦어졌고, 서명을 훼손하거나 필요한 세션 데이터를 없앤 대조 요청은 거부됐다는 내용도 원문에 제시했다.
영향은 developers.google.com 한 곳에 한정되지 않았다는 것이 연구자의 설명이다. 같은 키로 서명한 세션이 Firebase와 Android 개발자 문서 등 다른 DevSite 기반 도메인에서도 유효했다고 밝혔다. 이는 개발자 문서 플랫폼에서 확인한 문제이며, 모든 구글 서비스가 영향을 받았다는 의미는 아니다.
연구자는 대응 방안으로 노출된 OAuth 비밀값 교체와 기존 세션 무효화, 배포별로 분리된 서명키 사용, 인증 객체의 서버 측 보관, 클라이언트 경계를 넘는 데이터에서 pickle 제거를 제시했다. 다만 원문은 개별 대응 조치의 적용 내역을 모두 공개하지 않았으며, 실제 악용이나 이용자 데이터 유출이 발생했다고 밝히지는 않았다.
출처: Simon Koeck 연구자 원문 분석 https://simonkoeck.com/writeups/google-devsite-flask-session-pickle-rce
Python 공식 pickle 문서 https://docs.python.org/3/library/pickle.html









