DEEP DIVE REPORT

Vertex AI SDK 버그 선점으로 발생하는 크로스-테넌트 RCE 위험 분석

SecurityDesk
2026.06.24 조회 15

서론

구글 클라우드의 Vertex AI SDK에 치명적인 취약점이 발견되어 크로스-테넌트 원격 코드 실행(RCE) 위험이 드러난다. 이 취약점은 버킷 선점(bucket squatting) 공격을 통해 공격자가 자신의 클라우드 프로젝트에서 피해자의 머신러닝 모델 업로드를 탈취할 수 있게 한다. Palo Alto Networks Unit 42 연구팀이 발견하고 구글에 책임 있는 공개(responsible disclosure)를 한 이 문제는 버킷 소유권 확인 누락과 예상 가능한 버킷 네이밍 패턴 결합으로 발생한다.

본론

취약점 개요

이 취약점은 Vertex AI Python SDK 버전 1.139.0과 1.140.0에 영향을 미친다. 사용자가 명시적인 스테이징 버킷을 지정하지 않으면, SDK가 프로젝트 ID와 리전을 기반으로 결정론적 패턴으로 버킷 이름을 생성한다. 문제는 버킷 존재 여부만 확인하고 소유권은 검증하지 않는다는 점이다.

버킷 이름 구조는 {project_id}-vertex-staging-{region} 형태로, 공격자가 피해자의 프로젝트 ID를 알면 예측이 가능하다. 프로젝트 ID는 종종 공개적으로 발견 가능하므로 공격자는 자신의 프로젝트에서 먼저 해당 버킷을 생성할 수 있다. 이를 버킷 선점이라고 한다.

공격 시나리오

공격은 3단계로 진행된다. 첫 번째 단계에서 공격자는 피해자의 프로젝트 ID와 리전을 알아내고 예상되는 스테이징 버킷 이름으로 버킷을 생성한다. 그리고 모든 인증된 사용자가 버킷을 읽고 쓸 수 있도록 IAM 권한을 설정한다. 이는 피해자가 모델을 업로드하고 Vertex AI 서비스 에이전트가 모델을 읽는 데 필요하다.

두 번째 단계에서 공격자는 Cloud Function을 배포한다. 이 함수는 버킷에 새로운 객체가 생성될 때마다 트리거되며, 업로드된 모델을 악성 페이로드로 교체한다. 악성 페이로드는 pickle 역직렬화를 통해 코드 실행이 가능하도록 crafted된 Python 객체이다.

세 번째 단계에서 피해자가 정상적인 SDK 코드로 모델을 업로드하면, SDK가 공격자가 선점한 버킷을 사용한다. 공격자의 Cloud Function이 약 800ms 내에 모델을 교체하고, Vertex AI 서비스 에이전트가 약 2.5초 후에 모델을 읽는다. 이 시간 차이를 활용해 악성 모델이 로드된다.

기술적 세부사항

Pickle 역직렬화 공격 벡터

Python 머신러닝 모델은 pickle 또는 joblib을 사용하여 직렬화되는 것이 일반적이다. pickle의 중요한 속성은 역직렬화 시 코드 실행이 가능하다는 점이다. pickle 프로토콜은 __reduce__ 메서드를 지원하며, 이 메서드는 객체 재구성 방법을 정의한다. 공격자가 제어하는 pickle 파일은 joblib.load()pickle.load() 호출 시 유효성 검사 전 임의의 Python 코드를 실행하는 __reduce__ 메서드를 정의할 수 있다.

경쟁 조건(Race Condition) 윈도우

Unit 42의 테스트에 따르면, 피해자의 업로드와 서비스 에이전트의 읽기 사이에는 약 2.5초의 윈도우가 존재한다. Cloud Function이 google.storage.object.finalize 트리거로 약 800ms 내에 반응하면 충분한 시간이 남는다. 즉, 공격자가 경쟁 조건에서 이겨서 악성 모델로 교체할 수 있다.

