This page has been robot translated, sorry for typos if any. Original content here.

Un bogue iMessage en texte arabe redémarre à distance n'importe quel iPhone [FIX]

Un bug extrêmement désagréable a été détecté dans iOS. L'iPhone, auquel un message contenant un certain nombre de caractères est arrivé, redémarre et l'application Messages commence à se bloquer.

AVERTISSEMENT1: N'essayez pas de répéter cela avec vos téléphones et les téléphones de collègues! À en juger par les commentaires, beaucoup de gens ont déjà infecté leur téléphone et il n’ya pas encore de remède à 100%!

AVERTISSEMENT2: N'essayez même pas d'appeler un point Wi-Fi comme ça!

CLAUSE DE NON-RESPONSABILITÉ 3: Fonctionne également par le biais de tous les réseaux sociaux ou de la messagerie instantanée

N'envoyez personne à l'iPhone !!!!

"Cliquez pour afficher le spoiler - cliquez à nouveau pour masquer ..."

Ouvrez le message de bogue dans une fenêtre séparée (ne l'ouvrez pas avec l'iPhone!).

Fix

Il existe plusieurs moyens simples de corriger l'erreur:

  • ouvrez les messages de la dernière conversation et envoyez la réponse au joker;
  • Si vous avez déjà ouvert des messages en mode liste de dialogue, demandez à un ami de vous envoyer tout autre message.
  • envoyez-vous un message en utilisant Siri;
  • créez une note et envoyez-la sous forme de message à votre numéro de téléphone à l'aide du bouton "Partager".

En outre, un médicament a été décrit sur Reddit - vous devez envoyer des SMS de tout contenu au numéro attaqué, et le problème disparaîtra. Permettez-moi de vous expliquer. Après le redémarrage du téléphone attaqué, tout fonctionne correctement jusqu'à ce que la victime veuille lire le SMS, c'est-à-dire Téléchargez l'application Messages intégrée. Après avoir reçu un nouveau SMS de l'expéditeur du "virus", le dernier message sera un nouveau SMS et les messages, logiquement, cesseront de tomber.

CORRECTION DE TRAVAIL de shram.kiev.ua

Demandez à Siri de lire le dernier message non ouvert ("Siri a lu le dernier message non lu" ou "Siri a lu mon dernier message"), puis créez une note et envoyez-la par vous-même via iMessage.

Solution de contournement Apple

Jeudi, dans un nouveau document de support, Apple reconnaît ce bogue découvert il y a deux jours et propose une solution simple pour contourner temporairement ce problème, en annonçant qu'un correctif sera disponible dans un proche avenir via une mise à jour logicielle.

Le code de mort Unicode, également appelé "Puissance effective", survient lorsque le système tente de décoder les caractères Unicode, ce qui entraîne une surcharge de la mémoire du périphérique et un redémarrage. De nombreux utilisateurs signalent qu’ils ne peuvent pas ouvrir l’application iMessage après avoir reçu ce texte en arabe.

Apple avait précédemment envoyé des déclarations aux médias pour confirmer ce bogue, mais jeudi soir, la société a publié un document officiel reconnaissant le bogue et publiant une solution de contournement à cet effet.

Apple est conscient d'un problème lié à iMessage causé par une série spécifique de caractères Unicode et nous proposerons un correctif dans une mise à jour logicielle. Jusqu'à ce que la mise à jour soit disponible, vous pouvez utiliser cette procédure pour rouvrir l'application Messages.

Étape 1: Appuyez sur le bouton principal et maintenez-le enfoncé pour appeler Siri. Après l'activation, demandez à Siri de "lire les messages non lus".

Étape 2: Siri lit en quelque sorte le message (cela n’est pas possible pour pouvoir le parler correctement en anglais), puis il vous demandera si vous souhaitez répondre au message. Dites oui.

Étape 3: Dis quelque chose. Le contenu réel de la réponse n'a pas d'importance. L'important est d'envoyer un message.

Étape 4: Une fois la réponse envoyée, vous devriez pouvoir ouvrir l'application Messages. À partir de là, balayez pour supprimer la chaîne entière contenant la chaîne de caractères ou maintenez enfoncé le message malveillant, cliquez sur Avancé, puis supprimez le message de la conversation.

Ce n'est pas la première solution de contournement que nous avons vu dans cette affaire. Nous avons en fait publié plusieurs options hier. Les personnes disposant d'appareils piratés ont également la possibilité d'installer des astuces tierces qui empêcheront le problème de se produire en premier lieu.

