В данной статье речь пойдёт о том, как я обнаружил уязвимость, которая позволяла получить список пассажиров рейсов Международных Авиалиний Украины — самого крупного авиаперевозчика Украины, а также об отношении самой компании к факту наличия такой информации в публичном доступе.
Больше месяца назад я начал готовиться к отпуску и как раз пришло время бронировать авиабилеты. Так я оказался на сайте авиакомпании МАУ. В процессе выбора мест в самолёте, страница, которая должна была отображать схему мест, никак не хотела загружаться.
Я решил открыть в Google Chrome инструмент разработчика, чтобы попытаться понять, в чём проблема. Изучив запросы к серверу, я увидел, что данные о доступных местах сервером возвращаются.
Опробовав несколько разных браузеров, я так и не решил проблему, однако заметил, что запрос, который возвращает список доступных мест, выполнялся во всех браузерах успешно, не смотря на то, что сессионные куки были доступны только в Google Chrome.
Запрос выглядел следующим образом:
где XXXXXX — PNR или, так называемый, код бронирования.
Ответ же сервера имел следующий вид во всех браузерах:
А это означало то, что информация о пассажирах была доступна любому пользователю с любого устройства лишь по PNR коду. Следовательно, зная номер бронирования, любой пользователь мог получить такие данные о пассажире, как фамилия, имя, взрослый это или ребёнок, номер рейса, аэропорты отбытия и прибытия, время отбытия.
Мне стало интересно, какие ещё «сюрпризы» хранит данный сервис.
Продолжив оформление билетов, я выбрал пункт заказа места для багажа.
Запрос имел похожий вид:
Однако ответ сервера содержал чуть больше информации о пользователе:
Таки образом добавилась ещё такая информация о пассажире, как дата его рождения.
На самом деле речь идёт не об одном пассажире, а о всех пассажирах, включенных в данное бронирование. Например я оформлял билеты на всю семью и в вышеуказанных запросах содержалась информация не только обо мне, но так же о супруге и детях.
Вообще, говоря в терминах закона Украины о защите персональной информации, персональные
данные — это сведения или совокупность сведений о физическом лице, которое идентифицировано или может быть конкретно идентифицировано. Данные, доступные в вышеуказанных запросах позволяют в некоторых случаях однозначно идентифицировать человека не имея даже даты рождения. Таким случаем является вариант, если бронирование содержит данные о нескольких лицах. Так как такие лица являются как минимум знакомыми, а во многих случаях родственниками, идентифицировать их с помощью социальных сетей не составит большого труда. Таким образом уже имеющиеся данные, на мой взгляд, можно считать персональными, а факт публичного доступа к ним — нарушением закона о защите персональных данных. Но не будем отвлекаться и продолжим.
Исследуя дальше «возможности» сервиса, я перешёл на страницу оплаты. Здесь меня ждал новый сюрприз. Запрос имел вид:
Он так же выполнялся во всех браузерах без сессионных куков:
В запросе содержится разная платёжная информация, но для нас важнее наличие такого параметра, как PNR код. Как видно, запрос содержит инкрементальный ID транзакции, что означает, что при переборе данного значения в большую или меньшую стороны злоумышленники смогут получать реальные коды бронирования и использовать их в предыдущих запроса для получения подробной информации о клиентах компании по PNR коду без использования атаки типа брутфорс.
В итоге набор всех уязвимых запросов позволяет злоумышленникам организовать сервис, который сможет в режиме реального времени незаметно для администраторов ресурсов составлять список пассажиров рейсов авиакомпании. Однако список пассажиров не является публичной информацией и защищается в целях безопасности авиакомпаниями, а в некоторых странах и законами. Доступ к таким данным имеют как правило только сотрудники компаний и определённые госструктуры. Тем больше было моё удивление, когда обратившись в клиентскую поддержку компании МАУ и сообщив им о наличии данных уязвимостей, в процессе переписки и уточнения статуса моей заявки я получил следующий ответ:
Однако на вопрос, предоставляют ли они по запросу клиентов список пассажиров рейса, мне ответили негативно.
Не смотря на такой странный ответ компании, разработчики в течении месяца устранили все вышеуказанные уязвимости, что успокоило меня, как клиента.
Отдельным пунктом хотелось бы обратить внимание на то, что опять же, как в случае и с другими крупными компаниями, в МАУ отсутствует отдельный канал связи для сообщений о найденных уязвимостях. На мою просьбу связать меня со службой безопасности или ответственными разработчиками, мне ответили отказом:
Подводя итоги, хочу сказать следующее.
Авиакомпании должны заботиться о безопасности своих пассажиров не только в аэропортах и на борту самолёта, но также и в сети. Ведь данные о пассажирах — это очень чувствительная информация. Владея ею, воры могут ограбить квартиру жертвы, пока та будет в отъезде. Экс-супруг может преследовать свою бывшую жену, зная о её перемещениях. Злоумышленник, получив коды бронирований, может через сайт авиакомпании массово отменить регистрации пассажиров, что потенциально может привести к задержке рейсов. Публичная информация о перемещениях бизнес-конкурентов может нанести ущерб их компаниям. Способов использования такой информации со злым умыслом множество и охраняться она должна соответствующим образом.
Больше месяца назад я начал готовиться к отпуску и как раз пришло время бронировать авиабилеты. Так я оказался на сайте авиакомпании МАУ. В процессе выбора мест в самолёте, страница, которая должна была отображать схему мест, никак не хотела загружаться.
Я решил открыть в Google Chrome инструмент разработчика, чтобы попытаться понять, в чём проблема. Изучив запросы к серверу, я увидел, что данные о доступных местах сервером возвращаются.
Опробовав несколько разных браузеров, я так и не решил проблему, однако заметил, что запрос, который возвращает список доступных мест, выполнялся во всех браузерах успешно, не смотря на то, что сессионные куки были доступны только в Google Chrome.
Запрос выглядел следующим образом:
https://bookapi.flyuia.com/ancillary/seatmap?pnr=XXXXXX¤cy=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" : "1234",
"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 коду. Следовательно, зная номер бронирования, любой пользователь мог получить такие данные о пассажире, как фамилия, имя, взрослый это или ребёнок, номер рейса, аэропорты отбытия и прибытия, время отбытия.
Мне стало интересно, какие ещё «сюрпризы» хранит данный сервис.
Продолжив оформление билетов, я выбрал пункт заказа места для багажа.
Запрос имел похожий вид:
https://bookapi.flyuia.com/ancillary/luggage?pnr=XXXXXX¤cy=USD&locale=RU
Однако ответ сервера содержал чуть больше информации о пользователе:
[ {
"paxDetails" : {
"uniqueId" : "2",
"firstName" : "ivan",
"title" : "Г-н",
"lastName" : "ivanov",
"paxType" : "Adult",
"dateOfBirth" : "1978-10-20",
"cartPaxId" : "a30928c1-219b-8d15-8345-b517f0fda360"
},...]
Таки образом добавилась ещё такая информация о пассажире, как дата его рождения.
На самом деле речь идёт не об одном пассажире, а о всех пассажирах, включенных в данное бронирование. Например я оформлял билеты на всю семью и в вышеуказанных запросах содержалась информация не только обо мне, но так же о супруге и детях.
Вообще, говоря в терминах закона Украины о защите персональной информации, персональные
данные — это сведения или совокупность сведений о физическом лице, которое идентифицировано или может быть конкретно идентифицировано. Данные, доступные в вышеуказанных запросах позволяют в некоторых случаях однозначно идентифицировать человека не имея даже даты рождения. Таким случаем является вариант, если бронирование содержит данные о нескольких лицах. Так как такие лица являются как минимум знакомыми, а во многих случаях родственниками, идентифицировать их с помощью социальных сетей не составит большого труда. Таким образом уже имеющиеся данные, на мой взгляд, можно считать персональными, а факт публичного доступа к ним — нарушением закона о защите персональных данных. Но не будем отвлекаться и продолжим.
Исследуя дальше «возможности» сервиса, я перешёл на страницу оплаты. Здесь меня ждал новый сюрприз. Запрос имел вид:
https://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\":\"ivanov.ivan@gmail.com\",\"BackReference\":\"https://book.flyuia.com/RU/default/paymentstatus\",\"OaDRoute\":\"01Feb18JFKKBP-10Feb18KBPJFK\",\"LANG\":\"UKR\",\"DESC\":\"XXXXXX, ivanov ivan, 01Feb18JFKKBP-10Feb18KBPJFK\"}",...}
В запросе содержится разная платёжная информация, но для нас важнее наличие такого параметра, как PNR код. Как видно, запрос содержит инкрементальный ID транзакции, что означает, что при переборе данного значения в большую или меньшую стороны злоумышленники смогут получать реальные коды бронирования и использовать их в предыдущих запроса для получения подробной информации о клиентах компании по PNR коду без использования атаки типа брутфорс.
В итоге набор всех уязвимых запросов позволяет злоумышленникам организовать сервис, который сможет в режиме реального времени незаметно для администраторов ресурсов составлять список пассажиров рейсов авиакомпании. Однако список пассажиров не является публичной информацией и защищается в целях безопасности авиакомпаниями, а в некоторых странах и законами. Доступ к таким данным имеют как правило только сотрудники компаний и определённые госструктуры. Тем больше было моё удивление, когда обратившись в клиентскую поддержку компании МАУ и сообщив им о наличии данных уязвимостей, в процессе переписки и уточнения статуса моей заявки я получил следующий ответ:
Однако на вопрос, предоставляют ли они по запросу клиентов список пассажиров рейса, мне ответили негативно.
Не смотря на такой странный ответ компании, разработчики в течении месяца устранили все вышеуказанные уязвимости, что успокоило меня, как клиента.
Отдельным пунктом хотелось бы обратить внимание на то, что опять же, как в случае и с другими крупными компаниями, в МАУ отсутствует отдельный канал связи для сообщений о найденных уязвимостях. На мою просьбу связать меня со службой безопасности или ответственными разработчиками, мне ответили отказом:
Подводя итоги, хочу сказать следующее.
Авиакомпании должны заботиться о безопасности своих пассажиров не только в аэропортах и на борту самолёта, но также и в сети. Ведь данные о пассажирах — это очень чувствительная информация. Владея ею, воры могут ограбить квартиру жертвы, пока та будет в отъезде. Экс-супруг может преследовать свою бывшую жену, зная о её перемещениях. Злоумышленник, получив коды бронирований, может через сайт авиакомпании массово отменить регистрации пассажиров, что потенциально может привести к задержке рейсов. Публичная информация о перемещениях бизнес-конкурентов может нанести ущерб их компаниям. Способов использования такой информации со злым умыслом множество и охраняться она должна соответствующим образом.