extraction données navigateur

extraction données navigateur : automatiser le décryptage sous GitHub Actions

Comparatif / benchmark RubyAvancé

extraction données navigateur : automatiser le décryptage sous GitHub Actions

L’extraction données navigateur sur un runner GitHub Actions nécessite une maîtrise précise du système de chiffrement AES-256-GCM utilisé par Chromium. Le défi ne réside pas dans l’accès aux fichiers SQLite, mais dans la récupération de la clé maîtresse stockée dans le fichier Local State.

Sur un environnement Ubuntu 22.04 LTS, la clé est protégée par une couche d’abstraction logicielle. Sans la bonne méthode, l’extraction données navigateur échouera systématiquement avec une erreur de padding ou une clé invalide. Les performances varient selon le langage utilisé pour le décryptage.

Vous apprendrez à comparer trois approches de décryptage. Vous saurez implémenter une solution Ruby robuste. Vous maîtriserez la gestion des dépendances sur les runners GitHub.

extraction données navigateur

🛠️ Prérequis

Voici les éléments nécessaires pour tester ces scripts sur un runner GitHub ou localement :

  • GitHub Actions Runner (Ubuntu 22.04 ou 24.04)
  • Ruby 3.3.0 ou supérieur (pour l’usage de la bibliothèque OpenSSL native)
  • SQLite3 version 3.45+
  • Accès au répertoire : ~/.config/google-chrome/
  • Commande d’installation des dépendances : sudo apt-get install libsqlite3-dev

📚 Comprendre extraction données navigateur

Le mécanisme de sécurité de Chromium repose sur un secret stocké dans un fichier JSON nommé Local State. Ce fichier contient une clé nommée os_crypt.encrypted_key. Cette clé est elle-même encodée en Base64. Pour l’extraction données navigateur, il faut d’abord décoder ce Base64.

Une fois la clé récupérée, le processus utilise l’algorithme AES-256-GCM. Le flux de données suit cette structure : 1. Extraction du préfixe (souvent ‘v10’ ou ‘v11’). 2. Lecture de l’IV (Initialization Vector). 3. Décodage du ciphertext. 4. Vérification de l’authentification (Tag).

<
Structure du fichier Local State (Simplifiée)
{
« os_crypt »: {
« encrypted_key »: «  »base64_encoded_data » »
}
}

Comparaison avec le mode Windows : Sur Windows, l’extraction données navigateur est plus complexe. Elle nécessite l’appel à l’API DPAPI (Data Protection API). Sur Linux, nous dépendons de la gestion des secrets du système ou de la clé en clair si le profil n’est pas verrouillé par un trousseau externe. Le principe du moindre étonnement s’applique ici : ne cherchez pas de mot de passe utilisateur, cherchez la clé dans le JSON.

💎 Le code — extraction données navigateur

Ruby
require 'json'
require 'openssl'
require 'base64'
require 'sqlite3'

def decrypt_key(local_state_path)
  # Lecture du fichier de configuration de Chrome
  data = JSON.parse(File.read(local_state_path))
  # Extraction de la clé encodée en Base64
  encrypted_key = data['os_crypt']['encrypted_key']
  # Décodage Base64 vers binaire
  Base64.decode64(encrypted_key)
rescue Errno::ENOENT => e
  puts "Erreur : Fichier introuvable #{e.message}"
  nil
end

def decrypt_payload(encrypted_payload, master_key)
  # On saute le préfixe 'v10' (3 octets)
  iv = encrypted_payload[3..14]
  ciphertext = encrypted

  cipher = OpenSSL::Cipher.new('aes-256-gcm')
  cipher.decrypt
  cipher.key = master_key
  cipher.iv = iv
  # Le tag d'authentification se trouve à la fin du payload
  cipher.auth_tag = encrypted_payload[encrypted_payload.length - 16..-1]
  
  # Déchiffrement effectif
  cipher.update(ciphertext) + cipher.final
rescue OpenSSL::Cipher::CipherError
  puts "Erreur de décryptage : clé incorrecte ou payload corrompu"
  nil
end

📖 Explication

Dans le premier snippet, la méthode decrypt_key utilise JSON.parse. C’est une opération coûteuse en mémoire si le fichier est massif, mais pour Local State, c’est négligeable. L’attention doit être portée sur Base64.decode64 qui transforme la chaîne en octets bruts nécessaires à AES.

La méthode decrypt_payload est la plus critique. Le découpage encrypted_payload[3..14] est indispensable. Pourquoi ? Parce que Chromium préfixe ses données par v10 pour indiquer la version du protocole. Si vous oubliez de sauter ces 3 octets, l’IV sera mal aligné. L’erreur classique est de ne pas extraire le auth_tag. Dans AES-GCM, le tag est essentiel pour garantir que les données n’ont pas été altérées. Sans lui, cipher.final lèvera une exception OpenSSL::Cipher::CipherError.