Semblable au reportage d'une société publié plus tôt cette semaine, un document d'assistance publié jeudi soir indique également que la société publiera bientôt des correctifs avec une mise à jour logicielle, apparemment avec le firmware 8.4, qui est toujours en version bêta.

Ils ont écrit sur habrhabr.ru, si, après avoir reçu un tel message, ils essayaient d'ouvrir les messages en mode liste de dialogue, l'application commençait à se bloquer. Les «messages» s'ouvrent si vous les lancez immédiatement sur l'écran d'une conversation distincte. Toutefois, lorsque vous essayez d'accéder à la liste des conversations, l'application recommence à tomber.

Nous avons essayé de faire en sorte que cela fonctionne vraiment. De plus, cela ne fonctionne pas forcément à partir de SMS: il suffisait que le texte apparaisse dans un message push, par exemple celui de Viber, Watzup, VKontakte ou Facebook et d’autres services.

Bien entendu, il ne s'agit pas d'un redémarrage ou d'une panne, mais d'un crash du sous-système graphique, qui provoque un redémarrage de l'ensemble du système. Parce que la fenêtre avec le texte du message push entre directement dans le shell graphique d'iOS et n'est pas un widget séparé (comme par exemple sous Android), il est logique que toute erreur d'un niveau aussi élevé désactive le système.

iMessages se bloque pour la même raison que l'ensemble de l'iOS, la seule différence étant une application distincte, cela ne provoque pas le crash du processeur principal d'iOS. Les messages se bloquent parce que sur l'écran principal, vous voyez les textes des derniers messages envoyés et reçus.

Sur le projet habrahabr, nous avons créé un projet test en xCode. Lorsque j'ai essayé d'ajouter le texte néfaste directement à Interface Builder, le crash xCode s'est produit et il ne s'est pas ouvert tant que le projet de test n'a pas été supprimé du disque dur.

À la deuxième tentative, du texte arabe a été ajouté avec le code d'un fichier texte. Après plusieurs tentatives, nous avons découvert par essais et erreurs que:

  • UILabel n’a rien à voir avec cela, il ne peut même pas montrer le texte, insistant sur le mot Power;
  • UITextField est similaire;
  • UITextView a parfaitement affiché le texte intégral;
  • UIButton a généré un mauvais accès !!

