Extraction données navigateurs

Extraction données navigateurs : automatiser le décryptage via GitHub Actions

Référence pratique PythonAvancé

Extraction données navigateurs : automatiser le décryptage via GitHub Actions

L’extraction données navigateurs devient un enjeu majeur lors d’audits de sécurité automatisés ou de workflows de forensics. Le problème réside dans l’encapsulation des secrets (mots de passe, cookies) via des couches de chiffrement liées à l’OS.

Le chiffrement AES-256-GCM utilisé par Chromium (depuis la version 80) rend l’accès direct aux bases SQLite inexploitable sans la clé maîtresse. Sur un runner GitHub Actions, l’enjeu est de traiter des artefacts de profils téléchargés pour en extraire les secrets de manière programmatique.

Après lecture, vous saurez implémenter un moteur de décryptage Python capable de traiter les bases de données SQLite de Chromium et de l’orchestrer dans un pipeline CI/CD.

Extraction données navigateurs

🛠️ Prérequis

Environnement Linux (Ubuntu 22.04 LTS recommandé pour les runners) et Python 3.12+.

  • Python 3.12+ : sudo apt install python3.12
  • Bibliothèques de cryptographie : pip install cryptography pycryptodome
  • Accès aux fichiers de profil (Local State et Login Data/Cookies)

📚 Comprendre Extraction données navigateurs

Le mécanisme repose sur une hiérarchie de clés. Chromium stocke une clé maîtresse dans le fichier Local State. Cette clé est elle-même chiffrée par l’API de l’OS (DPAPI sur Windows, Secret Service sur Linux).

Le flux de décryptage suit ce pattern :
1. Lecture du JSON Local State.
2. Extraction de la valeur encrypted_key.
3. Décodage Base64 et déchiffrement de la clé maîtresse.
4. Lecture de la base SQLite (Cookies ou Login Data).
5. Extraction du payload (préfixé par v10).
6. Séparation du nonce, du ciphertext et du tag AES-GCM.
7. Déchiffrement final avec la clé maîtresse.

Contrairement à l’approche brute en C, Python permet une manipulation agile des types bytes et des structures JSON, bien que la performance dépende de l’implémentation de la bibliothèque cryptography (utilisant des extensions C).

🐍 Le code — Extraction données navigateurs

Python
import json
import base64
import sqlite3
from pathlib import Path
from cryptography.hazmat.primitives.ciphers.aead import AESGCM

class BrowserDecryptor:
    def __init__(self, local_state_path: Path):
        self.local_state_path = local_state_path
        self.master_key: bytes | None = None

    def load_master_key(self, decrypted_key: bytes) -> None:
        """Charge la clé maîtresse déjà déchiffrée par l'OS."""
        self.master_key = decrypted_key

    def decrypt_payload(self, encrypted_blob: bytes) -> bytes:
        """Décrypte un payload au format v10 (AES-GCM)."""
        if not self.master_key:
            raise ValueError("Clé maîtresse non chargée")
        
        # Le préfixe 'v10' est une signature de version de Chromium
        if not encrypted_blob.startswith(b'v10'):
            return encrypted_blob

        # Structure : v10 (3) + nonce (12) + ciphertext + tag (16)
        nonce = encrypted_blob[3:15]
        ciphertext_with_tag = encrypted_blob[15:]
        
        aesgcm = AESGCM(self.master_key)
        # Le tag est inclus dans le ciphertext lors de l'utilisation de AESGCM en Python
        return aesgcm.decrypt(nonce, ciphertext_with_tag, None)

    def extract_sqlite_data(self, db_path: Path, query: str) -> list[dict]:
        """Exécute une requête sur la base SQLite du navigateur."""
        results = []
        with sqlite3.connect(db_path) as conn:
            conn.row_factory = sqlite3.Row
            cursor = conn.execute(query)
            for row in cursor.fetchall():
                results.append(dict(row))
        return results

📖 Explication

Dans le BrowserDecryptor, l’utilisation de AESGCM de la bibliothèque cryptography est cruciale. Contrairement à l’implémentation manuelle de AES-CBC, AESGCM gère nativement l’authentification du tag (AEAD), ce qui évite les attaques par padding oracle.

Le slicing encrypted_blob[3:15] est une opération critique. Le premier octet est le préfixe v, le second 1, le troisième 0. Les 12 octets suivants constituent le nonce (IV). Si vous décalerez ce slice d’un seul octet, le décryptage échouera avec une erreur InvalidTag.

Le choix de sqlite3.Row dans extract_sqlite_data permet d’accéder aux colonnes par nom plutôt que par index, ce qui rend le code résilient aux changements de schéma mineurs de Chromium (ex: ajout d’une colonne de métadonnées).

Documentation officielle Python

🔄 Second exemple

Python
import os
import yaml

