Le blog Klar

Comment vérifier ce qu’une app Mac a vraiment le droit de faire

L’App Store, TestFlight et un DMG notarisé ne garantissent pas la même chose. Ce que chacun vérifie, et la commande qui dit si une app Mac peut envoyer vos données quelque part.

Vous ne pouvez pas lire le code d’une app avant de l’installer. Personne ne le peut : tout ce qui est sur l’App Store est un binaire fermé, le nôtre compris. Ce que vous pouvez faire, c’est vérifier ce que l’app a le droit de faire, sur votre propre machine, une fois téléchargée et avant même de l’ouvrir. Sur macOS cette vérification est réelle, et elle prend une minute.

Elle est le fondement de tout ce que Klar affirme sur la confidentialité : cet article est donc aussi le mode d’emploi pour nous auditer. Les commandes de la fin fonctionnent sur n’importe quelle app Mac.

Trois façons d’arriver sur votre Mac

Klar emprunte les trois, et elles ne promettent pas la même chose. L’app gratuite est sur le Mac App Store. Les bêtas passent par TestFlight, où Klar for Messages, le filtre iPhone, ouvrira en premier. Klar Plus, le compagnon payant optionnel, sera distribué en DMG notarisé depuis ce site.

CanalCe qu’Apple faitCe qu’il ne fait pas
Mac App StoreRelit chaque version, et impose que l’app tourne dans le bac à sableDire quoi que ce soit de ce que l’app fait des données qu’elle a déjà le droit de voir
TestFlightUne relecture bêta plus légère, avec la même exigence de bac à sableRester acquis : une bêta se met à jour sur place, et une nouvelle version peut déclarer de nouvelles permissions
DMG notariséUne analyse antimalware automatique, et une signature liée à un développeur identifié par AppleImposer le bac à sable. Hors de la boutique, c’est un choix du développeur

C’est la notarisation que l’on surinterprète le plus souvent. Elle signifie qu’Apple a scanné la version à la recherche de malwares connus et sait qui l’a signée. Ce n’est pas une relecture de ce que fait l’app, et cela ne l’enferme dans aucun bac à sable.

Ce qui vous protège vraiment, c’est le bac à sable

macOS n’accorde à une app l’accès à une ressource que si elle porte l’autorisation (« entitlement ») correspondante, et ces autorisations sont incluses dans la signature de code et scellées par elle. Le guide de sécurité d’Apple le dit sans détour : parce que les autorisations font partie de la signature et sont scellées par elle, « the App Sandbox trusts that these are the resources the developer intended to request ». Modifiez le paquet et le sceau casse : l’app ne se lance plus.

Les capacités déclarées sont donc les capacités réelles. Un développeur ne peut pas déclarer « pas de réseau » et ouvrir discrètement une connexion : l’ouvrir exige l’autorisation réseau, et cette autorisation ne peut pas être cachée. C’est la liste des autorisations, et non la politique de confidentialité, qui mérite d’être lue.

La seule ligne qui compte

C’est com.apple.security.network.client. Si une app la déclare, elle peut se connecter n’importe où, et la permission ne dit rien de la destination. Si elle ne la déclare pas, macOS refuse toute connexion sortante qu’elle tente, et aucun code à l’intérieur de l’app n’y changera rien. Pour un outil qui lit votre courrier, c’est la différence entre « faites-nous confiance » et « il ne peut pas ».

Où un filtre lit votre courrier est la question jumelle de ce qu’il a le droit de faire. Nous en avons cartographié les quatre niveaux dans un article précédent.

Ce que Klar déclare

VersionSignatureAutorisation réseau
Klar, gratuit, Mac App StoreApple Distribution, bac à sable, hardened runtimeAucune, ni sur l’app ni sur l’extension Mail
Klar sur TestFlightLes mêmes réglages de compilation que la version boutiqueAucune, mais revérifiez après chaque mise à jour de la bêta
Klar Plus, DMG notariséDeveloper ID, notarisé (ticket agrafé), bac à sable, hardened runtimeOui : vérification de licence et mises à jour du modèle

L’app gratuite embarque exactement un composant chargeable, KlarMailExtension.appex, et c’est une extension Mail : inerte tant que vous ne l’activez pas dans les réglages de Mail. Aucun service en arrière-plan, aucun élément d’ouverture de session, aucun agent de lancement, rien qui démarre tout seul. Au-delà du bac à sable, elle détient une seule permission sensible, les Contacts, qui garantit que le courrier des personnes de votre carnet d’adresses n’est jamais filtré. macOS la demande, et la lecture se fait sur votre Mac.

