Внимание Если вы работаете с сервисами Go на Amazon ALB и еще не обновились до версий 1.13.1 / 1.12.10, пожалуйста, сделайте это немедленно, так как эта уязвимость может быть применима к вам!
99designs, как и многие веб-сайты, серьезно относящиеся к конфиденциальности и безопасности, запускает программу вознаграждения за ошибки; мы платим «хорошим хакерам», чтобы они взломали нас и сообщили нам об уязвимостях, которые мы затем исправили. Будучи глобальной креативной платформой, распространяемой преимущественно через Интернет, большинство затронутых вопросов — это довольно непримечательная CSRF и случайные уязвимости XSS, но недавно у нас был отчет, который выделился и увлек нас в интересное путешествие:
Содержание статьи
Что такое контрабанда запросов?
—
Контрабанда запросов — это тип атаки, при котором злоумышленник обрабатывает HTTP-запрос таким образом, что он может вызвать разногласие (десинхронизацию) между промежуточными серверами в том, как должен обрабатываться запрос, в результате чего их запрос интерпретируется как стартовый. следующего (возможно, действительного) запроса на соединение.
В случае этой уязвимости возникли разногласия между AWS Application Load Balancers и библиотекой HTTP в Go, языке, который мы любим в 99designs:
Как можно использовать контрабанду запросов
—
Поскольку злоумышленник полностью контролирует начало запроса, существует два основных типа атак, которые он может выполнить:
Первый заставляет случайных пользователей предпринимать действия, которые они не инициировали, например, нравится дизайн или принятие запроса на добавление в друзья. Это делается путем игнорирования исходной строки HTTP-запроса пользователя путем превращения ее в заголовок:
POST / что-либо HTTP / 1.1 Длина контента: 4 Передача-кодировка: чанки 0 GET / like-my-design HTTP / 1.1 Игнорировать: X GET / any-user-request Cookie: UsersSessionCookie
При использовании таким образом файлы cookie исходного запроса сохраняются без изменений, но злоумышленник больше не может контролировать тело. Это ограничивает масштаб атаки простыми действиями, не требующими тела.
Вторая форма этой атаки получает контроль над телом запроса, используя заголовки, предоставленные злоумышленником. Найти конечную точку, уязвимую к такого рода атакам, может быть гораздо сложнее, но в случае ее обнаружения она может иметь катастрофические последствия для безопасности конечных пользователей.
POST / что-либо HTTP / 1.1 Длина контента: 4 Передача-кодировка: чанки 0 POST / отправить / личное / сообщение HTTP / 1.1 Cookie: AttackersSessionCookie Content-Type: application / x-www-form-encoded msg = GET / запрос любого пользователя HTTP / 1.1 Cookie: UserSessionCookie
В этом примере злоумышленник использовал кодировку формы, чтобы отправить себе личное сообщение, содержащее куки пользователя. Это позволит им затем предпринимать какие-либо действия от имени пользователя. Кодирование формы будет продолжаться вплоть до первого «&» в теле, что достаточно для захвата заголовков и большой части тела, если запрос использует json.
Как мы обнаружили уязвимость AWS / Go
—
1 сентября мы узнали об уязвимости, связанной с контрабандой запросов AWS / Go, из отчета исследователя безопасности в HackerOne (хосте нашей программы вознаграждений).
Внутренняя сортировка и оценка
Мы провели первую неделю сентября, пытаясь понять уязвимость и оценить возможное воздействие.
Мы обнаружили, что не можем воспроизвести проблему в локальной среде разработки — это привело нас к мысли, что может быть задействован балансировщик нагрузки приложений AWS. В нашей инфраструктуре было несколько возможных мест, которые могли быть причиной проблемы, поэтому мы начали копать.
Мы отслеживали проблему с используемым нами веб-прокси / роутером, который мы используем разделить трафик между всеми нашими различными сервисами и понял, что это проблема между этим и его балансировщиком нагрузки. В этот момент мы поняли, что это, вероятно, означало, что все службы Go, использующие стандартную библиотеку с ALB, были уязвимы (я считаю, что точные слова были «наполовину Интернет»).
Это казалось серьезной проблемой, поэтому мы передали эту проблему командам безопасности Go и AWS по электронной почте. Обе компании ответили оперативно и решили исправить проблему: Го сказал, что выпускает исправление безопасности, и AWS пообещал добавить параметр в ALB.
Где мы сейчас?
На момент публикации этой статьи эта уязвимость между AWS и Go больше не является проблемой для 99designs:
26 сентября: Команда Go выпустила Go 1.13.1 с исправлением и отправила CVE в MITRE.
30 сентября: На следующий рабочий день мы развернули исправление в наших 20-кое-каких сервисах Go.
1 октября: Мы выплатили вознаграждение исследователю безопасности, который сообщил об уязвимости.
Огромное спасибо исследователю безопасности из HackerOne, который обнаружил уязвимость. Абсолютно незапрашиваемый плагин: в 99designs мы очень серьезно относимся к конфиденциальности и безопасности, и мы невероятно довольны программой баунти-багов через HackerOne и настоятельно рекомендуем ее
.