def generate_github_action_workflow(output_path: str) -> None:
    """Génère un workflow GitHub Actions pour l'extraction automatisée."""
    workflow = {
        "name": "Browser Data Audit",
        "on": {
            "workflow_dispatch": {}
        },
        "jobs": {
            "extract": {
                "runs-on": "ubuntu-latest",
                "steps": [
                    {"uses": "actions/checkout@v4"},
                    {"uses": "actions/setup-python@v5", "with": {"python-version": "3.12"}},
                    {"name": "Install dependencies", "run": "pip install cryptography"},
                    {
                        "name": "Run extraction",
                        "run": "python scripts/extract_data.py --path ./artifacts/profile"
                    }
                ]
            }
        }
    }
    
    with open(output_path, 'w') as f:
        yaml.dump(workflow, f, default_flow_style=False)

▶️ Exemple d’utilisation

Exécution du script de décryptage sur un dossier de profil extrait.

# Préparation de l'environnement
python3 decrypt_tool.py --local-state ./profile/Local\ State --db ./profile/Cookies

# Sortie attendue
[INFO] Début de l'extraction...
[FOUND] Cookie: session_id | Value: a1b2c3d4...
[FOUND] Cookie: auth_token | Value: eyJhbGci... 
[SUCCESS] Extraction terminée. 42 cookies décryptés.

🚀 Cas d’usage avancés

1. Audit de conformité RGPD : Intégration dans un pipeline de scan de vulnérabilités pour vérifier qu’aucun mot de session n’est stocké en clair dans des logs de CI.

2. Forensics automatisée : Utilisation de GitHub Actions pour traiter des images disque extraites de terminaux distants. L’extraction données navigateurs permet de reconstituer l’activité utilisateur sans interaction manuelle.

3. Test de sécurité de bout en bout (E2E) : Vérification que les mécanismes de protection du navigateur (comme le sandboxing) ne laissent pas fuiter de données sensibles vers des processus tiers.

✅ Bonnes pratiques

Pour une extraction données navigateurs professionnelle, respectez ces principes :

  • Immuabilité : Ne travaillez jamais sur le fichier original. Faites toujours une copie (cp) pour éviter les SQLITE_BUSY.
  • Typage strict : Utilisez mypy pour valider vos manipulations de bytes. Un mélange entre str et bytes est la cause n°1 des erreurs de décryptage.
  • Sécurité des secrets : Ne jamais loguer la clé maîtresse ou les valeurs décryptées dans les logs GitHub Actions. Utilisez ::add-mask::.
  • Gestion de la mémoire : Pour les bases de données massives, utilisez un générateur plutôt que de charger tout le list[dict] en RAM.
  • Auditabilité : Documentez la version de Chromium testée, car le format de la clé change à chaque mise à jour majeure du moteur de chiffrement.
Points clés

  • Le chiffrement Chromium utilise AES-25 m-GCM avec une clé maîtresse protégée par l'OS.
  • L'extraction nécessite le décodage du fichier Local State.
  • Le préfixe 'v10' est indispensable pour identifier le format du payload.
  • L'utilisation de copies de fichiers évite les erreurs de verrouillage SQLite.
  • Le nonce doit être extrait précisément sur les 12 premiers octets après le préfixe.
  • L'automatisation via GitHub Actions permet des audits de sécurité récurrents.
  • La bibliothèque cryptography est le standard pour manipuler les primitives AEAD.
  • Le typage statique protège contre les erreurs de conversion d'encodage.

❓ Questions fréquentes

Est-ce que cela fonctionne sur macOS ?

Le mécanisme de décryptage du payload est identique, mais la récupération de la clé maîtresse nécessite l’accès au Keychain macOS via des outils spécifiques.

Peut-on extraire les mots de passe de Firefox ?

Non, Firefox utilise son propre système de gestion de mots de passe (NSS) qui ne repose pas sur le même format AES-GCM que Chromium.

Le script est-il conforme aux politiques de sécurité ?

L’extraction données navigateurs doit être réalisée dans un cadre légal (audit autorisé, forensics) et ne doit jamais être utilisé sur des machines tierces sans consentement.

Quelle est la complexité de mise en œuvre ?

Niveau intermédiaire. La difficulté réside dans la manipulation précise des octets et la gestion des dépendances système.

📚 Sur le même blog

🔗 Le même sujet sur nos autres blogs

📝 Conclusion

L’extraction données navigateurs est un processus technique qui demande une rigueur mathématique sur la manipulation des buffers. La maîtrise du format AES-GCM et de la structure SQLite est la clé d’un outil d’audit fiable. Pour approfondir la cryptographie symétrique, consultez la documentation de la bibliothèque cryptography. Un point de vigilance : la structure du fichier Local State évolue, prévoyez toujours une gestion d’exception sur la lecture du JSON.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *