Авторские курсы Михаила Тарасова

Хардкоденные API-ключи в desktop/mobile клиентах — извлечение creds из `.asar`, `.apk`, `.ipa`

Хардкоденные API-ключи в desktop/mobile клиентах — извлечение creds из `.asar`, `.apk`, `.ipa`

Суть проблемы (для тех, кто в танке)
Разработчики вшивают API-ключи/токены/секреты прямо в код клиентских приложений, думая: «Ну это же скомпилированный бинарник, кто там полезет?». Спойлер: любой школьник с 7zip.

Desktop-приложения на Electron упаковывают JS в .asar (по сути — архив). Android APK — это переименованный ZIP. iOS IPA — та же история. Внутри — plaintext JS/XML/strings с твоими AWS keys, Firebase secrets, Stripe tokens. Вскрывается за 2 минуты, эксплуатируется вечно.

Почему это катастрофа:
• Ключи с полными правами (s3:*, dynamodb:*)
• Токены OAuth без refresh rotation
• Жёстко вшитые пароли от БД
• Production secrets в dev-билдах

Форматы и точки входа
Electron (.asar) — 90% desktop-приложений
Что это: Electron упаковывает Node.js + Chromium. Весь JS-код лежит в app.asar или app.asar.unpacked.
Где найти:
• Windows: C:\Program Files\AppName\resources\app.asar
• macOS: /Applications/AppName.app/Contents/Resources/app.asar
• Linux: /opt/appname/resources/app.asar
Как вскрыть:

Пример находки:

Android (.apk) — миллиарды устройств
Что это: APK = ZIP с Dalvik-байткодом + ресурсами. Даже после обфускации ProGuard — строки остаются читаемыми.
Как вскрыть:

Типичные места:
res/values/strings.xml — прямо в XML
assets/config.json — JSON-конфиги
lib/armeabi-v7a/*.so — нативные либы (используй strings или Ghidra)
Пример из strings.xml:

iOS (.ipa) — закрытая экосистема, но не безопасная
Что это: IPA = ZIP с бинарником Mach-O + ресурсы. Обфускация Swift/Objective-C слабая, строки вшиты в бинарь.
Как вскрыть:

Бонус: Проверь Info.plist и все .json в бандле:

Автоматизация охоты
Скрипт для массового сканирования

TruffleHog для ленивых

Че почем: реальные сценарии эксплойтов
Electron-приложение с AWS ключами
Находка:

Эксплойт:

Пейлоад для репорта:

Android APK с Firebase admin SDK
Находка в assets/google-services.json:

Эксплойт:

iOS IPA с Stripe secret key
Находка через strings:

Эксплойт:

Доказательство для баунти
1. Путь к бинарнику (ссылка на скачивание или хеш)
2. Команда извлечения (asar extract app.asar dump/)
3. Скриншот найденного ключа в исходниках
4. Proof of concept:
• AWS: aws s3 ls с выводом бакетов
• API: curl с валидным ответом (замаскируй реальные данные)
5. Impact: Полный доступ к prod-данным/платёжной системе/юзерам
Типичный payout: $1000-$10000+ в зависимости от скоупа ключа.

Защита (для разрабов, если читают)
• НЕ ВШИВАЙ СЕКРЕТЫ В КЛИЕНТ. Точка.
• Используй OAuth с PKCE (клиент НЕ хранит client_secret)
• Backend Proxy: клиент → твой API → внешний сервис
• Для мобилок: Android Keystore / iOS Keychain (но и там баги бывают)
• Rotate keys регулярно + мониторь их использование

Советы
Если стандартный grep не дал результата:
1. Обфусцированные строки: Разрабы используют Base64/ROT13/XOR. Ищи паттерны:

2. Нативные библиотеки (.so/.dylib): Запусти Ghidra, ищи строковые референсы в функциях init_* и config_*:

3. Динамический анализ: Запусти приложение в эмуляторе/VM, логируй весь сетевой трафик через mitmproxy:

3. Ключи часто отправляются в Authorization: Bearer ТВОЙ_КЛЮЧ.
4. Electron DevTools: Если можешь запустить приложение, открой DevTools (Ctrl+Shift+I), вкладка Sources — весь код на виду.
5. Memory dump: Запусти приложение, дампи память процесса:

6. GitHub Dorks: Разрабы часто пушат креды в пубичные репы, потом удаляют commit, но забывают про историю:

 

Мои курсы