Користувач Google Cloud залишив API-ключ в проєкті, і його майже обікрали на $18 тисяч

Одного ранку AI-консультант та засновник Agentic Labs Джессі Девіс прокинувся не просто з поганим настроєм, а з рахунком від Google Cloud на понад 25 тисяч австралійських доларів. Це приблизно 18 тисяч доларів США. Хоча взагалі-то бюджет на акаунті був виставлений у 10 доларів.

Що сталося

За ніч зловмисник заволодів API-ключем в Google Cloud. Він знайшов Cloud Run-сервіс, який Девіс колись опублікував з Google AI Studio та зайшов на публічну URL-адресу. А далі вже проксі Google підписував запити від імені цього сервісу, використовуючи API-ключ, який зберігався у контейнері як відкритий текст у змінній середовища.

Сам сервіс не був ніде публічно поширений та не індексувався. Крім того, Девіс притримувався всіх заходів безпеки: у нього були окремі API-ключі для різних проєктів, окремі білінгові акаунти, двофакторна аутентифікація та ввімкнені журнали аудиту.

Тож поки герої цієї історії спав, на акаунт прилетіло близько 60 тисяч неавторизованих запитів.

«Коли я отримав сповіщення про бюджет наступного ранку, з моєї кредитної картки вже списали 10 тисяч австралійських доларів. Під час розмови зі службою підтримки Google надійшло сповіщення ще про 15 тисяч»

При цьому акаунт без попередження та підтвердження був переведений на вищий білінговий рівень: з ліміту у 2000 доларів до 20-100 тисяч доларів.

Як користувач вирішив проблему

Звернувшись у підтримку, Девіс очікувано потрапив на AI-агентів. Ті бачили старі дані та взагалі не розуміли, про який рахунок мова. Коли він дістався до людини, йому порадили вимкнути білінг. Він це зробив — та втратив журнали, які були потрібні для розслідування.

Потім користувача попросили довести, що акаунт зламали. Коли він діставав дані про навантаження, то побачив, що атака все ще триває в реальному часі. Запити йшли тисячами на хвилину, поки він сидів у чаті з підтримкою. На це йому відповіли, що «так буває, коли ви користуєтеся нашими сервісами, споживання росте». А невдовзі проєкт взагалі призупинили за «зловживання».

У підсумку Google все ж скасувала списання на 25 тисяч, а банк повернув кошти, які вже встигли пройти. Втім, підтримка досі не повідомила, який саме ключ використовувався, звідки йшов трафік, що стало тригером для автоматичного підвищення білінгового рівня та чому підтримка так довго не могла розпізнати шахрайські дії.

Чому це трапилося

Після ситуації Девіс уважно вивчив налаштування акаунту та виявив дев’ять функцій безпеки, які мали б зменшити шкоду, чи взагалі запобігти історії. Більшість із них були або вимкнені за замовчуванням, або налаштовані в поблажливому режимі.

Які це функції
  • обмеження для API-ключів були вимкнені за замовчуванням, тобто ключ працював без жорсткої прив’язки;
  • місячний ліміт витрат був порожнім;
  • журнали Gemini API треба вмикати окремо, також вони потребують активного білінгу, тож коли ви вимикаєте оплату під час інциденту — втрачаєте доступ до журналів;
  • підвищення білінгового рівня відбувається автоматично;
  • postpay був стандартним режимом, тобто фактично з необмеженим кредитним ризиком до моменту виставлення рахунку;
  • застосунок, опублікований з AI Studio у Cloud Run, мав вимкнений invoker IAM, а ключ лежав як змінна середовища у відкритому вигляді;
  • діагностичний інструмент Your AI spend існує, але його треба знайти та ввімкнути вручну;
  • виявлення аномалій у бюджеті не є «розумним», воно працює лише за тими порогами, які користувач задав сам;
  • повідомлення про помилки Gemini можуть повертати сам API-ключ, якщо застосунок показує сирі відповіді без санітизації.

Крім того, Девіс з’ясував, що budget alert не зупиняє витрати. Інструмент просто надсилає лист із затримкою, яка, за словами Девіса, може сягати 32 годин. Тобто це сповіщення не для зупинки атаки, а для того, щоб дізнатися про втрати постфактум.

Як зменшити ризики

