Extraction données navigateur : Automatiser le décryptage via GitHub Actions
L’extraction données navigateur sur des environnements isolés comme GitHub Actions pose un défi technique majeur pour l’audit de sécurité. Le décryptage des fichiers SQLite de Chrome ou Firefox dépend de clés protégées par le système d’exploitation ou par des fichiers de configuration locaux.
Un runner standard GitHub ne possède pas les secrets nécessaires par défaut. L’extraction nécessite l’accès au fichier Local State et à la clé AES-256-GCM. Une mauvaise configuration expose les secrets du runner ou échoue par manque de privilèges.
Ce guide détaille les scripts pour automatiser l’extraction données navigateur et le décryptage des cookies et mots de passe sur des runners Linux et Windows.
🛠️ Prérequis
Installation des dépendances sur le runner GitHub Actions :
- Python 3.12+ (pour le traitement cryptographique)
- pip install pycryptodome pybits
- Git (présent par défaut sur les runners GitHub)
- Accès aux fichiers de profil (via montage de volume ou checkout)
📚 Comprendre extraction données navigateur
Le processus d’extraction données navigateur repose sur la compréhension de la hiérarchie de chiffrement de Chromium. Le flux de décryptage suit ce schéma :
[Local State File] -> [Encrypted Key] -> [DPAPI/Keyring Decryption] -> [AES Key] -> [SQLite Cookie/Password Blob] -> [Plaintext Data]
Sur Windows, la clé est protégée par DPAPI (Data Protection API). Sur Linux, elle utilise souvent le secret service (libsecret) ou un fichier local. Contrairement à un script Perl qui utiliserait Crypt::CBC pour manipuler des chaques, Python offre ici des primitives plus directes pour le mode GCM de l’AES.
🐪 Le code — extraction données navigateur
📖 Explication
Dans le premier snippet, la ligne encrypted_key[5:] est cruciale. Elle supprime l’en-tête DPAPI qui n’est pas une donnée cryptographique mais un marqueur de version. Sans cela, le décryptage AES échouera avec une erreur de taille de bloc. Le choix de AES.MODE_GCM est dicté par la spécification de Chromium. Le mode GCM fournit l’intégrité des données via un tag. Si vous essayez d’utiliser AES.MODE_CBC, vous ne pourrez pas vérifier si le cookie a été altéré. Le second snippet montre la configuration YAML. Notez l’utilisation de actions/setup-python@v5. La version 5 est nécessaire pour une compatibilité optimale avec les nouveaux gestionnaires de cache de GitHub.
🔄 Second exemple
Référence pratique
Cette section regroupe les recettes pour l’extraction données navigateur dans des contextes de CI/CD.
Recette 1 : Extraction de cookies Chrome (Linux/Windows)
L’objectif est de récupérer le value du cookie. Le processus nécessite l’extraction de la clé AES depuis le fichier Local State. Une fois la clé obtenue, utilisez sqlite3 pour interroger le fichier Cookies. Attention, sur les versions récentes de Chrome (v114+), le format du blob contient le nonce et le tag d’authentification GCM. Vous devez extraire le nonce (12 premiers octets) avant de passer la main à pycryptod'.
Recette 2 : Extraction de mots de passe Firefox
Firefox utilise key4.db et logins.json. Contrairement à Chrome, Firefox utilise une structure de base de données plus complexe avec une clé maîtresse dérivée de nss. Pour l’extraction données navigateur sous Firefox, vous devez simuler l’environnement de l’application pour que les librairies nss puissent accéder au magasin de clés. L’utilisation de python-nss est recommandée pour automatiser ce processus sur un runner Linux.
Recette 3 : Automatisation du nettoyage post-extraction
Ne laissez jamais les données décryptées sur le runner. Utilisez une étape de nettoyage systématique dans votre YAML. Une commande rm -rf ./output est le minimum vital. Si vous utilisez des runners auto-hébergés, l’extraction données navigateur peut laisser des traces dans les fichiers temporaires de l’OS. Configurez toujours vos scripts pour qu’ils s’exécutent dans des répertoires de travail éphémères.
Recette 4 : Extraction de l’historique via SQLite
L’historique ne nécessite pas de décryptage AES, mais l’accès au fichier History. Le piège classique est le verrouillage de la base de données par un processus Chrome en cours. Dans un environnement GitHub Actions, le navigateur n’est pas lancé, donc le fichier est libre. Utilisez une simple requête SQL : SELECT url, title, visit_count FROM urls;.
▶️ Exemple d’utilisation
Exécution du script d’extraction sur un runner Linux :
# Installation des dépendances
pip install pycryptodome
# Exécution du script de décryptage
python scripts/decrypt_chrome.py --local-state ./path/to/Local
# Sortie attendue
[INFO] Extraction données navigateur en cours...
[INFO] Clé AES extraite avec succès.
[SUCCESS] 45 cookies décryptés.
[SUCCESS] 12 mots de passe récupérés.
[INFO] Fichiers sauvegardés dans ./output/
🚀 Cas d’usage avancés
1. Audit de sécurité automatisé : Intégrez l’extraction données navigateur dans un pipeline de scan de vulnérabilités. Si un cookie de session expire ou change de signature, le pipeline échoue. if not verify_cookie_signature(data): exit(1).
2. Monitoring de compromission (SOC) : Utilisez un runner surveillant les changements dans les fichiers de configuration des navigateurs sur un poste de travail partagé. L’extraction automatisée permet de détecter l’injection de nouveaux certificats ou de proxies malveillants.
3. Forensic automatisé : En cas d’alerte, déclenchez un workflow GitHub qui récupère les artefacts de session pour analyse ultérieure sans intervention humaine directe sur la machine source.
🐛 Erreurs courantes
⚠️ Erreur de taille de clé
Le préfixe ‘DPAPI’ n’a pas été supprimé, causant une erreur de padding ou de taille.
key = base64.b64decode(data)
key = base64.b64decode(data[5:])
⚠️
Tentative d’accès au fichier SQLite pendant que Chrome est ouvert.
conn = sqlite3.connect('Cookies')
conn = sqlite3.connect('file:Cookies?mode=ro', uri=True)
⚠️ Nonce manquant
L’AES-GCM nécessite le nonce extrait du début du blob.
cipher = AES.new(key, AES.MODE_GCM)
cipher = AES.new(key, AES.MODE_GCM, nonce=nonce_from_blob)
⚠️ Chemin de profil incorrect
Le script cherche le chemin par défaut alors que l’utilisateur utilise un profil personnalisé.
path = "~/.config/google-chrome/Default/Cookies"
path = os.getenv('CHROME_PROFILE_PATH', default_path)
✅ Bonnes pratiques
Pour une extraction données navigateur sécurisée, suivez ces règles :
- Utilisez toujours des runners éphémères (GitHub-hosted) pour éviter la persistance des données.
- Ne stockez jamais la clé AES en clair dans vos logs de workflow.
- Utilisez des variables d’environnement pour passer les chemins de fichiers.
- Privilégiez le mode lecture seule (
mode=ro) pour les bases SQLite. - Implémentez un checksum (SHA-256) sur les fichiers extraits pour garantir l’intégrité.
- L'extraction nécessite le décryptage de la clé AES via le système de l'OS.
- Le format Chrome utilise AES-256-GCM avec un préfixe 'DPAPI'.
- Le nonce doit être extrait du début du blob chiffré.
- L'utilisation de Python 3.12 garantent des librairies crypto à jour.
- Les runners Linux nécessitent une gestion spécifique de libsecret.
- Le mode lecture seule prévient les erreurs de verrouillage SQLite.
- L'automatisation via GitHub Actions doit inclure un nettoyage des artefacts.
- L'audit de sécurité est le cas d'usage principal de ce workflow.
❓ Questions fréquentes
Peut-on extraire des données de Chrome sur Windows via GitHub Actions ?
Oui, mais vous devez disposer de la méthode pour accéder à la clé DPAPI, ce qui est complexe sur un runner cloud sans session utilisateur active.
Est-ce légal de faire de l'extraction données navigateur ?
Cela dépend du contexte. L’usage doit être limité à l’audit de vos propres systèmes ou dans un cadre légal de forensic.
Pourquoi le script échoue-t-il avec 'ValueError: Data must be divisible by 16' ?
Vous essayez probablement de décrypter le bloc sans avoir retiré l’en-tête ou sans avoir correctement extrait le nonce GCM.
Le format de la base SQLite change-t-il souvent ?
La structure des tables est stable, mais le format du blob chiffré (AES-GCM) peut évoluer avec les versions de Chromium.
📚 Sur le même blog
🔗 Le même sujet sur nos autres blogs
📝 Conclusion
L’automatisation de l’extraction données navigateur sur GitHub Actions est un outil puissant pour la sécurité, à condition de maîtriser la chaîne de décryptage AES. La gestion des clés et des nonces est le point critique de tout échec. Pour approfondir la manipulation des structures de données complexes, consultez la documentation Perl officielle pour des approchets alternatives via CPAN. Un runner bien configuré est un runner qui ne laisse aucune trace après son exécution.