Безопасность как искусство
92,46
рейтинг
16 апреля 2012 в 13:57

Разработка → Яндекс.Пробки. А туда ли вы едете?

В прошлой статье была затронута тема информационной безопасности такой крупной компании, как Google.
Настало время посмотреть в сторону отечественного производителя, а именно, компании Яндекс и её сервиса карт.
С чего все началось. Стоял я, значит, как-то в пробке и думал, что заставляет всех людей ездить теми или иными маршрутами. Ответ очевиден: много чего.
Однако не последнюю роль определенно играет наличие пробок и разного рода дорожных ситуаций (ДТП, ремонт полотна, камеры).
Кроме того, эти факторы учитывают и все современные навигаторы при прокладке маршрута.
Что ж, попробуем повлиять на дорожную обстановку, хотя бы виртуально…



Играть будем с картами от компании Яндекс. Для начала разберемся, как вообще работает система. Все просто: мобильные пользователи ставят приложение и отправляют данные с координатами, направлением и скоростью на уютный сервачок Яндекса, где полученные данные агрегируются, после чего и рисуется карта.
Коротко говоря, едешь медленно – значит стоишь в пробке, быстро – все свободно. Чем больше людей (устройств) отправляют статистику, тем точнее данные. Подробнее о работе системе написано у самого Яндекса.

Читая описания работы системы, пытливый ум непременно должен заинтересоваться следующей фразой:
«Все данные обезличены, то есть не содержат никакой информации о пользователе или его автомобиле».

Так-так-так, если данные обезличены, то почему бы нам не попробовать стать той кучей пользователей, которые отправляют данные, например, с нужной нам скоростью, дабы информация о загруженности дорог в выбранном направлении изменилась? (http://en.wikipedia.org/wiki/Spoofing_attack)
Итак, у нас на руках телефон с ОС Android на борту, приложение "Яндекс.карты" и сниффер "Shark".
Необходимо для начала посмотреть, как обмениваются между собой данными приложение и сервер.
Соглашаемся на отправку данных о дорожных ситуациях, запускаем сниффер и катаемся по городу, собирая пакеты (сетевые, конечно).

Для начала попробуем поставить какую-нибудь метку о дорожной ситуации, например:



ловим пакет:

GET /userpoi/addpoint?uuid=a61d46553953fc3e346dae59d852c950&catidx=2&lat=59.985712&lon=30.350740&utf&comment=bla%20bla&packetid=2936036690 HTTP/1.1
Host: mobile-partners.maps.yandex.net


uuid – параметр-идентификатор пользователя
catidx – категория метки
lat;lon – координаты, куда ставится метка
comment – комментарий
packetid – ID пакета

Как, собственно, и ожидалось, можно рандомно менять uuid. Метки успешно ставились. Изменение packetid также ни на что не повлияло.
Играя с различными значениями (координаты и тип метки) и многократно посылая пакеты, можно в короткие сроки затруднить просмотр карты:



Но это все ребячество, где же данные о пробках?
Долго ждать не приходится, сразу бросается в глаза следующий пакет:

POST /ymm_collect/2.x/?uuid=a61d46553953fc3e346dae59d852c950&packetid=2052426273&compressed=1&oauth_token= HTTP/1.1
Content-Type: multipart/form-data; boundary=edge_here
Host: mobile-partners.maps.yandex.net

--edge_here
Content-Disposition: form-data; name="data"
Content-Type: application/gzip

..........m.[.. .E.....(/.4.C1... ..../m.l..Y;G....i..........'....4..}..>..3...[.:.E...1i.d![)x..?.'.k...a<.......0.=o..*w.[.F.H....J)c.)ot^.......z#oq..x...
.i......


uuid – знакомый нам параметр-идентификатор, значение которого можно произвольно менять.
packetid – как можно понять из названия, это ID пакета. Он же является и его контрольной суммой.

В пейлоаде POST-запроса – не что иное, как gzip, внутри которого можно увидеть что-то типа:

<?xml version="1.0" encoding="utf8" ?><traffic_collect><point lat="59.946379" lon="30.329207" avg_speed="2" direction="180" time="23052011:194509" /></traffic_collect>

Как раз то, что мы ищем: текущее местоположение, направление, скорость и время.

Пробуем играть со значениями в xml, меняя направление, положение, скорость и время => пакеты не принимаются сервером. Оно и очевидно, контрольные суммы не сходятся. Выход один: узнать, как сгенерировать packetid.

О том, как получить исходники андроидовского приложения, уже немало было сказано, поэтому на этом останавливаться не будем.



Шикарно. Исходник есть, осталось только разобраться, как это работает.
А работало оно следующим образом:

1) xml с данными gzip'овалась
2) полученный gzip ксорился побайтово с uuid
3) от полученого результата вычислялся CRC32
4) итоговым результатом и был заветный packetid