Klar Plus est l’exception, et nous préférons l’écrire que vous laisser la découvrir. Il se vend depuis ce site plutôt que sur l’App Store, il déclare l’autorisation réseau pour une vérification de licence et le téléchargement des modèles, et il pilote Mail en AppleScript pour déplacer des messages. Aucun de ces appels réseau ne transporte votre courrier, et l’envoi d’échantillons de spam pour nous améliorer est un réglage distinct, désactivé tant que vous ne l’activez pas. Mais dès qu’une app détient l’autorisation réseau, cette autorisation cesse d’être une preuve. Il ne reste que notre parole, plus un pare-feu sortant comme Little Snitch ou LuLu si vous voulez regarder passer le trafic vous-même. La liste complète de ce qui touche au réseau est sur la page local-first.

Vérifiez vous-même, en une minute

À lancer après avoir installé Klar depuis l’App Store, avant de l’ouvrir. Coupez le réseau si vous voulez aussi fermer l’intervalle entre le téléchargement et le moment où vous regardez.

APP="/Applications/Klar.app"
EXT="$APP/Contents/PlugIns/KlarMailExtension.appex"

# 1. Who signed it. Apple re-signs what a developer uploads, so the Team ID is
#    the constant, not the authority name.
codesign -dv --verbose=4 "$APP" 2>&1 | grep -Ei 'TeamIdentifier|Authority='
#    expect: TeamIdentifier=437587CCNF
#            Authority=Apple Mac OS Application Signing  (an App Store download)
#            Authority=TestFlight Beta Distribution      (a TestFlight build)

# 2. What can run: one Mail extension, nothing that starts by itself
find "$APP/Contents" \( -name "*.appex" -o -path "*XPCServices*" \
  -o -path "*LoginItems*" -o -path "*LaunchAgents*" \)
#    expect: exactly one line, KlarMailExtension.appex

# 3. Can either one reach the network, or drive another app?
codesign -d --entitlements - "$APP" > /tmp/klar-app.ent 2>/dev/null || echo "FAILED to read the app"
codesign -d --entitlements - "$EXT" > /tmp/klar-ext.ent 2>/dev/null || echo "FAILED to read the extension"
grep -icE 'network|apple-events' /tmp/klar-app.ent /tmp/klar-ext.ent
#    expect: no FAILED line, and a count of 0 for both files

La première vérification ne nous nommera pas, et c’est normal : Apple resigne ce qu’un développeur envoie, donc un téléchargement App Store affiche Apple Mac OS Application Signing et une version TestFlight affiche TestFlight Beta Distribution. Le certificat du développeur est sur l’envoi, pas sur votre copie. Ce qui nous identifie, c’est l’identifiant d’équipe, et il reste 437587CCNF.

La troisième vérification est celle qui compte, et elle réussit en affichant un compte de 0 pour les deux fichiers. Elle compte au lieu de se fier au silence, et c’est délibéré : si codesign ne peut pas lire le paquet, une sortie vide ressemblerait exactement à un résultat propre. La commande affiche donc un nombre, et le dit franchement quand elle échoue. Tout compte non nul signifie que l’app déclare une capacité réseau ou d’automatisation, et vous revoilà à devoir croire ce qu’elle dit en faire. Si un résultat ne correspond pas, supprimez l’app : rien ne s’est encore exécuté.

Une réserve pour les bêtas : TestFlight met à jour sur place, et une nouvelle version est un nouveau paquet, qui peut déclarer de nouvelles permissions. Relancez les vérifications après une mise à jour, ou désactivez les mises à jour automatiques de TestFlight.

Le moteur est open source

Le moteur de scoring, la partie qui lit un message et renvoie un score de spam, est sous AGPLv3 sur github.com/klar-im/engine, avec le milter Postfix qui l’embarque côté serveur. Vous pouvez lire comment un message devient un score, et le compiler. Pour être précis sur la frontière : l’interface de l’app Mac et les poids du modèle entraîné ne sont pas dans ce dépôt. Ce qui est ouvert, c’est la partie qui classe.

Ce que nous n’affirmons pas

  • Que vous pouvez vérifier quoi que ce soit avant d’installer. C’est impossible, pour tout binaire fermé, sur toute plateforme. La vérification se place après le téléchargement et avant l’ouverture.
  • Que macOS demande votre accord avant qu’une app se connecte à Internet. Il ne le fait pas, il n’y a aucune fenêtre. La garantie vient de l’absence de la permission et du fait qu’elle est inspectable.
  • Qu’une autorisation réseau absente signifie qu’aucune donnée ne peut jamais sortir. Elle signifie qu’il n’y a pas de connexion silencieuse propre à l’app. Une app en cours d’exécution peut encore passer une URL à votre navigateur, et c’est pourquoi vérifier hors ligne, ou derrière un pare-feu sortant, vaut le détour.
  • Qu’un tiers indépendant nous a audités. Aucun ne l’a fait. Tout ce qui précède est vérifiable par vous, et c’est tout l’intérêt de l’écrire.

Klar est gratuit sur le Mac App Store. macOS 14 ou ultérieur, Apple Silicon.

Tous les articles

L’option en local

Gratuit, privé, dans Apple Mail.

Télécharger dans l’ App Store