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


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

Таким чином, можна було отримати пряме посилання на будь-яке зображення у Вконтакті, незалежно від того, куди воно завантажувалося і які налаштування приватності мало. Це могло бути зображення з особистих повідомлень або фотографія з приватних альбомів будь-якого користувача/групи.
Як працюють фотографії у ВК
На жаль, витративши дві години на експерименти, я так цього і не зрозумів. У 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 |
Та й взагалі, не важливо, скільки часу зловмисник на це витратить, 5 годин або цілий день, адже так чи інакше посилання на приватні зображення він дістане. Можливість залізно отримати доступ до приватної інформації за кінцевий час – і є головна загроза, яку несе вразливість.
Повідомляємо про вразливість

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