Lỗ hổng SDK Google Vertex AI cho phép kẻ tấn công chiếm quyền kiểm soát quá trình tải lên mô hình thông qua "Bucket Squatting"

Một lỗ hổng nghiêm trọng trong bộ công cụ phát triển phần mềm Google Cloud Vertex AI SDK dành cho Python đã cho phép kẻ tấn công – dù không hề có quyền truy cập vào dự án (project) của nạn nhân – vẫn có thể chiếm quyền kiểm soát quá trình tải lên mô hình học máy (machine learning model) và thực thi mã độc bên trong cơ sở hạ tầng máy chủ của Google.
Đơn vị nghiên cứu Unit 42 thuộc Palo Alto Networks, tổ chức đã phát hiện và báo cáo lỗi này thông qua chương trình săn tiền thưởng lỗi (bug bounty) của Google, gọi kỹ thuật này là "Pickle in the Middle". Unit 42 cho biết họ chưa ghi nhận bất kỳ vụ khai thác thực tế nào trong môi trường tự nhiên. Hiện tại, Google đã vá lỗ hổng này. Nếu bạn đang sử dụng SDK trên, hãy cập nhật ngay lên phiên bản 1.148.0 hoặc mới hơn.
Cơ chế khai thác lỗ hổng
Điều đáng lo ngại là kẻ tấn công chỉ cần có một tài khoản Google Cloud Project của riêng chúng và ID dự án (Project ID) của nạn nhân (vốn là thông tin thường được công khai). Cuộc tấn công không đòi hỏi thông tin đăng nhập, không cần lừa đảo (phishing) và không cần có chỗ đứng sẵn (foothold) trong hệ thống mục tiêu.
Lỗ hổng nằm ở cách SDK tự động chọn một bộ lưu trữ đám mây tạm thời (Cloud Storage bucket) để tải các mô hình lên. Nếu nhà phát triển không thiết lập sẵn một bucket cụ thể, SDK sẽ tự động tạo ra một tên bucket có thể đoán trước dựa trên Project ID và khu vực (region), ví dụ: project-vertex-staging-region.
SDK có kiểm tra xem bucket đó đã tồn tại hay chưa, nhưng lại không kiểm tra xem ai là chủ sở hữu của bucket đó. Vì tên của các bucket trên Cloud Storage là duy nhất trên toàn cầu (globally unique), kẻ tấn công có thể chủ động tạo trước một bucket với cái tên dự đoán được đó ngay trong dự án Google Cloud của chính chúng.
Khi nạn nhân tiến hành tải mô hình lên, SDK của họ sẽ vô tình tải các tệp tin mô hình thẳng vào bucket do kẻ tấn công kiểm soát. Từ đó, kẻ tấn công có thể nhanh chóng thay thế mô hình gốc bằng một mô hình chứa mã độc.

Tấn công thực thi mã độc (RCE) và đánh cắp dữ liệu
Rất nhiều mô hình học máy Python được lưu dưới định dạng pickle hoặc joblib – những định dạng vốn có đặc tính tự động thực thi mã (code execution) khi tệp được tải lên (load). Khi hệ thống Vertex AI của Google tiến hành nạp mô hình đã bị hoán đổi, mã độc của kẻ tấn công sẽ lập tức được thực thi ngay bên trong container máy chủ của Google.
Cuộc tấn công này đòi hỏi yếu tố tốc độ. Unit 42 đo được rằng thời gian từ lúc nạn nhân tải tệp lên cho đến khi Vertex AI đọc tệp là khoảng 2,5 giây. Trong kịch bản thử nghiệm (Proof of Concept - PoC), kẻ tấn công đã sử dụng một hàm Cloud Function kích hoạt ngay sau khi có tệp tải lên và tráo đổi mô hình chỉ trong vòng 1,4 giây, hoàn tất trước khi Vertex AI kịp đọc dữ liệu.
Sau khi kích hoạt, payload (mã độc) sẽ đánh cắp mã token OAuth từ máy chủ siêu dữ liệu (metadata server) của container và gửi về cho kẻ tấn công. Trong môi trường thử nghiệm của Unit 42, mã token này không chỉ bị giới hạn trong phạm vi triển khai bị xâm nhập, mà nó còn có quyền truy cập vào các tài nguyên mô hình khác thuộc cùng một dự án do Google quản lý (tenant project). Các tài nguyên này bao gồm toàn bộ mô hình TensorFlow với các trọng số đã được huấn luyện (trained weights), siêu dữ liệu BigQuery, danh sách quyền truy cập (ACL), nhật ký hệ thống (logs), tên cụm GKE (Google Kubernetes Engine) và các đường dẫn hình ảnh container nội bộ.
Điều kiện xảy ra tấn công và giải pháp khắc phục
Cuộc tấn công này chỉ có thể thành công dưới các điều kiện cụ thể:
- Bucket cấu hình mặc định (default staging bucket) của nạn nhân chưa từng tồn tại ở khu vực (region) đó. (Điều này rất phổ biến đối với các dự án mới trên Vertex AI).
- Nhà phát triển để trống tham số staging_bucket, hoàn toàn phụ thuộc vào cơ chế đặt tên mặc định của SDK thay vì tự chỉ định một bucket riêng.
Unit 42 đã báo cáo lỗ hổng này cho Google thông qua Chương trình Phần thưởng Lỗ hổng vào ngày 5 tháng 3 năm 2026 sau khi thử nghiệm và xác nhận lỗ hổng tồn tại trên các phiên bản mới nhất lúc bấy giờ là 1.139.0 và 1.140.0.
Google đã tung ra bản vá ban đầu trong phiên bản v1.144.0 bằng cách thêm một chuỗi ngẫu nhiên (uuid4) vào tên bucket. Sau đó, hãng hoàn thiện bản vá trong phiên bản v1.148.0, bổ sung tính năng xác minh quyền sở hữu bucket để chặn đứng hoàn toàn kỹ thuật "bucket squatting" trong hàm Model.upload(). Tính đến thời điểm bài viết được đăng tải, cả Unit 42 và các bản tin an ninh của Google Vertex AI đều chưa gán mã định danh CVE cụ thể cho lỗi này.
Khuyến nghị cho các nhà phát triển
- Cập nhật SDK: Nâng cấp thư viện lên phiên bản 1.148.0 hoặc mới hơn để kích hoạt tính năng kiểm tra quyền sở hữu bucket.
- Chỉ định rõ Bucket: Luôn thiết lập tham số staging_bucket một cách tường minh trỏ về một vị trí Cloud Storage do chính bạn kiểm soát khi tải mô hình lên.
- Kiểm tra diện rộng: Vì logic bị lỗi nằm ở phía client SDK, hãy kiểm tra phiên bản của google-cloud-aiplatform ở mọi nơi nó đang chạy, bao gồm các môi trường Jupyter Notebooks, các tiến trình CI/CD, và các đường ống huấn luyện (training pipelines), chứ không chỉ riêng các dịch vụ đang chạy trên môi trường production.
Đáng chú ý, đây là lỗ hổng liên quan đến đặt tên bucket dễ đoán thứ hai xuất hiện trên Vertex AI trong năm nay. Trước đó vào tháng 2, Google cũng đã phải vá lỗ hổng CVE-2026-2473, một lỗi "bucket squatting" khác trong bộ công cụ Vertex AI Experiments, vốn cũng cho phép thực thi mã độc chéo tài khoản (cross-tenant code execution), đánh cắp và đầu độc mô hình.
Nguồn: https://thehackernews.com/2026/06/google-vertex-ai-sdk-flaw-let-attackers.html