🔗 ServerMess, или почему serverless — это тихий ужас AppSec-а
ПРЕДУПРЕЖДЕНИЕ
ТЕМА УРОВНЯ /b/
Всем снова привет! Давно я не выносил вам мозг про уязвимости, но, сами понимаете, молчать больше нельзя. Сегодня поговорим о ServerMess — как serverless-архитектуры тихо и незаметно ломают безопасность.
🤯 Что за "ServerMess" вообще такой?
Это такой скрытый хаос, который случается, когда разработчики на радостях пилят десятки Lambda-функций, Azure Functions и Cloud Functions и связывают их через event-driven подход. Сначала выглядит всё красиво: события летят, функции реагируют, разработчики довольны. Но потом наступает утро, и ты понимаешь, что у тебя под капотом полная жесть, а не архитектура. События запускают друг друга, вызывая функции, о которых уже никто не помнит, и весь этот цепной балаган уже никак не контролируется обычными инструментами безопасности.
❌ Что реально сломано (примеры которые я смог найти)
Если интересно, то сделаю про OpenSource решения (Knative, OpenFaaS, Fission)
1️⃣ AWS Lambda + EventBridge
Есть приложение, публикующее события вроде “OrderPlaced” через AWS EventBridge. Лямбды подписываются и радостно реагируют на это событие. Проблема в том, что EventBridge легко может стать открытым для публикации всем подряд. И вот уже злоумышленник с минимальными правами отправляет туда фейковое событие:
{
"Source": "orders.service",
"DetailType": "OrderPlaced",
"Detail": "{ \"orderId\": \"an.mtv\", \"userEmail\": \"attacker@test.local\" }"
}
И понеслось, кто-то шлёт письма не тому, кто-то обновляет статистику фальшивыми заказами, а кто-то (если повезло хакеру) ещё и читает данные из базы.
2️⃣ Azure Functions через Event Grid
В Azure разработчики любят триггеры через Event Grid. Проблема: часто это просто HTTP-вебхуки, которые случайно забывают закрыть ключами или хотя бы SAS-токенами. Злоумышленник спокойно отправляет фейковый запрос на публичную функцию, и вот уже кто-то получает нежелательные письма, а кто-то регистрирует тысячи новых пользователей. В общем, опасность тут настоящая.
❓ Почему классические средства защиты (DAST, SAST, WAF) в пролёте
Инструменты привыкли видеть HTTP-трафик и понятные цепочки данных. А бессерверные приложения разбиты на микрокуски, связанные событиями через облачные очереди и сервисы, куда традиционные сканеры просто не дотягиваются.
WAF вообще бесполезен, если атака идёт через внутренний канал событий типа SQS или Pub/Sub.
🔍 Как искать такой скрытый трэш
- Включайте Distributed Tracing типа AWS X-Ray или Azure Application Insights, чтобы увидеть, кто и как вызывает ваши функции.
- Используйте инфраструктурные сканеры (Prowler, Checkov, ScoutSuite), чтобы находить открытые топики и очереди.
- Фаззинг событий: берёте свой скриптик и отправляете мутные payload’ы прямо в очереди, смотрите на реакцию ваших функций.
🌐 Как защищаться и спать спокойно
- Каждой функции своя минимальная IAM-роль, никакой общей помойки с * правами.
- Не доверяйте данным из событий по дефолту: строгая валидация схемы и событий.
- Закрывайте триггеры аутентификацией и проверкой источника (хотя бы через HMAC или VPC Service Controls в GCP).
- Настройте мониторинг аномалий в событиях. Если количество вызовов резко возросло — это повод проснуться ночью и проверить, не хакнули ли вас уже.
🌐 Заключение
Serverless — это круто, пока не начинается бардак. Если вы строите свою инфраструктуру на Lambda, Azure или GCP Cloud Functions, то пора посмотреть на неё трезвыми глазами. Иначе в один прекрасный день она сама посмотрит на вас глазами удивлённого безопасника, которого только что взломали через тихий и незаметный Event Injection.
Для ознакомления
Безопасность serverless-приложений –
ТЫК (Youtube)
Всё, что вы хотели знать о бессерверных технологиях, но боялись спросить –
ТЫК The Ten Most Critical Risks for Serverless Applications v1.0 –
ТЫКLock-down OpenFaaS for the public Internet –
ТЫК#appsec