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

Arabischer Text-iMessage-Fehler startet jedes iPhone aus der Ferne neu [FIX]

In iOS wurde ein äußerst unangenehmer Fehler entdeckt. Das iPhone, auf dem eine Nachricht mit einem bestimmten Zeichensatz eingegangen ist, wird neu gestartet und die Nachrichtenanwendung stürzt ab.

HAFTUNGSAUSSCHLUSS1: Versuchen Sie nicht, dies mit Ihren Telefonen und den Telefonen von Kollegen zu wiederholen! Gemessen an den Kommentaren haben viele Leute bereits ihre Handys infiziert und es gibt noch keine 100% ige Heilung!

HAFTUNGSAUSSCHLUSS2: Versuchen Sie nicht einmal, einen solchen Wi-Fi-Punkt anzurufen!

HAFTUNGSAUSSCHLUSS3: Funktioniert auch über soziale Netzwerke oder Instant Messenger!

Schicken Sie niemanden an das iPhone !!!!

"Klicken Sie, um den Spoiler anzuzeigen - klicken Sie erneut, um ihn auszublenden ..."

Öffnen Sie die Fehlermeldung in einem separaten Fenster (nicht mit dem iPhone öffnen!).

Fix

Es gibt mehrere einfache Möglichkeiten, den Fehler zu beheben:

  • Öffne die Nachrichten in der letzten Unterhaltung und sende die Antwort an den Joker.
  • Wenn Sie bereits Nachrichten im Dialoglistenmodus geöffnet haben, bitten Sie einen Freund, Ihnen eine andere Nachricht zu senden.
  • sende dir eine Nachricht mit Siri;
  • erstelle eine notiz und sende sie als nachricht an deine telefonnummer über den "teilen" button.

Außerdem wurde auf Reddit ein Medikament beschrieben - Sie müssen SMS mit jeglichem Inhalt an die angegriffene Nummer senden, und der Fehler verschwindet. Lassen Sie mich erklären - nach dem Neustart des angegriffenen Telefons funktioniert alles einwandfrei, bis das Opfer die SMS lesen möchte, d. H. Laden Sie die integrierte Nachrichtenanwendung herunter. Nach dem Empfang einer neuen SMS vom Absender des "Virus" ist die letzte Nachricht eine neue SMS und die Nachrichten werden logischerweise nicht mehr abfallen.

ARBEITSFIX von shram.kiev.ua

Bitten Sie Siri, die letzte ungeöffnete Nachricht zu lesen ("Siri las die letzte ungelesene Nachricht" oder "Siri las meine letzte Nachricht"). Erstellen Sie dann eine Notiz und senden Sie sie sich selbst über iMessage.

Apple-Problemumgehung

Am Donnerstag erkennt Apple in einem neuen Supportdokument diesen Fehler, der vor zwei Tagen entdeckt wurde, und bietet eine einfache Lösung, um dieses Problem vorübergehend zu umgehen. Es wird angekündigt, dass in naher Zukunft ein Update durch ein Softwareupdate verfügbar sein wird.

Der sogenannte Unicode-Todescode, auch als "Effective Power" bezeichnet, tritt auf, weil das System versucht, Unicode-Zeichen zu decodieren, wodurch der Gerätespeicher überlastet und neu gestartet wird. Viele Benutzer geben an, dass sie die iMessage-Anwendung nach Erhalt dieses arabischen Textes nicht öffnen können.

Apple hat zuvor Aussagen an die Medien gesendet, um diesen Fehler zu bestätigen. Am Donnerstagabend veröffentlichte das Unternehmen jedoch ein offizielles Dokument, in dem der Fehler erkannt und eine Problemumgehung für diesen Fehler veröffentlicht wurde.

Apple ist sich eines Problems mit iMessage bewusst, das durch eine bestimmte Reihe von Unicode-Zeichen verursacht wird, und wir werden ein Update in einem Software-Update bereitstellen. Mit diesen Schritten können Sie die Nachrichten-App erneut öffnen, bis das Update verfügbar ist.

Schritt 1: Halten Sie die Home-Taste gedrückt, um Siri anzurufen. Bitten Sie Siri nach Activ ovanny, "ungelesene Nachrichten zu lesen".

Schritt 2: Siri liest die Nachricht sozusagen (dies ist nicht möglich, um sie tatsächlich in korrektem Englisch zu sprechen) und fragt dann, ob Sie auf die Nachricht antworten möchten. Sag ja.

Schritt 3: Sag etwas. Der tatsächliche Inhalt der Antwort spielt keine Rolle. Das Wichtigste ist das Senden einer Nachricht.

Schritt 4: Nachdem die Antwort gesendet wurde, sollten Sie in der Lage sein, die Nachrichtenanwendung zu öffnen. Wischen Sie von dort aus, um die gesamte Zeichenfolge mit der Zeichenfolge zu löschen, oder halten Sie die schädliche Nachricht gedrückt, klicken Sie auf Erweitert und entfernen Sie die Nachricht aus der Konversation.

