Как я нашел способ отследить всех водителей «Ситимобил»

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

    Это был запрос на получение информации о ближайших машинах. Выполнив этот запрос несколько раз с разными параметрами я понял, что можно выгружать данные о таксистах практически в реалтайме. Вы только представьте, сколько интересного можно теперь узнать!



    С чего все началось?


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

    Я использовал mitmproxy (Man In The Middle Proxy) — программа для атаки «человек посередине». Есть много инструкций по её установке и настройке, а общий принцип такой:

    1. Подключаешься к домашнему WiFi с телефона и компьютера
    2. Запускаешь mitmproxy на компьютере
    3. В телефоне прописываешь локальный адрес компьютера как основной прокси (уже можно смотреть внутрь http)
    4. Скачиваешь и подтверждаешь сертификат на телефоне (позволяет заглядывать внутрь https)

    Теперь, грубо говоря, весь трафик с телефона идет сначала на компьютер, расшифровывается, показывается на экране, зашифровывается и идет дальше. И наоборот.

    Таким способом я изучаю, как сделаны разные приложения, а иногда нахожу очень интересные вещи. Например, в этот раз я увидел запрос от приложения «Ситимобил» на получение информации о ближайших водителях, который не требовал аутентификации.

    Bug bounty Mail.ru


    Я оформил всю информацию на hackerone и отправил на рассмотрение. После опыта взаимодействия с баг баунти Яндекса, я не рассчитывал на быстрый ответ, однако уже через 3 минуты некто «3apa3a» закрыл мой репорт. Отличная скорость, Mail.ru!

    В ответе написали, что данные показываются пользователю в приложении, а значит не являются чувствительными и защищать их не надо.



    Ну что ж. Раз это публичные данные, давайте развлекаться!

    Как получить данные?


    Информацию о 10 ближайших водителях к геопозиции можно получить, отправив POST запрос на следующий адрес:

    https://c-api.city-mobil.ru/getdrivers

    При этом в теле запроса нужно указать интуитивно-понятные параметры:

    {
        "latitude": LAT,
        "longitude": LON,
        "limit": 10,
        "method": "getdrivers",
        "radius": 5,
        "tariff_group": [ 4, 5, 6 ],
        "ver": "4.33.0"
    }

    Здесь tariff_group — массив классов авто. Например, эконом, комфорт, бизнес и т.п.
    При этом поля radius и limit не работают, как надо, но и убрать их нельзя.

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

    curl -X POST --data '{ "latitude": 55.7, "limit": 10, "longitude": 37.6, "method": "getdrivers", "radius": 5, "tariff_group": [4], "ver": "4.33.0" }' https://c-api.city-mobil.ru/getdrivers

    В ответ приходит JSON с данными о 10 ближайших к (LAT, LON) автомобилях:

    Ответ сервера
    { 
       "drivers":[ 
          { 
             "id":"1c1f6779f893af6fe5bf4509af7366cd",
             "lt":"55.7025061",
             "ln":"37.5954334",
             "direction":"3",
             "CarColorCode":"000000",
             "car_type":"comfort_plus"
          },
          { 
             "id":"1a13d0daad9b6a3fa2b3d04a5b6f8c2a",
             "lt":"55.7019682",
             "ln":"37.6054896",
             "direction":"3",
             "CarColorCode":"000000",
             "car_type":"comfort"
          },
          { 
             "id":"c7c1634fae41a68924083af1d496d0a7",
             "lt":"55.7014223",
             "ln":"37.6067352",
             "direction":"3",
             "CarColorCode":"000000",
             "car_type":"comfort_plus"
          },
          { 
             "id":"f15ce054ccdaa268b16a0904b9eecdae",
             "lt":"55.6956527",
             "ln":"37.5972063",
             "direction":"4",
             "CarColorCode":"000000",
             "car_type":"sedan"
          },
          { 
             "id":"94ebc0fcc644bb1da4b57e7d23942e6d",
             "lt":"55.694786",
             "ln":"37.5982642",
             "direction":"4",
             "CarColorCode":"000000",
             "car_type":"sedan"
          },
          { 
             "id":"7251c45ee945c9cb839d69d5902b9f17",
             "lt":"55.7009351",
             "ln":"37.6094206",
             "direction":"3",
             "CarColorCode":"000000",
             "car_type":"comfort"
          },
          { 
             "id":"cb9dab2ba7379c3db817dd76ec68e6c5",
             "lt":"55.6950137",
             "ln":"37.6041883",
             "direction":"8",
             "CarColorCode":"000000",
             "car_type":"sedan"
          },
          { 
             "id":"761891d9c1129b1678c3eba616249e2b",
             "lt":"55.6944542",
             "ln":"37.5951122",
             "direction":"2",
             "CarColorCode":"000000",
             "car_type":"sedan"
          },
          { 
             "id":"4f0e835751cadaa5d5386f0e1374f315",
             "lt":"55.7066516",
             "ln":"37.6011767",
             "direction":"7",
             "CarColorCode":"000000",
             "car_type":"sedan"
          },
          { 
             "id":"2eb330cad5e5d9c87e6d0600a9ff10e8",
             "lt":"55.7066801",
             "ln":"37.6009127",
             "direction":"8",
             "CarColorCode":"000000",
             "car_type":"comfort"
          }
       ],
       "nearest":{ 
          "duration":420
       },
       "service_status":1
    }
    


    Посмотрим, что тут у нас

    { 
        "id":"2eb330cad5e5d9c87e6d0600a9ff10e8",
        "lt":"55.7066801",
        "ln":"37.6009127",
        "direction":"8",
        "CarColorCode":"000000",
        "car_type":"comfort"
    }
    

    Идентификатор, широта, долгота, код направления (Северо-запад), код цвета и тип авто. Отлично!

    Нужно больше данных!


    Так как поля лимит и радиус в запросе игнорируются, а в ответ возвращается не больше 10 ближайших авто, нельзя так просто взять и выбрать N точек на Москву, чтобы за N запросов получить всю информацию об автопарке.

    Но решение есть. Я написал алгоритм, похожий на заливку, который запускает запросы на поиск с координатами водителей, найденных на прошлом этапе. Ещё я все это дело распараллелил, а прокси подключать не пришлось — mail.ru позволяет мне делать все несколько тысяч запросов за минуту с одного и того же ip.

    В результате за пару десятков секунд собирается информация о всех таксистах «Ситимобил», которые сейчас на линии в Москве и Московской области. Именно так получается гифка из начала статьи.

    Давайте посмотрим, как работает алгоритм еще раз



    Думаете, сколько водителей на линии в воскресенье утром?
    В 11 утра их было 4374

    Но разве нас интересует срез? Давайте посмотрим в динамике.



    Найс. А как эти водители распределены в пространстве?



    Ну и напоследок давайте проследим за каким-нибудь водителем.



    Вот, видно маршрут. А ведь можно еще поднять частоту опроса и получить более точные данные.

    И что такого?


    А то, что данные вроде как важные.

    Во-первых, можно оценить долю рынка и доходность компании «Ситимобил».

    Во-вторых, на месте другого агрегатора (например, Яндекс.Такси) я бы использовал данные о положении таксистов конкурентов. Для ценообразования, например. Или вычислил водителей, работающих и там, и там на основе корреляций в геопозициях.

    В-третьих, раз можно отследить конкретного таксиста, можно отследить и его клиента. Это уже серьёзно. По факту, можно узнать, куда уехал человек на «Ситимобиле», если вы знаете, где он сел в такси.

    Заключение


    Не нужно недооценивать важность данных, которые показываются клиенту.

    Если Mail.ru все еще считают, что эту информацию не нужно защищать, то Яндекс.Такси, вот вам гора данных. С её помощью вы сможете забрать часть прибыли Ситимобила.

    Если же Mail.ru признаёт, что данные чувствительные и закрывает к ним доступ, то будет честно выплатить вознаграждение по bug bounty.

    Как ещё можно использовать данные о таксистах по вашему мнению?

    Спасибо, что дочитали! Надеюсь, вам было интересно.

    Успехов!

    Поддержать автора
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 122

      +15
      Оставайтесь на месте. За вами уже выехали ;-)
        +96
        Он скорее всего в курсе, маршрут-то показывается.
        0
        Но, в теории, при параметре «radius»: 5 может получиться существенно меньше 10 водителей? И вообще, может оказаться такое хитрое распределение машин, что в какой-то момент поиск оборвется — в радиусе 5 (км?) от каждого предыдущего водителя не будет найдено ни одного нового, но какие-то машины не попадут в массив?
          +15
          Да, действительно такое может быть. Если в Яндекс.Такси будут делать промышленное решение, то пусть учтут)
          +2
          Как делали визуализацию по координатам?
            +6
            На питоне folium сгенерировал html страницы с картами leaflet, затем selenium перевел в картинки, а картинки в гифку объединить можно хоть ffmpeg, хоть онлайн.
            0
            Крутая дыра, интересно, через сколько исправят.
              +3
              Думаю, что Zaraza уже получил волшебный пендаль за то, что закрыл репорт без разбора.
                +8
                Наоборот, премию за быстрый разбор тикета. Он же написал вполне аргументированно, почему они не считают это дырой.
                +1
                забавно то что это судя по всему может быть очень непросто
                  +3
                  Вообще я даже не знаю, можно ли это закрыть, и, если закрыть, изменит ли это хоть что-то. По примеру вк у них токены, скорее всего, живущие вечно. То есть если они сделают этот метод доступным только авторизованным пользователям, никто не мешает этим авторизованным пользователям взять токен и шуровать запросы.
                  Разве что можно сделать какой-то фильтр запросов (типа если с одного пользователя спрашиваются координаты водителей в 100 разных местах — это несколько странно).
                    +2
                    Ну, остальные же забанили подобные запросы (например, попробуйте закинуть в гугль больше чем положено запросов геокодирования — вас забанят по IP, или по вашему ID, потому что у авторизованных пользователей тоже есть лимиты, или они платят деньги за запрос)? Почему это у данной компании может не получиться? Не факт что просто — но должно быть вполне решаемо.

                    А еще проще — вообще не банить, а просто вводить задержку. И на этом тысяча запросов в цикле становится невыгодной.
                      0
                      Ну я и говорю: «если с одного пользователя спрашиваются координаты водителей в 100 разных местах — это несколько странно».

                      Другое дело, что я, например, не знаю, как с этим разобрались, например, в Яндексе, а разбираться сейчас у меня времени нет (предложение автору статьи).

                      Пример с гуглом чутка неправильный — там геокодирование является частью сервисов, которые можно купить и использовать. А тут с ситимобилом несколько другая ситуация: они же не продают данные о передвижении своих водителей. Поэтому «платят деньги за запрос» — стратегия, которая к ситимобилу не применима.

                      Мне лично кажется, что флудконтроль бы всех спас. Не выписывать перманентный бан, просто после, скажем, 20 странных запросов блокать на часок.
                        0
                        Все равно можно за людьми следить.
                    +1

                    Особенно под конец года, у всех годовые и квартальные планы горят, баги фиксить некогда. Астрологи предсказывают увеличение говнокода в проде.

                  +26
                  Видимо вопросы на собеседовании в «Ситимобил» на оценку асимптотической сложности алгоритма и ему подобные не помогают защищать свои http-концы.
                    +1

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

                    +16
                    Как же красиво всё здесь. От истории до подачи.
                    Респект
                    0
                    По данным вики на конец 2018 года в Москве зарегистрировано 100 000 водителей такси. То есть «ситимобил» занимает примерно 5% рынка?
                      +8
                      Очевидно, что одновременно все они не работают.
                        0
                        ~5000 это число активных таксистов в срезе времени. Я собирал данные примерно сутки. За это время было замечено порядка 10000 уникальных водителей. Думаю, если собирать данные достаточно долго, то можно будет понять, сколько водителей всего, когда они работают, какая у них средняя продолжительность смены и т.п.
                          +1
                          какая у них средняя продолжительность смены

                          Вот об этом бы очень было интересно почитать. Насколько помогают все кнуты и пряники, и как много таксерит по 20 часов выпучив глаза.
                            0
                            По 20 часов он таксерит с трех разных аккаунтов.
                            +1
                            Отличная тема для следующей статьи!
                            +1
                            Я бы заметил что процент водителей/машин (или, например, магазинов если абстрагироваться от перевозчиков) от общего числа это не доля рынка.

                            Ну и к тому же таксисты часто работают одновременно на несколько агрегаторов (у какого вылезет заказ пожирнее, у того и возьмет заказ). Видел «иконостасы» из 3-4 мобильников.
                              0
                              В другой отрасли — я бы с вами согласился, но на рынке такси достаточно высокая миграция водителей вслед за доходом и удержать их неценовыми факторами довольно сложно. При этом доход достаточно равномерен. Так что считаю что в данном случае количество водителей напрямую коррелирует с долей рынка.
                              0
                              В статье упоминалось количество водителей онлайн в определённый момент времени. Вероятно, существенная часть зарегистрированных водителей такси проводит на линии очень мало времени. Так что, по всей видимости, Ситимобил занимает больше, чем 5% рынка
                              +2

                              Кажется я начинаю понимать зачем Ситимобил спрашивает про все уровни osi.

                                +7
                                Неважно, что спрашивают на собеседованиях, если по факту бизнес требует от разрабов "… уяк-… уяк, и в продакшен"
                                  +2

                                  О, опять бизнес виноват. Нет, ну бизнес конечно виноват, но в каких-то других, глобальных проблемах: но неужели отслеживать частоту запроса с одного IP — это вот прям дико сложная задача, которая оттягивает все ресурсы от разработки и мешает выходу новой версии?


                                  Это основа, блин.


                                  Это при самом тупом моделировании системы на салфетке из кофейни нужно учитывать, прямой путь к ддосу.


                                  Это говорит только о некомпетенции авторов сервера, но не о нехватке времени на правильную реализацию.

                                    +4

                                    "Покатим в прод в виде MVP, а по нормальному сделаем потом (никогда)". Неработающие поля limit и radius как бы на это намекают.

                                      0

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


                                      Настоящая статья — это яркая иллюстрация, что к этому аггрегатору ни в коем случае нельзя идти ни в коем качестве.

                                        0

                                        Скорее всего они перестали работать когда другие исследователи ухнули радиус в 1000 км и лимит в пару лямов.

                                        +5
                                        Скорее всего было так:
                                        — Вот, я запилил для демки фичу, но нужно будет еще защиту на нее навесить и вообще отладить так как не все параметры работают.
                                        — Зачем это? У нас задача срочная новая горит, потом когда нибудь займешься.
                                          0

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


                                          А еще админы серверов вообще должны fail2ban настраивать во сне. Или облака так расслабили девопсов, что пущай кто угодно к нам стучится, на всех хватит!?

                                            0
                                            А точно ли по бизнес логике тут именно Rate limit нужен? Вполне возможно что нужна более сложная логика поскольку какие то сценарии где пользователь будет делать частые запросы окажутся валидными. Вы уверены что готовы решать за бизнес что ему нужно?
                                              +6
                                              Не за 5 минут всё же. Просто fail2ban — это полдела. Ещё нужно добавить такой ответ в API, задокументировать, протестировать чтобы ограничения были разумными и не сказывались на обычных пользователях, выводить в интерфейсе приложения человекопонятное сообщение «вы слишком часто делаете запросы, отдохните чуток или воспользуйтесь Яндекс.Такси» и наверное я ещё не всё учёл. Довольно часто бывает когда кажется, что работы на 5 минут, а потом одно тянет другое, другое тянет третье, разработчик в пределах своей компетенции задачу полноценно решить не может, нужно подключать других сотрудников — и даже если разработчик добросовестно отрепортит, задача может застрять на уровне выше.

                                              Ну и можно посмотреть предлагаемые варианты решения ниже по ветке, с авторизацией пользователя для запроса, проверке геокоординат пользователя и т.д. Явно не 5 минут времени.
                                                –1
                                                Ааа, классический зеноновский парадокс, где быстроногий Ахиллес никогда не догонит черепаху.

                                                Уверен, как и в многих современных чудо-приложениях, 70 % ошибок на стороне пользователя обрабатываются на стороне пользователя как «Упс, что-то пошло не так, попробуйте через пару минут». Но даже это лучше сотен тысяч данных в открытом доступе.
                                                  0
                                                  Ну да, и после пары «упс, что-то пошло не так» пользователь плюнет и переключится на другие приложения.
                                                0
                                                А зачем нужен лимит? С нагрузкой сервер пока справляется, а выкачать все данные можно и с лимитом.
                                                  0
                                                  Например, чтобы обеспечить качество предоставления услуги. Сэкономить деньги, в конце-концов
                                                  Давайте представим некий надуманный пример. Выкатили обновление. Клиент начал генерировать запросы на всю ширину канала клиента. Некоторые клиенты по лте, некоторые — по вайфай. Сами себя заддосили, получается. Был бы рейтлимит на стороне сервера — все было бы сильно лучше )
                                                  Т.е. рейтлимит это всего лишь один из инструментов и его можно применять, когда от него есть выгода
                                                    0
                                                    Сэкономить деньги, в конце-концов
                                                    Если у тебя ферма из серверов и ферма из балансеров, то правильная реализация рейтлимита, особенно с HA опцией, это не про «сэкономить деньги», дешевле пару лишних серверов поставить.
                                                      0
                                                      Ага, очень актуально для облака, в котором за каждый запрос платишь. Где-то у меня была картинка со стоимостью трафика для Амазона.
                                                        0
                                                        В правильном облаке за тебя всё уже сделано, осталось сконфигурировать. Я про on-premises.
                                        0

                                        Да, было очень интересно!

                                          0

                                          Спасибо! Рад, что понравилось)

                                            –1
                                            нам тоже понравилось)
                                          +5
                                          Ситимобил входит в МРГ, а как мы помним по ВК, они по Bug Bounty ну платят.
                                          «Это так и должно работать», а через неделю фиксят
                                            0
                                            если зайти на страницу компании на hackerone, там написано что через сервис всего уже было выплачено $564,656
                                            Из них
                                            $122,681
                                            Bounties paid in the last 90 days
                                            –11
                                            Закрывший тикет представитель citymobil указал не на то, что данные в приложении секьюрны, а на то, что они сами по себе открыты. Это не уязвимость, не баг и не недоработка, это одна из стандартных функций сервиса, на это указывают и очевидные ограничения АПИ.

                                            Возможно, у ТС не хватает опыта и компетентности в этой области, так как вещи это банальные и представляют собой базис. Их не забывают защищать, ибо их изначально не делают открытыми без надобности.

                                            Эту “проблему” в глобальной перспективе невозможно решить, разве что не показывать этой информации вовсе.
                                              –3

                                              Почему их нельзя зашифровать?

                                                +6
                                                Зачем шифровать данные, если мы отдаём их юзерам? В каком бы виде данные не передавались, их в любом случае нужно интерпретировать чтобы показать конкретную точку на карте, и ничего не мешает “злоумышленнику” делать это точно так же, как делает приложение.

                                                Возможно, я неправильно понял вопрос?
                                                  0

                                                  Я имею в виду почему нельзя передавать координаты в зашифрованном виде и расшифровывать их на стороне пользователя? Где на каждую пользовательскую сессию уникальный ключ-идентификатор

                                                    +2

                                                    И что это даст?
                                                    Зачем шифровать?

                                                      +1
                                                      Чтобы что? К тому же трафик и так шифруется по https протоколу ;/
                                                      0
                                                      Более-менее «защитить» можно элементарно. Запоминать предыдущие точку и время запроса и сравнивать с новой. Если скорость перемещения больше ~250км/ч — клиент на подозрении, если повтор — бан за нарушение условий использования.
                                                        0
                                                        Человек не обязательно заказывает такси себе. Зайти в приложение, а затем переместиться на другую точку — вполне нормально. Или например телефон подглючивает и определяет собственные координаты не в том месте. Или например я при повышенном спросе ползаю по карте и смотрю, может с другой точки будет заказать дешевле.
                                                    +6
                                                    Эту проблему можно решить рядом способов:
                                                    — показывать данные только авторизованным пользователям (если у человека нет приложения, данные ему не нужны);
                                                    — ограничивать количество запросов в единицу времени (чаще чем раз в 10-15 секунд не имеет смысла запрашивать, для практического применения возможно и минуты будет достаточно);
                                                    — бить тревогу если запросы начинают идти на локации значительно удаленные от места где находится пользователь приложения;
                                                    — не отдавать результат если пользователь находится в поездке (ему это уже или ещё не нужно, пока он не достигнет конечной точки);
                                                    — … и ещё можно придумать мониторинг и ограничения, не создающие проблем честным пользователям, но не дающие возможности следить за водителями кому угодно.

                                                    Да даже банальный rate-limit на раз в 30 секунд с одного IP существенно сократит (если совсем не уберёт) возможности слежки, уж маршрут-то точно станет тяжко отслеживать.
                                                      0
                                                      Я говорил о решении проблемы, а не ограничениях. Можно накатывать сколько угодно условий, скраппить данные это не помешает, но давайте по пунктам.
                                                      показывать данные только авторизованным пользователям (если у человека нет приложения, данные ему не нужны);

                                                      Вы можете передавать данные авторизации вместе с запросом, серверу глубоко всё равно с приложения или тапка они отправлены, любой user agent можно подменить хотя бы с помощью того же reverse proxy.
                                                      ограничивать количество запросов в единицу времени (чаще чем раз в 10-15 секунд не имеет смысла запрашивать, для практического применения возможно и минуты будет достаточно);

                                                      Прокси помогут as well.
                                                      бить тревогу если запросы начинают идти на локации значительно удаленные от места где находится пользователь приложения;

                                                      Невозможно точно установить местоположение пользователя, как вы собираетесь это сделать?
                                                        +2
                                                        Вы можете передавать данные авторизации вместе с запросом, серверу глубоко всё равно с приложения или тапка они отправлены, любой user agent можно подменить хотя бы с помощью того же reverse proxy.

                                                        Это смотря как делать авторизацию, не говоря уже о том что пользователю придётся сначала регистрироваться, а это привязка по номеру телефона (подозреваю, что с верификацией).

                                                        В токен авторизации можно забить текущие координаты пользователя и ограничить радиус запроса в (скажем) 3 км.

                                                        Далее, если мы ограничим выдачу результатов только авторизованным пользователям, то в сочетании с банальным rate-limit не помогут ни прокси, ни что-то ещё, ибо он привязан к пользователю, а не IP.

                                                        Вы конечно скажете что можно создать сотню или тысячу пользователей, но их можно быстро вычислить по частоте запросов (тот кто просто ездит не делает запросы даже раз в минуту на протяжении часа), не говоря уже о том что на каждого пользователя потребуется свой номер телефона, а три разных запроса (скажем) в течение минуты с разных IP но от одного пользователя явное свидетельство чего-то «левого».

                                                        Конечно, если разбить город сеткой 100x100, в каждый квадрат «посадить» отдельного пользователя (уже 10 тыс. нужно), и каждый из них будет делать запрос раз в минуту — то что-то из этого и получится, но стоимость такого съёма информации будет просто невероятной, причём их всё ещё легко отследить (при желании), ибо они не ездят.

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

                                                        Правда? Приложение для вызова такси не использует GPS смартфона для определения положения пользователя? Да, можно подменить данные — но «прыгунов» легко отследить, не думаю что если кто-то реально способный перемещаться со скоростью более км/минуту (и делающий это между запросами) нуждается в такси, в сочетании с ограничением по радиусу поиска это отфильтрует левые запросы.
                                                          0
                                                          тот кто просто ездит не делает запросы даже раз в минуту на протяжении часа

                                                          Похоже, вы просто напросто забыли что данная возможность предназначена для отслеживания автомобилей (не автомобиля) и их положения в реальном времени. Будет сложновато для обычных пользователей без корыстных намерений сделать это с такими ограничениями.
                                                          Не говоря уже о том, что gps технологии поддерживаются не всеми устройствами.
                                                            +1
                                                            Будет сложновато для обычных пользователей без корыстных намерений сделать это с такими ограничениями.

                                                            Для гиков дается burst на 10 запросов и далее rate-limit на 1 запрос/минуту — этого более чем достаточно чтобы насладится видом вокруг несколько раз, вызвать машину, дождаться её и уехать. Среднему пользователю совершенно неважно что машины в районе сместятся на несколько сотен метров (или даже на километр) пока он изучает карту, ему важно (и то вопрос) видеть сколько их рядом.

                                                            Если машина заказана и уже едет и хочется знать где она — отдается только её положение, что ещё нужно пользователю для приятного опыта?

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

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

                                                            Не говоря уже о том, что gps технологии поддерживаются не всеми устройствами.

                                                            Ок, тогда пользователь сам укажет где он. Но если он будет менять положение каждые 15 секунд со смещением в несколько километров, опрашивая машины в округе — разве это реалистично для того кто просто хочет уехать? Он что, телепортироваться собирается в район где их больше? А если собирается (и может) — то зачем ему, собственно, такси?

                                                              0
                                                              Похоже, вы просто напросто забыли что данная возможность предназначена для отслеживания автомобилей (не автомобиля) и их положения в реальном времени.

                                                              Нет, её назначение — создать у пользователя впечатление, что он сможет быстро уехать, но при этом не сильно пользователю наврать. Более того, пользователь абсолютно не расстроится, если в момент назначения машины он получит не уже нарисованную на карте, а какую-то новую — главное, что машина есть. Точность местоположения и реальное время здесь не нужны от слова совсем.

                                                              И да, вам не нужно делать сто тысяч запросов в секунду, чтобы рисовать машинки на карте — дайте клиенту позицию и направление, пусть экстраполирует, юзеры не будут бегать по улице и сравнивать. Дороги у нас обычно прямые, максимум, что произойдет — машина на карте немного проедет перекресток, а потом прыгнет на перпендикулярную дорогу, будто кому-то на это не побоку. Одного запроса раз в 10-15 секунд вполне хватит.
                                                                0

                                                                Расстроится. Неоднократно было — машине в округе есть, но не назначают ни одной, либо назначают самую бальную...

                                                              0

                                                              В некоторых сервисах такси есть такая штука — вызов такси кому-то в другой части города. Есть например в том же яндексе. И точно так же показываются машины рядом. Удобная штука. А вот вы предложили сделать ее менее удобной.

                                                                0
                                                                Нисколько. Это решается уже упомянутым мной выше бурстом. К тому же, я (будучи сервисом) с трудом поверю что пользователь вдруг решил заказать такси десятку разных «других» в разные районы города за короткое время, а если и решил, то вряд-ли будет это делать регулярно и продолжительное время — он что, свой сервис заказов открыл, а у всех без исключения «других» нет смартфонов с приложением? И он готов отвечать каждому водителю «Я тут стою у зелёного киоска, вы где?» вместо этих самых «других», или наоборот, каждому «другому» — «Да едет он к вам, едет, в пробке стоит, опоздает на 10 минут»?
                                                                  0

                                                                  Не в некоторых, а во всех известных мне. И это жизненно необходимая возможность. Например, заказать такси жене/ребенку/теще/другу и т п
                                                                  Или едешь ты в метро, gps прыгает, а ты хоп — и вызвал такси на конечную метро по адресу )

                                                              0

                                                              Шаринговые сервисы типа Share Now показывают машины и без логина, все.
                                                              Кстати, интересно было бы поковыряться в их трафике, хотя это мало что даст.

                                                                +2

                                                                Почти наверняка эти сервисы обфусцируют уникальный айди машины. Т.е. в моменте посмотреть картину распределения можно, а вот построить карту передвижений — нет

                                                                  0
                                                                  Они же не показывают машины в движении.
                                                                0
                                                                Эту “проблему” в глобальной перспективе невозможно решить, разве что не показывать этой информации вовсе.


                                                                А почему нельзя показывать пользователю варианты автомобилей вокруг только после создания заказа? Как это делает тот же Я.Такси. Тогда можно было бы отдавать их не по локации пользователя, а по локации самого заказа, который этот пользователь создал. Локацию заказа поменять у пользователя не получится, не пересоздавая заказ. Как и создавать 100500 заказов в минуту. Вот и решение.
                                                                  +1
                                                                  Это не решение проблемы существующей задачи, это другая задача.
                                                                    0

                                                                    Потому, что я не хочу делать заказ, если рядом нет машин?

                                                                      +1
                                                                      Достаточно сделать чуть другую систему — делаете заказ, водитель делает преложение — «буду через 20 минут» — вы можете бесплатно отказаться если не устраивает, а если «буду через 3 минуты» — то всё равно сколько машин в округе, вам ведь важно быстро уехать, или нет?

                                                                      И даже если округа вся занята машинами, у вас всё равно никакой гарантии не будет что кто-то из них уложится в нужное вам время, хотя… если никто не уложится — разве вы будете вызывать вертолёт? В лучшем случае будете заказывать у другой службы, но не факт что ситуация там будет лучше (особенно в час пик), и обозревание количества машин вокруг совершенно на это не может повлиять.
                                                                        0

                                                                        Да 200%. Меня не волнует плотность машин в конкретном районе. Я уже выше писал почему — легко может оказаться, что свободных водителей нет. А машины на карте есть
                                                                        А интересует меня — среднее время ожидания по конкретному адресу. Если оно больше некой величины, то пора садиться на ОТ или искать каршэринговую тачку

                                                                          0

                                                                          Меня интересует количество свободных машин.
                                                                          Если ребята показывают все машины — в этом, действительно, нет смысла.

                                                                          +1

                                                                          Лишние действия от пользователя вместо нормальной реализации от поставщика услуг.
                                                                          Мне важно уехать, когда быстро, когда комфортно — зависит.
                                                                          А идиотские ограничения "не заказал — не покажем машины рядом" автоматически отправляют таких вот оптимизаторов, в лучшем случае, в конец списка сервисов.

                                                                            0
                                                                            Что значит «лишние»? Он заказывать не собирается, что-ли? Тогда зачем полез в приложение? А если собирается, всё равно жмёт кнопку «заказать», и независимо от плотности и количества машин показанных на карте время ожидания его может не устроить (они все могут быть заняты, ехать в другом направлении, etc).

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

                                                                            Пользователю может быть «неудобно» только в одном случае — если карта даёт ему возможность сделать drag & drop конкретной машины, с последующей материализацией этой самой машины там где он стоит через несколько секунд.

                                                                            За всё время пользования подобными сервисами не могу вспомнить ни одного случая когда информация о машинах хоть как-то была полезна, хотя красиво, да — создает атмосферу «мы заботимся о вас» и «смотрите как у нас круто, сколько машин вокруг».
                                                                    0
                                                                    То есть это просто запрос на конкретный домен? Можно через браузер всё это провернуть?
                                                                      +1

                                                                      Да, только это POST запрос. Не сработает, если просто вставить ссылку в адресную строку, так как там исполняется GET запрос. Но можно сделать из кода странтцы на js.

                                                                        0

                                                                        Postman бесплатен и крут, жаль, что уже не расширение хрома.

                                                                          0
                                                                          POST можно отправить, создав .html файл с тегом form method=«post»
                                                                        +9

                                                                        Имхо дырка в одном: можно отслеживать, куда едет клиент, если знаешь, где и когда он сел в такси.
                                                                        А показывается ли положение ЗАНЯТЫХ такси?

                                                                          +1
                                                                          Даже если не показывается, то возможно отследить место, в котором машина станет свободной
                                                                            0

                                                                            Тоже думал об этом.
                                                                            Теоретически — да. А практически, машина может и не освободиться, если водитель решит закончить рабочий день.
                                                                            Или если он сразу схватит нового пассажира между сканированиями.


                                                                            Ну и отслеживание онлайн это совсем не то, что ты после поездки выясняешь, куда же человек ездил.


                                                                            При чём история не ведётся: пропустил момент освобождения такси, и всё, данных нет

                                                                          0
                                                                          POST запрос на /getdrivers

                                                                          А так пишут?) В смысле, глагол в endpoint'е, POST вместо GET на получение списка и дублирующий `method: getdrivers` в теле запроса.
                                                                            0

                                                                            Тоже показалось странным

                                                                              0
                                                                              Если я правильно понимаю, в GET запросе параметры можно передавать лишь в query либо в header-ах, при этом в POST (PUT, etc.) доступен «payload» — body. И вот насколько мне известно передача данных в payload-е секьюрнее с точки зрения возможности отследить что ты и куда отправляешь на уровне просмотра твоего трафика. Но это не точно.
                                                                                0

                                                                                Чуточку секурнее. А ещё можно струячить не http, а grpc запросами, которые то же самое, но лучше. А к чему это я. Gprc уже без спец знаний и средств просто так не распарить. А эффективность может быть выше (компактнее хранение)

                                                                                  0
                                                                                  в GET запросе параметры можно передавать лишь в query либо в header-ах

                                                                                  Вы удивитесь (как удивился в своё время я сам) — в GET можно использовать body, спецификация это не запрещает. Неплохое обсуждение тут.

                                                                                  Проблема может быть только с (кэширующими) прокси, которые используют старую спецификацию (где «смысл» GET запроса определялся исключительно URI, а тело игнорируется).
                                                                                    0
                                                                                    Это то понятно, но можно много вещей делать игнорируя спецификации. Тем более Вы сами явно выделили причину не использовать этот костыль.

                                                                                    Ещё одна причина почему могут юзать POST вместо GET — возможно большинство ручек подразумевают у них POST запросы, и им просто было проще вообще все запросы делать POST копипастой из других мест в коде. Т.е. внутренние парсеры, кодогенерация, и так далее мб уже были настроены под POST так что их и юзали.
                                                                                      0
                                                                                      Это не костыль — спецификация как раз это допускает, и старая и новая, просто смысла в те времена в теле не было, всё легко влезало в URI, JSON ещё не было, XML только начинал свой путь. Новая же спецификация явно это поддерживает, поскольку «смысл» запроса уже не определяется только URI.

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

                                                                                      И наконец, иногда всё же хочется скрыть тело запроса (параметры) от случайного (или избыточного) логирования (ясный пень что при желании и тело можно логировать, но это и в случае POST/PUT можно).
                                                                                  0
                                                                                  Можно.
                                                                                  В том случае когда query string большой/сложный, это прям в REST написано.

                                                                                  Но в целом да, что то не так с названием.
                                                                                  0
                                                                                  «некто «3apa3a»» случаем не автор 3proxy github.com/z3APA3A?
                                                                                    0
                                                                                    Деанон на Хабре?
                                                                                      +4
                                                                                      Владимир Дубровин имеет профиль на хабре с несколькими публикациями.
                                                                                      habr.com/ru/users/z3apa3a
                                                                                    –1
                                                                                    > А то, что данные вроде как важные.

                                                                                    Вроде как да, а вроде и нет.

                                                                                    > можно отследить конкретного таксиста, можно отследить и его клиента

                                                                                    Ну и что? Сомневаюсь что Ситимобил хоть раз гарантировал приватность в этом вопросе.

                                                                                    > Яндекс.Такси, вот вам гора данных

                                                                                    ЯДу бы самому не мешало эти данные раскрыть.
                                                                                      0
                                                                                      Практически любое моб приложение страдает подобными дырами. Многие прям в лог плюют дебаг информацией. Включая, банковские. Спасает только то, что для реверсинжиниринга моб приложений нужен уровень чуть выше консольки в хроме… Хотя, может быть и не спасает. Просто кому это действительно надо — молча пользуются.
                                                                                        +3
                                                                                        Защитить эти данные и вправду сложно.

                                                                                        Формально любая ручка, отданная юзеру — публичная. Есть телефон с приложением — значит есть и полный доступ, ограничения по лимиту обходятся через прокси.

                                                                                        Единственный способ защитить — это хорошее шифрование и дешифратор в приложении. Есть умельцы которые смогут реверснуть код, против такого — смена соли при каждом обновлении приложения.

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

                                                                                        Но вот POST запрос на getdrivers это реально треш. К тому же вперемешку и snake и camel, неработающие радиус и лимит, еще не пойми зачем они версии каждый раз таскают прямо в теле запроса…

                                                                                        Если я был бы разработчиком там, мне было бы стыдно за такое. Взять 2-3 недели как техдолг и привести в нормальный вид. Самим то не стремно такой шлак изрыгать?
                                                                                          +1
                                                                                          Единственный способ защитить — это хорошее шифрование и дешифратор в приложении.

                                                                                          Это не защитит данные, а сделает их получение чуть более сложным. Придётся гонять приложение в эмуляторе, подсовывая ему разные данные о местоположении и делая скриншоты, которые потом нужно будет правильно распарсить. Просто будет меньше людей, которым будет не лень это сделать.
                                                                                            +4
                                                                                            Все можно, т.к. вообще неясно зачем эти данные приложению — достаточно отрисовать 2-3-… н «вирутальных» такси, не привязанных к реальным координатам/идентификаторам. Тут просто кривое проектирование апи/продукта.
                                                                                            +3
                                                                                            Есть телефон с приложением — значит есть и полный доступ, ограничения по лимиту обходятся через прокси.

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

                                                                                              Абсолютной защиты естественно не бывает, но банальные ssl pinning + firebase anonymous auth мигом повысили бы сложность с «я тут за вечерок снял траффик и наклепал скрипт» до «геморройно, ну его нафиг» для большинства любителей пошуршать там, где их не ждут.
                                                                                                0
                                                                                                Можно поставить ограничение на количество запросов на аккаунт. В таком случае прокси не поможет
                                                                                                  0
                                                                                                  Не нужно защищать данные.
                                                                                                  Нужно отдавать пользователю ровно то, что он попросил — сколько машин рядом, и где эти машины.
                                                                                                  Не привязывая к меткам машин какие-то ID.
                                                                                                  И обновляя метки при каждом обращении.
                                                                                                  А уже после заказа — конкретизировать авто до цвета, марки, модели, номерного знака, ВИН, ИНН водителя… :)
                                                                                                  +4

                                                                                                  Опять хакер в солонку нассал. Мне кажется что точно стоит убрать id машины — уже этого будет достаточно. Но если есть фича с выбором конкретного такси для поездки — она поломается. Как вариант можно наверное после каждой поездки назначать новый ид машины (ид — который отдается в приложение); не показывать машины в поездке.

                                                                                                    0
                                                                                                    Да и адрес машины можно убрать, а только их количество отдавать…
                                                                                                    0
                                                                                                    И случайно так у автора иконка Яндекс-Турбо)
                                                                                                      0
                                                                                                      Krupnikas, круто, что у вас не только текстовое описание, а и визуальное.

                                                                                                      Когда я нашёл уязвимости в другом сервисе такси (Как ездить на такси за чужой счёт — уязвимости на примере одного сервиса), я видел такую же ситуацию, но не мог так хорошо расписать её. Что ж, попробую сообщить сейчас, с ссылкой на ваш пост, о результатах сообщу ;)
                                                                                                        0
                                                                                                        Круто, а какими библиотеками пользовались для визуализации всего этого?
                                                                                                        0
                                                                                                        Молодец, классно получилось, ждем еще статей)
                                                                                                          +2
                                                                                                          Всем привет. Сергей, ещё раз здравствуйте. Ситимобил на связи.

                                                                                                          Мы внимательно изучили всю ситуацию, описанную Сергеем Крупником. Мы ожидаем, что все детали найденных дефектов, а также любые вопросы касающиеся уязвимостей, будут сначала заданы нам в тикете на HackerOne (https://hackerone.com/reports/756833). В данной ситуации мы не получили всех тех деталей, которые описаны в статье, и очень ждем от автора, что в будущем вместе с ним лично будем обсуждать любые возникающие вопросы.

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

                                                                                                          По условиям программы Bug Bounty мы не можем можем выплатить вознаграждение после открытой публикации уязвимости. Но от команды Ситимобил считаем важным выдать вознаграждение за сообщение об этой возможности и проделанные усилия для её описании. Мы также готовы предложить Крупнику присоединиться к инженерной команде Ситимобил. Ещё мы призываем всех специалистов, кто занимается безопасностью пользовательских данных, сообщать нам о найденных уязвимостях через сайт HackerOne. Ситимобил очень серьёзно относиться к любым найденным уязвимостям и готов сотрдуничать со всеми, кому не безразлична эта тема. Мы также готовы выплачивать достойные вознаграждения за найденные баги в наших продуктах, но в рамках правил площадки HackerOne.
                                                                                                            +10
                                                                                                            Всем привет. Георгий, еще раз здравствуйте. Станислав на связи.

                                                                                                            Я внимательно изучил информацию по предоставленной вами ссылке и не нашел там запроса деталей. Просто тикет закрыт и есть отписка. Вам сначала в тикете и написали. И почему вы лично будете обсуждать? Я как пользователь хочу знать о существующих уязвимостях, по которым какой-нибудь псих может за мной следить.
                                                                                                              +1
                                                                                                              Если клиент сел, и машина пропала, а потом машина появилась в новом месте, то это не говорит о том, что клиента высадили в новом месте?
                                                                                                                –1
                                                                                                                Но ведь водитель просто может пойти отдохнуть, поесть. Уйти домой и еще куча причин не связанных с поездкой. Как в таком формате можно различить реальные поездки от шума?
                                                                                                              0
                                                                                                              Оставлю тут.

                                                                                                              Читал про возможности защититься шифрованием того что клиент все равно должен прочитать.

                                                                                                              Ади Шамир (Adi Shamir), один из создателей RSA.
                                                                                                              Первый закон Шамира гласит: систем с абсолютной безопасностью не существует и никогда не будет существовать.
                                                                                                              Второй закон Шамира гласит: криптографию не сломают, ее обойдут.
                                                                                                              Шамир — устранить все возможные уязвимости в конкретной программе ныне так же бессмысленны, как и 30 лет назад.

                                                                                                              Возможно лучшее из того что уже писали, это подкрутить само общение клиента и сервера. Без усложнения логики, и без наворотов вроде отслеживания брутов и ложных блокировок.
                                                                                                                +1
                                                                                                                А еще у Ситимобила худшее в Москве управление качеством сервиса — их машины неоднократно игнорируют пешеходные переходы/красный свет, а в ответ поддержка по телефону говорит «ну, пишите жалобу в полицию». Ты же Я.Такси обрабатывают и реагируют по таким заявкам с сайта.
                                                                                                                  +1
                                                                                                                  Так, хорошо, разобрались, все машины можно посмотреть. А как с тем, чтобы попробовать создать заказы для всех машин одновременно?
                                                                                                                    0
                                                                                                                    Чем сформировать на карте надпись «The bug!»

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

                                                                                                                  Самое читаемое