Предыстория
8-го декабря 2017-го года была выпущена новая версия приложения для iOS. В ней обновили дизайн, поправили мелкие недоработки и т.д. и т.п. Скачав приложение на телефон, я столкнулся с проблемой: не получалось пройти процедуру аутентификации. Пытался вводить в поле логина и номер договора, и номер телефона, и почту – ничего не помогало, все попытки оканчивались фиаско.
Проблема наблюдалась только в приложении, сайт же работал (да и работает) безупречно – пускает меня полностью. Сообщение об ошибке не очень-то и информативно. Что же пошло не так?
Анализ трафика приложения
Для того, чтобы установить, почему же наш пациент не хочет жить, воспользуемся программой mitmproxy. Она позволит нам посмотреть коммуникацию между приложением и сервером.
Попробуем аутентифицироваться, чтобы получить запрос клиента и ответ сервера.
Судя по ответу, передается невалидный timestamp:
Взглянем на запрос:
В поле «timestamp$c» передаётся время отправления запроса. Не понимаю, зачем доверять клиенту в таких вопросах?
Решение проблемы
Разработчики не учли то, что люди используют разные форматы времени; timestamp формируется неправильно, если стоит 12-и часовой формат (как в моём случае), поэтому запрос не может пройти проверку на сервере. Меняем формат отображения времени в настройках телефона на 24-х часовой и успешно проходим аутентификацию. Отличие запросов лишь в том, что в 24-х часовом формате в timestamp нет AM/PM.
Корректный запрос выглядит так:
Вычисляем по номеру телефона или адресу электронной почты
Во время анализа трафика приложения на этапе аутентификации, я наткнулся на одну весьма интересную недоработку системы. Некорректное поведение функции «восстановить пароль». Она отдаёт очень интересную информацию.
Запрос выглядит следующим образом:
Нас интересует параметр "param_values_arr$c".
- Если в нём передать номер договора пользователя услуг Interzet/DomRU, то мы получим привязанные к договору контактные данные: номер телефона, адрес электронной почты.
- Если передать в нём номер телефона или адрес электронной почты, то в ответе мы увидим точный адрес пользователя.
Пример ответа:
Видим точный адрес своей квартиры, понимаем, что это фиаско, а так же улыбаемся и машем!
P.S: на сайте всё работает корректно, вроде бы, адрес звездочками закрывают :)
К слову, судя по ошибкам, которые выдаёт сервер в случае отсутствия пользователя в базе, на сервере включен режим отладки. Не понимаю, зачем?
<debug>
<![CDATA[debug$n=24: exception: ORA-20001: debug=2 backtrace: ORA-06512: at "EXCELLENT3.WEBCAB_XML_PROC", line 6264 ORA-06512: at line 1 ORA-06512: at "EXCELLENT3.WEB_CABINET", line 1064 ]]>
</debug>
Как повторить?
У каждого города, я подозреваю, своя БД и URL. Ниже приведен пример для города Санкт-Петербург.
Простой запрос через cURL:
curl "https://spb.db.ertelecom.ru/cgi-bin/ppo/es_webface/web_cabinet.get_info?param_names_arr%24c=client_contact¶m_values_arr%24c=habr@example.com¶ms=get_agr_list_contact_xml"
Меняем habr@example.com на необходимый номер телефона или адрес электронной почты.
UPDATE: проблема исправлена, теперь адрес закрыт звездочками.
Вся информация предоставлена исключительно в ознакомительных целях. Я не несу ответственность за любой возможный вред или ущерб, причиненный материалами данной статьи.
Комментарии (104)
mkll
11.12.2017 03:09-1Разработчики не учли то, что люди используют разные форматы времени; timestamp формируется неправильно, если стоит 12-и часовой формат
Вообще-то причина не в том, что разработчики чего-то не учли (хотя и в этом тоже, но это уже мелочи), а в том, что они, как и подобает настоящим советским разработчикам, снова изобрели велосипед. ISO 8601 ведь не для них писался, это совершенно очевидно.
Ну а зависимость формируемого параметра от локали девайса говорит нам, что опять понабрали студентов по объявлению, чо.nerudo
11.12.2017 08:42Вы думаете только советские студенты этим отличаются? Софт за много-тысяч-баксов зачастую пишут люди, которым на локали кроме [en] глубоко пофиг.
tyomitch
11.12.2017 10:14Уточню: «на локали кроме en-US».
Потому что англичане точно так же плюются от кривого софта, для которого 11/12/2007 — это 12-тое ноября, независимо от настроек системы.
HEKOT
11.12.2017 09:08как и подобает настоящим советским разработчикам, снова изобрели велосипед
Уверяю, настоящие антисоветские разработчики не менее, чем настоящие советские, склонны изобретать велосипеды.
BTW, настоящим советским разработчикам теперь уж лет по 50+. Почему Вы думаете, что в данном случае работал не хипстер-кодерок с гиктайма?mkll
11.12.2017 11:43«Советские» — это не возраст, это образ мышления. Надо было сказать «савецкие», чтоб дифференцировать от советских, тут я облажался.
HEKOT
11.12.2017 12:09-1А какова этимология этого нового для меня слова?
mkll
11.12.2017 12:14Боюсь, я не смогу дать развернутого квалифицированного ответа, да он будет и не слишком уж уместен в рамках данной дискуссии. Если коротко — «сделаем как быстрее, проще и бог на душу положит, а не так, как надо».
achekalin
11.12.2017 10:08timestamp формируется неправильно, если стоит 12-и часовой формат (как в моём случае), поэтому запрос не может пройти проверку на сервере
Этопятьfail, товарищи разработчики! А настоящий timestamp чем не подошел?LoadRunner
11.12.2017 10:22Вопрос из категории «Хочу всё знать»: А для чего вообще нужна проверка timestamp?
AllexIn
11.12.2017 12:56Да она вообще не нужна скорее всего. Чисто для статистики. Но верификация корректности фейлится и запрос отклоняется.
alexeykuzmin0
11.12.2017 12:56Может быть, чтобы игнорировать дублирующиеся запросы.
Например, если мы пишем мессенджер, то будет нехорошо, если при работе с нестабильной сетью сообщения будут просто теряться, поэтому добавляем в мобильное приложение автоматическую переотправку сообщения, пока не получим ответ «все ок, опубликовано». Но что если потерялся именно этот ответ сервера? Тогда телефон попробует снова, и будет отправлено две копии сообщения. Поэтому телефону стоит добавлять в сообщение некий id, и сервер будет игнорировать сообщения с одинаковым id. В качестве такого id подойдет локальный timestamp.
Хотя не очень понятно, чем именно в их случае сильно мешают дублирующиеся запросы.Pycz
11.12.2017 13:30Все-таки для id в таком случае надежнее какой-то UUID использовать, таймстампы, вообще говоря, не гарантируют уникальность.
impwx
11.12.2017 10:26+3Интересно, имеет ли какую-то юридическую силу дисклеймер в стиле «я не несу ответственность за выложенное». Ставлю на то, что он является ничтожным, но хотелось бы услышать комментарий знающего человека.
DSLow
11.12.2017 11:10А почему автор должен нести какую-то ответственность, если он не извлекал из этого никакой выгоды. Он придал проблему огласке, пусть правят. Ответственность проявляется лишь в том случае, когда есть видимое злоупотребление подобным абузом.
impwx
11.12.2017 11:25Неправомерный доступ к информации является нарушением закона по cтатье УК 272. Наличие выгоды — не обязательное, а отягощающее обстоятельство.
Arthaus25
11.12.2017 11:10согласно соглашению Пользователя с Хабром весь контент, выложенный пользователями принадлежит Хабру. По лицензии, которая позволяет изменять контент и использовать так, как только можно.
Поэтому, по сути, ответственность за это несет Хабр =)
FractalizeR
11.12.2017 10:55+2Я верно понимаю, что вы только что фактически выложили в открытый доступ личные адреса проживания огромного количества ни в чем не повинных людей? Вы дали компании только пятницу на закрытие уязвимости из-за не слишком сообразительного сотрудника в службе поддержки?
OstaninKI
11.12.2017 11:01Не совсем пятницу, скрины от 10.12.17 (это воскресенье), а обновление агента, с которого все началось вышло в пятницу. (все со «слов автора»)
izzholtik
11.12.2017 11:02
Возможно, вы просто залогинены в ЛК?multiprogramm
11.12.2017 11:10Аналогичная ситуация. Выдаёт город, первую букву улицы, номер квартиры и подъезд. Но количество звёздочек к скрытым символам, похоже, соответствует один к одному. Т.е. если подумать, то можно, например, легко определить улицу и сколько цифр в номере дома, что уже даёт некое сужение информации об адресе.
Мне, как клиенту, конечно, хотелось бы, чтобы не выводило вообще ничего.
XakRU
11.12.2017 11:12И вроде бы — организация хранит паспортные данные, ФИО, номер телефона, адрес проживания (не всегда совпадает с местом прописки), а значит должны соблюдать ФЗ 152.
А тут оператор допускает раскрытие персональных данных неопределенному кругу лиц.
Также не понимаю — зачем провайдерам в личном кабинете пользователя указывать паспортные данные абонента, ведь ФИО должно быть достаточно, ну храните паспортные данные у себя в недоступной публично БД, свои паспортные данные я и сам прекрасно знаю.atronach
12.12.2017 16:59Для подтверждения различных действий по телефону — подключение услуг, смена тарифа и т.п. Есть исключения в процессах, в некоторых случаях это не требуется, но при любых сомнениях с вас требуют ПД для идентификации и подтверждения.
VolCh
12.12.2017 17:04Зачем их отображать и/или отдавать по публичному API? Более того, такое отображение сильно снижает защищенность в случае, если у злоумышленника есть доступ к ЛК, и он хочет произвести какую-то манипуляцию.
atronach
12.12.2017 23:49Я прошу прощения. Утром, пока мозг не проснулся, ваш комментарий прочитался совсем под другим соусом, конечно вы правы. Кстати именно паспортные данные у меня в ЛК никогда не отображались, только ФИО владельца договора, сам договор и адрес. Провайдер как раз дом.ру
nipnull
11.12.2017 11:12Уязвимость/дыра — не суть важно. Да, серьезно. Да, из-за глупости при разработке.
Вопрос в том, пытались ли вы до публикации связаться с провайдерами, у которых присутствует данная уязвимость?
Proof of work до закрытия уязвимости без bug report — спорное действие.
zabbius
11.12.2017 11:23Когда-то давно интерзет был норм, пока его не купил дом.ру. Перешел тогда с них на другого провайдера, воткнув его вторым аплинком. Интерзету платить перестал и стал ждать, когда же отключат. Как итог, я уже несколько лет абонент-призрак, личного кабинета нету, однако порт активен и доступна вся интерзетовская локалка. Могу много еще плохого написать про дом.ру, но суть в том, что хуже только ростелеком.
dean999
11.12.2017 12:06+2
Можно побаловаться…zabbius
11.12.2017 12:13надеюсь, через ТОР?
dean999
11.12.2017 12:35да я просто так собрал, уже в тех поддержку обратисля тоже, криво звездочками закрыли и нет защиты от перебора
dean999
11.12.2017 20:08generator2015.esy.es
Если кто хочет пощупать дыру)) номер вводите и город ))можете еще предел))
artemmityushov
11.12.2017 13:28+1Эта проблема у эртелекома была еще лет 10 назад когда я там работал, демонстрировал эту дыру(и еще несколько) начальству, но оказывается что а воз и ныне там.
Кстати странно что все еще все идет через ppo, это самописная утилита мост между вебсервером и ораклом, для вызовов через веб методов пакетов по url-у /пакет/функция. За 10 лет ничего не изменилось балин.
NYMEZIDE
12.12.2017 10:55Домру хранит пароли в открытом виде, без соли и без хеша.
На мой запрос — почему? сказали что они лучше знают как хранить пароли и мол так все делают.artemmityushov
12.12.2017 11:20+3В 2007 лично писал хэширование паролей, не знаю как сейчас, но тогда пароли не хранились. А учитывая что работает еще старый движок биллинга то с трудом верю в это.
И вопрос — а откуда вы знаете как он хранится внутри? Кто вам дал такой ответ за запрос?NYMEZIDE
12.12.2017 13:09Мне мой пароль продиктовали в тех.поддержке, он его видел как обычный текст и мы проверяли совпадает он или нет. Если бы пароль был захеширован — то его никак в обратную сторону бы не вернули в обычный текст. Функция не обратима.
+ его присылают на телефон СМСкой тоже в открытом виде. Если бы он был захеширован — то пришел бы другой сгенерированный системой пароль.
Разве не так?artemmityushov
12.12.2017 13:26Если это так то могу сказать только одно — в мое время такого бардака не было.
Есть конечно же подозрение что есть параллельное хранилище зашифрованное для работы суппорта, но это по моему мнению дыра внутри безопасности эртелекома.NYMEZIDE
12.12.2017 15:11там на самом деле бардак на всех уровнях, начиная с расклейщиков и агентов по подключению. У меня весь подъезд с 1 по 5 этажи расклеили рекламой новых тарифов и условий. причем посадили на клей, заклеили счетчики домовые, щитовые, на стенах, окнах. Дурдом был. Мальчик все валил на менеджеров, мол ему дали стопку — сказали куда хочешь девай, лишь бы было везде. Они от него открещивались, и мол это его инициатива.
В итоге месяц ругался, пригрозил написать заявление коллективное, по факту вандализма. На след.день прибежали с ведерком, тряпочкой, отодрали.
Раньше ругался с ними по поводу качества интернета, сейчас все хорошо с этим.
Еще проблема есть в личном кабинете. Баланс некоректный у них. Списание было на 1-2 мес. вперед. Причем в биллинге списания нет. А на сайте есть. И таких косяков по мелочи набирается снежный ком. Увы, но бардак он везде…
MasMaX
12.12.2017 14:40Да все верно. Суть хеша что он работает только в одну сторону. Т.е. при логине сравнивается хеш логина в базе и вычисленный хеш пароля который дал юзер.
artemmityushov
12.12.2017 16:26Кажется у вас бардак в голове) Почитайте как-нибудь как устроены правильные системы проверки пользователей и для чего в базах хранится хэш пароля, хэш логина не нужен совершенно.
VolCh
12.12.2017 16:55Вообще, в хэшировании логина есть смысл, особенно если логином является иной идентификатор будь то какой-то адрес (мыло, телефон), учётный номер в иной системе (ИНН, СНИЛС) или другой легко персонализируемый идентификатор (номер паспорта, например).
Jin_89
12.12.2017 17:00Кто знает, вдруг они оперативно брутят хеш перед тем как показать его оператору
sumanai
12.12.2017 20:01Даже если сбрутят, не факт, что не наткнутся на коллизию, то есть пароль может и не совпасть. А брутить современные алгоритмы с большой длинной, где коллизия практически исключена, как-то накладно, даже если у них в подвале припрятан квантовый компьютер на пару сотен кубит.
dean999
13.12.2017 06:32Хранит пароли в открытом виде, мне пришла смс восстанолвения, там номер договора и пароль)) изи)
m_a_d
13.12.2017 15:04Кстати, кто-нибудь знает точное наименования и адрес юр.лица, от имени которого работает Interzet Dom.ru? Три года как отключился от них, а они продолжают названивать по телефону. Не могу найти контакты, куда отправить заявление на запрет обработки ПД.
ivaaaan
Вы не сообщили провайдеру о уязвимости?
mkll
Я бы сказал, что это не уязвимость. Это дыра.
StjarnornasFred
Вероятнее всего, если покопаться, то и у некоторых других провайдеров, особенно мелких, можно найти подобные дыры. Шутка про «вычислю по айпи» выходит на новый уровень.
jo1n Автор
Сообщил :)
OstaninKI
Я так понимаю, что данная статья и есть оповещение, судя по смайлу в конце? )
jo1n Автор
Нет, я им написал на почту. Так как ответ был в стиле «у нас всё защищено», я посчитал правильным придать огласке. Если обратите внимание на скриншоты, то увидите, что они были сделаны за день до публикации статьи, именно тогда я и уведомил их.
OstaninKI
Хм, было бы не плохо прикрепить скрин ответа, на самом деле, иначе не считово ) И как же «золотое правило» — 30 дней до публикации о уязвимости?
AllexIn
Если ответ «Спасибо исправим
, вот вам бонус», то да, 30 дней или по договоренности.А если ответ «Идите в ж***, у нас всё ок!», то смысл ждать 30 дней?
OstaninKI
Ну пока про это мы знаем лишь со слов автора. При том, судя по его сообщению выше, прошли только сутки с момента нахождения проблемы (час ночи 10 декабря на скринах). Я крайне не уверен, что за один выходной день ему что-либо ответили вменяемое. Вот скрин ответа был бы очень к месту в данном обсуждении.
Gorodnya
Автор действительно очень поспешил. Получив шаблонный ответ от поддержки в пятницу-субботу, не стоит сразу раскрывать детали проблемы.
Конечно, ждать так долго, как ждал я (с мая по август — очень похожая ситуация, кстати: Уязвимость в Альфа-Банк Украина: получение ФИО клиента по номеру телефона) тоже не дело, но один день? Один ответ поддержки? Не разработчиков, не службы безопасности, а просто получив ответ(ы) от службы поддержки?
EvilsInterrupt
Абсолютно неважно знает сотрудник поддержки о том насколько обстоят дела с безопасностью их системы. Может быть хорошо, а может не очень. Ему это должно быть до лампочки!!! Правильный ответ в этом «Я занес ваши слова в систему, но сейчас выходной день. Лучшие инженеры нашей компании смогут взглянуть на вашу проблему только в понедельник с 11:00». Саппорт не имеет права выносить вердикт «У нас все хорошо». Он не того уровня технарь, чтобы так говорить.
Если есть хотя 1 тысячная от 1 % из 100, когда пользователя могут скомпрометировать, то надо СРАЗУ реагировать!
Gorodnya
И чем ваш ответ отличается от моего?
Я же и пишу, что принимать слова саппорта от том, что уязвимости нет, нельзя — нужно, чтобы вопрос был передан ответственным людям.
Автор поспешил с публикацией? Поспешил. Нужно было пробовать достучаться дальше? Нужно было.
И не кричите, пожалуйста.
ValdikSS
Автор следует парадигме full disclosure, а не responsible disclosure.
VolCh
Тем, что смысл первого ответа «спасибо, но нам не интересно», а второго " спасибо, мы займёмся этим при первой возможности".
Gorodnya
Я и не говорил, что «спасибо, но нам не интересно» — это правильный ответ. Я сказал, что получив шаблонный ответ от поддержки в пятницу-субботу, не стоит сразу раскрывать детали проблемы. И в статье, которую я привёл в пример, указано, что я пытался доказать значимость аналогичной проблемы несколько раз.
Reineke
Возникает чувство, будто автор должен быть больше заинтересован в этом вопросе, чем провайдер %)
Если его отшил сапортер — дальше, ИМХО, это уже косяк сапортера. Что вместо «мы займемся» (такой же шаблонный ответ, но подходящий под ситуацию), они прикинулись шлангом и сказали «у нас все ок».
VolCh
У вас было упорство и желание сделать мир лучше именно так, как вы сделали. У автора немного по другому.
Gorodnya
Спасибо за такой комментарий.
Am0ralist
А смысл?
Вот я еще полгода где-то в Теле2 написал, что как минимум на некоторых типах смартфонов смс с кодом для доступа к личному кабинету в предпросмотре при залоченном экране как раз позволяют увидеть этот самый код любому.
Банально, делаешь предварительный текст на десяток символов больше — и проблемы нет (как от того же сбера приходит)
Не, попытки с третьей донести мне написали, что передадут выше, и через несколько месяцев при очередном заходе в личный кабинет я опять ввел код не разблокируя смартфон.
Lashchevsky
Ну, лично мне удобнее когда код виден сразу. Увидел и сразу ввёл, не надо открывать сообщения. В некоторых случаях бывает, что код не в начале и не в конце, а сообщение большое. И его ещё выискивать надо. Но это скорее вопрос моего удобства + редко когда где-то логинюсь, только дома или в офисе. А так с точки зрения безопасности ваш посыл вполне оправдан.
Am0ralist
Удобство и безопасность редко пересекаются.
Так как эта смс типа безопасность — реализация у теле2 конкретно «хреновая».
И смысл тогда в этой фикции?
VolCh
А некоторые сознательно выбирают себе такие модели смартфонов, чтобы видеть подобные сообщения без разблокировки. Уж очень часто на каждый чих эти коды присылают, даже если ты не разработчик.тестировщик подобных систем :)
Тут я Теле2 поддерживаю — это именно тот сценарий, когда компромисс между удобством и безопасностью отдаётся на откуп пользователю.
Am0ralist
Эм, всю линейку винфонов брали исключительно потому, что там стандартно отображается n-ое количество первых символов в смс?
Или я должен бежать менять платформу телефона на другую, сменив оператора? Серьезно?
Как я могу вообще изменить эту ситуацию, если таких настроек нет? Какой откуп пользователю? Не использовать данного оператора, если только, так получается?
VolCh
Если вы брали винфон (и не сдали его назад), значит знали о такой его особенности и были согласны, что начало ваших смс может прочитать любой человек. Это особенности конкретных интерфейсов, а не стандарт де-факто в индустрии.
Am0ralist
Писать несколько первых слов начала смски в предпросмотре того, что пришло? Это однозначно страшное дело, надо чтоб пользователь даже номера не видел на экране, пока не разблокирован телефон, видимо по вашему.
И знаете, ни от одной серьезной организации а-ля банки — ничего в начале смс и не пишут, хотя кучей сервисов пользуюсь. А в теле2 — пожалуйста. В индустрии вообще стандартов нет, окститесь, товарищ.
sumanai
В андроиде всё настраивается, не через настройки, так через рут можно сделать всё. Не знаю, что там на виндофоне, но на конкретно моём андроиде 4.1.2 эту функцию можно отключить, что я и сделал.
Am0ralist
Если что-то гугл запретил делать, используйте рут и левые сборки, норм, чё, безопасность фореве. Кстати, когда на 4.1.2 последние заплатки безопасности вообще приходили? к вопросу про безопасность.
sumanai
Могу повторить, что конкретно у меня настройка отображения СМС является штатной возможностью.
Кому надо, тот рут получит.
На заплатки мне плевать, старый андроид не более опасен, чем старые инсталяции других ОС, а я думаю вы помните, что МС много раз кидал с обновлениями, и, в отличии от андроида с его многочисленными кастомами, там ничего иправить нельзя вовсе. А плевать лично мне можно, потому что я знаю, что к чему, будет нужно- поставлю кастом с почти последним андроидом, хотя вряд ли он на моём старичке SGS2 будет работать быстро, ну да мало ли.
Riateche
Странная какая-то претензия. Если смартфон позволяет читать приходящие сообщения без разблокировки, то это проблема смартфона, а не Теле2. И предложенный способ решения тоже странный. То, что на вашем смартфоне достаточно добавить 10 символов, вовсе не означает, что это поможет всем. У меня, например, приходящее сообщение прокручивается в статусной строке полностью, так что никакое количество символов не поможет (правда, в заблокированном состоянии ничего не показывает).
Am0ralist
Он не позволяет читать всё сообщение без разблокировки.
Он показывает лишь небольшую часть сообщения, что удобно понимать очередной рекламный спам тебе тот же теле 2, мегафон, банк и прочие прислали, или это напоминание о пополнении баланса, благая весть о начислении зарплаты, срочное сообщение от коллег.
А так как уже отвечал предыдущему — стандартов в отрасли нет и каждый делает что хочет, глупо не учитывать такие вещи.
Почему то у прочих контор обычно еще много текста «никому не говорите этот код» и все норм. И подобное я видел не только на винфонах, но так как на постоянке не использую прочие ОС утверждать про них не могу.
В любом случае мне нравится подход всех выше ответивших «это не баг, это фича», после которого удивляться происходящему в том же ЭР-телекоме не приходится — там абсолютно такие же люди работают. «Это фича!»
Turbal
Правильно, а зачем? У них разве есть bug bounty?
p.s. Хотя я будь на вашем месте, обязательно бы сообщил, не из за корыстных целей конечно, а из благородности.
Acuna
В смысле? Автор же сразу сообщил.
roginvs
И не надо этим засранцам сообщать — весь подъезд своей рекламой обклеили! Чем скорее они разорятся — тем всем лучше станет
dean999
))сейчас к половине придут коллекторы) хех)) изи бризи!)