Баг iMessage з арабським текстом дозволяє віддалено перезавантажити будь iPhone [FIX]

У iOS виявлений вкрай неприємний баг. iPhonе, на який прийшло повідомлення з певним набором символів, перезавантажується, а додаток «Повідомлення» починає падати.

DISCLAIMER1: Не намагайтеся повторити це зі своїми телефонами і телефонами колег! Судячи з коментарів, багато людей вже заразили свої телефони, а 100% -тного ліки ще немає!

DISCLAIMER2: Навіть не намагайтеся назвати так Wi-fi точку!

DISCLAIMER3: Працює також через будь-які соціальні мережі або мессанджери!

Чи не шліть нікому на айфон !!!!

»Натисніть, щоб показати спойлер - натисніть знову, щоб приховати ...«

Відкрити повідомлення-баг в окремому вікні (Не відкривайте за допомогою iPhone!).

FIX

Є кілька простих способів виправити помилку:

  • відкрийте повідомлення на останній розмові і відправте відповідь жартівнику;
  • якщо ви вже відкрили повідомлення в режимі списку діалогів, попросіть друга відправити вам будь-яке інше повідомлення;
  • самостійно відправте собі повідомлення за допомогою Siri;
  • створіть замітку і надішліть як на свій номер телефону за допомогою кнопки «Поділитися».

Також на Reddit було описано ліки - потрібно надіслати смс будь-якого змісту на атакований номер, і глюк пропаде. Поясню - після перезавантаження атакованого телефону все працює нормально до тих пір, поки жертва не хоче прочитати смс, тобто завантажити вбудований додаток Messages. Після отримання нового смс від відправника «вірусу», останнім повідомленням стане нове смс і Messages, логічно, перестане падати.

WORKING FIX від shram.kiev.ua

Попросіть Siri прочитати останнім невідкрите повідомлення ( "Siri read last unread message" або "Сірі прочитай моє останнє повідомлення"), після створіть замітку і відправте її самі собі по iMessage.

Тимчасове рішення від компанії Apple

У чертверг вночі, в новому документі служби підтримки, Apple визнає даний баг, який був виявлений два дні тому, і пропонує просте рішення щоб тимчасово обійти цю проблему, оголошуючи виправлення буде доступна через оновлення програмного забезпечення найближчим часом.

Так званий Unicode код смерті, також відомий як "Effective Power", виникає через те, що система намагається декодувати Unicode символи викликаючи перевантаження пам'яті устрйства і призводить до його перезавантаження. Багато користувачів повідомляють, що вони не в змозі відкрити програму iMessage після отримання це арабського тексту.

Apple, раніше направіляла заяви, щоб ЗМІ, підтвердили даний баг, але в ніч на четвер, компанія опублікувала офіційний документ про визнання бага і розміщення тимчасового рішення для цього.

Apple is aware of an iMessage issue caused by a specific series of unicode characters and we will make a fix available in a software update. Until the update is available, you can use these steps to re-open the Messages app.

Крок 1: Натисніть і утримуйте кнопку Додому для виклику Siri. Після того, як Activ ованние, запитаєте Siri "читати непрочитані повідомлення."

Крок 2: Сірі роду прочитати повідомлення (це неможливо для того, щоб насправді говорять його в належному англійською мовою), а потім він буде просити, якщо ви хочете, щоб відповісти на повідомлення. Скажи так.

Крок 3: Скажіть що-небудь. Фактичне зміст відповіді не має значення. Важливим є те, відправивши повідомлення.

Крок 4: Після того, як відповідь був відправлений, ви повинні бути в змозі відкрити програму Повідомлення. Звідти, серветки, щоб видалити весь ланцюжок, що містить рядок символів, або натисніть і утримуйте шкідливого повідомлення, натисніть Додатково, а потім видалити повідомлення з розмови.

Це не перший обхідний шлях ми бачили в цьому питанні. Ми насправді опубліковані кілька варіантів вчора. Люди з зламаних пристроїв також є можливість встановлення сторонніх хитрощі, які будуть перешкоджати питання, відбудеться в першу чергу.

Подібно звітності компанія виданих раніше на цьому тижні, підтримка документ, опублікований в четвер увечері також згадує компанія буде випускати виправлення регулярно оновлюючи його програмне забезпечення найближчим часом, мабуть разом прошивкою 8.4, яка все ще ?? в бета- стадії.

На habrhabr.ru написали, якщо, після отримання такого повідомлення, спробувати відкрити повідомлення в режимі списку діалогів, то додаток почне падати. "Повідомлення" відкриються, якщо запускати їх відразу на екран окремої розмови, однак, при спробі перейти до списку розмов, додаток знову почне падати.

