Исследователю безопасности Алексу Шапиро удалось с помощью брутфорса взломать API системы бронирования авиакомпании Avelo. В результате получилось узнать личные данные случайных пассажиров.
Обычно API бронирования оснащены двухфакторной защитой, которая предотвращает кражу данных. Чтобы получить доступ к информации, надо знать номер бронирования и фамилию пассажира. Такая комбинация из двух параметров даёт очень много возможных значений, поэтому подобрать её сложно.
В системе бронирования авиакомпании Avelo не было двухфакторной защиты. Всё что надо для получения данных — шестизначный номер бронирования, состоящий из заглавных букв английского алфавита и цифр. Возможных значений всего 366 = 2 176 782 336, и их уже не так сложно подобрать брутфорсом.
Если арендовать сервер с возможностью отправлять по 100 тыс. запросов в секунду, то все актуальные коды бронирования можно будет получить примерно за шесть часов. При этом аренда сервера с нужными параметрами будет стоить в пределах тысячи долларов.
Следующей ошибкой инженеров Avelo стало игнорирование файлов cookie. В алгоритме проверки можно было бы привязать токен аутентификации к номеру бронирования. Тогда сервер возвращал бы пользователю только его данные. Разработчики этого не сделали, поэтому для запросов подходили любые файлы cookie с токеном аутентификации.
Единственная система защиты в API системы бронирования Avelo — ограничение на количество запросов в секунду. Блокировки подозрительных IP-адресов или капчи в системе не было.
Исследователь написал скрипт на Python для генерации случайных шестизначных кодов бронирования и получил от сервера данные пассажиров, включая:
личные данные: имя (FullName), дату рождения (DateOfBirth), пол (Gender);
номер удостоверения личности (IDDocuments.IDNumber);
контактную информацию: номер телефона и электронную почту;
данные бронирования: номер рейса, посадочное место, дату и время вылета;
платёжные данные: номер карты с маской в формате ************8 (CardNumber), срок действия карты (DateTimeExpiration), адрес для выставления счетов (Address.PostalCode);
данные внутренних ваучеров: номер счёта (PaymentInternals.AccountNumber), сумму счёта (Amount.Value);
данные PCI DSS: PaymentCards.TrackData.
Среди сотен полученных бронирований оказались пассажиры, которые летают рейсами Avelo по правительственным делам. Их почты заканчивались на @dot.gov и @faa.gov.
Скриншоты JSON-файлов с данными
Исследователь обнаружил уязвимость 15 октября 2025 года и сразу сообщил в поддержку Avelo. Спустя сутки с инженером связались, и попросили подробнее рассказать об ошибке и воспроизвести её. Почти через месяц, 13 ноября, разработчики отчитались об исправлении.
Источник: habr.com