Расследование одного взлома или как быстро и просто потратить миллиард
Все вокруг постоянно рассуждают о коррупции. А я хочу рассказать Вам о случае, на коррупцию очень похожем, но в среде чистого IT-бизнеса, на государство никак не завязанного.Описываемый далее случай интересен именно с точки зрения взлома бизнеса, хотя статья больше посвящена взлому в смысле IT.
Начну с нетехнической части.Мой друг-одноклассник работает в сфере бизнеса московского такси. Работает в этом бизнесе довольно много лет. Несколько лет назад, когда на рынок московского такси вошел крупный игрок (а теперь — монополист) — Яндекс, то мой друг, разумеется (как и все прочие мелкие и крупные игроки этого бизнеса) также присоединился к заказам Яндекс-Такси.
Уже несколько лет он работает в Яндекс.Такси с использованием ПО ООО РОСИНФОТЕХ.
Где-то с полгода назад Яндекс приобрел эту компанию и теперь это ПО называется Яндекс.Таксометр или вроде того.
Что представляет собой это ПО: это комплект по управлению водителями (можно добавить/удалить машину/водителя), а так же принять/отменить проследить заказ.
Так вот, обещал я, что начну с нетехнической части. Этот мой друг уже несколько лет жалуется мне при личных встречах на извечную русскую проблему: «воруют».
Рассказывает что воруют водителей, заказы и даже, по слухам, деньги с QIWI-кошельков…
Я относился к этому как-то философски. Ну, жалуется человек на жизнь. Ушел водитель (увели) от него в другую компанию, а он считает что его украли — обычная история. Но на этих выходных таки он меня упросил: «Иван, ну да, ты (как ты говоришь) не специалист по безопасности, но посмотри, как могут у меня воровать водителей? Ты же IT-шник, в конце концов!».
Мы сели с ним в кафешке с WiFi и стали смотреть.
Закончу нетехническую вводную я тем, что скажу что, по слухам, среди компаний, работающих с Яндекс-Такси, которые идут в том числе и от самого Росинфотех, Яндекс приобрел вышеуказанное ПО за миллиард.
Запомните эту цифру, она понадобится нам в конце статьи.
Итак, вступление окончилось, перейдем к технической части.
Дал он мне логин/пароль от его личного кабинета в диспетчерской, и я туда зашел.
Там все несложно: список водителей: добавить/удалить/заблокировать/распечатать. Отчеты, заказы и т.п. Полазив чуток по страничкам, обратил внимание, что практически весь сайт построен на том, что в ссылках или запросах фигурируют UUID.
Кликнув на водителя, можно увидеть, что UUID водителя фигурирует в ссылке информации о нем.
Далее стало интересно выяснить три вопроса:
можно ли узнать UUID водителя чужой компании можно ли, зная этот UUID, получить информацию о чужом водителе (собственно то, на что жаловался мой друг) можно ли получить доступ к заказам водителей других компаний Походив по страничкам личного кабинета, я обратил внимание, что UUID присвоен и компаниям тоже.
«Ага!»- подумал я и стал спрашивать моего друга, знает ли он, что такое UUID, и применял ли где-нибудь его. Он говорит: «Да, в личном кабинете Яндекса я указывал урл на API». «Давай сюда, — говорю, — этот урл». Дает он мне нечто вроде такого sync.yandex.taxi.itrf.ru/drivers/
Осталось узнать UUID других компаний. Как это сделать? Как я уже сказал выше, в некоторых местах сайта банальный Ctrl-U в браузере показывает UUID других компаний, однако мне стало интересно получить UUID адреса ВСЕХ компаний, использующих это ПО. Мы где-то с полчасика покопались по урлам, используя Ctrl-U, и нашли сразу множество путей, как это сделать.
Например, вот такой красивый JSON сообщает нам подобный список:
Обратите внимание, что список затрагивает сразу все регионы страны, не только Москву.
Ну или подобные списки встречаются в различных селектах, списках итп. Таких мест множество. Однако, продолжим далее.
Стало интересно вернуться к карточкам водителей и рассмотреть их поближе. Для этого мы выбрали одну из Московских компаний — взяли XML со всеми ее водителями (которая, как описано выше, доступна без авторизации) и продолжили эксперименты над ней.
Взяли пару водителей из этого XML, ввели их UUID в карточке в личном кабинете. Посмотрели карточку водителя. Рейтинги, когда сдавал экзамены такси, номера прав итп — все видно. Информация о любом водителе (в том числе чужих) доступна по урлу с UUID.
Это как бы расширенная информация (больше, чем вышеприведенном XML).
Вероятно, разработчики этого ПО о понятиях «авторизация», «аутентификация» не слышали, а уж и тем паче о разнице между ними.
Там же, сидя в кафе я набросал скриптик на Python, и через 20 минут у нас была база данных всех водителей Яндекс.Такси во всех городах (не только в Москве) с их телефонами, рейтингами, номерами прав, лицензий, балансами счета и прочей приватной информацией.
Получили вот примерно такой XLS файлик:
Так я получил вещественное доказательство более чем двухлетним подозрениям моего друга о воровстве водителей.
Дальше стало интересно посмотреть несколько шире на эту проблему: доступность этих UUID без авторизации вообще. Оказалось, и это есть!
Это ПО предлагает довольно широкий спектр сопутствующих услуг. Например, вебформу заказа такси на сайте компании-клиента.
Заглянув (Ctrl-U) на несколько сайтов-партнеров Яндекс-такси, как Вы думаете, что я там обнаружил? Правильно! UUID этих компаний, по которым (напомню) можно бесплатно доставать всех водителей.
Таким образом, не исключаю, что какой-либо поисковик (в т.ч. Яндекса) однажды проиндексирует все эти приватные данные компаний и людей.
Затем мы заглянули на еще один ресурс без авторизации этой компании. В публичном доступе находится в реальном времени лог всех заказов в Яндекс-такси. Можно посмотреть, кому назначен, что с ним происходит, кто выполняет, адрес подачи итп.
Нажимая Ctrl-U на этой странице, мы видим ID заказа, компанию которой он назначен.
Вот мы и докопались до ID заказов других компаний на неавторизованной странице (на авторизованных они тоже есть, но повторюсь: было интересно найти на неавторизованной).
Далее, используя инструменты, доступные в разных частях личного кабинета, мы можем не просто наблюдать, но и воздействовать на процесс: например, можно чужой компании изобразить отмену заказа, а самому послать машину вместо нее!
Для водителя это будет выглядеть, как отмена заказа. Для клиента — как «приехала другая машина».
Это просто клондайк какой-то для человека, настроенного на нечестные способы ведения бизнеса!
но мы не такие Отсюда и статья :)
Самое интересное, что это не просто какая-то одна дырка, а все ПО целиком такое, весь сервис построен на том, что НИКАКОЙ защиты информации нет. Продукт представляет собой просто этакий просмотрщик записей в БД без какой-либо защиты между пользователями.
Представьте, залогинившись в гугл Вы бы могли посмотреть всю почту ВСЕХ пользователей Гугл. Вот тут примерно такой случай.
Однако продолжим. Комплекс содержит еще приложение для андроида. Взяв приложение «Таксометр» с андроид маркета мы быстро выяснили, что оно делает запросы по неавторизованным урлам. И первый неавторизованный http-запрос, который делает это приложение, — угадайте, какой?
Правильно, полный список пар UUID-название компаний!
Используя урлы, взятые из этого приложения, можно:
брать/отменять заказы от имени других водителей, писать широковещательные и адресные сообщения (например, предложения о работе) другим водителям, и так далее.Здесь я получил еще одно подтверждение, что не только водителей можно воровать, но и заказы у этих водителей.
Рассказывают, что ушлые люди уже даже выпустили на эту тему специальное приложение по перехвату заказов Яндекс.Такси. Жаль на андроид маркет только не выложили (или выложили? Надо бы посмотреть в платных разделах маркета.)
Ну, а теперь давайте немного поразмышляем на тему, о которой я писал вначале.
Коррупция или не коррупция.
Да, Яндекс — частная фирма. Слово «коррупция» к нему не применимо. Однако возникает интересный вопрос: вот Яндекс покупает за огромные деньги (миллиард) программный комплекс. При этом, судя по вышеприведенной картинке, НИКАКОГО технического аудита этого программного комплекса не произведено.
То, что нашел я (рядовой IT-шник) за пару часов копаний в кафе, специалист по безопасности нашел бы без особого труда, но вопрос: почему этот специалист (коих у Яндекса вдоволь) даже не заглянул в этот комплекс за миллиард?
Как Вы думаете, этот комплекс куплен с использованием системы «откатов», или нет?
Мне кажется, что, проводя сделку за миллиард, не выделить 10 тыс руб на один рабочий день специалиста для проведения аудита это… гхм… или сознательная халатность, или совсем уж хочется побыстрее от миллиарда избавиться :)
Объяснение, что это куплено с использованием отката, — по моему, наиболее логичное.
Интересный вопрос: кто в Яндексе принимал решение о покупке такой «большой дыры»? Вероятно, с него должны начать выяснение обстоятельств покупки СБ Яндекса.
PS: После того, как мы поразглядывали Таксометр с андроид-маркета, мы заглянули еще и в устройство приложения для заказа такси с того же маркета — Яндекс.Такси. Что удручает — ситуация там очень похожая. Его явно делали люди, далекие не только от вопросов безопасности, но и от вопросов HighLoad программирования.Впрочем, это совсем другая история, о ней можно написать отдельную статью.
PPS: Недавно Яндекс.Такси внедрило оплату поездок кредитными карточками. Мне вот лично как-то страшно теперь платить за поездку кредиткой. А Вам?
UPD: Яндекс уведомлен о проблеме, так что здесь предлагаю обсудить способ взлома бизнеса Яндекс.Такси примененный товарищами из вышеупомянутой компании. Можно только выражать восхищение бизнес-способностям этих людей. Согласитесь, развести крупнейшую компанию рунета на такие деньги без какой-либо проверки качества впариваемого кода — это вам не старушкам пылесосы продавать…