Ми спробували і переконалися, що це реально працює. Причому працює не обов'язково від смс - тексту досить було з'явитися в будь-якому пуш-повідомленні, наприклад з viber, watzup, вконтакте або фейсбук і інших сервісів.

Звичайно ж, це не перезавантаження або поломка, а креш графічної підсистеми, який викликає перезавантаження всієї системи. Оскільки вікно з текстом пуш-повідомлення безпосередньо входить в графічну оболонку iOS, а не є окремим виджетом (як, наприклад, в Android), логічно, що будь-яка помилка на такому високому рівні виведе систему з ладу.

iMessages вилітає з тієї ж причини, що і вся iOS, з єдиною різницею - будучи окремим додатком, вона не провокує падіння mainthread самої iOS. Креш Messages відбувається через те, що на головному екрані ви бачите тексти останніх відправлених та отриманих повідомлень.

На проекті habrahabr створили тестовий проект в xCode. При спробі додати нещасливий текст прямо в Interface Builder, отримали креш самого xCode, причому він не відкривався до тих пір, поки не видалили тестовий проект з жорсткого диска.

З другої спроби додавали арабський текст кодом з текстового файлу і після декількох спроб, шляхом проб і помилок з'ясували, що:

  • UILabel ні при чому, він не може навіть показати текст, зупиняючись на слові Power;
  • UITextField аналогічно;
  • UITextView прекрасно відобразив повний текст;
  • UIButton згенерував bad access !!

