Sicherheitsmodell: was sim gegen jede Bedrohung tut
sim ist um eine Frage herum gebaut: Was darf eine Datei, ein Ordner oder ein Repository, das Sie nicht geschrieben haben, mit Ihnen anstellen? Diese Seite ist das Bedrohungsmodell und zeigt, was sim bei jeder Bedrohung tut.
Bedrohungsmodell
Sie öffnen Dateien und Repositories, die Sie nicht geschrieben haben: einen Klon, ein entpacktes Archiv, einen Pull-Request-Checkout, eine Datei, die ein anderer Prozess schreibt. Der Angreifer kontrolliert deren Inhalt, nicht Ihren Rechner. sim versucht sicherzustellen, dass sich dieser Inhalt nicht vor Ihnen verstecken, den Editor nicht umkonfigurieren und den Editor nicht dazu bringen kann, Code auszuführen.
Annahmen
- Sie vertrauen Ihrem eigenen Terminal, Ihrem eigenen Benutzerkonto und Ihrer eigenen globalen git-Konfiguration.
- Der Angreifer kann jede Datei in einem Repository ändern, einschließlich .git/config und der Dateien neben der, die Sie öffnen.
- Der Angreifer kann weder sim selbst noch Ihr Home-Verzeichnis ändern.
Bedrohungen und was sim tut
Bidirektionale Steuerzeichen (Trojan Source)
Die Bedrohung
Unicode-Steuerzeichen ändern die Reihenfolge, in der Code angezeigt wird, sodass der Code, den ein Reviewer liest, nicht der Code ist, den ein Compiler liest (CVE-2021-42574). Der Rat der Forscher an Editoren lautet, diese Zeichen wahrnehmbar zu machen.[1] [2] [3]
Was sim tut
U+200E–200F, U+202A–202E, U+2066–2069 und U+061C werden als
<U+202E>auf einem magentafarbenen Block gezeichnet und nie roh an das Terminal gesendet. Der Block hält in jedem Zustand, in dem sich eine Zelle befinden kann: ausgewählt, von einer Suche getroffen, in der Cursorzeile, innerhalb einer Änderung von außen, im Nebel einer weit entfernten Zeile, in einer Überschrift oder einem Codeblock. Der in eine Datei getippte wörtliche Text<U+202E>ist gewöhnlicher Text und bekommt keinen Block.Spezifikation: SAFE-8, UI-15
Unsichtbare Zeichen und Leerraum
Die Bedrohung
Viele Unicode-Zeichen zeichnen gar nichts. Eine Folge von Tag-Zeichen, die ASCII spiegeln, kann eine versteckte Anweisung an einen KI-Assistenten tragen, der die Datei liest („ASCII smuggling“); laut Standard selbst wird eine Darstellung, die Tags nicht kennt, „display any sequence of tag characters as invisible“ (jede Folge von Tag-Zeichen unsichtbar anzeigen). Eine Folge von Variantenselektoren kann ein Programm tragen: Eines versteckte eine Nutzlast in veröffentlichten VS-Code-Erweiterungen (GlassWorm). Füllzeichen, weiche Trennstriche, Joiner und Zeilentrenner können in einem Bezeichner oder Kommentar stehen und nichts ändern, was Sie sehen. Ein Leerzeichen mit Breite null, eine Byte-Order-Mark mitten in einer Datei, ein geschütztes Leerzeichen oder Leerzeichen am Zeilenende ändern auf dieselbe Weise, was eine Datei bedeutet oder wie sich ein Diff liest.[4] [5] [6] [7] [8] [9]
Was sim tut
U+200B und U+FEFF an jeder Stelle außer dem Dateianfang werden als
<U+200B>und<U+FEFF>gezeichnet. Ein geschütztes Leerzeichen wird als⍽gezeichnet, Leerzeichen am Zeilenende als·und Tabulatoren als».Jedes Zeichen, das nichts zeichnet, wird auf dieselbe Weise gezeigt, als
<U+E0041>auf dem magentafarbenen Block, im Text, in der Statuszeile, in Meldungen und in der Befehlszeile sowie in den Namen und Zeilen, die aus Dateien kommen (Dateibaum, Tabs, Breadcrumb-Leiste und Suchergebnisse): Formatzeichen, Tag-Zeichen, Variantenselektoren, Hangul-Füllzeichen, der weiche Trennstrich, der Combining Grapheme Joiner, U+2028 und U+2029 und jeder Codepunkt, den Unicode 18.0.0 nicht zugewiesen hat. Das bleibt, wie es ist: ein Zero-Width-Joiner zwischen zwei Emojis, ein Variantenselektor nach einem Piktogramm, die drei Flaggen von England, Schottland und Wales und Zeichen aus dem privaten Bereich (die Symbole einer Nerd Font); dieselben Zeichen an anderer Stelle werden gezeigt. Der Preis: Folgt auf ein Kanji ein ideografischer Variantenselektor (eine registrierte Möglichkeit, eine Glyphenform eines Kanji zu wählen), zeigt sim den Selektor,葛<U+E0100>, weil dasselbe Zeichen ein Kanal zum Verstecken von Daten ist; das trifft vor allem japanischen Text. Die Unicode-Empfehlung für Quelltexteditoren rät zu „an option to make visible any default ignorable code points“ (einer Option, standardmäßig ignorierte Codepunkte sichtbar zu machen); sim hat keine solche Option und zeigt sie immer.[10] [6] [11] [12] [13]Spezifikation: SAFE-8, SAFE-10, SAFE-11, UI-6
Terminal-Escape-Sequenzen in Dateien und Dateinamen
Die Bedrohung
Steuerzeichen in einer Datei oder in einem Dateinamen können als Escape-Sequenzen das Terminal erreichen.
Was sim tut
C0-Zeichen und DEL werden als
^[gezeichnet, C1-Zeichen als<U+0085>. Nichts Rohes wird ins Terminal geschrieben, und Tests prüfen die gesendeten Bytes.Steuer- und bidirektionale Zeichen in Dateinamen werden in denselben Formen gezeichnet,
^[und<U+202E>, im Dateibaum, in den Tabs, in der Breadcrumb-Leiste, in Suchergebnissen und im Picker; v0.1.0 zeichnete sie als U+FFFD.Spezifikation: SAFE-8, SAFE-10, TREE-1, GREP-7
In einer Datei versteckte Einstellungen (Modelines)
Die Bedrohung
Ein Kommentar in einer Datei kann Editoroptionen setzen, und Fehler in diesem Mechanismus haben zu Codeausführung geführt: CVE-2019-12735 (Vim und Neovim) und CVE-2026-34982 (Vim).[14] [15] [16]
Was sim tut
Einstellungen und Befehle werden nie aus Dateiinhalten gelesen. Es gibt keine Modeline, die sich umgehen ließe.
Spezifikation: SAFE-9
Projektlokale Konfiguration
Die Bedrohung
Ein Projektverzeichnis kann Konfiguration mitbringen, die ein Editor lädt und ausführt:
exrc-Dateien in Vim und Neovim,.helix/config.tomlin Helix.[17] [18] [19]Was sim tut
sim hat keine Konfigurationsdateien, keine Plugins und keine projektlokale Konfiguration, die sich laden ließe. Gemerkt werden nur Ihre Wahl von Look, Icons und Markdown-Ansicht, je ein Wort, im State-Verzeichnis von sim.
Spezifikation: SAFE-9, LOOK-1
Repository-Konfiguration, die Befehle ausführt
Die Bedrohung
git führt Befehle aus, die in der eigenen
.git/configeines Repositorys genannt sind.core.fsmonitornennt einen Hook, den git-Befehle wiegit statusaufrufen, und ein Filtertreiber nennt Programme, die auf den Inhalt einer Datei angewendet werden. Ein Editor, der git nach dem Status eines gerade entpackten Repositorys fragt, kann sie auslösen.[20] [21] [22]Was sim tut
sim fragt git zuerst nach der Konfiguration des Repositorys. Was eine Befehlszeile stoppen kann, wird abgeschaltet (
core.fsmonitor, Hooks, Filter, ein externes Diff, eine Textumwandlung), und git antwortet. Definieren die eigenen Geltungsbereiche des Repositorys etwas anderes, das einen Befehl enthalten kann (core.sshCommand, ein Include, der einen mitbringen könnte), wird git nicht ausgeführt. Läuft git, dann ohne Shell, mit--no-optional-locksund in einer Umgebung, die jedes Abholen verhindert. sim führt keinen schreibenden git-Befehl aus, also läuft kein Hook. Der Dateibaum sagtn git settings offodergit not run, und die Statuszeile nennt den Schlüssel und wo er steht.Spezifikation: MARK-1, GIT-1, GIT-2, GIT-3, GIT-5
Suche, die den Code des Repositorys ausführt
Die Bedrohung
ripgrep übernimmt zusätzliche Flags aus einer in der Umgebung genannten Konfigurationsdatei und kann für jede gelesene Datei einen Befehl ausführen (
--pre).[23]Was sim tut
sim findet ripgrep in den absoluten Einträgen von
PATH, startet es mit vollem Pfad, leerer Umgebung und--no-configund übergibt nie--pre. Suchanfrage und Dateien stehen hinter-eund--, sodass keine davon eine Option sein kann.Spezifikation: GREP-7, GREP-8
Links, die aus dem Projekt hinausführen
Die Bedrohung
Ein Symlink kann aus dem Projekt hinauszeigen, und in einem gemeinsam genutzten Verzeichnis kann ein Link untergeschoben sein, dem ein Speichern folgen soll.
Was sim tut
Suche und Vorschau lesen nur reguläre Dateien, deren echter Pfad unterhalb der Projektwurzel liegt. Ein Speichern weigert sich, durch einen Link zu schreiben, der weder Ihnen noch root gehört, und zwar in jeder Komponente des Pfads.
Spezifikation: SAFE-1, GREP-7
Von außen neu geschriebene Dateien
Die Bedrohung
Ein Build, ein Formatierer oder ein Tool schreibt die Datei neu, die Sie geöffnet haben. Beim Speichern überschreiben Sie dann dessen Arbeit, oder dessen Arbeit überschreibt Ihre.
Was sim tut
sim bemerkt es, markiert, was sich geändert hat, und vergleicht unmittelbar vor dem rename den Hash der Datei mit dem beim Laden. Weichen sie ab, wird nichts geschrieben.
Eine Änderung, die eintrifft, während ein Speichervorgang geschrieben wird, wartet jetzt auf die Antwort des Speicherns und kann deshalb nicht über den Text gemischt werden, der gerade gespeichert wird. Ein seltenes Race, gefunden am 2026-10-18, konnte in v0.1.0 eine Zeile verlieren.
Spezifikation: DISK-1, DISK-2, SAFE-5, SAFE-7
Abstürze und geschlossene Terminals
Die Bedrohung
Ein Absturz,
kill -9oder ein geschlossenes Terminal verliert ungespeicherten Text.Was sim tut
Ungespeicherter Text wird höchstens einmal pro Sekunde als Snapshot in einem privaten State-Verzeichnis gesichert und als ein Undo-Schritt wieder angeboten. Das Verzeichnis muss ein echtes, Ihnen gehörendes Verzeichnis ohne Zugriff für andere sein; andernfalls sind Snapshots aus, und sim sagt es.
Spezifikation: SAFE-6
Dateien, die kein Text sind
Die Bedrohung
Binäre oder nicht-UTF-8-Inhalte, als Text angezeigt, können verbergen, was eine Datei enthält, und durch ein Speichern beschädigt werden.
Was sim tut
Solche Dateien werden schreibgeschützt geöffnet, mit angezeigtem Grund. Ungültige Bytes werden als U+FFFD gezeichnet, und jede Art von Schreiben wird abgelehnt.
Spezifikation: SAFE-4
Was sim nicht tut
- sim ist keine Sandbox. Es läuft mit Ihren Rechten. Ein verstecktes Zeichen anzuzeigen hindert Sie nicht daran, den Code auszuführen, den es verbirgt.
- Seine Zeichenliste ist fest: die Tabelle von Unicode 18.0.0. Ein Codepunkt, den eine spätere Version zuweist, wird als verborgen gezeigt, bis die Tabelle neu erzeugt wird. Es ist keine vollständige Prüfung der Unicode-Confusables (UTR #36), und ähnlich aussehende Buchstaben aus anderen Schriften (Homoglyphen, die andere Hälfte von Trojan Source) gehören nicht zu dem, was die Dokumentation beschreibt.
- Die letzte Prüfung vor dem Speichern vergleicht den Stempel der Datei und deren Hash nur, wenn sich der Stempel bewegt hat. Ein Schreibvorgang in derselben Mikrosekunde oder ein Umschreiben gleicher Größe innerhalb eines Zeitstempel-Ticks eines Dateisystems mit grober Zeitauflösung kann trotzdem durchrutschen.
- Alles auf dieser Seite stammt aus der eigenen Spezifikation und den Tests des Projekts. In der Dokumentation wird kein unabhängiges Audit angeführt.
- Language Server sind noch nicht gebaut. Ein Language Server in einer Sandbox steht in der Roadmap unten.
Roadmap: Language Server
Geplant
Ein Language Server ist ein Programm, das ein Projekt von Ihrem Editor starten lassen kann, und damit einer der größten Wege, auf denen ein Repository Code ausführen kann. sim hat noch keinen. Geplant sind ein Client in einer Sandbox und eine Anzeige in der Statuszeile, ob die Projektwurzel vertrauenswürdig ist. Es ist geplant, nicht ausgeliefert.
Quellen
- NVD: CVE-2021-42574 (bidirectional control characters, “Trojan Source”)
- Boucher and Anderson, Trojan Source: Invisible Vulnerabilities (USENIX Security 2023)
- Unicode Standard Annex #9: Unicode Bidirectional Algorithm
- Unicode Technical Report #36: Unicode Security Considerations
- Johann Rehberger, ASCII Smuggler Tool: Crafting Invisible Text and Decoding Hidden Codes (Embrace The Red, 14 January 2024)
- Unicode Technical Standard #51: Unicode Emoji, revision 31 (ZWJ sequences, emoji tag sequences, Annex C)
- Paul Butler, Smuggling arbitrary data through an emoji (8 February 2025)
- Koi Security, GlassWorm: First Self-Propagating Worm Using Invisible Code Hits OpenVSX Marketplace (18 October 2025; the original address now redirects elsewhere, so this is the Internet Archive's copy)
- Endor Labs, Invisible Threats and the Blind Spots of Security (an analysis of GlassWorm)
- The Unicode Standard 18.0, chapter 23, Special Areas and Format Characters (§23.4 Variation Selectors, §23.9 Tag Characters)
- Unicode Technical Standard #55: Unicode Source Code Handling, revision 5 (§4.2 Blank and Invisible Characters)
- Unicode Technical Standard #37: Unicode Ideographic Variation Database, revision 16 (ideographic variation sequences)
- Unicode Ideographic Variation Database: the registered collections (Adobe-Japan1, Hanyo-Denshi, Moji_Joho and others)
- NVD: CVE-2019-12735 (Vim before 8.1.1365 and Neovim before 0.3.6, modeline)
- NVD: CVE-2026-34982 (Vim before 9.2.0276, modeline sandbox bypass)
- Vim security advisory GHSA-8h6p-m6gr-mpw9 (modeline sandbox bypass)
- Vim 9.2.1202, runtime/doc/options.txt ('modeline', 'modelinestrict', 'exrc', 'isprint', 'fsync')
- Neovim 0.12.6, runtime/doc/options.txt ('modeline', 'modelineexpr', 'exrc', 'isprint', 'fsync')
- Helix 25.07.1, book/src/configuration.md (a config.toml local to a project)
- git-config documentation (core.fsmonitor, filter.<driver>.*)
- githooks documentation (fsmonitor-watchman, post-index-change)
- Justin Steven, Git honours embedded bare repos, and exploitation via core.fsmonitor affects IDEs (2022)
- ripgrep user guide (the config file named by RIPGREP_CONFIG_PATH, --pre)