Обычным весенним днем, занимаясь «подготовкой» к ЕГЭ по информатике, наткнулся на статью об уязвимости Facebook, позволявшей взломать все аккаунты в социальной сети, за которую выплатили 15000$. Суть уязвимости заключалась в переборе кодов восстановления на тестовом домене компании. Я подумал, а чем собственно ВКонтакте хуже? И решил попробовать провернуть подобный трюк у них. Зная, что веб-версия уже достаточно хорошо исследована, жертвой должен был стать Android клиент, а что из этого вышло можно прочитать под катом.
Смотрим трафик
Первым делом я захотел узнать, какую информацию приложение передает в сеть во время процесса восстановления страницы. Помощником в этом деле выступил Fiddler, я настроил его и Android устройство, как написано в официальной документации. Таким образом в Fiddler становятся доступны все HTTP/HTTPS запросы c устройства. Теперь, в приложении, смело выходим из аккаунта ВКонтакте и нажимаем на кнопку «Забыли пароль?». После ввода номера телефона приложение отправляет 2 HTTPS запроса. Особую ценность представляет второй, потому что именно он отвечает за отправку SMS с кодом восстановления.
Особое внимание стоит обратить на некоторые параметры запроса:
phone — номер на который отправляется SMSПопытка отправить запрос изменив его не увенчалась успехом. Мешает параметр «signature», который выступает в роли «подписи», как она генерируется разберемся немного позже.
session_id — рандомно генерирующаяся сессия операции восстановления
Для последующего анализа, в приложении, введём случайный код восстановления и продолжим наблюдать за сетевой активностью. Видим следующий запрос, он проверяет правильность введенного кода. Так как код был случайным — проверка не пройдена.
Честно говоря на этом моменте мне хотелось начать перебирать коды восстановления, меняя значение параметра «code». К сожалению, и этот запрос защищен от изменения с помощью «signature». Придётся разобраться, как генерируется эта подпись.
Реверс инжиниринг: декомпиляция
Для первоначального анализа можно попробовать декомпилировать приложение ВКонтакте. Так можно получить некоторые части исходного кода на Java.
Открываем в jd-gui все полученные .jar файлы. И не долго думая, делаем поиск по строке «signature».
Библиотека libverify за авторством Mail.Ru явно выпадает из общего списка найденного. Смотрим и не ошибаемся, формируемая строка очень похожа на url из предыдущих запросов.
localObject3 = String.format(Locale.US, "%s%s?%s&signature=%s", new Object[] { d(), e(), localObject3, URLEncoder.encode(ru.mail.libverify.utils.m.b(f() + (String)localObject4 + ru.mail.libverify.utils.m.c(a.b())), "UTF-8") });
Эта библиотека сделана в лучших традициях security through obscurity, весь код надежно обфусцирован. Поэтому, через jd-gui мне удалось узнать только то, что за «signature» прячется MD5-хэш от неизвестной строки.
Реверс инжиниринг: дизассемблирование
Мне требовалось узнать, что за строка поступает в функцию ru.mail.libverify.utils.m.b(). Самый простой способ сделать это — немного изменить код приложения. Ну что ж попробуем. Для начала используем apktool, с командой:
apktool.jar d vk.apk -r
(ключ -r для игнорирования ресурсов)
Теперь, в папках с smali-кодом находим файл в котором происходит генерация MD5. В моем случае путь был такой: smali_classes3\ru\mail\libverify\utils\m.smali. Переходим к нужному методу:
...
.method public static b(Ljava/lang/String;)Ljava/lang/String;
.locals 8
.param p0 # Ljava/lang/String;
.annotation build Landroid/support/annotation/NonNull;
.end annotation
.end param
:try_start_0
const-string/jumbo v0, "UTF-8"
invoke-virtual {p0, v0}, Ljava/lang/String;->getBytes(Ljava/lang/String;)[B
:try_end_0
.catch Ljava/io/UnsupportedEncodingException; {:try_start_0 .. :try_end_0} :catch_2
move-result-object v0
:try_start_1
const-string/jumbo v1, "MD5"
invoke-static {v1}, Ljava/security/MessageDigest;->getInstance(Ljava/lang/String;)Ljava/security/MessageDigest;
move-result-object v1
invoke-virtual {v1}, Ljava/security/MessageDigest;->reset()V
invoke-virtual {v1, v0}, Ljava/security/MessageDigest;->update([B)V
invoke-virtual {v1}, Ljava/security/MessageDigest;->digest()[B
move-result-object v0
...
Строка, которую требовалось узнать передавалась в функцию в первом параметр-регистре (p0). Поэтому, чтобы получить ее, следует куда-нибудь вывести параметр, например, в Logcat. Добавляем в код несколько строк:
...
.method public static b(Ljava/lang/String;)Ljava/lang/String;
.locals 8
.param p0 # Ljava/lang/String;
.annotation build Landroid/support/annotation/NonNull;
.end annotation
.end param
# PATCH
# String v0 = "vk-research";
const-string/jumbo v0, "vk-research"
# Log.d(v0, p0), где p0 параметр метода
invoke-static {v0, p0}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
:try_start_0
const-string/jumbo v0, "UTF-8"
...
После сохранения изменений собираем приложение с помощью apktool:
apktool.jar b vk -o newvk.apk
Теперь нужно подписать apk, я использовалAPK Signer.
После этого, предварительно удалив оригинальное приложение, можно установить и запустить наш измененный клиент ВКонтакте. Для получения logcat с устройства воспользуемся Android Debug Bridge. Подключаем Android-устройство по USB и последовательно выполняем команды:
adb devices
adb logcat
Как только присоединились к устройству и получили возможность смотреть логи, снова нажимаем на «Забыли пароль?» и вводим номер телефона. В окне adb появляется запись:
Становится понятно, что хэшируемая строка состоит из последовательно склеенных: части url, параметров запроса и еще одной строки-хэша (506e786f377863526a7558536c644968). И теперь, зная алгоритм генерации «signature» можем начать отправлять свои «подписанные» запросы.
Исследование
Для исследования я написал простую программу на C#, которая отправляла запрос на отправку SMS и делала попытки ввода кода. Воспользовавшись ей, я вводил случайные коды восстановления. Но ожидаемо уперся в лимит попыток:
Пытался повторно отправить смс, в надежде, что после этого пропадет лимит. К моему сожалению, сообщение приходило, но вводить код я все так же не мог:
Решил отправлять запросы с разными session_id, приходили смс с другими кодами восстановления, но я все еще упирался в лимит, теперь уже не в «ATTEMPTLIMIT», а в «RATELIMIT».
Я пытался обойти лимиты всеми возможными способами. Менял IP-адреса, параметры запроса, номера телефонов, но сделать больше 5 попыток ввода кода у меня не получалось.
И тут, почти случайно, я решил отправить код восстановления на два разных номера, но используя один и тот же session_id. Моему удивлению не было придела, когда я увидел одинаковую SMS на обоих телефонах. Вот как это работало:
Таким образом получалась атака:
- Отправляем запрос на отправку SMS абоненту A с session_id C, ему приходит код 1234
- Отправляем запрос на отправку SMS абоненту B с session_id C, ему приходит код 1234
- Теперь, если абонент A знает номер телефона абонента B, он может восстановить его страницу. Восстанавливать можно было только ту страницу, на номер которой пришла последняя SMS с сходным session_id.
Вывод
Сразу после обнаружения уязвимости я написал репорт на HackerOne. Уже через 17 часов уязвимость была устранена. Спустя несколько дней мне выплатили 2000$. Данная уязвимость позволяла взломать большинство аккаунтов в социальной сети, в безопасности были только аккаунты с двухфакторной авторизацией (у них нельзя делать восстановление по номеру телефона). Репорт.
P.S. ЕГЭ по информатике сдал на 97 баллов. К сожалению, остальные предметы не так успешно.
UPD: Библиотека libverify так же использовалась в ICQ, следовательно уязвимость существовала и там. В программе bug-bounty ICQ мне была сделана доплата в размере 1000$.Репорт.
Комментарии (144)
powerman
09.07.2017 13:22Эта библиотека сделана в лучших традициях security through obscurity, весь код надежно обфусцирован.
OMG… кто-то ещё такое использует в наши дни. Чего ради??? Чтобы потом это сломал школьник и VK с Mail.ru стало стыдно?
AllexIn
09.07.2017 13:32+20Вы так говорите «школьник», как будто школьники — идиоты.
powerman
09.07.2017 14:47+13С чего Вы это взяли?
Я говорю "школьник" потому, что судя по упоминанию ЕГЭ в статье это сделал именно школьник. И какими бы умными не были школьники, квалификация людей профессионально занимающихся безопасностью обычно намного выше. Так что мой вопрос вполне уместен — если эта "защита" не в состоянии сдержать школьника, то хакера она тем более не сдержит — и зачем она тогда нужна вообще? Все остальные и так не будут пытаться подделывать HTTP-запросы.
Проблема в том, что от такой реализации "безопасности" больше вреда, чем пользы: на самом деле она ни от чего не защищает, но создаёт у разработчиков ложное чувство безопасности — якобы параметрам запроса можно доверять, раз они корректно подписаны. А доверять им, разумеется, нельзя, и код будет намного безопаснее, если об этом никто из разработчиков не будет забывать ни на секунду.
AllexIn
09.07.2017 15:07+3Школьник вполне может быть квалифицированным специалистом. Хакером.
Это в начальных классах еще дети, в старших — вполне уже личности и специалисты.powerman
09.07.2017 17:22+1Может, конечно. Я сам таким был. Но суть вопроса ведь не в этом. Всё описанное в статье по сложности реализации доступно и понятно начинающим разработчикам под андроид. Добавляем к этому желание взломать и хакерский склад ума — и всё, "защита" моментально обходится. Если начинающий разработчик может обойти эту защиту — зачем её вообще делали? Против кого, собственно? Где целевая аудитория хакеров, которые хотят это сломать, но не смогут этого сделать из-за недостатка квалификации/времени/средств? Кто и для чего придумывает глупости вроде этой "подписи" параметров HTTP, выполняемой кодом на клиенте, который контролирует хакер? Я бы ещё понял, если бы они этот код вынесли в C-шную библиотеку набитую антиотладочными приёмами — тоже не сильно поможет, но было бы видно, что они хотя бы пытались поднять планку требуемой квалификации для взлома. А в текущем виде это просто профанация.
x67
10.07.2017 02:09Имхо, такими вещами должен заниматься исключительно сервер, причем код восстановления ну никак не должен быть детерминированным.
NLO
09.07.2017 18:05НЛО прилетело и опубликовало эту надпись здесь
AllexIn
09.07.2017 18:06+3Вы либо не понимаете термин скрипт-кидди, либо намеренно принижаете заслуги парня.
NLO
09.07.2017 18:19НЛО прилетело и опубликовало эту надпись здесь
AllexIn
09.07.2017 18:31+3ТС очевидно не искал систему с конкретной уязвимостью, чтобы её «по шаблону взломать»(он не перебирал сервисы в поисказ уязвимости, а взял один конкретный для проверки).
Даже отсылка к Facebook не будет актуальной, потому что там совсем другая уязвимость и он её в ВК не нашел. Он нашел в ВК совсем другую уязвимость, уникальную, которую сам и разобрал. ПРи этом четко понимания что и зачем делает.
Где тут хоть один пункт совпадения с той огромной цитатой, что вы привели?NLO
09.07.2017 18:54НЛО прилетело и опубликовало эту надпись здесь
AllexIn
09.07.2017 20:06+2Перебор — признак скрипт-кидди. Потому что не видит возможностей, а тупо перепибарает варианты, как раз.
Здесь перебора нет. Попробовал одну уязвимость, в процессе увидел другую.NLO
09.07.2017 20:34НЛО прилетело и опубликовало эту надпись здесь
AllexIn
09.07.2017 20:36+4Открою секрет: между Pro и script-kiddie есть градации.
NLO
09.07.2017 20:48НЛО прилетело и опубликовало эту надпись здесь
AllexIn
09.07.2017 20:50+6Верно, фарс — прекрасное определение для высказываний вида «профессионал в отличии от скрипт кидди — тупо перебирает уязвимости»
Удачи!NLO
11.07.2017 21:23НЛО прилетело и опубликовало эту надпись здесь
AllexIn
11.07.2017 21:26+1Как почту ломанете — приходите.
А собрать открытую информацию — много ума не надо. Это никак не показывает ваш уровень навыков. ;)
Тем более ладно бы ломали человека, который пытаеться анонимность изображать. Я не изображаю и никогда о себе ничего не скрывал, о мой бог, как много вы обо мне знаете. :))))
UPD: Ну или хотя бы сайт, который висит на деромохостинге и весь дырявый, даже https нет. лол. Справитесь?NLO
11.07.2017 22:34НЛО прилетело и опубликовало эту надпись здесь
AllexIn
11.07.2017 22:39Вот только проблема в том, что вы откопали древний сайт, который не обновляет сколько… Не знаю точно, лет 5 думаю как минимум. А скорее всего даже и больше. Лол.
Запустить вашу демку я конечно соглашусь. Поэтому у меня песочницы под qemu. Винда с UE не имеет доступа ни к каким из моих аккаунтов. Ну так уж повелось, что не верю я винде с тех пор как десятка вышла. ;)
Подсудного дела нет. Я вам официально разрешаю сломать сайт. Как я уже сказал — это персональная страничка давно протухшая. Велкам.
Её дефейс будет для всех здесь прекрасным доказательством вашей правоты. Вы же здесь для этого? Обосновать свою позицию. Вот и попробуйте.NLO
12.07.2017 00:45НЛО прилетело и опубликовало эту надпись здесь
AllexIn
12.07.2017 09:08Мне не 13 чтобы кому то что то доказывать.
Ну вы ж не поленились потратить некоторое время чтобы в гугле посмотреть результаты по запросу с моей почтой? :)
Это уже говорит о том, что доказывать вам есть что. Не противореьте сами себе, этож палево.
Мне и не нужны ваши аккаунты, я бы просто зашифровал вам диск.
Это бы вам ничего не дало, во первых хрен бы вы чего зашифровали. :)
Во вторых — у меня быкапы на защищенном от постороннего доступа сервере. :))
Судя по вашей безалаберности в сети.
Слушайте, ну воспользуйтесь хоть одним пунктом по безалаберности в сети? По вашему я дырявый идиот, ломаться должен за меньшее время, чем «граф на 2000 вершин» составлять. ;)
Вы вообще не следите за безопасностью в своей системе.
Бла-бла-бла
Хорошо что хоть аккаунт в avast есть.
Не, я не пользуюсь антивирусами. Лет уже так 10.
Вот сайт который я делал четыре года назад.
Можете смело делать что предлагали мне Велкам!
Я разработчик игр, что вы мне предлагаете. :))
Хотя боюсь вас посадят, несмотря на Велкам.
Значит вы все таки боитесь, что я на вас настучу.
Давайте я вам официальную бумажку с подписью и печатью дам, где разрешаю меня сломать? Естественно без причинения ущерба.AllexIn
12.07.2017 09:25Отдельно весьма показатель, что не вы нашли второй сервер. Причем его данные тоже в свободном доступе и лежат на виду. Вы даж открытую инфу халтурно смотрели. :(
NLO
12.07.2017 12:31НЛО прилетело и опубликовало эту надпись здесь
AllexIn
12.07.2017 12:37О господи, конечно я не знаю инструментов для взлома веба. :)
Я вообще вебом никогда не занимался.
И информационной безопасностью тоже.
Хакерство(открою секрет), бывает не только в вебе. ;) Конкретно в моём случае — это локализация и реверс игровых архивов.
Чтож, оценка за ваш анализ — двоечка.
devalone
10.07.2017 23:04+1Завидуешь, что он получил 3 килобакса?
NLO
11.07.2017 00:33НЛО прилетело и опубликовало эту надпись здесь
devalone
11.07.2017 03:04+1Откуда мне знать, насколько они для тебя ощутимы
devalone
12.07.2017 23:49Это НЛО такое странное… Почему оно удалило этот комментарий, который написал пользователь ниже?
Тогда зачем интересуешься?
Хотя видимо ты ждешь ответа с числами, ок.
Моя зарплата 3200$ в месяц.
Мне придется работать почти весь месяц по 5 дней в неделю по 8 часов.
Но все равно не настолько чтобы кому то завидовать.
Я рад что у нас есть такие таланты, побольше бы таких.
Серьёзно, что он написал такого, матов не было, чего-то запрещённого законом РФ тоже…
И да, отвечу тому парню: я вообще-то даже не спрашивал, какая у тебя зарплата…AllexIn
13.07.2017 09:28НЛО удалило сообщения не за нарушение. А по просьбе самого автора всех этих сообщений.
devalone
13.07.2017 14:170_о А что так можно было?
AllexIn
13.07.2017 14:33Все что делаю обсуждаю нашу беседу в телеграм с друзьями безопасниками.
И веселю их степенью вашего маразма.
И жду когда же разработчики хабр исполнят мою заявку и удалят мой аккаунт.
По закону о персональных данных.
Так что наша беседа останется в прошлом, и надеюсь вы вынесите из нее хоть крупицу полезной информации.
Кстати, вся переписку у меня сохранена.
Как думаете, куда выложить?
Очевидно вне юрисдикции РФ, чтобы комрад опять свой позор не потребовал удалять.devalone
14.07.2017 00:50Кстати, вся переписку у меня сохранена.
И не только у вас :)
https://sohabr.net/habr/post/332684/#comment_10306258
https://web.archive.org/web/20170712063507/https://habrahabr.ru/post/332684/#comment_10306258
firk
09.07.2017 17:48Лучше посмотреть на это с другой стороны:
1) уменьшения безопасности конкретно вся эта обфускация и "подписывание" запросов не создаёт
2) разумные разработчики понимают, что всё, что сформировано на клиенте, не является доверенным и подлежит проверке — поэтому их это не запутает
3) небольшой препон к реверсу библиотеки и протокола это создаст
итого — вреда нет, польза, пусть и маленькая, есть, почему бы не сделать, раз есть такая возможность, причём почти бесплатная?powerman
09.07.2017 21:41+2К сожалению, разумные разработчики не настолько разумные, как нам бы хотелось. И психология этих разумных разработчиков не отличается от других людей. И работают они каждый над своим участком кода, зачастую не имея ни времени ни желания вникать в то, как что-то устроено на другой стороне или в следующем слое абстракции. Так что когда они видят не просто обычный набор параметров, а подписанный набор параметров — они обычно считают, что раз подпись есть, то она должна что-то да значить, в частности что параметрам можно верить (ведь зачем-то такую необычную подпись кто-то добавил… а разработчики, как известно, разумные, так что добавлять совершенно бессмысленную подпись они бы не стали :)). Да и просто подсознательно подписанным данным доверия всегда больше. Так что проверять подписанные параметры разработчики если и будут вообще, то совсем не так тщательно, как обычно.
Итого — вред есть, и значительный. Начиная с затрат времени на разработку и поддержку бессмысленного функционала, и заканчивая ослаблением безопасности из-за психологического фактора. А самое плохое то, что такой бессмысленный функционал часто со временем попадает в категорию "магическая хреновина, никто не знает зачем она нужна, но её нужно обязательно поддерживать в рабочем состоянии иначе неизвестно что может поломаться".
norver
09.07.2017 13:37Мне кажется в такой библиотеке это довольно логичный ход. Кто знает, возможно, именно это и спасло от обнаружения уязвимости настоящими хакерами.
Zibx
09.07.2017 17:14+1Скорее всего код не был обфусцирован. Это же декомпиляция. Для получения реальных имён переменных разработчик должен специально включить отладочный режим. Если же была включена какая-то дополнительная оптимизация, то код будет выглядеть ничуть не лучше обфусцированного.
musimba
15.07.2017 21:30Компилятор же не убирает реальные имена методов при компиляции. Даже при релиз сброке. Иначе как тогда reflection будет работать.
LionZXY
09.07.2017 13:47+2Куда поступать планируешь?)
norver
09.07.2017 17:40+3Собираюсь использовать принцип «куда возьмут». Все же профильную математику я хорошо завалил и получил всего 60 баллов. Поэтому, скорее всего, Лэти, СПБГУТ, Военмех, Горный.
ru_vlad
09.07.2017 18:18Не понял, а 97 баллов за что, за "базу"?
Общая сумма с учетом Информатики какая?
На счет вуза сильно не переживай, если захочешь учится то везде сможешь стать спецом.
Кроме вузов есть еще и Академия современного программирования, она тоже не плохо поможет.norver
09.07.2017 19:32Да я особо не волнуюсь. 97 баллов за ЕГЭ по информатике, это уже тестовые баллы.
Nakosika
09.07.2017 21:26-23Не теряй лучшие годы своей жизни слушая пердунов которым на тебя накласть. За пять лет можно и нужно запустить стартап, стать оверквалифаед, свалить на доллары или хотя бы евро, взять ипотеку и Теслу. Может меня и заминусят, но я ни разу не пожалел что свалил с первого курса. Потом ко мне приходили выпустившиеся одногруппники, а я не мог их взять потому что они, потратив на "образование" пять лет, знали меньше школьника с одним годом реального опыта. И знали меньше как практики так и теории, т к теория без практики это просто хлам, а занимаясь практикой теорию усваиваешь на порядок быстрее.
AllexIn
09.07.2017 21:57+19А я вот жалею что свалил с 1 курса.
Стартап за 10 лет так и не смог построить, потому что разрпаботчик, а не бизнесмен, а карьеру строить и трактор снаряжать — отсутствие образования мешает.devalone
10.07.2017 23:09-1а карьеру строить и трактор снаряжать
Чтоб трактор заводить, образование не обязательно, желательно, но не обязательно, по крайней мере не во всех странах.
0xd34df00d
09.07.2017 22:11+11Не теряй лучшие годы своей жизни слушая хипстеров-ниасиляторов которым на тебя накласть
Я очень рад, что пошёл в вуз, и не на программиста, а на прикладного математика.
Не, я бы счастливо работал программистом, может, даже основал бы свой стуртуп и попивал бы сейчас смузи, но знакомство с математикой, и что она бывает не только унылой и школьной, помогло мне эту самую математику полюбить, поизучать самостоятельно и сейчас иметь возможность решать существенно более сложные задачи существенно эффективнее.
Ну а так да, в 24 года, сразу по окончанию вуза, тоже свалил на доллары, причём с физической релокацией. Мне норм. Просто параллельно с вузиком надо не забывать писать код и вообще самообразовываться самому.
А, ну и хороший не заборостроительный — это ещё и социальные связи, что полезно.
immaculate
09.07.2017 22:16+5Теоретически все оно так, но, например, не все могут запустить стартап. А при приеме на работу и во многих других ситуациях прежде всего смотрят на бумажку. Ну, так устроены люди. Им обязательно нужна какая-то простая метрика, по которой можно сравнивать кандидатов и людей вообще. Особенно умиляют кадры, которые хвастаются 2-3 образованиями. А с первого раза не дошло что-ли?
Кроме того, лично я никуда переезжать не собираюсь. Но если бы захотел переехать в почти любую другую страну, то отсутствие бумажки затрудняет процесс на порядок.
Nakosika
10.07.2017 09:39-7Пять лет опыта при приеме нормальную компанию дают больше шансов чем корочка. Сегодняшние воротилы начиная с Билла Гейтса — почти все забили на учебу. Вылетел из универа -> добился успеха, это на столько частая формула наблюдаемая на практике, что я даже и не знаю как нужно смотреть на мир чтобы ее не заметить, особенно в ИТ. В общем конечно каждому самому решать и все такое. Но те кто закончил за редким исключением будут говорить или учиться, потому что не признавать же себя неудачниками слившими молодость. Она один раз бывает, а жизнь и так коротка.
immaculate
10.07.2017 09:50+5Мне кажется, что это все же слишком сильное упрощение. Я хочу обратить внимание, что у диплома есть очень весомые преимущества. В частности, мобильность. Как писал в изначальном комментарии, переехать в другую страну без диплома — чрезвычайно сложная задача. Может быть, оно и не надо. Но если вдруг приспичит, то придется локти кусать и преодолевать весьма серьезные препоны. Тогда как с дипломом (если не врач, конечно), задача становится элементарной для многих стран.
Есть преимущества и недостатки и у того и у другого. Кроме того, учиться — это не равноценно прожиганию времени. Можно и знания получить, и связи, и полноценно жить в это время.
Nakosika
10.07.2017 14:21+1Ну, я работаю за границей без диплома. Меня вообще ни разу не спросили про какие-то бумажки. На поиск работы это ни как не сказывается, если только не пытаться в какой-нить Газпром устроиться. Рядом со мной работают ребята из мгу, зря время потеряли. Наши вузы за границей не котируются от слова совсем. :) и связи, полученные в России, тоже никому не нужны, как мне тут подсказал один копетан. Имеет значение знания предметной области, профиль на гитхабе и адекватность во время интервью. Все. Как говорил Рик, «умному человеку делать в школе нечего».
Frankenstine
10.07.2017 10:11+15Вылетел из универа -> добился успеха, это на столько частая формула наблюдаемая на практике, что я даже и не знаю как нужно смотреть на мир чтобы ее не заметить, особенно в ИТ.
Типичная ошибка выжившего. Вы просто не замечаете, что существует гораздо большее число вылетевших / не поступивших, и ничего серьёзного не добившихся.Nakosika
10.07.2017 17:32Ну мой совет относится к человеку, у которого явно есть талант, предрасположенность. Обычному работяге без способностей, коих большинство, идти по накатанной конечно будет проще. Таланту же это смерти подобно.
den_golub
10.07.2017 11:04+3Да только вылетали и уходили они из Гарворда и и еще чего-то там, но никак не из какого-нибудь захудалого института, да и всегда надо иметь парашют на всякий, вот не выгорит стартап или вообще не запустится и что дальше? Либо на завод, либо учится, да и не что не мешает при нормальных мозгах, учится и развивать какой-нибудь стартап.
saboteur_kiev
10.07.2017 14:28+1«Сегодняшние воротилы начиная с Билла Гейтса — почти все забили на учебу. Вылетел из универа -> добился успеха,»
Единственное что, подобные воротилы — сперва добились успеха, а потом уже частично забили на учебу из-за недостатка времени. Причем подавляющее большинство из них угрохали все свое «незамутненное детство» на то, чтобы освоить какие-то технологии (а не на дотку и танчики) причем на таком уровне, что уже учась в универе смогли создать бизнес, дающим им бОльшие перспективы, чем корочка.
Опять же, сравните требования к разработчику в 90-е и сейчас — в последнее время я все чаще и чаще даже на простых проектах наблюдаю необходимость в вузовской математике.Nakosika
10.07.2017 17:26-3За 20 лет ни разу не было необходимости что-то сложнее второго класса использовать. Вы точно программистом работаете а не математиком?
saboteur_kiev
10.07.2017 17:36+1В проектах, где я был или принимал участие
1) разрабатывали систему активного шумоподавления для телевизоров. Я вообще не врубался о чем говорили товарищи про матрицы, частоты, волны, разбор это все по фурье и так далее.
2) Вы проходили во втором классе сложность алгоритмов? Можете сходу сказать сложность алгоритма обычной пузырьковой сортировки, и объяснить ее второкласснику?
3) Битовые операции, and/or/xor/not, и циклические сдвиги — это в принципе можно попробовать пояснить. Но вот когда начинаешь использовать это на практике для работы с графикой (банального отрисовывания спрайтов поверх других спрайтов) — мне школьного образования и интуитивного понимания не хватило, пришлось почитывать отдельно.
4) Принципы работы ssh-ключей на достаточном уровне, чтобы вообще понимать как оно работает? Как и почему работает https, что именно содержится в ключах и сертификатах?
Это только за минуту накидал из личной практики.
P.S. А я ведь даже не программист, а девопс. Просто приходится немного bash/java/c++/python/php/js ковырять на базовом уровне.Nakosika
10.07.2017 19:03Какое отношение все это имеет к математике? Кроме матриц, для работы с которыми все библиотеки давно написаны математиками? Mathematicians do math, engineers use math.
flatscode
10.07.2017 17:41+2За 20 лет ни разу не было необходимости что-то сложнее второго класса использовать
Не знаю, как можно работать со всякими OpenGL и при этом не знать аналитическую геометрию.Nakosika
10.07.2017 19:10-4OpenGL со всей геометрией выражается при помощи системы уравнений. Синусы хоть и проходят в седьмом классе, это просто соотношение сторон, что есть второй класс. Помню даже статью писал пятнадцать лет назад в духе «скелетная анимация это просто».
flatscode
10.07.2017 19:36+2OpenGL со всей геометрией выражается при помощи системы уравнений. Синусы хоть и проходят в седьмом классе, это просто соотношение сторон, что есть второй класс.
Мне кажется, что вы — гений (непризнанный)AllexIn
10.07.2017 19:40Почему не признаный? Если верить словам господина(а других источников у нас нет) — он очень ценный и успешный сотрудник.
Nakosika
10.07.2017 20:57Просто наткнулся тогда на исходники анрил торнамента, все кредитсы — Тиму Свини. А вот исходники квейка я так и ниасилил, слишком сложно оказалось, так что не нужно вот этого сарказма.
AllexIn
10.07.2017 18:02+4А чем вы занимаетесь?
Я вот в геймдеве работаю, математики тоннами. Причем сейчас я работаю с UNreal Engine, казалось бы — там вся математика уже написано. А вот фиг, всё равно приходится много математики использовать.
Ок. Не геймдев.
Делал платежный терминал… Контрольную сумму чтобы посчитать — надо полиномы знать!
Ок. Можно использовать готовую формулу. Формулы для расчета контрольных сумм всегда есть в документации к API.
Но:
1) Много стоит специалист, который работает с чужим кодом как с черным ящиком? Вот вы говорите, что норм так работается. А вот я таких людей специалистами не считаю.
2) Если что-то пойдет не так, не зная как строится таже примитивная контрольная сумма — по логу ошибку понять сложнее.Nakosika
10.07.2017 19:34-3Да я даже вики не буду открывать чтобы узнать что такое ваши полиномы. И да, я как специалист стою не мало. По зп всегда в топ 10%. И говнокод за мной никому не приходится переписывать, а совсем наоборот. Вот такая она реальность с другой стороны. Потому что важно не знать много, а уметь быстро учиться тому что нужно сейчас для решения конкретной задачи, чему в вузах не учат не смотря на громкие заявления.
Nakosika
10.07.2017 19:41-1Занимаюсь андроид разработкой, а геймдев, бухгалтерия, системное, бакенд, бд — в прошлом. Про математику в геймдеве я выше отписался. Ее было много, но она простая. В движках ее усложняют, но Тим Свини реализовал матрицы через три вектора, не знаю как сейчас, давно не смотрел в исходники анрил енжайна.
AllexIn
10.07.2017 19:44Ну вы либо действительно непризнанный гений, либо много фантазируете о собственных успехах.
Впрочем разницы нет, ваши советы все равно непригодны, в первом случае — потому что гении и так знают как им поступать, а во втором случае- потому что ценность нулевая.Nakosika
10.07.2017 20:16-2Мой совет может оказаться пригодным тому кому я его давал — т.е. школьнику, сломавшему пентагон.
devalone
10.07.2017 23:21а геймдев, бухгалтерия, системное, бакенд, бд — в прошлом
лол
Даже комментировать не буду
В движках ее усложняют
лол x2
Никто её намеренно не усложняет, разве что для эффективности.
devalone
10.07.2017 23:13в последнее время я все чаще и чаще даже на простых проектах наблюдаю необходимость в вузовской математике.
Вообще говоря, её можно и самому изучить при достаточном желании.
r85qPZ1d3y
10.07.2017 19:58Абсолютно согласен с написанным про лучшие годы. Себя образовывать надо самостоятельно, и с умом, развивая те скиллы, которые тебе интересны, и в которых ты можешь добиться успеха. А те, кто пропагандируют образование по устаревшим учебникам, и учебу у «престарелых пердуров», как уже выразились, вот как раз они и пишут в комментариях, что награда за такой баг очень достойная, и заодно минусуют. На моем комментарии так-же можно в этом убедиться.
devalone
10.07.2017 23:08Не всё так однозначно. Чтоб открыть свой стартап нужны в первую очередь хорошая идея и умение вести бизнес, а уже потом умение программировать. А на счёт ВУЗа, большинство не могут в самообучение, если человек из таких, то ему дорога в ВУЗ, также бывают ситуации, когда нужна корочка, например, для иммиграции, тогда тоже ВУЗ крайне желателен, ну и также для тех, кто ещё не определился, это хороший способ набраться опыта, т.к. свободного времени явно больше, чем на работе.
dmitry_ch
09.07.2017 14:51-13Молодец! Хорошая подготовка к ЕГЭ получилась!
У вас в начале написано, что «выплатили $15000», а в конце «выплатили 2000$». Общественность переживает, куда «утряслись» остальные $13000?
LexS007
09.07.2017 15:32+2Я в шоке. Серьезно? Сервак без проверок принимает любой номер от клиента и отправляет на него смс с кодом? И это крупнейшая соц. сеть?
firk
09.07.2017 15:56+3Мне тоже так показалось сначала, но на самом деле нет — сервер посылает на каждый номер код к его аккаунту, но сам код для двух аккаунтов (жертвы и хакера) одинаковый, если он запрошен в одной и той же (веб? или как его назвать для приложения)-сессии.
norver
09.07.2017 16:02Да, можно отправлять SMS на любой номер, тут ещё повезло, что есть лимиты. Мне кажется, раньше сам ВКонтаке занимался отправкой SMS, но потом этот сервис отдали Mail.Ru. И из-за этого возникла проблема с сессиями.
kirillaristov
09.07.2017 22:54То есть код восстановления на стороне сервера генерировался на основе лишь session_id без добавления самого номера?
norver
10.07.2017 00:50Как именно все это работало знаю только сотрудники Mail.Ru. Могу только утверждать, что на одинаковый session_id, приходило одинаковое SMS. Так же я не помню менялись ли коды в сообщениях со сходными session_id с течением времени.
kirillaristov
10.07.2017 02:48А как теперь стало? Смс на другой номер не приходит вообще или приходит с другим кодом восстановления?
Izaron
09.07.2017 16:56+1Действительно круто! Остается только догадываться, сколько мошенники нагрели денег за взломы, из-за того, что кое-где программисты занимаются непонятно чем =)
mihver1
09.07.2017 17:34+12На самом деле, после анализа логов, мы не нашли использования данной уязвимости, кроме того, что делал автор статьи.
flatscode
10.07.2017 12:15Возможно плохо искали, т.к. встречал несколько случаев угона аккаунта с похожими симптомами (приходили SMS-ки владельцу, потом терялся контроль над аккаунтом). То ли SMS-ки перехватывали, то ли это.
mapatka
10.07.2017 17:43Воооот, такая же ситуация была, угнали акк в VK.
А 1 Апреля угнали почту на Mail, хотя там стоит двуфакторная авторизация. Пришла СМС о том что сменили пароль и пипец, при чем восстановить по номеру телефона обратно не дало.
NLO
09.07.2017 19:07НЛО прилетело и опубликовало эту надпись здесь
norver
09.07.2017 19:27Тут скорее проблема в архитектуре библиотеки. В большинстве случаев сессии восстановления генерируются на стороне сервера, а тут эта задача лежит на клиенте от этого и проблемы. Ну а конкретн, то что на одну и также сессию генерировался один и тот же код проблема сервера.
easty
09.07.2017 19:54Я думаю перемудрили с повторными запросами кода смс. Когда клиент нетерпиливый и запрашивает код повторно, когда первый еще в пути, чтобы код был одинаков и клиент лихорадочно не вводил все подряд)) тут и вкралась ошибка, скорее всего телефон для отправки брали не из базы сервера, а из запроса. Возможно кто-то не закоментил отладочный код))
NLO
09.07.2017 20:04НЛО прилетело и опубликовало эту надпись здесь
AllexIn
09.07.2017 20:09Отладочный код не столько комментами надо сопровождать, сколько дефайнами, которые не могут присутствовать в боевом режиме.
easty
09.07.2017 20:12+1Тут согласен, но ситуации могут быть разные. Очень часто в продакшен код уходит по давлением дедлайнов, начальства и т.п. тут и вылазять ошибки
AllexIn
09.07.2017 20:17+2Это понятно. Речь же про идеал. :)
Мы можем сколько угодно рассуждать о том, какие нубы сидят в ВК.
Но по факту — все совершают ошибки. По разным причинам.
easty
09.07.2017 20:10Ну я просто предположил. Был код для отладки, который брал телефон из запроса, программист сам подставлял тестовый телефон для отладки и по какой-то причине запулили в продакшен. При корректных данных тесты проходит. Но это всего лишь версия) ничем не обоснованная
r85qPZ1d3y
09.07.2017 20:34+3norver, размер вознаграждения (2к$) прокомментировать можете? Чем больше, и эмоциональнее, тем лучше.
norver
10.07.2017 20:38+2Считаю, что выплата нормальная. Да, это меньше чем за тот же тип уязвимости у Facebook, но лучше чем ничего. Все-таки если очень хочется денег намного выгоднее такие уязвимости вообще не раскрывать. Спокойно ломать страницы «девочек» по заказу «мальчиков» беря при этом 10 тыс. за страницу. Мне кажется, что при такой работе шанс спалить уязвимость стремится к нулю, можно еще и маскироваться под фишинг. Но тут уже этическая сторона вопроса.
lawoge
09.07.2017 21:55Скажите пожалуйста, а каким образом вы считали кол-во возможных вариантов для 4х значного кода без находящихся рядом одинаковых цифр? У вас получилось ~6500
Что я упускаю?
10^4 = 10000 - кол-во всех вариантов. 10^3 = 1000 - кол-во вариантов где одинаковые цифры стоят рядом. 10000 - 1000 = 9000 - кол-во вариантов где одинаковые цифры не стоят рядом.
Кол-во вариантов где одинаковые цифры стоят рядом считал таким образом, т.к. в 4х значном коде только 3 места по 2 цифры и кол-во значений на одно место — 10.
norver
09.07.2017 22:07+1Могу сказать, что всего возможных 4-х значных кодов точно 9000. Т.к. на первом месте могут находится все цифры кроме 0, а на трех других местах любые цифры, т.е. 9 * 10 * 10 * 10. А количество чисел в которых цифры не стоят рядом я считал вот так:
count = 9000 for i in range(1000, 10000): numstr = str(i) for j in range(len(numstr) - 1): if numstr[j] == numstr[j + 1]: count -= 1 break print(count)
lawoge
09.07.2017 22:11+1на первом месте могут находится все цифры кроме 0
аааа.
Ну в общем перебором)
Может кто знает как решить данную задачу с помощью комбинаторики?) Стало очень интересно
SilverHorse
10.07.2017 00:40+19^4=6561.
На первом месте стоит что угодно от 1 до 9, то есть 9 цифр, на втором что угодно, кроме цифры, попавшей на первое, то есть 9 цифр, на третьем — что угодно, кроме цифры, попавшей на второе, то есть… в итоге для кода длиной N имеем 9^N вариантов. Это рассуждение, кстати, очевидно из написанного выше кода цикла.
Akuma
09.07.2017 23:36Хм. А на чьем еще аккаунте вы это тестировали? :)
Как раз последние 2-3 дня постоянно приходили коды восстановления на телефон, хотя я ничего не запрашивал. Писал в саппорт, те сказали, что все ок, переживать не стоит.
pr3dat0r
09.07.2017 23:46к примеру само приложение mail.ru почта вообще не проверяет сигнатуру на бекенде(месяца 2 назад писал почтового бота)
спс за статью.
nanshakov
10.07.2017 07:37+3Автор, вы молодец. Достойная награда. Продолжайте изучать инструменты и совершенствовать навыки.
r85qPZ1d3y
10.07.2017 19:53+1Автор да, молодец, но достойная награда? Больше похоже на сарказм.
michael_vostrikov
10.07.2017 21:26+1120 тыщ для начинающего, тем более для 11-классника, это вполне себе неплохая награда.
r85qPZ1d3y
11.07.2017 02:40+4А, вон оно чё, в возрасте дело…
Ну тогда и на bag bounty надо ограничения всякие ставить по этой логике, регистрация с 18 лет, выплаты за баги с 20, 0-day уязвимости рассматриваем только в преклонном возрасте… главное не победа, а участие.michael_vostrikov
11.07.2017 09:20-1Я имел в виду, с точки зрения самого начинающего. Ограничение на возраст тут ни при чем, это ваша логика, а не моя.
files
10.07.2017 14:05А уязвимость точно устранили? Судя по всему, по этой схеме, меня взломали сегодня утром
NLO
10.07.2017 18:28НЛО прилетело и опубликовало эту надпись здесь
files
10.07.2017 18:39СМС не приходила. Только извещение на почту, что пароль успешно изменен. А при попытке восстановить/изменить пароль сообщение: что Вы уже воспользовались восстановлением, попробуйте позже. Куда, кому и как пришел сброс пароля — не понятно!
Дополнительно сообщу, что поддержка Вконтакте отреагировала на этот комментарий и пароль удалось восстановить на привязанный телефон (вне очереди). В логах есть два захода с Androida с разных IP (при том, что мобильным приложением давно не пользуюсь).NLO
10.07.2017 19:49НЛО прилетело и опубликовало эту надпись здесь
files
10.07.2017 20:20Я и написал, что возможно — судя по всему. Так как других версий просто нет! Тем не менее, кто-то воспользовался восстановлением пароля на телефон (при этом самой SMS на моем телефоне нет, я даже на сайте оператора логи проверил).
IP разные из Германии, но одного провайдера. Никаких мобильных клиентов соцсетей нет на телефоне, кроме FB. Установка из внешних источников запрещена. Самим ВК с телефона последний раз пользовался полгода назад, за это время пароль менялся 3 раза.
Пароль был сброшен и заходили в аккаунт в 3 часа утра (и повторно в 10), когда телефон не мог находится в интернете (был выключен и компьютер). В общем, все это меня не смутило бы, если бы не выглядело странным.norver
10.07.2017 20:51На самом деле мистика какая-то. Вы уверены, что было восстановление именно по телефону, уточняли это у тех. поддержки? Все же не думаю, что кто-либо будет использовать подобные уязвимости на аккаунте обычного пользователя.
files
10.07.2017 21:03Восстановление идет только на ТЕЛЕФОН (даже если я указываю привязанную почту). Только что проверил для убедительности.
Было именно восстановление, так как я не мог воспользоваться повторным восстановлением (лимит 24 часа), кто-то получил/перехватил каким-то образом СМС!norver
10.07.2017 21:16Но если не было SMS в детализации у оператора, то по вашей вине перехватить его точно не могли. Сразу вспоминается история, когда ФСБ совместно с оператором отключили прием сообщений у оппозиционеров для доступа к их переписке в Telegram.
michael_vostrikov
10.07.2017 21:15+1Как вариант. Если у них отправляется не напрямую из кода, а через очередь, то возможно SMS просто не успела отправиться. Сначала запрашиваем код на свой номер, вводим в поле, потом с тем же session_id на нужный номер, и сразу же отправляем форму. Код восстановления принимается и стирается из базы. Через N миллисекунд подходит очередь на отправку, а отправлять уже нечего.
С другой стороны, раз говорят что пофиксили, возможно где-то в другом функционале есть похожая уязвимость с session_id. Или пофиксили на фронт-сервере, а они знают адрес внутреннего сервера, куда пересылается запрос. Ну или криво пофиксили) Можно много чего нафантазировать.
Artyomushko
10.07.2017 20:29Судя по тайм-лайну на HackerOne — да, устранили.
К тому же, запрещено публиковать пост о найденной уязвимости ранее 30 дней после её устранения.
Так что да, данная уязвимость устранена, но не исключена возможность того, что существуют другие.
disakov
11.07.2017 23:16+4Я согласен со многими, что парень молодец.
Выпендреж, что $3к не деньги вызывает улыбку. Оставим за скобками, что даже в Европе и США это хорошие деньги, а уж для выпускника школы это очень круто. Можно и на отдых сгонять и железа прикупить.
Что касается script-kiddie, не согласен. Делал автор сам, недостаток опыта компенсировал перебором кое-где. Ну и нормально. Не все же сразу становятся Ионеску или lokihardt. Всем задравшим нос предлагаю вспомнить себя в таком возрасте.
Про универ. На мой взгляд очень правильная мысль была про помощь диплома при переезде. Там вверху кто-то писал про отстуствие диплома и релокацию. Хотелось бы подробнее узнать. Вроде как в некоторых странах годы опыта засчитывают, но далеко не везде. Также это может сказаться на типе визы и условиях пребывания в стране. Если еще полезно время проводить, то есть шанс реального опыта набраться.
Все двери открыты. Я автору желаю успехов и дальнейших побед.
firk
Ну, на самом деле не только они — взятую наугад случайную незнакомую страницу вы так скорее всего не взломаете. Но уязвимость очень серьёзная, что-то маленькая выплата за неё.
norver
Согласен, случайную страницу таким образом не взломать. Но все же при взломах есть некоторая информация о жертвах, можно, например, попробовать применить социальную инженерию.