Comment vérifier que Comoji n’envoie jamais vos frappes nulle part
Comoji ajoute gratuitement l’autocomplétion :emoji: façon Slack à toutes les apps de votre Mac.
Comoji demande les autorisations Accessibilité et Surveillance de l’entrée, les deux plus intrusives de macOS. Nous affirmons que tout est traité localement et que rien de ce que vous tapez n’est jamais envoyé. Quelqu’un sur Reddit a bien résumé l’objection évidente : il nous croyait plutôt, mais il trouvait quand même étrange de céder ces autorisations sur notre seule parole.
C’est une objection légitime, et la réponse ne devrait pas être « faites-nous encore plus confiance ». Cet article est le tutoriel : chaque commande ci-dessous est en lecture seule, prend environ cinq minutes et vous permet de confirmer sur votre propre machine ce que Comoji fait, et ne fait pas, sur le réseau. La version de référence de tout cela, y compris la liste complète des hôtes, se trouve sur la page sécurité.
Ce que vous vérifiez réellement
Un enregistreur de frappe doit bien faire quelque chose de ce qu’il capture. Il l’envoie quelque part, ou il l’écrit quelque part. C’est une affirmation concrète et limitée, facile à tester, et macOS fournit les outils pour le faire : vous pouvez lister chaque socket réseau qu’un processus a ouvert, compter chaque octet qu’il a envoyé, lire les noms d’hôte intégrés au binaire tel qu’il a été livré, et lui couper complètement l’accès au réseau pour voir ce qui casse.
Rien de tout cela n’est propre à Comoji. Appliquez exactement les mêmes étapes à n’importe quelle app Mac qui demande ces autorisations, la nôtre comprise. C’est tout l’intérêt.
Avant de commencer
Lancez Comoji et ouvrez Terminal (Applications → Utilities → Terminal). Chaque commande ci-dessous est une inspection en lecture seule : rien n’est installé, modifié ni supprimé. Si vous avez installé une version de développement, le processus s’appelle ComojiDev et vous devez le substituer partout où Comoji apparaît.
D’abord, vérifiez qu’il tourne et récupérez son identifiant de processus :
pgrep -x ComojiVous devriez obtenir un nombre. Si rien ne s’affiche, Comoji n’est pas lancé (c’est une app de barre des menus : regardez dans la barre des menus plutôt que dans le Dock).
Étape 1 : observer ses connexions réseau pendant que vous tapez
lsof liste les fichiers ouverts, et sur un système Unix un socket réseau est un fichier. Limité à l’identifiant de processus de Comoji, il affiche chaque connexion que l’app a ouverte à cet instant :
lsof -nP -i -a -p "$(pgrep -x Comoji)"Le résultat attendu est aucune sortie. Une réponse vide signifie que le processus ne détient aucune connexion réseau. Maintenant, tapez : ouvrez Messages, enchaînez quelques complétions :fire, :tada et :liz, écrivez un paragraphe ou deux, puis relancez la commande. Toujours vide.
Un instantané pourrait en théorie rater une connexion qui s’ouvre et se ferme entre deux vérifications ; observez donc en continu. Collez ceci dans une fenêtre Terminal libre et laissez-le tourner pendant que vous utilisez votre Mac normalement :
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
doneVous obtenez un horodatage toutes les deux secondes, sans rien derrière, quelle que soit la quantité de texte tapée. Appuyez sur Control-C pour arrêter.
Ensuite, pendant que la boucle tourne encore, faites quelque chose qui est *censé* utiliser le réseau : tapez /gif dans Messages et lancez une recherche. Vous verrez alors api.giphy.com et un hôte CDN giphy.com apparaître à côté des horodatages. C’est ce contraste qui fait l’intérêt du test. Il prouve que la boucle vous aurait montré une connexion s’il y en avait eu une, et que les lignes vides pendant votre saisie signifient bien ce qu’elles semblent signifier.
Étape 2 : compter les octets
nettop suit le trafic cumulé par processus, il repère donc tout ce qui serait trop bref pour une vérification par échantillonnage :
nettop -P -p "$(pgrep -x Comoji)"Laissez-le ouvert, tapez pendant quelques minutes et tenez-vous à l’écart des sélecteurs /gif et /sticker. Les colonnes bytes_in et bytes_out restent à zéro. Appuyez sur q pour quitter.
Étape 3 : lire les noms d’hôte dans l’app téléchargée
Un processus ne peut se connecter qu’à un endroit qu’il connaît, et les noms d’hôte doivent être stockés dans le binaire. strings extrait le texte lisible d’un fichier compilé, ce qui permet de les lister sans aucun code source :
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.plistVous obtenez le CDN des illustrations de stickers de Google (fonts.gstatic.com), le flux de mises à jour dans Firebase Storage (storage.googleapis.com), et une poignée d’adresses de comoji.io et d’autres projets qui ne sont jamais transmises qu’à votre navigateur, quand vous cliquez sur un lien dans l’app.
Deux réserves honnêtes, pour que cela corresponde à ce que vous voyez réellement plutôt qu’à une version embellie. api.giphy.com est construit dans le code à partir de son nom d’hôte au lieu d’être stocké comme URL complète : il n’apparaîtra donc pas dans cette première liste. Cherchez-le directement avec strings -a … | grep -Eo '[a-z0-9.-]*giphy\.com', un motif qui ne correspond qu’aux noms d’hôte et n’affichera donc pas la clé d’API également livrée dans le paquet. Par ailleurs, le framework de mise à jour Sparkle intégré contient ses propres URL de documentation (sparkle-project.org, andymatuschak.org) dans Contents/Frameworks : ce sont des chaînes d’une bibliothèque tierce, pas des hôtes que Comoji contacte.
Étape 4 : le bloquer et voir ce qui casse
C’est le test le plus solide, car il ne dépend d’aucune sortie à laquelle il faudrait se fier. Installez un pare-feu sortant : LuLu est gratuit et open source, et Little Snitch est l’option commerciale de longue date. Réglez-le pour qu’il vous alerte à chaque connexion sortante, puis refusez tout à Comoji, définitivement.
L’autocomplétion des emoji continue de fonctionner exactement comme avant, indéfiniment, parce qu’elle n’a jamais eu besoin du réseau. Les seules choses qui cessent de fonctionner sont la recherche de mises à jour et le téléchargement des illustrations de stickers ou de GIF que vous n’avez pas encore en cache. Si l’affirmation sur le traitement local était fausse, c’est ici que tout s’effondrerait, bruyamment.
Étape 5 : confirmer que l’app est bien la nôtre
Tout ce qui précède teste la copie présente sur votre disque. Il vaut la peine de confirmer que cette copie est bien celle qu’Apple a notarisée et que personne ne l’a modifiée depuis :
codesign -dv --verbose=4 /Applications/Comoji.app
spctl -a -vvv -t exec /Applications/Comoji.app
codesign -d --entitlements - /Applications/Comoji.appcodesign affiche le Developer ID avec lequel l’app est signée, spctl doit répondre accepted avec source=Notarized Developer ID, et la liste des entitlements montre ce que l’app est autorisée à faire, tout simplement.
Ce que nous faisons de notre côté
Une vérification que vous pouvez faire vaut mieux qu’une promesse, mais la promesse doit aussi être garantie quelque part. Deux contrôles s’exécutent à chaque build de l’app :
- La liste complète des hôtes que Comoji peut contacter est une déclaration dans le code source, publiée sous le nom de surface réseau et affichée dans l’app sous Préférences → Confidentialité. Un test automatisé fait échouer le build si l’app peut joindre un hôte que cette liste ne mentionne pas.
- Un second test analyse le code qui traite réellement les frappes (l’interception d’événements, le tampon de jetons, le moteur de correspondance et le module d’insertion) et fait échouer le build si une API réseau ou une URL distante y apparaît. La partie de Comoji qui voit ce que vous tapez ne contient absolument aucun code réseau, et ne peut pas en acquérir discrètement.
Cette même page consigne aussi ce que nous avons décidé de *ne pas* faire et pourquoi, notamment rendre open source le chemin de saisie et commander un audit payant par un tiers, pour que vous puissiez juger le raisonnement au lieu de le deviner.
Si vous lancez l’une de ces commandes et trouvez quelque chose qui contredit ce que nous publions, écrivez à support@comoji.io. Nous préférons corriger la page ou l’app plutôt que de laisser l’affirmation être fausse en silence.
Pour ce que l’app fait réellement de ces autorisations, la page des fonctionnalités présente toutes les apps et tous les sites où Comoji fonctionne ainsi que les listes de désactivation par app et par site web, qui le font taire là où vous préférez qu’il ne s’exécute pas du tout.
Questions fréquentes
Comment savoir si une app Mac envoie mes frappes quelque part ?
Lancez lsof -nP -i -a -p "$(pgrep -x AppName)" dans Terminal pour lister les connexions réseau que l’app a ouvertes à cet instant, et nettop -P -p "$(pgrep -x AppName)" pour voir le cumul des octets envoyés et reçus. Pour un test décisif, installez un pare-feu sortant comme LuLu ou Little Snitch, bloquez complètement l’app et vérifiez si ses fonctionnalités marchent encore.
Comoji envoie-t-il ce que je tape ?
Non. Comoji n’a ni compte, ni télémétrie, ni outil d’analyse, ni rapport de plantage. Les frappes sont conservées dans un tampon éphémère en mémoire uniquement pour détecter un raccourci commençant par deux-points, et ne sont jamais écrites sur le disque ni transmises. L’app contacte exactement quatre hôtes : le flux de mises à jour, le CDN des illustrations de stickers de Google, ainsi que l’API et le CDN de GIPHY quand vous utilisez le sélecteur /gif.
Pourquoi Comoji a-t-il besoin d’Accessibilité et de Surveillance de l’entrée ?
Surveillance de l’entrée lui permet de remarquer quand vous tapez un raccourci comme :fire. Accessibilité lui permet de trouver le champ de texte actif et la position du curseur pour afficher la fenêtre au bon endroit, puis de taper l’emoji dans ce champ. Aucune des deux ne sert à lire le contenu de vos champs de texte, et les champs de mot de passe sécurisés sont entièrement ignorés.
Comoji est-il open source ?
Pas pour le moment. La page sécurité de comoji.io consigne cette décision et son raisonnement, publie l’intégralité de la surface réseau et donne les commandes, étape par étape, pour vérifier le traitement local sur le binaire notarisé que vous avez téléchargé.
Téléchargez Comoji gratuitement pour Mac
L’autocomplétion :emoji: façon Slack et Discord, partout sur votre Mac. Gratuit.