extraction données navigateur : audit automatisé via GitHub Actions
L’extraction données navigateur est une étape critique lors d’audits de sécurité automatisés sur des environnements de test ou de CI. Un accès non contrôlé aux fichiers de profil SQLite peut exposer des sessions actives et des identifiants sensibles.
Le défi réside dans la nature éphémère des runners GitHub Actions et la complexité des mécanismes de chiffrement OS-dépendants (DPAPI sur Windows, Keyring sur Linux). Une automatisation efficace nécessite de manipuler les API système directement depuis le workflow.
Après lecture, vous saurez implémenter un workflow capable de parser les bases SQLite de Chromium et d’extraire les secrets chiffrés de manière programmatique.
🛠️ Prérequis
Environnement de développement et exécution de tests de sécurité.
- Python 3.12+ (pour la manipulation cryptographique et SQLite).
- GitHub Actions Runner (Ubuntu 22.04 LTS ou Windows 2022).
- Librairies Python :
pycryptodome,pypi-win32(si Windows),pywin32. - Accès aux fichiers de profil (chemin
%LOCALAPPDATA%ou~/.config).
📚 Comprendre extraction données navigateur
Le processus d’extraction données navigateur repose sur la compréhension de la chaîne de confiance du navigateur. Pour Chromium (version 80+), la clé de chiffrement n’est pas stockée en clair.
Structure du chiffrement (Chromium) : 1. Fichier 'Local State' (JSON) -> Contient 'encrypted_key'. 2. Déchiffrement de 'encrypted_key' via l'API système (DPAPI sur Windows). 3. Utilisation de cette clé maîtresse pour déchiffrer les données AES-256-GCM dans 'Login Data' ou 'Cookies'. Comparaison des approches : - Ruby (FFI) : Très élégant, mais nécessite une gestion complexe des dépendances système pour DPAPI. - Python (ctypes/pywin32) : Plus direct pour interagir avec les DLL Windows, moins de friction sur les runners GitHub. - Shell (OpenSSL) : Impossible pour le déchiffrement DPAPI sans interaction avec le keychain de l'utilisateur.
💎 Le code — extraction données navigateur
📖 Explication
Dans le premier snippet, l’utilisation de win32crypt.CryptUnprotectData est indispensable. On ne peut pas réimplémenter DPAPI manuellement car elle dépend du secret utilisateur lié au SID Windows. Le découpage de la clé (encrypted_key[5:]) est crucial : le préfixe ‘DPAPI’ est une signature interne à Chromium pour identifier le type de protection utilisé.
Côté Python, le choix de AES.MODE_GCM est dicté par le standard de Chromium depuis la version 80. L’extraction du vecteur d’initialisation (IV) sur les 12 premiers octets du payload est une étape souvent oubliée, ce qui rend le déchritement impossible. L’erreur classique est de tenter de déchiffrer le bloc entier sans isoler l’IV et le tag d’authentification.
🔄 Second exemple
Référence pratique
L’extraction données navigateur varie selon le moteur de rendu. Voici les recettes pour les cas les plus fréquêtes en audit de sécurité.
Recette 1 : Chrome/Edge sur Windows (DPAPI)
Le point critique est l’utilisation de CryptUnprotectData. Cette fonction ne fonctionne que si le script s’exécute dans la session utilisateur active. Sur GitHub Actions, cela fonctionne car le runner crée une session interactive. Le script doit d’abord extraire la clé du fichier Local State, puis utiliser cette clé pour traiter les blobs AES-2GCM trouvés dans Network/Cookies.
Recette 2 : Firefox (NSS Database)
Firefox n’utilise pas DPAPI mais une base de données nssckey.db. L’extraction nécessite l’utilisation de la librairie nss. Contrairement à Chromium, Firefox utilise un fichier key4.db pour stocker les clés de chiffrement. Pour automatiser l’extraction données navigateur sur Firefox, vous devrez installer les outils libnss3-tools sur le runner Linux via sudo apt-get install.
Recette 3 : Extraction de Cookies via SQLite
Une fois la clé maîtresse obtenue, l’accès aux cookies est une simple requête SQL. Attention au verrouillage de la base :
- Étape 1 : Copier le fichier
Cookiesvers un répertoire temporaire (évite l’erreurdatabase is locked). - Étape 2 : Exécuter
SELECT name, url, encrypted_value FROM cookies. - Étape 3 : Appliquer la fonction de déchiffrement sur la colonne
encrypted_value.
Dans les faits, la gestion du verrouillage SQLite est la cause n°1 d’échec des scripts d’extraction données navigateur en environnement de production.
▶️ Exemple d’utilisation
Exécution du script sur un runner Windows avec un profil Chrome présent :
# Commande de lancement
python decrypt_chrome.py
# Sortie attendue
[INFO] Reading Local State...
[INFO] Master key decrypted successfully.
[INFO] Extracting cookies...
[FOUND] Cookie: session_id | Value: eyJhbGciOiJIUzI1Ni...
[FOUND] Cookie: auth_token | Value: 12345-abcde...
[SUCCESS] Extraction terminée. 2 cookies extraits.
🚀 Cas d’usage avancés
1. Audit de conformité CI/CD : Intégrer l’extraction données navigateur dans un pipeline pour vérifier qu’aucun token de session n’est persisté de manière non chiffrée dans les artefacts de build.
2. Analyse forensique automatisée : Utiliser un runner Windows pour analyser des dumps de mémoire ou de disque contenant des profils utilisateurs afin de détecter des fuites de credentials.
3. Pentest automatisé : Déployer un workflow qui tente l’extraction données navigateur sur des environnements de staging pour tester la résistance des politiques de sécurité des navigateurs déployés.
🐛 Erreurs courantes
⚠️ Database is locked
Le navigateur est ouvert pendant l’exécution du script, empêchant l’accès au fichier SQLite.
sqlite3.connect('Cookies').execute(...)
shutil.copy('Cookies', 'Cookies_temp'); sqlite3.connect('Cookies_temp').execute(...)
⚠️
Oubli de supprimer le préfixe ‘DPAPI’ de la clé chiffrée avant le déchiffrement.
key = win32crypt.CryptUnprotectData(encrypted_key, ...)
key = win32crypt.CryptUnprotectData(encrypted_key[5:], ...)
⚠️ Incorrect AES mode
Utilisation de CBC au lieu de GCM pour les versions récentes de Chromium.
cipher = AES.new(key, AES.MODE_CBC, iv)
cipher = AES.new(key, AES.MODE_GCM, iv)
⚠️
Tentative d’accès à un chemin utilisateur Windows sur un runner Linux.
path = os.path.join(os.environ['USERPROFILE'], ...)
path = os.path.expanduser('~/.config/google-chrome/...') if os_is_linux else ...
✅ Bonnes pratiques
Pour une extraction données navigateur fiable et sécurisée :
- Immutabilité : Travaillez toujours sur une copie du fichier SQLite pour éviter les corruptions de base de données.
- Principe du moindre privilège : Ne donnez au runner GitHub que les droits de lecture sur les fichiers cibles, jamais d’accès write.
- Gestion des secrets : Ne jamais logger les valeurs déchiffrées (cookies, passwords) dans les logs publics de GitHub Actions. Utilisez
::add-mask::. - Typage strict : En Python, utilisez des types pour les payloads binaires afin d’éviter les erreurs d’encodage UTF-8 sur des données chiffrées.
- Audit de version : Vérifiez systématiquement la version du moteur de rendu avant de choisir l’algorithme de déchiffrement (AES-GCM vs AES-CBC).
- L'extraction données navigateur nécessite l'accès à la clé maîtresse dans 'Local State'.
- Le déchiffrement DPAPI est dépendant de la session utilisateur Windows.
- Chromium utilise AES-256-GCM pour les cookies et mots de passe depuis la v80.
- Copier la base SQLite est indispensable pour éviter l'erreur 'database is locked'.
- Le préfixe 'DPAPI' doit être supprimé de la clé avant traitement.
- L'automatisation sur GitHub Actions nécessite des runners Windows pour le support DPAPI.
- L'utilisation de Python 3.12 avec pycryptodome est la méthode la plus stable.
- La sécurité des logs est primordiale : masquez toujours les données sensibles extraites.
❓ Questions fréquentes
Est-ce que cela fonctionne sur les runners Ubuntu de GitHub ?
Peut-on extraire les mots de passe avec le même script ?
Pourquoi mon script échoue avec une erreur de padding ?
Est-ce légal d'utiliser ce script ?
📚 Sur le même blog
🔗 Le même sujet sur nos autres blogs
📝 Conclusion
L’extraction données navigateur est une technique puissante pour automatiser la surveillance de la sécurité des endpoints. La maîtrise des mécanismes de chiffrement OS est le seul moyen de transformer un simple dump de fichiers en informations exploitables. Pour approfondir la manipulation des bases SQLite en Python, consultez la documentation officielle de sqlite3. Un bon auditeur ne se contente pas de voir les fichiers, il comprend comment ils sont protégés.