Ein Gespenst geht um auf Twitter. Es ist das Gespenst des Unicode, und es bringt reihenweise Programme auf Apple-Betriebssystemen zum Absturz. (Tweet von @glitchr_ – Achtung! Bringt diverse Browser zum Absturz!)
Technisch betrachtet handelt es sich um folgende Zeichen:
U+0647 ARABIC LETTER HEH character (ه)
25x U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
U+036x COMBINING LATIN SMALL LETTER M, R, D, V, C, H, X, I, I, M, H, U, A, X, H, C, A, I, R, H
25x U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
U+036x COMBINING LATIN SMALL LETTER H, I, C, H, M, R, T, V, X, I, E, A, I, C, H, U, A, X, R, H
29x U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
U+036x COMBINING LATIN SMALL LETTER H, C, H, M, R, D, V, X, I, C, A, I, M, H, U, A, X, I, R, H
Chrome für Mac in Version 25.x (Beta) hängt oder stürzt ab (alle Tabs des gleichen Rendering-Prozesses; das UI ist ein separater Prozess), die Entwickler-Version 26.x offenbar nicht (was aber auch am Debug Build liegen kann), von 24.x gibt es unterschiedliche Berichte. Safari crasht bei mir nicht, obwohl ich es erwarten würde. Firefox hat eh eine eigene Engine für Unicode und hat kein Problem mit dem Tweet, stellt ihn aber auch nicht richtig dar. Ebenso geht es bei Android, wo die Zeichen eiskalt dekomponiert werden.
Apples Terminal-Anwendung crasht sofort. iTerm 2 überlebt den Glitch erst einmal, crasht dann aber, wenn die Zeichen aus dem sichtbaren Bereich scrollen und in den alternate buffer oder Scrollback wandern:
Exception Type: EXC_CRASH (SIGABRT)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Application Specific Information:
Assertion failed: (freeRange_.length >= positions), function -[SharedCharacterRunData advance:], file /Users/georgen/globalsearch/trunk/CharacterRun.m, line 38.
Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0 libsystem_kernel.dylib 0x00007fff91cac212 __pthread_kill + 10
1 libsystem_c.dylib 0x00007fff87af5af4 pthread_kill + 90
2 libsystem_c.dylib 0x00007fff87b39dce abort + 143
3 libsystem_c.dylib 0x00007fff87b3ae2a __assert_rtn + 146
4 com.googlecode.iterm2 0x0000000100125fbc -[SharedCharacterRunData advance:] + 76
5 com.googlecode.iterm2 0x000000010012570b -[CharacterRun appendRunsWithGlyphsToArray:] + 59
Die meisten Anwendungen crashen allerdings in Apples CoreText – der API, die eigentlich für die Textdarstellung im gesamten Betriebssystem zuständig ist. (Chrome rendert den Webseiten-Inhalt komplett selbst und ohne Zuhilfename von CoreText und stürzt daher nur ab, wenn der Tab-Titel ausreichend groß ist, um den Tweet, der im <title>
steht, anzuzeigen.)
1 com.apple.CoreText TRun::TRun(TRun const&, CFRange, TRun::SubrangingStyle) + 850
2 com.apple.CoreText CTGlyphRun::CloneRange(CTRun const*, CFRange, TRun::SubrangingStyle) + 142
3 com.apple.CoreText TLine::SetLevelRange(CFRange, unsigned char, bool) + 162
…
Der minimale Testcase ist offenbar folgende Byte-Sequenz:
00000000 d9 88 d2 88 cd a5 cd a8 cd aa cd af 20 d2 88 d2 |............ ...|
00000010 88 d2 88 |...|
00000013
oder benannt:
U+0648 ARABIC LETTER WAW character (و)
U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
U+0365 COMBINING LATIN SMALL LETTER I character (ͥ)
U+0368 COMBINING LATIN SMALL LETTER C character (ͨ)
U+036A COMBINING LATIN SMALL LETTER H character (ͪ)
U+036F COMBINING LATIN SMALL LETTER X character (ͯ)
U+0020 SPACE character
U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
U+0488 COMBINING CYRILLIC HUNDRED THOUSANDS SIGN character (҈)
Der Bug ist Apple bekannt und man arbeitet dort hoffentlich an einem baldigen Fix. Sicherheitsrelevant dürfte das ganze jedoch nicht sein, weil OS X endlich mit Stack Guards und ASLR arbeitet, aber schön ist natürlich auch ein solcher DoS nicht. Bis es einen Fix gibt, empfehle ich, lieber Firefox und iTerm zu nutzen.
Sorry für die Crashes.
Imperiale Order 1:261 405, p.281ff
— Großmoff Tarski,