На прошлой неделе пользователи Reddit нашли интересный баг, который действует во всех версиях iOS. Если на телефон отправить определённую комбинацию символов, то он уходит в «ребут».
Вот эта комбинация.
Данный баг подробно исследовали на Хабре. Автор перебрал все комбинации символов и нашёл минимальную, которая работает аналогично оригинальной, хотя, может быть, не так красива.
Неизвестно, кто изначально нашёл этот баг, но он не послал информацию в компанию Apple, и поэтому в ближайшее время пользователям продукции «яблочной компании» придётся страдать.
После перезагрузки Messages может снова демонстрировать это сообщение как последнее полученное и перезагружаться. Можно попробовать исправить уязвимость, послав на телефон нормальное сообщение и сдвинув старое. Сама Apple рекомендует сделать это с помощью голосового помощника Siri.
Многие сайты уже фильтруют «небезопасную» последовательность глифов из кириллицы/латинского, арабского, маратхи и китайского.
Из заметки пользователя iago:
- UILabel ни при чем, он не может даже показать текст, останавливаясь на слове Power;
- UITextField аналогично;
- UITextView прекрасно отобразил полный текст;
- UIButton сгенерировал bad access!
Крэш происходит внутри метода CopyFromStorage(TRunGlue&, long) и, судя по ассемблерному коду, в момент копирования байтов длиной long n из одной части памяти в другую (movq 0x90(%rax), %rdx).
Другой пользователь dns78 делится дополнительной информацией: «Всякий bidi процессинг (когда в тексте встречаются сразу символы left-to-right и right-to-left), арабские диалекты, хинди, кхмер и т. п. — поле непаханное для крэшей. Во всех операционных системах. Обработка [например двухбайтных] символов каждого типа естественного языка — это примерно как виртуальная машина. Символы — как опкоды. В сложных языках эти опкоды могут модифицировать на лету [сегмент кода] прочий текст. Правила этих модификаций не до конца внятны. Например, в Sinhala. Отсюда ошибки».