Fonctionnement du système de suivi
macOS crée le fichier ~/Library/Keyboard/VulgarWordUsage.db qui enregistre chaque occurrence d’un mot classé comme vulgar, offensive ou sensitive. La table vword_usage possède les colonnes app, recipient, vword et word_reading. La combinaison (app, recipient, vword, word_reading) constitue une clé unique, ce qui signifie que le compteur est maintenu séparément pour chaque application et chaque destinataire. Le compteur usage_count augmente lorsqu’un utilisateur confirme le mot et diminue lorsqu’il l’annule. Le moteur de clavier interroge ensuite la base via la fonction can_autocorrect : si le mot n’est pas « allowlisted » pour le contexte, la suggestion propre l’emporte.
Architecture de la base de données et des API privées
Le fichier SQLite possède deux tables : properties (qui indique la version = 2) et vword_usage. La dernière écriture du fichier a été détectée en avril 2024, ce qui montre que le mécanisme est actif depuis iOS 17/macOS 14. Les drapeaux de vulgarité proviennent du framework privé Lexicon.framework. Deux fonctions exportées, _LXEntryGetCategoryFlags et _LXEntryGetMetaFlags, retournent deux champs de 32 bits pour chaque entrée du dictionnaire linguistique situé sous /System/Library/LinguisticData/. Aucun API public ne permet d’accéder à ces métadonnées ; les classes publiques comme NSSpellChecker ou UITextChecker les ignorent.
#include <CoreFoundation/CoreFoundation.h>
#include <stdbool.h>
#include <stdio.h>
typedef const void *LXLexiconRef, *LXCursorRef, *LXEntryRef;
extern CFStringRef kLXLexiconLocaleKey;
LXLexiconRef LXLexiconCreate(CFDictionaryRef options, CFErrorRef *error);
LXCursorRef LXLexiconCreateRootCursor(LXLexiconRef);
void LXCursorEnumerateEntriesRecursively(LXCursorRef, void (^block)(LXEntryRef, bool *stop));
CFStringRef LXEntryCopyString(LXEntryRef);
uint32_t LXEntryGetCategoryFlags(LXEntryRef);
uint32_t LXEntryGetMetaFlags(LXEntryRef);
Implications de confidentialité
Le suivi granulaire (application + destinataire) crée un profil comportemental détaillé. Un attaquant qui parvient à lire le fichier SQLite pourrait reconstituer les conversations où l’utilisateur a employé des jurons, voire identifier des interlocuteurs sensibles. Le fait que la base soit synchronisée via KSUserWordsSynchroniser indique que les données peuvent être propagées sur iCloud, augmentant la surface d’exposition. Aucun contrôle explicite n’est offert à l’utilisateur : la base est créée en lecture‑seule par défaut et aucune préférence ne permet de la désactiver.
Limites observées
L’auteur n’a trouvé aucune ligne insérée après avoir tapé des jurons dans TextEdit, ce qui suggère que le mécanisme ne s’active que dans certaines applications (probablement celles utilisant le clavier système avec le mode « learn from typing » activé). De plus, le dictionnaire de mots vulgaires est fixé à la compilation du système d’exploitation ; aucune mise à jour dynamique n’est documentée, ce qui limite la réactivité face à de nouveaux termes. Enfin, l’absence d’API publique empêche les développeurs tiers d’auditer ou de désactiver la fonctionnalité, renforçant le caractère opaque du suivi.