Il y a déjà plus intéressant. Nous imprimons la trace complète de la pile avec la commande llvm-bt et obtenons quelque chose comme ce qui suit:

  * thread # 1: id = 0xf611cd, 0x00000001120ce5f3 CoreText`CopyFromStorage (TRunGlue &, long) + 28, file d'attente = 'com.apple.main-thread', motif d'arrêt = EXC_BAD_ACCESS (code = 1, adresse = 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
  cadre # 4: 0x00000001120d1007 CoreText`TOpenTypeMorph :: ShapeGlyphs (bool &) + 331
  cadre # 5: 0x0000000112056c4e CoreText`TShapingEngine :: ShapeGlyphs (TLine &, TCharStream const *) + 264
  frame # 6: 0x000000011205c48b CoreText`TTypesetter :: FinishEncoding (std :: __ 1 :: tuple  *, unsigned int, unsigned char> const &, TLine &, char signé) + 127 cadre # 7: 0x0000000112070586 CoreText`TTypesetterAttrString :: Initialize (__ CFAttributedString const *) + 674 cadre # 8: 0x000000011207029a CoreText`TTyrsetrttAttrttAttr ) + 158 cadre # 9: 0x000000011205d79f CoreText`CTLineCreateWithAttributedString + 63 cadre # 10: 0x0000000110c6d8bd UIFoundation`__NSStringDrawingEngine + 18744 cadre # 11: 0x0000000101c68f5UIFoundationr Métier de la marque 0x000000010ec24930 UIKit`- [UIView (UIConstraintBasedLayout) _updateContentSizeConstraints] + 422 cadre # 16: 0x000000010ec2bd25  UIKit`- [UIView (AdditionalLayoutSupport) updateConstraints] + 162 cadre n ° 17: 0x000000010e87521b UIKit`- [UIButton updateConstraints] + 2.925 cadre n ° 18: 0x000000010ec2b346 UIKit`- [UIView (AdditionalLayoutSupport) _internalUpdateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 242 châssis n ° 19: 0x000000010ec2b53e UIKit `- [UIView (AdditionalLayoutSupport) _updateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 124 cadre n ° 20: 0x000000010e0bd354 CoreFoundation`CFArrayApplyFunction + 68 châssis # 21: 0x000000010ec2b2ed UIKit`- [UIView (AdditionalLayoutSupport) _internalUpdateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBaselineUpdate:] + 153 châssis n ° 22: 0x000000010d9ef1be Foundation`- [NSISEngine withBehaviors: performModifications:] + 155 frame # 23: 0x000000010ec2b53e UIKit`- [UIView (AdditionalLayoutSupport) _updateConstraintsIfNeededAccumulatingViewsNeedingSecondPassAndViewsNeedingBeedelineBaselineUpdate:] + 124 frame  # 24: 0x000000010ec2ba0e UIKit`__60- [UIView (AdditionalLayoutSupport) updateConstraintsIfNeeded] _block_invoke + 96 cadre # 25: 0x000000010d9ef1be Foundation`- [NSISEngine withBehaviors: performModifications:] + 155 cadre #fec_fec_f + 231 cadre n ° 27: 0x000000010ec2bdde UIKit`- [UIView (AdditionalLayoutSupport) _updateConstraintsAtEngineLevelIfNeeded] + 146 cadre n ° 28: 0x000000010e623a3d UIKit`- [UIView (Hiérarchie) _updateConstraintsAsNecessaryAndApplyLayoutFromEngine] + 114 cadre n ° 29: 0x000000010e62fa2b UIKit`- [UIView (CALayerDelegate) layoutSublayersOfLayer :] + 536 frame # 30: 0x0000000111e08ec2 QuartzCore`- [CALayer layoutSublayers] + 146 cadre # 31: 0x0000000111dfd6d6 QuartzCore`CA :: Layer :: layout_if_needed (CA :: Transaction *) + 380 cadre # 32: 0x0000000111dfd546. : Layer :: layout_and_display_if_needed (CA :: Transaction *) + 24 images # 33: 0x0000000111d69886 QuartzCore`CA :: Context :: commit_transaction (CA :: Transaction *  ) +242 cadre # 34: 0x0000000111d6aa3a QuartzCore`CA :: Transaction :: commit () + 462 cadre # 35: 0x000000010e5ada2d UIKit`- [UIApplication _reportMainSceneUpdateFinished:] + 44 cadre # 36: 0x000000010e5fUI` achèvement:] + cadre 2.648 # 37: 0x000000010e5ad0d5 UIKit`- [UIApplication workspaceDidEndTransaction:] + 179 cadre n ° 38: 0x0000000110d835e5 FrontBoardServices`__31- [FBSSerialQueue performAsync:] _ + 21 block_invoke_2 cadre n ° 39: 0x000000010e0ea41c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 12 châssis # 40 : + 341 0x000000010e0e0165 CoreFoundation`__CFRunLoopDoBlocks trame N ° 41: 0x000000010e0dff25 CoreFoundation`__CFRunLoopRun + 2389 cadre n ° 42: 0x000000010e0df366 CoreFoundation`CFRunLoopRunSpecific + 470 châssis n ° 43: 0x000000010e5acb42 UIKit`- [UIApplication _run] + 413 cadre n ° 44: 0x000000010e5af900 UIKit`UIApplicationMain + 1282 * frame # 45: 0x000000010d91ed0f Islam`main (argc = 1, argv = 0x00007fff522e1330) + 111 à main.m: 14 frame # 46  : 0x000000011076e145 libdyld.dylib`start + 1 

La dernière fonction documentée est CTLineCreateWithAttributedString, ce qui en principe ne nous donne rien. Le crash lui-même se produit dans la méthode CopyFromStorage (TRunGlue &, long) et, à en juger par le code assembleur, lors de la copie d'octets de longueur long n d'une partie de la mémoire vers une autre (movq 0x90 (% rax),% rdx).

Je suppose que cela est dû à certaines différences dans le calcul de la longueur du texte arabe - apparemment, la longueur est calculée à deux endroits dans le programme en utilisant des méthodes différentes. Ici, je peux me tromper et demander à corriger des personnes bien informées.

Le bogue, apparemment, existe autant que iOS et a été remarqué, apparemment par accident. A propos, le mot Power est inséré pour un mot rouge et ne joue pas de rôle. Je ne pouvais même pas découvrir le sens du texte, même à l'aide de Google Translate (le dernier caractère n'est pas du tout arabe, mais chinois, et signifie redondance, ce qui semble laisser deviner!). Peut-être en raison de la présence de caractères chinois et arabes en même temps?

Pour sim, je m'incline, je vous souhaite à tous 200 codes, construit sans exc_bad_access et stackoverflow et une agréable fin à une semaine de travail productive!