У новинній стрічці я нещодавно виявив цікаве дослідження, де хлопці завантажили і розпарсили Android Playmarket, проаналізували сотні тисяч додатків на предмет наявності зашитих секретних токенів і паролів.
Те що результат їх роботи стосувався тільки аналізу декомпільованого коду під Android, сподвиг мене написати про дослідження, яке я проводив ще рік тому, причому не тільки для Android, але і для iOS додатків, і яке, в підсумку, вилилося в цілий online-інструмент, про який я розповім в самому кінці, коли стане очевидний його сенс. Частина написаного нижче була представлена на конференції ZeroNights і на сторінках журналу «Хакер». (Так як матеріал не був опублікований онлайн, редакція дала на «добро», на публікацію тут). Отже, поїхали.
Мета - стори
Про ручний аналіз мобільних додатків написано багато, розроблені методики перевірки, складені чеклісти. Однак, більша частина цих перевірок стосується безпеки користувача: як зберігаються його дані, як вони передаються і як до них можна отримати доступ, використовуючи уразливості програми.
Але навіщо зловмиснику копатися з тим, як працює додаток на пристрої конкретного користувача, якщо можливо спробувати напасти на серверну частину і відвести дані ВСІХ користувачів? Чим мобільний додаток може бути корисним для нападу безпосередньо на хмарну інфраструктуру цього додатку? І як щодо того, щоб взяти і проаналізувати тисячі або, ще краще, десятки тисяч додатків, перевіривши їх на типові баги - «вшиті» токени, ключі автентифікації та інші секрети?
Оскільки за посиланням з введення вичерпно написано про ^ Play, то моя розповідь, для інтересу, піде про App Store, точніше про додатки для iOS. Як реалізувати автоматичне скачування з AppStore, тема для окремої великої статті, скажу тільки що це на порядок більш трудомістке завдання, ніж «качалка» для Google Play. Але зі сльозами, кров'ю, сніфером і пітоном, все-таки вирішувана:)
У статтях, де порушується питання дистрибуції iOS додатків, пишуть, що:
- Програма зашифрована
- Програма захищена DRM
- Програма, що встановлюється, прив'язується до пристрою
За всіма цими твердженнями стоїть факт, що в дистрибутиві програми (який являє собою звичайний ZIP-архів) скомпільований код шифрується з прив'язкою до пристрою. Весь інший вміст існує у відкритому вигляді.
З чого почати?
Перше, що спадає на думку (токени авторизації, ключі тощо), це інструменти strings і grep. Для автоматизації це не годиться. Тупий пошук рядків створює таку кількість сміття, що вимагає ручного розбору, що автоматизація втрачає всякий сенс.
Щоб написати прийнятну систему автоматичного аналізу, потрібно уважно подивитися на те, з чого складається дистрибутив. Розпакувавши дистрибутиви для ауд 15 000 додатків і відкинувши завідоме сміття (картинки, аудіо, відео, ресурси), ми отримаємо 224 061 файл 1396 типів.
* .m і * .h (вихідці) - це, звичайно, цікаво, але не варто забувати про конфіги, а якщо точніше, то XML-, PList- і SQLite-контейнери. Прийнявши це спрощення, побудуємо TOP цікавих нам типів за популярністю. Сумарна кількість цікавих нам файлів 94 452, що становить 42% від початкового.
Додаток, який ми умовно назвемо нормальними, складається з:
- медійний контент: картинки, аудіо, ресурси інтерфейсу;
- скомпільований код (зашифрований)
- контейнери з даними - SQLite, XML, PList, BPList
- всякий непотріб, який потрапив у дистрибутив з невідомої причини
Разом, завдання зводиться до двох:
- Рекурсивний пошук різних секретів у SQLite, XML, PList
- Пошук усякого «незвичайного» непотребу і приватних ключів
Keep this token in secret
Мабуть, для багатьох розробників не є очевидним, що опублікований додаток стає публічним. Так, періодично зустрічаються Oauth-токени твіттера та інших популярних сервісів. Показовим випадком був додаток, який збирав контакти, фотки, геолокацію і devceID користувачів і зберігав їх в амазонівській хмарі, і так - використовуючи при цьому токен, зашитий в одному з PList-файлів. Використовуючи цей токен, без особливих зусиль можна злити дані по всім користувачам і спостерігати за пересуванням пристроїв в реальному часі.
Важлива обставина, яка чомусь залишається без уваги: бібліотеки які дозволяють гнучко керувати push-повідомленнями (наприклад UrbanAirship). У мануалах ясно написано, що ні в якому разі master secret (за допомогою якого серверна частина програми шле пуші), в додатку зберігати не можна. Але майстер-секрети все одно зустрічаються. Тобто я можу надіслати повідомлення всім користувачам програми.
TEST-DEV
Не варто обділяти увагою різні артефакти процесу тестування та розробки, тобто посилання на зневаджувальні інтерфейси, системи контролю версій та посилання на dev-оточення. Ця інформація може бути вкрай цікава зловмисникам, оскільки в ній трапляються SQL-дампи баз з реально існуючими користувачами. Розробники, як правило, не займаються безпекою тестового оточення (залишаючи, наприклад, паролі за замовчуванням), при цьому часто використовують реальні дані користувачів для більш якісного тестування. Видатною знахідкою став скрипт, через який (без автентифікації) можна було розсилати push повідомлення всі користувачам програми.
Tap to enter
Те, що в дистрибутивах трапляється інформація про тестове оточення та інформація про системи контролю версій, очікувано. Але деякі речі продовжують дивувати:
- SQLite-база з обліковими даними сервіси
- Додаток-візитка з автентифікацією на клієнті
- Приватний ключ для підписування транзакцій
Що це робить тут?!
Виявлення описаного вище контенту, в принципі зрозуміло, але в програмах періодично можна знайти незрозумілі речі, наприклад PKCS-контейнер з сертифікатом розробника... і приватним ключем до нього
Або шматки PHP-коду з логінами, паролями до бази даних.
… і моє улюблене - робочий клієнтський конфіг OpenVPN.
А так само не зашифровані приватні ключі «всіх сортів і забарвлень» (с)
Що крім секретів?
Як би по своїй суті не було спірне питання ліцензування, але він знайшов своє місце і тут. Багато розробників використовують у своїх програмах код фреймворків, які бувають під ліцензією GPL, що вимагає розкриття коду. А як GPL працює з платними і безкоштовними додатками в App Store - питання, яке може створити патентним тролям простір для маневру.
Is There an App for That?
Отже, у нас є тисячі додатків, в яких знаходяться описані «косяки», але розробники не особливо поспішають щось з цим робити. У чому ж тут проблема? На гітхабі є безліч всяких супер-конструкцій для аудиту безпеки додатків, але для того щоб з ними працювати, розробнику потрібно:
- Витратити сили і час на те, щоб розібратися самому, як що працює. Тобто додаткова робота, за яку не платять
- Створити і підтримувати погляд.
- Якщо додатків багато, то потрібен окремий фахівець на фултайм, який буде робити п.1 і п.2
з цього складається ситуація, в якій безпечну розробку собі можуть дозволити багаті корпорації, які сильно хвилюються за свій бренд або фінансові структури, які міцно тримаються «за жабри» регуляторами. А кількість небезпечних додатків зростає.
Відповіддю на всі ці фактори стала поява HackApp, інструменту, який забезпечує базовий аналіз безпеки додатків і розвивається відповідно до принципів:
- Звіт не повинен «вантажити» розробника технічними деталями (типу лістингів і трейсів), а чітко і зрозуміло повідомляти, що, де потрібно виправити
- Не повинен вимагати вкладень в інфраструктуру. (тобто якихось виділених під себе потужностей на боці клієнта)
- Мати інтерфейс для автоматичної взаємодії, роботу з яким можна вбудувати в процес передрелізного тестування програми, стати, з точки зору інтеграції в розарботку, yet another testing tool
Зараз HackApp існує в 2х варіантах: базовий і Pro (з платною підпискою), але це вже зовсім інша історія.
