Связка самых разных ключей на одном кольце
Pittigrilli · CC BY-SA 4.0

Вчера PHP, сегодня Railway: хостинг попросил сменить вообще все ключи

21 октября облачная платформа Railway сообщила: посторонний добрался до систем, где хранятся переменные окружения клиентов, и для части из них получил содержимое в расшифрованном виде. А там все самое ценное: ключи к API, пароли от баз, доступы к реестрам. Railway считает, что это часть серии атак на платформы, цель которых — ключи к провайдерам ИИ-моделей. Всем клиентам советуют сменить все ключи, при этом сборки на паузе, так что новый ключ выпустить можно, а довезти до сервиса пока нечем. Ночью платформа аннулировала все свои API-токены. Что это меняет и почему удобство «все секреты на одном экране» обходится дороже, чем кажется.

Вчера здесь был разбор двух срочных дыр в PHP, обе на 9,2 из 10. Казалось, на эту неделю по безопасности хватит. Не хватило. В тот же день, 21 октября, Railway, облачная платформа, где многие держат веб-сервисы и базы данных, выпустил раскрытие инцидента. Посторонний добрался до систем, где хранятся переменные окружения клиентов, и, по оценке самой компании, для части из них получил содержимое в расшифрованном виде.

В переменных окружения лежит все самое ценное

Переменные окружения — это место, куда сервис складывает все, без чего он не запустится: ключи к API, пароли от баз данных, доступы к реестрам образов. То есть утекли не адреса почты и не логины. Утекли ключи от квартиры, причем вместе с адресом. Railway пишет, что затронута, судя по первому разбору, только часть пользователей, но менять ключи советует всем, на всякий случай.

Самая интересная фраза в раскрытии другая. Railway считает, что это часть серии атак на платформенные компании, и цель у нее одна: добраться до провайдеров ИИ-моделей. Компания сама предупредила этих провайдеров, чтобы те заранее отозвали ключи. Получается, ключ к модели сейчас — самое вкусное, что лежит в вашем хранилище. За ним сразу деньги: чужие запросы к модели оплачиваете вы, и счет приходит без предупреждения.

Поменять ключ можно, применить нельзя

Дальше начинается почти комедия. Сборки и деплои на платформе остановили во всех регионах, а разбираться, судя по статусу, начали еще утром 21-го, в 07:24 по UTC. Railway честно пишет: понимаем, что вы сейчас не можете обновить приложения новыми ключами. То есть новый ключ вы выпустили, а довезти его до сервиса нечем. Старый тем временем, возможно, лежит у кого-то еще. Вот.

К ночи платформа сама сменила все ключи к своим файловым хранилищам, а к утру 22 октября выложила тринадцать инструкций: как проверить неожиданный расход у провайдеров моделей и в платежном сервисе, как поискать странный доступ в облаках и на GitHub, как сменить пароли к Postgres, MySQL, MongoDB и Redis. Сборки вернули сначала корпоративным клиентам, остальным обещают по очереди. А в 04:17 по UTC Railway аннулировал вообще все свои API-токены. Веселая ночь у людей.

Дело не только в Railway

Первая реакция простая: клиент платит за хостинг, а не за то, чтобы его ключами пользовался кто-то еще. Хотя, мне кажется, дело не в одной платформе. Дело в том, как последние годы принято строить. Удобно же: положил ключ в переменную, нажал кнопку, и все работает. Один экран, все секреты рядом. Получается, все, что нужно украсть, заранее собрано в одном месте и аккуратно подписано.

Массивная стальная дверь в хранилище банковских ячеек
Joe Mabel · CC BY-SA 4.0

Отсюда три простые вещи. Первое — меняются все ключи, которые жили на платформе, без разбора, какой «наверное не задет». Railway советует ровно это. Второе — у каждого продукта свой ключ к модели и свой лимит расходов. Тогда утечка стоит лимит одного продукта, а не весь бюджет. Третье — главные секреты живут в своем хранилище, а на платформе только то, без чего сервис не поедет. Платформа — это хостинг. Не сейф.

Если что-то из ваших сервисов крутится на Railway, начать стоит с кабинета провайдера моделей: посмотрите расход за последние два дня. Чужие запросы видны там раньше, чем где-либо еще, и у Railway под это есть отдельные инструкции.

Два дня, две тревоги, и обе в итоге про одно. Дверь может быть сколь угодно крепкой, пока ключ от нее висит на общем гвоздике у входа.

Обсудить в Telegram