extraction données navigateur : automatiser le décryptage via GitHub Actions
L’extraction données navigateur est une tâche critique lors des audits de sécurité ou des migrations de profils utilisateurs. Ce processus nécessite de manipuler des bases SQLite verrouillées et de répercuter des clés de chiffrement complexes.
Dans un contexte de migration legacy, récupérer les sessions actives (cookies) ou les identifiants permet de réduire le downtime. Les environnements CI/CD comme GitHub Actions offrent une infrastructure éphémère idéale pour traiter ces dumps sans laisser de traces sur des machines permanentes.
Après cette lecture, vous saurez configurer un workflow capable de parser des fichiers SQLite, de gérer le décryptage AES-GCM et de transformer des données brutes en formats structurés comme le JSON ou le CSV.
🛠️ Prérequis
Installation des environnements de runtime et des dépendances cryptographiques nécessaires.
- Python 3.12+ pour le moteur de décryptage.
- pip install pycryptodome pyyaml sqlite3
- GitHub Actions Runner (Ubuntu-latest recommandé).
- Un dump de profil navigateur (fichiers Login Data ou Cookies).
📚 Comprendre extraction données navigateur
Le fonctionnement repose sur la structure de stockage des navigateurs basés sur Chromium. Les données ne sont pas de simples fichiers texte, mais des bases de données SQLite. Le défi réside dans la couche de chiffrement.
Structure typique d'un fichier 'Login Data' : [Table: logins] - username: TEXT - password_encrypted: BLOB (AES-G256-GCM) Processus de décryptage : 1. Lecture du fichier 'Local State'. 2. Extraction de l'encrypted_key. 3. Décodage Base64 de la clé. 4. Déchiffrement via l'API système (DPAPI sur Windows, ou clé dérivée sur Linux). 5. Application de l'algorithateur AES-GCM sur le BLOB.
Contrairement au COBOL où les fichiers sont souvent structurés en enregistrements fixes (FD), nous manipulons ici des structures dynamiques. La complexité n’est pas dans le volume, mais dans la gestion de l’état de la clé.
🏦 Le code — extraction données navigateur
📖 Explication
Dans le code_source, la gestion du iv (Initialization Vector) est cruciale. Le format de Chrome commence par un préfixe de version (3 octets). On commence le slicing à l’index 3 pour isoler l’IV. Sans cela, le déchiffrement AES-GCM échouera avec une erreur de tag d’authentification.
L’utilisation de sqlite3.connect(f'file:{db_path}?mode=ro', uri=True) est une technique de ‘pro’ pour éviter le database is locked error. En mode lecture seule (read-only), le kernel Linux ne bloque pas l’accès même si un autre processus écrit dans le fichier.
Dans le code_source_2 (YAML), l’utilisation de workflow_dispatch permet de déclencher l’extraction manuellement avec des paramètres. C’est indispensable pour tester différents dossiers de profils sans modifier le code du workflow.
Le choix de python 3.12 est dicté par les performances de la bibliothèque pycryptodome qui bénéficie des optimisations récentes de l’interpréteur pour les opérations de manipulation de bytes.
Documentation officielle COBOL
🔄 Second exemple
Référence pratique
L’extraction données navigateur nécessite une approche méthodique pour chaque type de donnée. Voici les recettes pour les cas les plus fréquents en environnement automatisé.
Recette 1 : Extraction des Cookies (Session Recovery)
Les cookies sont stockés dans le fichier Cookies. La structure est identique au fichier Login Data. Pour automatiser cela, utilisez un script qui itère sur la table cookies. L’enjeu est le champ encrypted_value. Si vous utilisez un runner Linux, la clé doit être pré-extraite du fichier Local State de la machine source et injectée via les secrets GitHub.
Recette 2 : Extraction des Form Data (Auto-fill)
Le fichier Web Data contient les adresses et informations de paiement. Contrairement aux mots de passe, les données sont souvent en clair ou faiblement protégées. La recette consiste à parser la table autofill. Attention au piège classique : les bases SQLite sont souvent verrouillées par le processus navigateur. Utilisez toujours le flag ?mode=ro dans votre chaîne de connexion SQLite pour permettre l’extraction même si le fichier est en cours d’utilisation.
Recette 3 : Traitement multi-navigateurs
Pour supporter Chrome, Edge et Brave, ne codez pas de chemins en dur. Utilisez une structure de configuration JSON. Le script doit détecter le moteur via le chemin du fichier Preferences. Si le fichier Local State est absent, le script doit basculer sur un mode de lecture simple sans décryptage AES.
Recette 4 : Export vers format Mainframe-friendly
Pour les intégrations legacy, transformez le JSON en fichier plat (Fixed Length). Utilisez un script Python de post-traitement qui convertit chaque champ en colonnes de taille fixe (ex: URL 100 chars, User 50 chars). Cela permet d’injecter les données directement dans un programme GnuCOBOL de reporting via un simple COPY statement.
▶️ Exemple d’utilisation
Exécution du script de décryptage sur un dump Chrome extrait d’un poste Windows.
$ python scripts/extractor.py --path ./downloads/chrome_profile --key 0123456789abcdef0123456789abcdef
[INFO] Initialisation de l'extraction...
[INFO] Lecture du fichier Local State...
[INFO] Déchiffrement de la clé maître réussi.
[INFO] Analyse de la table 'logins'...
[SUCCESS] 12 identifiants extraits.
[SUCCESS] 5 cookies extraits.
[INFO] Résultat sauvegardé dans output/results.json
🚀 Cas d’usage avancés
1. Audit de sécurité post-migration : Après avoir migré des utilisateurs vers un nouveau domaine, lancez un workflow GitHub Actions pour vérifier qu’aucun mot de passe en clair n’est resté dans les caches locaux des anciens postes. Utilisez le script pour scanner les répertoires AppData via un agent de déploiement.
2. Récupération de session pour automatisation de tests : Dans un pipeline de test E2E (End-to-End), utilisez l’extraction données navigateur pour injecter des cookies de session valides dans un container Selenium. Cela évite de passer par l’étape de login à chaque test, réduisant le temps d’exécution de 40%.
<
3. Forensics et investigation numérique : En cas d’analyse de machine compromise, le workflow peut être utilisé pour parser des dumps de disques durs extraits. Le script traite les fichiers Login Data de manière isolée, garantissant l’intégrité des preuves.
🐛 Erreurs courantes
⚠️ Database Locked
Le navigateur est ouvert sur la machine source, empêchant l’accès au fichier SQLite.
sqlite3.connect('path/to/Cookies')
sqlite3.connect('file:path/to/Cookies?mode=ro', uri=True)
⚠️ Clé de chiffrement invalide
Tentative de décryptage avec une clé non décodée du format Base64.
key = os.getenv('MASTER_KEY')
key = base64.urlsafe_b64decode(os.getenv('MASTER_KEY'))
⚠️ Format de version non supporté
Le script ne gère pas le préfixe ‘v10’ spécifique aux versions récentes de Chromium.
data = encrypted_blob
data = encrypted_blob[3:] # Skip 'v10' prefix
⚠️ Erreur d'encodage UTF-8
Le mot de passe ou l’URL contient des caractères spéciaux non valides en UTF-8.
decoded = bytes.decode('utf-8')
decoded = bytes.decode('utf-8', errors='replace')
✅ Bonnes pratiques
Pour une extraction données navigateur sécurisée et professionnelle, respectez ces règles de gestion de données.
- Zéro Persistance : Ne stockez jamais les résultats décryptés en clair sur un runner permanent. Utilisez uniquement les
artifactsde GitHub Actions qui sont supprimés après le cycle de vie du workflow. - Gestion des Secrets : La clé maîtresse (Master Key) doit être injectée via
GITHUB_TOKENouSecrets. Ne jamais la commiter dans le dépôt. - Isolation des processus : Exécutez toujours vos scripts dans un environnement virtuel (venv) pour éviter les conflits de versions de librairies cryptographiques.
- Audit Trail : Loggez chaque étape de l’extraction (sans loguer les données sensibles) pour permettre la traçabilité en cas d’échec du pipeline.
- Principe de moindre privilège : Le script de décryptage ne doit avoir que les droits de lecture sur le dossier cible.
- L'extraction nécessite le mode lecture seule (mode=ro) pour éviter les verrous SQLite.
- Le décryptage AES-GCM nécessite l'isolation du nonce et du tag d'authentification.
- Le préfixe 'v10' des blobs Chrome doit être ignoré avant le traitement.
- GitHub Actions est l'outil idéal pour traiter ces données de manière éphémère.
- La clé maîtresse doit être extraite du fichier 'Local State' au préalable.
- L'utilisation de Python 3.12 garantit des performances optimales sur les opérations binaires.
- La conversion des données en format fixe (flat files) facilite l'intégration legacy.
- La sécurité repose sur la non-persistance des artefacts décryptés.
❓ Questions fréquentes
Peut-on extraire des données de Firefox avec ce script ?
Non, Firefox utilise un système de chiffrement différent basé sur le fichier ‘key4.db’. Il faut un script spécifique pour parser le format NSS.
Le workflow est-il utilisable sur Windows Runner ?
Oui, mais le chemin des fichiers et la gestion de l’encodage des caractères (UTF-16 vs UTF-8) diffèrent.
Comment gérer les fichiers trop volumineux ?
Si le dump dépasse 2Go, évitez de charger toute la base en mémoire. Utilisez un curseur SQLite pour traiter les lignes une par une.
Est-ce légal d'automatiser cette extraction ?
Cela dépend du contexte (audit interne vs intrusion). L’usage doit être strictement encadré par votre politique de sécurité informatique.
📚 Sur le même blog
🔗 Le même sujet sur nos autres blogs
📝 Conclusion
L’extraction données navigateur est une composante essentielle des stratégies de migration et d’audit moderne. En utilisant GitHub Actions, on transforme une tâche manuelle risquée en un processus industriel, reproductible et sécurisé. Pour aller plus loin dans l’automatisation des flux de données, consultez la documentation COBOL officielle pour comprendre comment réintégrer ces données dans des systèmes de batching traditionnels. Un workflow bien conçu est un workflow qui ne laisse aucune trace après son exécution.