Documentation officielle Ruby

🔄 Second exemple

Ruby
name: Browser Data Extraction
on:
  workflow_dispatch:

jobs:
  extract:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Ruby
        uses: ruby/setup-ruby@v1
        with:
          ruby-version: '3.3'
          bundler-cache: true

      - name: Install SQLite3
        run: sudo apt-get install -y libsqlite3-dev

      - name: Run Extraction
        run: |
          # Simulation de l'extraction des cookies
          ruby scripts/extract_cookies.rb
        env:
          CHROME_PROFILE_PATH: ~/.config/google-chrome/Default

▶️ Exemple d’utilisation

Exécutez le script sur votre machine locale pour tester le décryptage d’un fichier de cookies extrait d’un runner. Assurez-vous que le chemin vers le profil est correct.

# Commande d'exécution
ruby decrypt_chrome.rb --local-state ~/.config/google-chrome/Local\ State --db ~/.config/google-chrome/Default/Cookies

# Sortie attendue
[INFO] Début de l'extraction données navigateur...
[SUCCESS] Clé maîtresse récupérée.
[SUCCESS] Déchiffrement de 124 cookies réussi.
[INFO] Extraction terminée en 0.12s.

🚀 Cas d’usage avancés

1. Audit de sécurité automatisé : Intégrez l’extraction données navigateur dans un pipeline de sécurité pour vérifier que des cookies sensibles ne sont pas exposés en clair dans les logs de build. ruby scripts/audit_cookies.rb --path ./profile.

2. Migration de profils : Automatisez le transfert de données entre deux instances de runners en utilisant un script Ruby qui extrait, décrypte et ré-encrypte les données pour un nouveau système de fichiers. ruby scripts/migrate_profiles.rb --source $S1 --dest $S2.

3. Forensics en CI : En cas d’échec de tests E2E (End-to-End) sur Playwright ou Selenium, utilisez l’extraction données navigateur pour récupérer l’état de la session et diagnostiquer l’erreur de login. ruby scripts/dump_session.rb --workflow-id ${{ github.run_id }}.

✅ Bonnes pratiques

Pour une extraction données navigateur professionnelle, respectez ces règles :

  • Utilisez le mode lecture seule : Ne jamais ouvrir un fichier SQLite en mode écriture sur un runner, cela corrompt le profil du navigateur.
  • Gestion de la mémoire : Pour les bases de données de cookies dépassant 100 Mo, utilisez des curseurs SQLite plutôt que de charger tout le contenu en mémoire Ruby.
  • Principe du moindre étonnement : Nommez vos variables de manière explicite (ex: master_key_raw au lieu de k).
  • Isolation des secrets : Ne jamais stocker la clé décryptée dans les logs GitHub Actions. Utilisez ::add-mask::.
  • Vérification de version : Vérifiez toujours la présence du préfixe ‘v10’ avant de lancer le processus de décryptage.
Points clés

  • L'extraction nécessite la clé du fichier Local State.
  • L'algorithme AES-256-GCM est le standard actuel.
  • Le préfixe 'v10' doit être ignoré lors du découpage de l'IV.
  • L'authentification GCM exige l'extraction du tag de 16 octets.
  • Le mode 'readonly' est crucial pour SQLite.
  • Ruby 3.3 offre des performances optimales via OpenSSL.
  • Évitez les dépendances Python lourdes en CI/CD.
  • L'utilisation de GitHub Actions demande une gestion stricte des chemins.

❓ Questions fréquentes

Est-ce légal d'utiliser ce script ?

L’extraction données navigateur doit se faire uniquement sur des profils dont vous êtes le propriétaire ou dans un cadre d’audit autorisé.

Pourquoi mon script Ruby échoue sur Windows ?

Le mécanisme de chiffrement Windows utilise DPAPI. Le code fourni ici est spécifique aux environnements Linux/macOS (Chromium).

Peut-on extraire les mots de passe ?

Oui, la logique est identique au fichier ‘Login Data’, seul le nom de la table SQLite change.

Le format 'v11' change-t-il la logique ?

La structure reste similaire, mais le nombre d’octets à sauter dans le préfixe peut varier selon les mises à jour de Chromium.

📚 Sur le même blog

🔗 Le même sujet sur nos autres blogs

📝 Conclusion

L’extraction données navigateur sur GitHub Actions est un exercice de précision technique. Le choix de Ruby permet de rester proche de l’écosystème de développement tout en garantissant une maintenance aisée. Pour aller plus loin, explorez la gestion des trousseaux de clés (Keyring) sous Linux. documentation Ruby officielle. Un script bien écrit est un script qui ne nécessite pas de mise à jour à chaque patch de Chrome.

Laisser un commentaire

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