So prüfst du, dass Comoji deine Tastenanschläge nirgendwohin sendet
Comoji bringt kostenlose :emoji:-Autovervollständigung im Slack-Stil in jede App auf deinem Mac.
Comoji verlangt Bedienungshilfen und Eingabeüberwachung, die zwei weitreichendsten Berechtigungen, die macOS kennt. Wir sagen, dass alles lokal verarbeitet und nichts, was du tippst, jemals hochgeladen wird. Jemand auf Reddit hat den naheliegenden Einwand gut auf den Punkt gebracht: Er glaube uns im Großen und Ganzen, aber es fühle sich trotzdem seltsam an, diese Berechtigungen nur auf unser Wort hin zu erteilen.
Der Einwand ist berechtigt, und die Antwort sollte nicht „vertrau uns einfach mehr“ lauten. Dieser Beitrag ist die Anleitung: Jeder Befehl unten liest nur, dauert etwa fünf Minuten und lässt dich auf deinem eigenen Rechner bestätigen, was Comoji im Netzwerk tut und was nicht. Die Referenzfassung von allem, einschließlich der vollständigen Liste der Hosts, steht auf der Sicherheitsseite.
Was du eigentlich prüfst
Ein Keylogger muss mit dem, was er aufzeichnet, etwas anfangen. Er schickt es irgendwohin oder schreibt es irgendwohin. Das ist eine kleine, konkrete Behauptung, die sich testen lässt, und macOS bringt die Werkzeuge dafür mit: Du kannst jeden Netzwerk-Socket auflisten, den ein Prozess offen hat, jedes gesendete Byte zählen, die Hostnamen auslesen, die in die ausgelieferte Binärdatei eingebaut sind, und den Netzwerkzugriff komplett sperren, um zu sehen, was dann kaputtgeht.
Nichts davon ist speziell für Comoji. Wende genau dieselben Schritte auf jede Mac-App an, die diese Berechtigungen verlangt, unsere eingeschlossen. Genau darum geht es.
Bevor du anfängst
Lass Comoji laufen und öffne Terminal (Applications → Utilities → Terminal, im deutschen Finder „Programme“ → „Dienstprogramme“ → „Terminal“). Jeder Befehl unten ist eine reine Leseprüfung: Nichts wird installiert, geändert oder gelöscht. Wenn du einen Entwicklungs-Build installiert hast, heißt der Prozess ComojiDev, und du setzt das überall dort ein, wo Comoji steht.
Prüf zuerst, ob die App läuft, und hol dir ihre Prozess-ID:
pgrep -x ComojiDu solltest eine Zahl zurückbekommen. Kommt nichts, läuft Comoji nicht (es ist eine Menüleisten-App, also schau in die Menüleiste und nicht ins Dock).
Schritt 1: Netzwerkverbindungen beobachten, während du tippst
lsof listet offene Dateien auf, und auf einem Unix-System ist ein Netzwerk-Socket eine Datei. Eingeschränkt auf Comojis Prozess-ID zeigt es jede Verbindung, die die App gerade offen hat:
lsof -nP -i -a -p "$(pgrep -x Comoji)"Das erwartete Ergebnis ist überhaupt keine Ausgabe. Eine leere Antwort bedeutet, dass der Prozess keine Netzwerkverbindungen hält. Jetzt tipp etwas: Öffne Nachrichten, lös ein paar Vervollständigungen mit :fire, :tada und :liz aus, schreib ein, zwei Absätze und führ den Befehl dann erneut aus. Immer noch leer.
Eine einzelne Momentaufnahme könnte theoretisch eine Verbindung verpassen, die zwischen zwei Prüfungen auf- und wieder zugeht, also beobachte lieber dauerhaft. Füg das in ein freies Terminal-Fenster ein und lass es laufen, während du deinen Mac ganz normal benutzt:
while :; do
printf '%s ' "$(date +%T)"
lsof -nP -i -a -p "$(pgrep -x Comoji)" | tail -n +2 | awk '{print $9}' | paste -sd' ' -
echo
sleep 2
doneDu bekommst alle zwei Sekunden einen Zeitstempel und nichts dahinter, egal wie viel du tippst. Drück Control-C zum Beenden.
Dann, während die Schleife noch läuft, tu etwas, das das Netzwerk nutzen *soll*: Tipp in Nachrichten /gif und such nach etwas. Jetzt erscheinen api.giphy.com und ein CDN-Host von giphy.com neben den Zeitstempeln. Dieser Kontrast ist der nützliche Teil des Tests. Er beweist, dass die Schleife dir eine Verbindung gezeigt hätte, wenn es eine gegeben hätte, und die leeren Zeilen beim Tippen bedeuten also genau das, wonach sie aussehen.
Schritt 2: die Bytes zählen
nettop erfasst den kumulierten Datenverkehr pro Prozess und erwischt deshalb auch alles, was für eine Stichprobe zu kurz wäre:
nettop -P -p "$(pgrep -x Comoji)"Lass es offen, tipp ein paar Minuten lang und halte dich von den Pickern /gif und /sticker fern. Die Spalten bytes_in und bytes_out bleiben auf null. Drück q zum Beenden.
Schritt 3: die Hostnamen aus der heruntergeladenen App auslesen
Ein Prozess kann sich nur mit Zielen verbinden, die er kennt, und Hostnamen müssen in der Binärdatei gespeichert sein. strings holt lesbaren Text aus einer kompilierten Datei, sodass du sie ganz ohne Quellcode auflisten kannst:
strings -a /Applications/Comoji.app/Contents/MacOS/Comoji \
| grep -Eo 'https?://[A-Za-z0-9._-]+' | sort -u
/usr/libexec/PlistBuddy -c 'Print :SUFeedURL' \
/Applications/Comoji.app/Contents/Info.plistHeraus kommen Googles CDN für Sticker-Grafiken (fonts.gstatic.com), der Update-Feed in Firebase Storage (storage.googleapis.com) und eine Handvoll Adressen von comoji.io und anderen Projekten, die immer nur an deinen Browser übergeben werden, wenn du in der App auf einen Link klickst.
Zwei ehrliche Einschränkungen, damit das hier zu dem passt, was du wirklich siehst, und keine geschönte Fassung ist. api.giphy.com wird im Code aus dem Hostnamen zusammengesetzt und nicht als vollständige URL gespeichert, taucht in der ersten Liste also nicht auf; such direkt danach mit strings -a … | grep -Eo '[a-z0-9.-]*giphy\.com', einem Muster, das nur Hostnamen trifft und deshalb nicht den API-Schlüssel ausgibt, der ebenfalls im Bundle steckt. Und das mitgelieferte Update-Framework Sparkle bringt in Contents/Frameworks seine eigenen Dokumentations-URLs mit (sparkle-project.org, andymatuschak.org). Das sind Strings in einer Drittanbieter-Bibliothek, keine Hosts, die Comoji kontaktiert.
Schritt 4: sperren und schauen, was kaputtgeht
Das ist der stärkste Test, weil er nicht davon abhängt, irgendeiner Ausgabe zu vertrauen. Installier eine Firewall für ausgehende Verbindungen: LuLu ist kostenlos und Open Source, und Little Snitch ist die bewährte kommerzielle Option. Lass dich bei jeder ausgehenden Verbindung benachrichtigen und verweigere dann alles von Comoji, dauerhaft.
Die Emoji-Autovervollständigung funktioniert weiter genau wie vorher, unbegrenzt, weil sie das Netzwerk nie gebraucht hat. Das Einzige, was nicht mehr funktioniert, sind die Update-Prüfung und das Herunterladen von Sticker- oder GIF-Grafiken, die noch nicht im Cache liegen. Wäre die Behauptung „lokal“ falsch, würde sie genau hier auffliegen, und zwar laut.
Schritt 5: prüfen, dass die App wirklich von uns stammt
Alles oben testet die Kopie auf deiner Festplatte. Es lohnt sich zu bestätigen, dass diese Kopie die von Apple notarisierte ist und niemand sie seitdem verändert hat:
codesign -dv --verbose=4 /Applications/Comoji.app
spctl -a -vvv -t exec /Applications/Comoji.app
codesign -d --entitlements - /Applications/Comoji.appcodesign gibt die Developer ID aus, mit der die App signiert ist, spctl sollte mit accepted und source=Notarized Developer ID antworten, und die Ausgabe der Entitlements zeigt, was die App überhaupt tun darf.
Was wir auf unserer Seite tun
Eine Prüfung, die du selbst durchführen kannst, ist mehr wert als ein Versprechen, aber das Versprechen sollte auch irgendwo erzwungen werden. Bei jedem Build der App laufen zwei Dinge:
- Die vollständige Liste der Hosts, die Comoji kontaktieren darf, ist eine Deklaration im Quellcode, veröffentlicht als die Netzwerkoberfläche und in der App unter Einstellungen → Datenschutz zu sehen. Ein automatisierter Test lässt den Build scheitern, wenn die App einen Host erreichen kann, den diese Liste nicht offenlegt.
- Ein zweiter Test durchsucht den Code, der tatsächlich mit Tastenanschlägen umgeht (den Event-Tap, den Token-Puffer, den Matcher und den Inserter), und lässt den Build scheitern, wenn darin irgendeine Netzwerk-API oder eine entfernte URL auftaucht. Der Teil von Comoji, der sieht, was du tippst, enthält keinerlei Netzwerkfunktionen und kann sich auch nicht heimlich welche zulegen.
Dieselbe Seite hält auch fest, was wir bewusst *nicht* tun und warum, darunter die Offenlegung des Eingabepfads als Open Source und eine bezahlte Prüfung durch Dritte. So kannst du die Begründung abwägen, statt raten zu müssen.
Wenn du etwas davon ausführst und etwas findest, das unseren Angaben widerspricht, schreib an support@comoji.io. Wir korrigieren lieber die Seite oder die App, als dass die Behauptung still und leise falsch ist.
Was die App tatsächlich mit diesen Berechtigungen macht, erklärt die Funktionsseite: jede App und Website, in der Comoji funktioniert, und die Listen zum Deaktivieren pro App und pro Website, mit denen Comoji dort stumm bleibt, wo es gar nicht laufen soll.
Häufige Fragen
Wie erkenne ich, ob eine Mac-App meine Tastenanschläge irgendwohin sendet?
Führ lsof -nP -i -a -p "$(pgrep -x AppName)" in Terminal aus, um die Netzwerkverbindungen aufzulisten, die die App gerade offen hat, und nettop -P -p "$(pgrep -x AppName)", um die insgesamt gesendeten und empfangenen Bytes zu sehen. Für einen eindeutigen Test installierst du eine Firewall für ausgehende Verbindungen wie LuLu oder Little Snitch, sperrst die App komplett und prüfst, ob ihre Funktionen noch laufen.
Lädt Comoji hoch, was ich tippe?
Nein. Comoji hat kein Konto, keine Telemetrie, keine Analyse und keinen Absturzberichter. Tastenanschläge liegen nur kurz in einem Puffer im Arbeitsspeicher, um einen Kurzbefehl mit Doppelpunkt zu erkennen, und werden nie auf die Festplatte geschrieben oder übertragen. Die App kontaktiert genau vier Hosts: den Update-Feed, Googles CDN für Sticker-Grafiken sowie die GIPHY-API und das GIPHY-CDN, wenn du den /gif-Picker nutzt.
Warum braucht Comoji Bedienungshilfen und Eingabeüberwachung?
Mit der Eingabeüberwachung bemerkt Comoji, wenn du einen Kurzbefehl wie :fire tippst. Mit den Bedienungshilfen findet es das fokussierte Textfeld und die Position der Einfügemarke, damit das Popup an der richtigen Stelle erscheint, und tippt das Emoji in dieses Feld zurück. Keine der beiden wird genutzt, um den Inhalt deiner Textfelder zu lesen, und sichere Passwortfelder werden vollständig ignoriert.
Ist Comoji Open Source?
Derzeit nicht. Die Sicherheitsseite auf comoji.io hält diese Entscheidung samt Begründung fest, veröffentlicht die vollständige Netzwerkoberfläche und liefert Schritt-für-Schritt-Befehle, mit denen du die Behauptung der lokalen Verarbeitung an der notarisierten Binärdatei prüfen kannst, die du heruntergeladen hast.
Comoji kostenlos für Mac laden
:emoji:-Autovervollständigung im Stil von Slack und Discord, überall auf deinem Mac. Kostenlos.