Розібравшись у ситуації, Девіс сформулював загальні поради, як уникнути такої халепи:

  • Увімкнути обмеження для API-ключів та не залишати жодного повністю відкритого ключа.
  • Виставити місячний spend cap для кожного проєкту в AI Studio та не залишати його порожнім.
  • Перевірити поточний білінговий рівень, щоб розуміти, коли акаунт може автоматично перейти на вищий рівень.
  • По можливості використовувати prepaid billing або окремі картки з низьким лімітом для білінгу.
  • Вмикати Gemini API logs заздалегідь, а не вже під час інциденту.
  • Активувати Your AI spend, щоб бачити атрибуцію витрат по ключах.
  • Перевірити Cloud Run-сервіси, особливо якщо щось публікувалося з AI Studio: чи не лежить там ключ у змінних середовища та чи не залишився сервіс публічним.
  • Не показувати сирі помилки Gemini в застосунку або журналах.
  • Якщо атака вже йде: спочатку відкликати ключ, потім виставити spend cap у 0, та лише після цього вимикати білінг.
  • Перед вимкненням білінгу витягти дані з IAM та Logs Explorer, інакше можна втратити докази.
  • Спершу дзвонити в банк, а вже потім сперечатися з підтримкою.
  • Не покладатися лише на push-сповіщення банку, а перевіряти стан вручну.
  • Мати на увазі, що публічний розголос іноді пришвидшує реакцію сильніше, ніж офіційний канал підтримки.

Хоча історія закінчилась позитивно, вражень Девіс отримав на рік вперед. Також він розповів про свої пригоди на Reddit, де кілька коментаторів теж повідомили про подібні випадки. Наприклад, користувач з Японії отримав рахунок на 44 тисячі доларів, який зріс до 128 тисячі навіть після того, як він призупинив API.

Цікаво, що одна з компаній з кібербезпеки ще у лютому повідомляла про ризики, пов’язані з API-ключами в Google Cloud.

«Google казав, що API-ключі Google не є секретами. Але це вже не так: Gemini приймає ті самі ключі для доступу до ваших особистих даних. Ми просканували мільйони веб-сайтів та виявили майже 3000 ключів API Google, що тепер також автентифікуються в Gemini, хоча вони ніколи не були для цього призначені. Маючи дійсний ключ, зловмисник може отримати доступ до завантажених файлів, кешованих даних та стягувати плату за використання LLM з вашого облікового запису»

А ви переглядали Google API-ключі після того, як Gemini почав приймати їх для доступу до пов’язаних сервісів? І взагалі — чи перевіряєте свої проєкти саме з точки зору фінансової безпеки, а не лише технічної?

👍ПодобаєтьсяСподобалось4
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

В мене YouTube досисих пір знімає оплату за спонсорську підписку на інші YouTube канали. Після того коли YouTube видалив мій YouTube канал. Для того щоб скасувати спонсорську підписку мені потрібно зайти в свій YouTube канал який мені YouTube видалив. Буду дзвонити в банк, щоб блокували запити від YouTube на зняття коштів

Чула схожі історії, неприємна фігня. Якщо я правильно пам’ятаю, проблема у тому, що ютуб-акаунт та гугл-акаунт суміжні, і підписки можуть бути прив’язані до гугла, але це не точно

Ну в гугл акаунті я бачу підписки ютуба, але щоб перейти на саму підписку і її скасувати, потірібно мати ютуб канал, який мені видалили — «Ми не відновимо ваш канал на YouTube»

А що саппорт каже (якщо там взагалі можна дістатися до людини)?

У відновлені ютуб каналу мені відмовили.А про підписки я ще не писав, спочатку думаю з банком вирішу чи зможуть вони заблокувати списання коштів з картки. Я змінив картку з якої ютуб списував кошти, на картку єПідримка))) Не знаю чи ютуб зможе з неї щось списати

Ахаха, заведете в борги державу)

Ютуб спробува списати кошти з картки єПідтримка і в нього нічого не вийшло)))

Your membership to ... has been paused due to payment failure.

We’re having trouble with your current payment method so we had to pause your membership to ... and access to their perks.

We’ll try again, but please update your payment details to regain access to your member benefits.

Вибачте, але

Ютуб спробува списати кошти
з картки єПідтримка

Це ніби оцей мем)

Ну Ютуб написав що буде ще пробувати списувати кошти з єПідтримки. Успіху йому)

І єПідтримка така присилає вам листа через через деякий час: Dear customer, we cannot afford to pay for this kind of service. Please calm down your YouTube)

Ну мені ще в банку сказали, що можна випустити віртуальну картку, потім дану картку підв’язати під спонсорські підписки, замість картки єПідтримка, а потім ту нову віртуальну картку заблокувати, щоб YouTube не зміг з неї списувати кошти)))

Нащо стільки рухів, якщо є єПідтримка, яка і так гарно справляється?))

Поки що білеше рухів робити не буду))

видаляй пов’язаний гугл акаунт....

Як варіант, можна буде спробувати

Сам сервіс не був ніде публічно поширений та не індексувався

А це і не треба. Достатньо створити SSL сертифікат для вашого домену, і через Certificate Transparency Logs ті кому треба вас знайдуть.

У мене була схожа ситуація буквально днями. Тільки там ще фігурував «навіково заблокований обліковий запис воркспейс», який AI після аналізу ситуації розблокував назад. Тільки без рахунку. Але з блоком всього воркспейсу на 44 дні.
Може потім напишу деталі.

Claude закомітив? Класика.

Підписатись на коментарі