구글의 공용 개발자 문서 플랫폼인 데브사이트(DevSite)에서 치명적인 원격 코드 실행(RCE) 취약점이 발견되어 구글이 9만 달러의 포상금을 지급했습니다. 이 취약점은 플라스크(Flask) 세션 쿠키 내부에 해당 쿠키의 서명 키가 포함되어 있어, 공격자가 로그인 없이도 세션을 위조하고 임의의 코드를 실행할 수 있게 만들었습니다.
취약점의 핵심은 OAuth 클라이언트 시크릿(client_secret)이 플라스크의 시크릿 키(SECRET_KEY)로도 재사용되었다는 점입니다. 연구자는 비정상적으로 큰 세션 쿠키를 분석하여 압축 해제 후 JSON 형태로 저장된 OAuth2WebServerFlow 객체에서 client_id와 client_secret을 추출했습니다. 이 추출된 client_secret으로 세션 서명을 위조할 수 있었고, 서버가 이를 유효한 서명으로 받아들였습니다. 더 나아가, OAuth 콜백 과정에서 세션 속 객체를 파이썬의 피클(pickle.loads) 함수로 역직렬화하는 과정에서, 위조된 쿠키에 악성 피클 데이터를 주입하여 인증 없이도 원격 코드 실행이 가능했습니다. 연구자는 실제 서버에 피해를 주는 대신 time.sleep(N) 명령을 삽입하여 응답 지연을 통해 코드 실행 여부를 성공적으로 검증했습니다. 이 취약점은 developers.google.com을 포함한 7개 구글 도메인에 영향을 미쳤습니다.
이번 사례는 소프트웨어 개발에서 기본적인 보안 원칙이 얼마나 중요한지 다시 한번 일깨워줍니다. 특히, 민감한 정보인 서명 키와 OAuth 자격 증명을 분리하고, 배포 환경마다 고유한 시크릿 키를 사용하는 것이 필수적입니다. 또한, 클라이언트 경계를 넘는 데이터에 피클(pickle)과 같은 안전하지 않은 역직렬화 메커니즘을 사용하는 것은 원격 코드 실행으로 이어질 수 있는 심각한 보안 결함이 될 수 있습니다. 구글은 노출된 OAuth 클라이언트 비밀값 교체, 고엔트로피 플라스크 시크릿 키 사용, OAuth 흐름 객체 서버 보관, 그리고 피클 대신 스키마 검증을 거치는 데이터 전용 형식 사용 등 네 가지 조치를 통해 취약점을 해결했습니다. 이러한 보안 결함들이 복합적으로 작용하여 단 두 번의 GET 요청만으로 구글 서버에서 코드를 실행할 수 있었다는 점은 개발자들이 경각심을 가져야 할 부분입니다.