Мы знаем, как генерятся контрольные суммы – теперь ничто не мешает нам накодить скрипт, который будет отправлять на сервера Яндекса данные с нашими координатами и скоростью.
Тестим.



Все отлично работает: на улице появился несуществующий затор.
А если там еще поставить парочку меток об аварии или дорожных работах, то вполне можно заставить некоторых доверчивых водителей (или их навигаторы) принять решение об изменении своего маршрута, тем самым позволив мне, любимому, свободно доехать до дома!

Этот и еще множество других докладов по инфобезу можно услышать на ежемесячных встречах Russian Defcon Group, что проходят в Питере. Приходите, там всегда интересно.

Такие дела.
Ах да, информация о данной баге была своевременно предоставленна ребятам из Я, которые все очень оперативно прикрыли. Молодцы.
Вам же предлагаю не расстраиваться, ведь есть еще Google и Nokia с их пробками!
Ну и совсем любопытным – код скрипта для спуфинга Яндекс.Пробок: http://pastebin.com/9y4hmFX9
Огромное спасибо ntkt за помощь и с прошедшим ДР!

До встречи на дорогах.
Автор: @chipik
Digital Security
рейтинг 92,46
Безопасность как искусство

Комментарии (77)

  • +3
    Отлично! Спасибо за дельное описание методологии.
    Думаю, они просто не предполагали, что кто-то полезет к ним с этой стороны :)
    • +39
      Как, интересно, можно не предполагать, что полезут? :)
      • 0
        Я имел ввиду некоторую недобросовестность на уровне собственного pentest-а.
        Мне кажется, специалисты Яндекс не учли довольно тривиальных вещей.
        • 0
          Ну это дааа, это они любят :)
    • +20
      Не знаю как там яндекс, но лично я, делая приложения для веб, всегда исхожу из того, что все пытаются ломануть приложение.
      • +4
        Вы исключительно правы.
        Перед выпуском в продакшн необходимо производить серьезное тестирование на проникновение.
      • +7
        Не зря говорят, что 90% времени уходит на обработку ситуаций, которые никогда не должны произойти.
      • 0
        … хакер параноик который 24/7 сидит на кофе и единственной мечтой которого является желание найти уязвимость в вашем приложении :)
  • +7
    Автор только забыл добавить, что все описанное происходило более года назад. Так что это не свежая уязвимость.
    • +3
      Какая разница, было это год назад или вчера? Закрыто и хорошо. Это информация не была представлена ни где, кроме как на DCG. Может людям интересно будет почитать…
      • –5
        Может будет.
  • +14
    Ах да, информация о данной баге была своевременно предоставленна ребятам из Я, которые все очень оперативно прикрыли.

    А как это можно прикрыть? За исключением нового алгоритма генерации packetid.
    • 0
      Зашифровать пейлоад?
      • +15
        Шикарно. Исходник есть, осталось только разобраться, как это работает.
        • –1
          Асимметричное шифрование никто не отменял. Шифруем открытым ключом, расшифровываем на сервере закрытым. Кроме инсайда особо никак и не сломаешь.
          • +6
            Что мешает вытянуть открытый ключ из исходников и шифровать им фальшивые пакеты?
          • +1
            А нам что, расшифровывать пакеты нужно?
            • 0
              Какие-нибудь сессионные ключи с небольшим времени действия спасут. От лица другого пользователя уже не отошлёшь.
              • +1
                А к чему их привязывать?
                • 0
                  к ключу, который однократно/редко получает установленная программа яндекс.пробки.
                  • 0
                    А если я ее снесу и заново поставлю? А если я перехвачу обращение к серверу за ключом? Тут нет защиты. Просто нужно не спамить, и все. Это как в сообществе Open Source — многие могут коммитить бекдоры, и защиты почти нет, но этого не делают
    • 0
      Прикрутить регистрацию…
      • 0
        Что помешает зарегать 2 десятка аккаунтов?
        • 0
          Очевидно, что на регистрацию должна быть отдельная защита. И, например, можно отсеивать новых пользователей и считать их данные менее ценными, тут уже миллион способов тк. информации о юзере больше.
  • +16
    Блин. Я не ортодоксальный граммар-наци, но это… Едим мы в рот. По крайней мере, большинство из посетителей сайта, я надеюсь.
    • +2
      Про немногочисленные (тем более, единичные) орфографические ошибки принято писать в личку.
      • –1
        Лучше писать их в паблик, так больше людей заострят своё внимание на том, как пишется то или иное слово и сами потом такую ошибку не допустят
        • 0
          Видимо, это работает только в теории. Тся/ться и некоторые другие популярные ошибки как были, так и остаются на просторах интернета и хабра, в том числе.
  • +1
    Круто!
  • +4
    Ну вот, как мне теперь расчищать дорогу домой? (
    • +1
      Тем же методом — ставите на своем пути кучу пробок, народ начинает ломиться в объезд, оставляя свободным нужный маршрут… Profit.
    • +2
      Всегда остается хардверный способ.
  • +31
    Мне честно говоря интересно, как они багу-то прикрыли.
  • +7
    интересно как вобще можно прикрыть такую багу учитывая что софт запускается на несекьюрном девайсе.
    • +2
      Как вариант, использовать данные, полученные от уникальных ip и/или с устройств, которые отправляют данные уже некоторое значительное время, а не появились только что.
  • +1
    На вашем месте я бы сделал «троллфейс» на карте Москвы :)
    • 0
      Вы этот комментарий написали до того, как она в посте появилась?
      • +1
        А, понял, вы имели в виду на самом деле :)
  • 0
    Залез на яндекс в поисках троллфейса, а там его нет :(
  • –8
    Ну вот, блин. Спалили в паблик.
    • 0
      Что спалили? Уязвимость уже закрыта. Да и было это год назад.
      • 0
        Идею спалили. Не у всех ещё уязвимость закрыта.
        • +2
          Спалили идею. Теперь у всех будет желание закрыть эту уязвимость.
          • +1
            Угу. И правильно сделали, в общем.
  • –1
    А если там еще поставить парочку меток об аварии или дорожных работах, то вполне можно заставить некоторых доверчивых водителей (или их навигаторы) принять решение об изменении своего маршрута, тем самым позволив мне, любимому, свободно доехать до дома!

    Сомнительно =) Некоторые, может и уедут, но таикх будет немного.
  • 0
    Даешь анти-навигаторы в массы!
  • +2
    А мне вот всегда было жутко интересно. А как яндекс узнает — я медленно еду или быстро иду. И просто прогуливаясь с телефоном, не наношу ли я пробок на родной город?
    • +2
      отсекают статистически крайние значения, скорее всего
  • +1
    Пара евроцентов о том, как это у конкурентов сделано (у TomTom).

    Там пользователь может менять карты (ну, к примеру, где-то поворот или проезд запрещён или сделали кольцевое движение вместо обычного перекрёстка) — эти изменения можно сделать прямо в навигаторе или на веб-сайте. При синхронизации изменения будут доставлены другим пользователям. От этих изменений пользователь вправе отказаться. Однако необходимости покупки новых карт эта фишка, к сожалению, не отменяет.

    По поводу пробок и заторов — у TomTom есть любопытная технология, где анализируются расстояния мобильных телефонов до базовых станций и таким образом рассчитывается количество и скорость движения транспортных средств на магистрали. В случае затора все мобильники перестанут двигаться, что и сигнализирует о пробке (тут, конечно можно о защите прав тоже развить дискуссию). Это не единственный источник информации, также анализируется информация TMC — так информация об авариях распространяется. Руками ничего вводить не надо.
  • НЛО прилетело и опубликовало эту надпись здесь
    • 0
      1) Фильтровать по IP-адресу и учитывать только IP-адреса мобильных операторов в данном регионе
      2) Передавать cellID

      Это не 100% защита, но сервер становится «Неломаемым Джо», который сломать-то можно, но на фиг никому не нужно

      • 0
        Кто мешает юзать несколько симок? А то и проксики подходящие могут найтись.
        CellID — не защита, из своей проги можно послать, что угодно, вместо настоящего cellid.
        • +1
          найти такой прокси, чтобы Яндекс ваш трафик видел бы как идущий из подсети Мегафона будет проблематично (если, конечно, вы не работаете в Мегафоне)

          специальным образом проксировать трафик своей комповой программы через свой телефон?
          ну… можно конечно… тут даже симки разные не нужны… трафик ведь анонимный

          полностью мимикрировать под МЯК? Или внести в существующий мобильный клиент функцию отсылки заведомо неправильных данных? Да, это возможно. Но, как отвечала медсестра на вопрос больного будет ли он жить: «А СМЫСЛ?»

          Я ж сказал — защита не 100%. Но дешевая на серверной части и сильно усложняющая жизнь потенциального ломальщика на клиенте.
          • +3
            Несколько usb-модемов подключить к компу не проблема, про проксики (общедоступные) это я так, как маловероятный, но возможный вариант.

            Несколько симок нужно в том случае, если защита будет строится на лимит запросов с одного IP… Правда скорей всего белые IP вряд ли есть на мобильном инете, так что проксики не понадобятся в таком случае.

            Смысл ясно расписан в статье — чтобы расчистить путь домой например.

            А перечисленные 2 пункта не тянут на защиту, которую будет лень ломать. Ибо оба пункта легко обходятся.
        • +2
          По идеи аппарат видит сразу несколько вышек, если пересылать именно список всех видимых станций, а потом сравнивать координаты с картой вышек, то можно отсеивать откровенно левые данные.
  • +1
    На дорогах достаточно му***ов, которые используют другой алгоритм для более быстрого передвижения — наглость. Последнее время наблюдаю прямую зависимость между целевой функцией от марки автомобиля/номера и поведением на дороге. Можно даже график соответствующий нарисовать. Подозреваю они не знают что такое сниффер. Но бага прикольная, спасибо. Под стать весёлой картинке =)
  • –4
    Зачем это все?) Бесплатно же и для людей.
    Не совсем понятна эта статья в принципе. Всегда было интересно, почему бы не направить столько усилий на что-нибудь действительно полезное, бесплатное и для людей.
    • 0
      Потому что — если не автор, то этим воспользовался бы какой-нибудь злой человек. Ну, например, конкурент Яндекс-карт. (Нет, я не про Гугл)) Я про теоретически возможную подобную ситуацию.)
  • +1
    Статья интересная! Автору спасибо, замечу лишь только что источники информации — далеко не только водители с приложением, но и сторонние компании. А именно компании которые мониторят свой транспорт (логистика) на расход топлива и соответствие маршрутам, продают(отдают, нюансов не знаю) обезличенные данные таким компаниям как яндекс.
    С одних пользователей приложений «сыт» не будешь, тем более что реальный инструмент для водителя — яндекс навигатор, выпустили только недавно, а я.карты использовать постоянно мало кто способен.
  • 0
    Действительно, очень бы хотелось услышать, как именно в Яндексе прикрыли данную брешь. Для едичного запроса я может и придумаю пару эвристик, с анализом когда и откуда пришел первый сигнал, как данные менялись во времени, сколько он уже вещает — т.е. посчитать его рейтинг с учетом его истории. А потом как-то сравнивать информацию с устройств с разным рейтингом и принимать решение о достоверности данных. Но вот представить, что бы эти алгоритмы быстро работали на большом объеме данных сложно.
    Или изменения вносились в протокол/ПО, что бы просто предельно усложнить подмену данных?
  • +2
    А я сегодня думал, кто это посередине реки поставил метку об аварии в среднем ряду…
    • +5
      Я просто добираюсь на работу на гидроцикле — быстрее получается.
  • +6
    Что касается карт Nokia, мы используем не только информацию от пользователей, но и данные собственных сетей датчиков, веб-камер, коммерческих и государственных организаций, центров управления движением, летательных аппаратов с неподвижным крылом.

    Итоговая информация о загруженности дорог вычисляется по собственному алгоритму, который обрабатывает весь массив полученных данных с той или иной степенью доверия каждому из источников. Информация от пользователей на общую картину влияет незначительно.
    • +2
      У нокии, конкретно в Москве, данные по пробкам никакие. МО боюсь даже ставнивать. Яндекс в этом плане на несколько порядков лучше.
      maps.nokia.com/
      • 0
        Каждый вправе выбирать чему верить: минимуму информации с высокой степенью надежности или большому объёму с некоторой вероятностью недостоверности.
    • +1
      Так и представил как «летательные аппараты с неподвижным крылом» над МКАДом кружат и пробки ищут.
    • 0
      Спасибо, не знал о таких.
  • 0
    Фигассе. Только сегодня в пробке об этом думал и сразу статья! :)
  • +1
    > тем самым позволив мне, любимому, свободно доехать до дома!
    Ага, конечно, только вот ЯП пользуются пренебрежимо малый процент водителей.
  • +2
    Меня вот другое интересует, несколько мотоциклистов с навигаторами, просочившихся через стоячую пробку, очевидно, позволят яндексу принять решение о том, что автолюбители попросту припарковались, и на самом деле, дорога свободна. Было бы здорово сделать выбор типа ТС все же — пешком\мотоцикл\авто. Или такое как-то отслеживается?
    • +1
      Я думаю это достаточно легко определить по ускорению и средней скорости. Ясно, что ускорение у мотоциклов будет в разы больше, чем у авто. Ясно, что пешеходы не будут двигаться со скоростью 60 км/ч. Я бы даже примерно прикинул среднюю скорость: пешеход 3 км/ч, мотоцикл 50-60 км/ч, авто 20-30 км/ч. Потом, как различить медленно движущегося пешехода от медленнодвижущегося в пробке автомобиля: автомобиль будет через каждые 3-4 метра останавливаться, затем снова проезжать 3-4 метра и т.д. Потом, думаю мотоциклисты практически не пользуются яндекс.картами, особенно в движении и их гораздо меньше в общем потоке данных от клиентов приложения.
    • +3
      Я как мотоциклист не слышал, чтобы среди наших было популярно пользоваться навигаторами. Хотя конечно разные бывают, не мало и тех, кто в пробках тоже медленно едет. Но я не против дополнительных настроек, главное чтобы не глючило.
  • 0
    Насчет Яндекса и Москвы — мне известно, что у Яндекса по Москве висят радары-измерители над дорогами.
  • +5
    Здесь должна быть история про хакера и солонку.
    • 0
      она уже была, выше
  • 0
    как открыть maps.yandex.ru сразу с пробками? Т.е. прямую ссылку, чтобы не нажимать кнопку «Пробки»

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.

Самое читаемое Разработка