Dies ist nicht die erste Problemumgehung, die wir in dieser Angelegenheit gesehen haben. Wir haben gestern tatsächlich mehrere Optionen veröffentlicht. Menschen mit gehackten Geräten haben auch die Möglichkeit, Tricks von Drittanbietern zu installieren, die verhindern, dass das Problem überhaupt auftritt.

Ähnlich wie in den Unternehmensberichten, die Anfang dieser Woche veröffentlicht wurden, wird in einem am Donnerstagabend veröffentlichten Support-Dokument auch erwähnt, dass das Unternehmen in Kürze Patches mit einem Software-Update veröffentlichen wird, anscheinend zusammen mit Firmware 8.4, die sich noch in der Betaphase befindet.

Sie schrieben auf habrhabr.ru, wenn nach dem Empfang einer solchen Nachricht versucht wird, die Nachrichten im Dialoglistenmodus zu öffnen, stürzt die Anwendung ab. "Nachrichten" werden geöffnet, wenn Sie sie sofort auf dem Bildschirm einer separaten Konversation starten. Wenn Sie jedoch versuchen, zur Liste der Konversationen zu wechseln, wird die Anwendung wieder beendet.

Wir haben versucht, sicherzustellen, dass es wirklich funktioniert. Außerdem funktioniert es nicht unbedingt über SMS - es war genug, dass der Text in einer Push-Nachricht angezeigt wurde, beispielsweise von viber, watzup, VKontakte oder Facebook und anderen Diensten.

Dies ist natürlich kein Neustart oder Ausfall, sondern ein Absturz des Grafik-Subsystems, der einen Neustart des gesamten Systems zur Folge hat. Weil Das Fenster mit dem Text der Push-Nachricht gelangt direkt in die grafische Oberfläche von iOS und ist kein separates Widget (wie zum Beispiel in Android). Es ist logisch, dass ein Fehler auf einer so hohen Ebene das System deaktiviert.

iMessages stürzt aus dem gleichen Grund ab wie das gesamte iOS. Der einzige Unterschied besteht darin, dass es sich um eine separate Anwendung handelt, die den Mainthread von iOS nicht zum Absturz bringt. Nachrichtenabsturz tritt auf, weil auf dem Hauptbildschirm die Texte der zuletzt gesendeten und empfangenen Nachrichten angezeigt werden.

Auf dem Habrahabr-Projekt haben wir ein Testprojekt in xCode erstellt. Als ich versuchte, den unglückseligen Text direkt in Interface Builder einzufügen, kam es zum Absturz von xCode selbst, der erst dann geöffnet wurde, wenn das Testprojekt von der Festplatte gelöscht wurde.

Beim zweiten Versuch wurde arabischer Text mit Code aus einer Textdatei hinzugefügt, und nach mehreren Versuchen stellten wir durch Ausprobieren fest, dass:

  • UILabel hat nichts damit zu tun, es kann nicht einmal den Text zeigen, der sich mit dem Wort Power befasst.
  • UITextField ist ähnlich.
  • UITextView zeigte den vollständigen Text perfekt an.
  • UIButton hat einen schlechten Zugang erzeugt !!

Es ist schon interessanter. Wir drucken den vollständigen Stack-Trace mit dem llvm-Kommando bt und erhalten so etwas wie folgendes:

  * 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 &, Int * ohne Vorzeichen, 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  *, int ohne Vorzeichen, char ohne Vorzeichen> const &, TLine &, char mit Vorzeichen) + 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
  Bild # 32: 0x0000000111dfd546 QuartzCore`CA :: Layer :: layout_and_display_if_need (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 bei main.m: 14
  Frame # 46: 0x000000011076e145 libdyld.dylib`start + 1 

Die letzte dokumentierte Funktion ist CTLineCreateWithAttributedString, die uns im Grunde nichts gibt. Der Absturz selbst erfolgt innerhalb der CopyFromStorage-Methode (TRunGlue &, long) und nach Assembler-Code zum Zeitpunkt des Kopierens von Bytes der Länge n von einem Teil des Speichers in einen anderen (movq 0x90 (% rax),% rdx).

Ich nehme an, dass dies auf einige Unterschiede bei der Berechnung der Länge des arabischen Textes zurückzuführen ist - anscheinend wird die Länge an zwei Stellen im Programm mit unterschiedlichen Methoden berechnet. Hier kann ich mich irren und nach sachkundigen Personen fragen.

Der Bug existiert anscheinend genauso wie iOS und wurde anscheinend durch Zufall bemerkt. Das Wort Power wird übrigens für ein rotes Wort eingefügt und spielt keine Rolle. Ich konnte die Bedeutung des Textes nicht einmal mit Hilfe von Google Translate herausfinden (das letzte Zeichen ist überhaupt nicht arabisch, sondern chinesisch und bedeutet Redundanz, was anscheinend andeutet!). Vielleicht aufgrund der Anwesenheit von chinesischen und arabischen Schriftzeichen gleichzeitig?

Für sim, ich verbeuge mich, ich wünsche Ihnen alle 200 Codes, Builds ohne exc_bad_access und Stackoverflow und ein angenehmes Ende einer produktiven Arbeitswoche!