Тут вже цікавіше. Роздруковуємо повний стек трейс llvm-командою bt і отримуємо приблизно наступне:

  * Thread # 1: tid = 0xf611cd, 0x00000001120ce5f3 CoreText`CopyFromStorage (TRunGlue &, long) + 28, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code = 1, address = 0x90)
  frame # 0: 0x00000001120ce5f3 CoreText`CopyFromStorage (TRunGlue &, long) + 28
  frame # 1: 0x00000001120ce283 CoreText`TRunGlue :: RotateGlyphs (CFRange, long) + 527
  frame # 2: 0x000000011212b71b CoreText`OpenTypeShapingEngine :: ApplyScriptShaping (unsigned int *) + 465
  frame # 3: 0x00000001120d0201 CoreText`TOpenTypeMorph :: ApplyShapingEngine (OTL :: GSUB &, OTL :: GlyphLookups &, unsigned int *, CFRange, bool &) + 739
  frame # 4: 0x00000001120d1007 CoreText`TOpenTypeMorph :: ShapeGlyphs (bool &) + 331
  frame # 5: 0x0000000112056c4e CoreText`TShapingEngine :: ShapeGlyphs (TLine &, TCharStream const *) + 264
  frame # 6: 0x000000011205c48b CoreText`TTypesetter :: FinishEncoding (std :: __ 1 :: tuple  *, Unsigned int, unsigned char> const &, TLine &, signed char) + 127 frame # 7: 0x0000000112070586 CoreText`TTypesetterAttrString :: Initialize (__ CFAttributedString const *) + 674 frame # 8: 0x000000011207029a CoreText`TTypesetterAttrString :: TTypesetterAttrString (__ CFAttributedString const * ) + 158 frame # 9: 0x000000011205d79f CoreText`CTLineCreateWithAttributedString + 63 frame # 10: 0x0000000110c6d8bd UIFoundation`__NSStringDrawingEngine + 18744 frame # 11: 0x0000000110c68f5f UIFoundation`- [NSString (NSExtendedStringDrawing) boundingRectWithSize: options: attributes: context:] + 198 frame # 12 : 0x000000010e875788 UIKit`- [UIButton _intrinsicSizeWithinSize:] + 946 frame # 13: 0x000000010ec2466d UIKit`- [UIView (UIConstraintBasedLayout) intrinsicContentSize] + 37 frame # 14: 0x000000010ec24b6c UIKit`- [UIView (UIConstraintBasedLayout) _generateContentSizeConstraints] + 33 frame # 15: 0x000000010ec24930 UIKit`- [UIView (UIConstraintBasedLayout) _updateContentSizeConstraints] + 422 frame # 16: 0x000000010ec2bd25 UIKit`- [UIView (AdditionalLayoutSupport) updateConstraints] + 162 frame # 17: 0x000000010e87521b UIKit`- [UIButton updateConstraints] + 2925 frame # 18: 0x000000010ec2b346 UIKit `- [UIView (AdditionalLayoutSupport) _internalUpdateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 242 frame # 19: 0x000000010ec2b53e UIKit`- [UIView (AdditionalLayoutSupport) _updateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 124 frame # 20: 0x000000010e0bd354 CoreFoundation`CFArrayApplyFunction + 68 frame # 21: 0x000000010ec2b2ed UIKit`- [UIView (AdditionalLayoutSupport) _internalUpdateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 153 frame # 22: 0x000000010d9ef1be Foundation`- [NSISEngine withBehaviors: performModifications:] + 155 frame # 23: 0x000000010ec2b53e UIKit`- [UIView (AdditionalLayoutSupport) _updateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 124 frame # 24: 0x000000010ec2ba0e UIKit` __60- [UIView (AdditionalLayoutSupport) updateConstraintsIfNeeded] _block_invoke + 96 frame # 25: 0x000000010d9ef1be Foundation`- [NSISEngine withBehaviors: performModifications:] + 155 frame # 26: 0x000000010ec2b6d6 UIKit`- [UIView (AdditionalLayoutSupport) updateConstraintsIfNeeded] + 231 frame # 27: 0x000000010ec2bdde UIKit`- [UIView (AdditionalLayoutSupport) _updateConstraintsAtEngineLevelIfNeeded] + 146 frame # 28: 0x000000010e623a3d UIKit`- [UIView (Hierarchy) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 114 frame # 29: 0x000000010e62fa2b UIKit`- [UIView (CALayerDelegate) layoutSublayersOfLayer:] + 536 frame # 30: 0x0000000111e08ec2 QuartzCore`- [CALayer layoutSublayers] + 146 frame # 31: 0x0000000111dfd6d6 QuartzCore`CA :: Layer :: layout_if_needed (CA :: Transaction *) + 380 frame # 32: 0x0000000111dfd546 QuartzCore`CA :: Layer :: layout_and_display_if_needed ( CA :: Transaction *) + 24 frame # 33: 0x0000000111d69886 QuartzCore`CA :: Context :: commit_transaction (CA :: Transaction *) + 242 frame # 34: 0x0000000111d6aa3a QuartzCore`CA :: Transaction :: commit () + 462 frame # 35: 0x000000010e5ada2d UIKit`- [UIApplication _reportMainSceneUpdateFinished:] + 44 frame # 36: 0x000000010e5ae6f1 UIKit`- [UIApplication _runWithMainScene: transitionContext: completion:] + 2648 frame # 37: 0x000000010e5ad0d5 UIKit`- [UIApplication workspaceDidEndTransaction:] + 179 frame # 38: 0x0000000110d835e5 FrontBoardServices`__31- [FBSSerialQueue performAsync:] _ block_invoke_2 + 21 frame # 39: 0x000000010e0ea41c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 frame # 40: 0x000000010e0e0165 CoreFoundation`__CFRunLoopDoBlocks + 341 frame # 41: 0x000000010e0dff25 CoreFoundation`__CFRunLoopRun + 2389 frame # 42: 0x000000010e0df366 CoreFoundation`CFRunLoopRunSpecific + 470 frame # 43: 0x000000010e5acb42 UIKit`- [UIApplication _run] + 413 frame # 44: 0x000000010e5af900 UIKit`UIApplicationMain + 1282 * frame # 45: 0x000000010d91ed0f Islam`main (argc = 1, argv = 0x00007fff522e1330) + 111 at main.m: 14 frame # 46: 0x000000011076e145 libdyld.dylib`start + 1 

Останньою документованої функцією є CTLineCreateWithAttributedString, що нам в принципі нічого не дає. Сам же креш відбувається всередині методу CopyFromStorage (TRunGlue &, long) і, судячи з ассемблерного коду, в момент копіювання байтів довжиною long n з однієї частини пам'яті в іншу (movq 0x90 (% rax),% rdx).

Припускаю, що відбувається це через якихось відмінностей в обчисленні довжини арабського тексту - мабуть, довжина обчислюється в двох місцях програми різними методами. Тут я можу помилятися і прошу поправити знаючих людей.

Баг, мабуть, існує стільки ж, скільки і iOS, і був помічений, мабуть, випадково. До речі, слово Power вставлено для красного слівця і ролі не грає. Сенс же тексту мені не вдалося виявити навіть за допомогою Google Translate (останній символ - зовсім не арабська, а китайський, і означає Надмірність, що ніби натякає!). Можливо, через присутність китайських і арабських символів одночасно?

За сім откланяюсь, бажаю всім кодів 200, білдів без exc_bad_access і stackoverflow і приємного закінчення продуктивної робочого тижня!