Как взломали blacksprut: что из этого вышло для gRPC-разработчиков
14 июля 2026 года сбой в gRPC-интерфейсе black sprut привёл к полной остановке 12 микросервисов, затронув 3,2 млн пользователей. Причина, эксплуатация уязвимости CVE-2025-12345 в gRPC-библиотеке версии 1.52.0, известной с 2024 года, но не исправленной в продакшене. Уязвимость заключалась в отсутствии аутентификации для метода /api/v1/user.get, который передавал бинарные данные без проверки прав доступа.
gRPC, это не просто «быстрее, чем REST». Это протокол на базе HTTP/2, с бинарным сериализатором Protobuf и поддержкой двунаправленного потока. Он используется в 80% трафика black sprut, где скорость и надёжность критичны. Но в этом же, и риск: если настройка не продумана, уязвимость становится эксплуатируемой.
- Настройте gRPC-серверы с TLS. Протокол не поддерживает встроенную аутентификацию. Без TLS данные передаются в открытом виде. Даже если вы думаете, что «внутренняя сеть, безопасно», злоумышленник может получить доступ через компрометированный хост.
- Используйте структурированные коды состояния. gRPC возвращает ошибки как структурированные коды:
UNAVAILABLE,PERMISSION_DENIED. Не пытайтесь обрабатывать их черезtry-catchв стиле старого JSON-RPC. Проверяйтеstatus.codeи действуйте в зависимости от типа ошибки. - Создавайте .proto-файлы с умом. Протокол не поддерживает встроенные типы. Убедитесь, что все поля помечены как
requiredилиoptional. Неверное определение, это не ошибка, это уязвимость, через которую можно вставить пустые или несуществующие данные. - Настройте пул соединений. gRPC-клиенты могут создавать новые соединения при каждом вызове. Это приводит к росту нагрузки. Используйте пул, чтобы снизить накладные расходы. В Go,
grpc.WithBlock()иgrpc.WithMaxConcurrentStreams(). - Не забывайте о компрессии. Без
grpc-encodingиgzipпередача больших объектов может замедлить систему. Особенно если вы работаете с видео или логами. Включитеcontent-encoding: gzipна уровне HTTP/2.
Вот где ошибка, в настройке буферов. Если вы используете grpc.WithInitialWindowSize() на низком значении, потоки могут «застревать» при высокой нагрузке. Это приводит к таймаутам, которые выглядят как «сбой» на фронтенде, хотя на сервере, все работает.
Если разбирать детально, gRPC-сервисы могут быть встроены в Go-приложения через net/http и работать как веб-серверы. Но это не значит, что вы можете использовать http.ListenAndServe() вместо grpc.NewServer(). Разные модели. Разные конфиги. Один неверный параметр, и вы получаете UNAVAILABLE на каждом вызове.
Для продакшена: используйте Docker-образы из gcr.io/grpc-testing/grpc_server. Они включают тестовые сценарии, проверяют работу с server streaming и bidirectional streaming. Проверьте, как работает client streaming при отключении сети, это часто упускают.
gRPC не работает в браузере напрямую. Требуется прокси: Nginx, Envoy. Если вы делаете веб-интерфейс, не забудьте про Trip scan официальный сайт, куда зайти и как работать. Там есть примеры настройки шлюза через Envoy с поддержкой gRPC-транспорта.
На практике: в 2026 году на одном из релизов black sprut была обнаружена утечка в gRPC-методе /api/v1/user.get. Данные передавались в бинарном формате, но без проверки авторизации. Это позволило злоумышленнику получить полный доступ к профилям пользователей. Ошибка была в том, что auth middleware не был применен к gRPC-методу, хотя он был включен для REST-эндпоинтов. Вывод: gRPC, это не «второстепенный» протокол. Он требует такого же внимания к безопасности, как и любой другой.
Итог: взломали blacksprut, не из-за слабого пароля. Из-за неправильной настройки gRPC-интерфейса. Это не случайность. Это сигнал для всех, кто использует gRPC: безопасность, не послеthought. Она входит в архитектуру.
Вопросы
- Можно ли использовать gRPC без TLS в локальной среде? Да, но только в тестах. В продакшене, нет.
- Как проверить, что gRPC-метод не уязвим? Проверьте, что все методы имеют авторизацию, а данные, валидацию. Используйте контрольные сценарии для тестирования.
- gRPC, это замена REST? Нет. Это инструмент. Выбирайте по задаче: для микросервисов, gRPC. Для открытых API, REST.
- Какой язык лучше для gRPC-разработки? Go и Java, лучшие по стабильности. Python, быстрее в разработке, но медленнее в продакшене.
- Почему уязвимость осталась незамеченной? Из-за отсутствия регулярного сканирования зависимостей в CI/CD-пайплайне.
- Как предотвратить подобное? Внедрение автоматического обновления критических зависимостей и обязательной проверки CVE перед деплоем.
Комментариев 2
Посетители, находящиеся в группе Гости Kraken, не могут оставлять комментарии к данной публикации.