Вразливість "ВКонтакте" дозволяла отримати прямі посилання на приватні фотографії

вразливість

отримати

При додаванні посилання сервер парсить її, намагається з'ясувати, на яку сутність вона посилається і дістає інформацію про цей об'єкт з бази. Як правило, при написанні такого роду функцій з багатьма умовами ймовірність того, що розробник щось забуде, дуже висока. Тому я не зміг собі дозволити пройти повз і вирішив витратити кілька хвилин, щоб трохи поекспериментувати.

Я вирішив зайти на мобільну версію сайту, щоб перевірити, чи там відображається так само, як і у звичайній версії. Заглянувши в код сторінки, я побачив це:

вразливість

Таким чином, можна було отримати пряме посилання на будь-яке зображення у Вконтакті, незалежно від того, куди воно завантажувалося і які налаштування приватності мало. Це могло бути зображення з особистих повідомлень або фотографія з приватних альбомів будь-якого користувача/групи.

Як працюють фотографії у ВК

На жаль, витративши дві години на експерименти, я так цього і не зрозумів. У 2012 році на HighLoad++ Олег Іларіонов сказав кілька слів про те, як вони зберігають фотографії, про горизонтальний шардинг і випадковий вибір сервера для завантаження, але ця інформація мені нічого не дала, оскільки між id-сервером і id-фотки ніякого зв'язку не видно. Зрозуміло, що є якийсь глобальний лічильник, але там є ще якась логіка… Бо якщо б друге число формувалося за допомогою звичайного автоінкремента, то значення айдішок фоток давно вже досягли б величезних значень (у фб, наприклад, на даний момент це

700 трлн.), але у «Вконтакті» це значення лише

400 млн (хоча, судячи зі статистики,щоднякористувачі завантажують понад 30 млн фотографій). Тобто. ясно, що ця цифра не унікальна, але при цьому і не рандомна. Я написав скриптик, який пройшовся пофотографіям «старих» користувачів та за отриманими даними склав графік того, на скільки змінювалася ця цифра з кожнимроком:

дозволяла

Перебираємо фотографії

Прискорюємо перебір x25

Щоб хоч трохи обійти обмеження 3 запити, я вирішив скористатися методом execute. В одному виклику цього методу можливо 25 звернень до методів API.

Тим самим вдалося підвищити швидкість брутфорсу до 3*25 закладок/сек. За минулий рік фотографії перебиралися б довго, але для коротких проміжків цей метод перебору вже був непоганий.

Прискорюємо перебір x25 * кількість паралельних запитів за секунду

Обмеження на кількість запитів/сек діє на кожну програму окремо, а не на користувача повністю. Так що нічого не заважає надсилати паралельно багато запитів, але при цьому використовуючи в них токени від різних програм.

Спочатку потрібно було знайти (або створити) потрібну кількість додатків. Був написаний скрипт, який шукає standalone програми в заданому інтервалі ідентифікаторів додатків:

Можна було ще відбирати програми за кількістю користувачів, щоб ще більше прискорити подальший перебір:

Якщо програма встановила менше 10 000 осіб, можна здійснювати 5 запитів на секунду, до 100 000 – 8 запитів, до 1 000 000 – 20 запитів, понад 1 млн. – 35 запитів на секунду. [Обмеження та рекомендації]

Але вирішив із цим не морочитися.

Скільки програм знайдено, стільки і паралельних запитів. Для розпаралелювання цієї справи було вирішено використовувати гем Typhoeus, який відмінно зарекомендував себе в інших завданнях. Вийшов такий ось невеликий брутфорсер:

Щоб ще більше прискорити брутфорс, була спроба позбутисянепотрібного тіла у відповіді, але наHEADзапит сервер "Вконтакте" повертає помилку501 Not implemented.

Остаточна версія скрипта виглядає так:

Після відпрацювання програми у закладках були всі фотографії користувача за заданий період. Залишалося тільки зайти в мобільну версію «Вконтакте», відкрити консоль браузера, витягнути прямі посилання та насолоджуватися фотографіями в їхньому оригінальному розмірі.

Період Час (хвилини)
Вчора0.84
Минулий тиждень6.9
Минулий місяць18.3
Минулий рік121.1
3 останні роки312.5
У таблиці показаний середній час, необхідний для того, щоб перепробувати id фотографій за певний період. Я впевнений, що все це можна було прискорити раз так у 10-20. Наприклад, у скрипті брутфорсу зробити одну велику чергу з усіх запитів та нормальну синхронізацію між ними, т.к. у моїй реалізації один запит з timeout буде гальмувати весь процес. Та й взагалі, можна було просто купити пару інстансів на EC2, і за годину отримати всі фотографії будь-якого користувача. Але я вже хотів спати.

Та й взагалі, не важливо, скільки часу зловмисник на це витратить, 5 годин або цілий день, адже так чи інакше посилання на приватні зображення він дістане. Можливість залізно отримати доступ до приватної інформації за кінцевий час – і є головна загроза, яку несе вразливість.

Повідомляємо про вразливість

вразливість

Хардкорна конфа за С++. Ми запрошуємо лише профі.