공격 영향

악성 모델이 배포되면 공격자의 코드가 Vertex AI 서빙 인프라 내에서 실행된다. Unit 42의 POC에서는 서빙 컨테이너의 서비스 계정 자격증명을 탈취하는 페이로드를 사용했다. 이 토큰은 동일한 Google 관리 테넌트 프로젝트 내의 다른 모델 아티팩트에 접근할 수 있으며, 훈련된 가중치가 포함된 전체 TensorFlow 모델, BigQuery 메타데이터, 액세스 목록, 테넌트 로그, GKE 클러스터 이름, 내부 컨테이너 이미지 경로 등에 접근할 수 있었다. 이는 데이터 유출, 횡적 이동, 피해자의 클라우드 환경 추가 탈취로 이어질 수 있다.

전제 조건

이 공격이 성공하기 위한 전제 조건은 다음과 같다. 첫째, 피해자의 기본 스테이징 버킷이 해당 리전에 존재하지 않아야 한다. 이는 해당 리전에서 Vertex AI를 처음 사용하거나 기본 스테이징 버킷 이름을 사용하지 않는 프로젝트의 경우 일반적이다. 둘째, 피해자가 Model.upload()와 같은 SDK 메서드를 호출할 때 staging_bucket 파라미터를 명시적으로 지정하지 않아야 한다. 공격자 측에서는 Google Cloud 프로젝트와 피해자의 프로젝트 ID 식별만 있으면 된다.

패치 내역

Google은 v1.144.0(2026년 3월 31일)에 첫 번째 수정을 배포하여 버킷 이름에 랜덤 uuid4를 추가했다. v1.148.0(2026년 4월 15일)에 두 번째 수정을 완료하여 버킷 소유권 확인을 추가하여 Model.upload()에서 버킷 선점을 차단했다. 현재 Unit 42와 Google의 Vertex AI 보안 게시판에 이 문제에 대한 CVE는 할당되지 않았다.

결론

이 취약점은 크로스-테넌트 RCE로 이어질 수 있는 심각한 보안 결함이다. 개발자는 즉시 v1.148.0 이상으로 업그레이드해야 한다. 또한 모델 업로드 시 명시적인 staging_bucket을 자신이 제어하는 Cloud Storage 위치로 설정해야 한다. 결함이 클라이언트 SDK에 존재하므로, 프로덕션 서비스뿐만 아니라 노트북, CI 작업, 트레이닝 파이프라인 등 모든 환경에서 google-cloud-aiplatform 버전을 확인해야 한다. 이는 올해 Vertex AI에서 발견된 두 번째 예상 가능한 버킷 이름 취약점이며, 2월에는 CVE-2026-2473이 패치되었다.

참고자료

  1. Unit 42 Palo Alto Networks
    https://unit42.paloaltonetworks.com/hijacking-vertex-ai-model/

  2. The Hacker News
    https://thehackernews.com/2026/06/google-vertex-ai-sdk-flaw-let-attackers.html

  3. Google Cloud Vertex AI Documentation
    https://docs.cloud.google.com/vertex-ai/docs/python-sdk/use-vertex-ai-sdk

  4. Google Cloud Vertex AI Release Notes
    https://docs.cloud.google.com/vertex-ai/docs/core-release-notes


본 콘텐츠는 AI 기술로 생성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하시면 댓글을 통해 소중한 의견 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.

로그인

아직 댓글이 없습니다.

첫 번째 댓글을 작성해보세요!

IT 도구 서랍

→ Unix: 2025-01-15T09:30:00
→ 날짜: 1736934600

→ ASCII: ABC
→ 문자: 65 66 67

ASCII 코드표 — 클릭하면 입력란에 추가

DecHex약어설명
DecHex문자
DecHex문자

→ 유니코드: 홍길동
→ 문자: \ud64d\uae38\ub3d9