Отримуємо список пасажирів рейсів найбільшого авіаперевізника України

Більше місяця тому я почав готуватися до відпустки і як раз прийшов час бронювати авіаквитки. Так я опинився на сайті авіакомпанії МАУ. В процесі вибору місць в літаку, сторінка, яка повинна була відображати схему місць, ніяк не хотіла завантажуватися.

Я вирішив відкрити в Google Chrome інструмент розробника, щоб спробувати зрозуміти, в чому проблема. Вивчивши запити до сервера, я побачив, що дані про доступних місцях сервером повертаються.

Випробувавши кілька різних браузерів, я так і не вирішив проблему, однак зауважив, що запит, який повертає список доступних місць, виконувався у всіх браузерах успішно, незважаючи на те, що сесійні куки були доступні тільки в Google Chrome.

Запит виглядав наступним чином:

http s: //bookapi.flyuia. com / ancillary / seatmap? pnr = XXXXXX & currency = USD & flyuiacountrycode = uk & flyuialanguagecode = ru & locale = RU


де XXXXXX - PNR або, так званий, код бронювання.
Відповідь же сервера мав такий вигляд у всіх браузерах:

[{ "PaxDetails": { "uniqueId": "2", "firstName": "IVANOV", "title": "Пані (Ms.)", "lastName": "IVAN", "paxType": " Adult "," cartPaxId ":" b1da2ebf-4525-35bd-afc1-b1f448132ad3 "}," segmentDetails ": [{" company ":" PS "," bookingClass ":" B "," flightNumber ":" 1 234 ", "departureAirport": "KBP", "arrivalAirport": "JFK", "departureDateTime": "2018-02-01T00: 05", "operatingAirline": "PS"}], "segmentId": "1", "isAvailableForCheckIn ": true," seat_rows ": [{" seats ": [{" id ":" aab4ca38-2c28-1f13-359d-4ad264d53a0e_1e80aae3-a68b-44de-ae14-aff839563612 "," occupation ":" AVAILABLE "," letter ":" A "," rowNumber ": 4," seatCharacteristics ": [" W "," CH "," EK "," H "," for_infant "]," price ": {" amount ":" 16.00 " , " currency ":" USD "}," class ":" ECONOMY "," seat_type ":" SEAT "," ticket_value ":" FD3A "}, ...]

А це означало те, що інформація про пасажирів була доступна будь-якому користувачеві з будь-якого пристрою лише по PNR коду. Отже, знаючи номер бронювання, будь-який користувач міг отримати такі дані про пасажира, як прізвище, ім'я, дорослий це чи дитина, номер рейсу, аеропорти відбуття і прибуття, час відбуття.

Мені стало цікаво, які ще "сюрпризи" зберігає даний сервіс.

Продовживши оформлення квитків, я вибрав пункт замовлення місця для багажу.

Запит мав схожий вид:

http s: //bookapi.flyuia. com / ancillary / luggage? pnr = XXXXXX & currency = USD & locale = RU

Однак відповідь сервера містив трохи більше інформації про користувача: [{

"PaxDetails": { "uniqueId": "2", "firstName": "ivan", "title": "Пан", "lastName": "ivanov", "paxType": "Adult", "dateOfBirth" : "1978-10-20", "cartPaxId": "a30928c1-219b-8d15-8345-b517f0fda360"}, ...]

Таким чином додалася ще така інформація про пасажира, як дата його народження.

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

Взагалі, говорячи в термінах закону України про захист персональної інформації, персональні дані - це відомості чи сукупність відомостей про фізичну особу, яка ідентифікована або може бути конкретно ідентифікована. Дані, доступні в вищевказаних запитах дозволяють в деяких випадках однозначно ідентифікувати людину не маючи навіть дати народження. Таким випадком є ​​варіант, якщо бронювання містить дані про кількох осіб. Так як такі особи є як мінімум знайомими, а в багатьох випадках родичами, ідентифікувати їх за допомогою соціальних мереж не складе великих труднощів. Таким чином вже наявні дані, на мій погляд, можна вважати персональними, а факт публічного доступу до них - порушенням закону про захист персональних даних. Але не будемо відволікатися і продовжимо.

Досліджуючи далі "можливості" сервісу, я перейшов на сторінку оплати. Тут мене чекав новий сюрприз. Запит мав вигляд:

http s: //bookapi.flyuia. com / payportal / transaction / 123456? flyuiacountrycode = ua & flyuialanguagecode = ru & locale = RU


Він так само виконувався у всіх браузерах без сесійних куків:

{ "Id": 211334, "payportal": "UkrEximBank", "creationTime": "2017-12-25 14:32:13", "status": "INIT", "amount": 15578.00, "currency": "UAH", "errorCode": 0, "errorCategory": "UNDEFINED", "data": "{\" Locale \ ": \" ru_RU \ ", \" ORDER \ ": \" +000000450187 \ ", \" PosId \ ": \" 12e66438b256e10f74424133 \ ", \" Pnr \ ": \" XXXXXX \ ", \" fopType \ ": \" CREDIT_CARD \ ", \" Country \ ": \" 492ac4aae7f43c6e6a4336f9 \ ", \" Passenger \ ": \" ivanov ivan \ ", \" PayerEmail \ ": \" [email protected] \ ", \" BackReference \ ": \" https://book.flyuia.com/RU/default/paymentstatus \ ", \" OaDRoute \ ": \" 01Feb18JFKKBP-10Feb18KBPJFK \ ", \" LANG \ ": \" UKR \ ", \" DESC \ ": \" XXXXXX, ivanov ivan, 01Feb18JFKKBP-10Feb18KBPJFK \ "}", ...}


У запиті міститься різна платіжна інформація, але для нас важливіше наявність такого параметра, як PNR код. Як видно, запит містить інкрементальний ID транзакції, що означає, що при переборі даного значення в більшу або меншу сторони зловмисники зможуть отримувати реальні коди бронювання і використовувати їх в попередніх запиту для отримання докладної інформації про клієнтів компанії по PNR коду без використання атаки типу брутфорс.

В результаті набір всіх вразливих запитів дозволяє зловмисникам організувати сервіс, який зможе в режимі реального часу непомітно для адміністраторів ресурсів складати список пасажирів рейсів авіакомпанії. Однак список пасажирів не є публічною інформацією та захищається в цілях безпеки авіакомпаніями, а в деяких країнах і законами. Доступ до таких даних мають як правило тільки співробітники компаній і певні держструктури. Тим більше було моє здивування, коли звернувшись в клієнтську підтримку компанії МАУ і повідомивши їм про наявність даних вразливостей, в процесі листування і уточнення статусу моєї заявки я отримав таку відповідь:

Однак на питання, чи надають вони за запитом клієнтів список пасажирів рейсу, мені відповіли негативно.

Незважаючи на такий дивний відповідь компанії, розробники протягом місяця усунули всі вищевказані уразливості, що заспокоїло мене, як клієнта.

Окремим пунктом хотілося б звернути увагу на те, що знову ж таки, як у випадку і з іншими великими компаніями, в МАУ відсутній окремий канал зв'язку для повідомлень про знайдені вразливості. На моє прохання зв'язати мене зі службою безпеки або відповідальними розробниками, мені відповіли відмовою:

Підводячи підсумки, хочу сказати наступне.

Авіакомпанії повинні дбати про безпеку своїх пасажирів не тільки в аеропортах і на борту літака, але також і в мережі. Адже дані про пасажирів - це дуже чутлива інформація. Володіючи нею, злодії можуть пограбувати квартиру жертви, поки та буде у від'їзді. Екс-чоловік може переслідувати свою колишню дружину, знаючи про її переміщеннях. Зловмисник, отримавши коди бронювань, може через сайт авіакомпанії масово скасувати реєстрацію пасажирів, що потенційно може призвести до затримки рейсів. Публічна інформація про переміщеннях бізнес-конкурентів може завдати шкоди їх компаніям. Способів використання такої інформації зі злим умислом безліч і охоронятися вона повинна відповідним чином.

Com / ancillary / seatmap?
Com / ancillary / luggage?
Com / payportal / transaction / 123456?

Дополнительная информация

rss
Карта