Extraction données navigateur

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

Référence pratique GoAvancé

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

L’extraction données navigateur automatisée est devenue un enjeu majeur pour les audits de sécurité post-incident. Le défi réside dans la gestion des clés de chiffrement qui varient selon l’OS et la version du moteur Chromium.

Les navigateurs modernes utilisent AES-GCM avec une clé maîtresse protégée par DPAPI sur Windows ou via le Keychain sur macOS. Automatiser l’extraction données navigateur sur un runner GitHub Actions nécessite de contourner ces protections de manière programmatique et reproductible.

Après cette lecture, vous saurez implémenter un outil en Go capable de parser les bases SQLite et de restaurer les secrets chiffrés en environnement CI/CD.

Extraction données navigateur

🛠️ Prérequis

Configuration technique requise pour l’extraction données navigateur :

  • Go 1.22 ou supérieur (pour les nouvelles fonctionnalités de type range sur les itérateurs).
  • Accès à un runner GitHub Actions (Windows-latest recommandé pour l’accès aux API DPAPI).
  • L’outil sqlite3 installé sur le runner pour les tests rapides.
  • Accès au répertoire AppData du profil utilisateur cible.

📚 Comprendre Extraction données navigateur

Le mécanisme de protection des navigateurs repose sur un chaînage de clés. Pour Chromium, la structure est la suivante :

Local State (JSON) -> Encrypted Master Key -> DPAPI/Keychain -> AES-GCM Key -> Cookie/Password Data

Le fichier Local State contient une clé nommée encrypted_key. Cette clé est encodée en base64. Une fois décodée, elle est passée à l’API système (CryptUnprotectData sur Windows) pour obtenir la clé AES réelle. L’extraction données navigateur échoue si cette étape est ignorée. Contrairement à Python, Go permet de manipuler ces flux binaires avec une empreinte mémoire minimale, crucial pour traiter des bases SQLite de plusieurs centaines de mégaoctets.

🐹 Le code — Extraction données navigateur

Go
package main

import (
	"crypto/aes"
	"crypto/cipher"
	"encoding/base64"
	"encoding/json"
	"fmt"
	"os"
)

// LocalState représente la structure du fichier de configuration de Chromium
type LocalState struct {
	OsCrypto struct {
		EncryptedKey string `json:"encrypted_key"`
	} `json:"os_crypto"`
}

// DecryptMasterKey traite la clé chiffrée issue du fichier Local State
// Note : nécessite une implémentation de CryptUnprotectData selon l'OS
func DecryptMasterKey(encryptedKeyBase64 string) ([]byte, error) {
	data, err := base64.StdEncoding.DecodeString(encryptedKeyBase64)
	if err != nil {
		return nil, fmt.Errorf("erreur base64: %w", err)
	}
	
	// Ici, l'appel à l'API système (DPAPI) est indispensable
	// Pour l'exemple, on simule le retour de la clé décryptée
	return data, nil
}

func main() {
	// Chargement du fichier de configuration
	file, err := os.ReadFile("Local State")
	if err != nil {
		panic(err)
	}

	var state LocalState
	if err := json.Unmarshal(file, &state); err != nil {
		panic(err)
	}

	key, err := DecryptMasterKey(state.OsCrypto.EncryptedKey)
	if err != nil {
		fmt.Printf("Échec décryptage: %v\n", err)
		return
	}
	fmt.Printf("Clé maîtresse récupérée: %x\n", key)
}

📖 Explication

Dans code_source, l’utilisation de json.Unmarshal sur le fichier Local State est la seule méthode fiable pour extraquer la clé. L’utilisation de encoding/base64 est obligatoire car la clé est stockée sous forme de chaîne textuelle.

Dans code_source_2, l’import _ "github.com/mattn/go-sqlite3" est nécessaire pour enregistrer le driver SQL. Attention : ce driver nécessite CGO_ENABLED=1. Si vous déployez sur un runner Linux sans GCC, la compilation échouera. Pour une alternative pure Go, privilégiez modernc.org/sqlite, bien que légèrement moins performante sur les très gros volumes de données.

Le décryptage AES-GCM nécessite de séparer le nonce (les 12 premiers octets après le préfixe) du reste du message. Si vous utilisez un nonce incorrect, le tag d’authentification échouera, rendant l’extraction données navigateur impossible.

Documentation officielle Go

🔄 Second exemple

Go
package main

import (
	"database/sql"
	"fmt"
	"_ "github.com/mattn/go-sqlite3"
)

// Cookie structure simple pour l'extraction
type Cookie struct {
	Name     string
	Value    string
	Path     string
}

// ExtractCookies lit la base SQLite du navigateur
func ExtractCookies(dbPath string, aesKey []byte) ([]Cookie, error) {
	db, err := sql.Open("sqlite3", dbPath)
	if err != nil {
		return nil, err
	}
	defer db.Close()

	rows, err := db.Query("SELECT name, encrypted_value, path FROM cookies")
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var results []Cookie
	for rows.Next() {
		var name, encryptedValue, path string
		if err := rows.Scan(&name, &encrypted		value, &path); err != nil {
			continue
		}

		// Le décryptage AES-GCM doit intervenir ici avec aesKey
		decryptedValue := decryptAESGCM(encryptedValue, aesKey)
		results = append(results, Cookie{name, decryptedValue, path})
	}
	return results, nil
}

func decryptAESGCM(cipherText string, key []byte) string {
	// Logique de décryptage AES-GCM (Nonce + Ciphertext + Tag)
	// À implémenter selon la spec Chromium v10+
	return "decrypted_content"
}

▶️ Exemple d’utilisation

Exécution de l’outil sur un profil Chrome local. Le programme lit le fichier Local State, récupère la clé, puis interroge la base Cookies.

$ go run main.go --path="C:\Users\Admin\AppData\Local\Google\Chrome\User Data\Default"
[INFO] Extraction données navigateur en cours...
[INFO] Décodage de la clé maîtresse réussie.
[INFO] Lecture de la base SQLite...
[SUCCESS] Cookie trouvé: session_id = eyJhbGciOiJIUzI1NiJ9...

🚀 Cas d'usage avancés

1. Audit de conformité SOC2 : Intégration dans la pipeline CI/CD pour vérifier qu'aucun secret n'est stocké en clair dans les fichiers de configuration des agents de build.go test ./audit/...

2. Analyse Forensique automatisée : Récupération des artefacts de session après une simulation d'attaque sur un environnement de staging. Utilisation de os/exec pour piloter le processus d'extraction.

3. Monitoring de fuite de credentials : Scan périodique des bases de données de navigateurs sur des postes de travail gérés via des agents de sécurité. L'extraction données navigateur permet de valider l'efficacité des politiques de chiffrement.

✅ Bonnes pratiques

Pour une implémentation professionnelle de l'extraction données navigateur, respectez ces principes :

  • Gestion de la mémoire : Utilisez io.Reader pour les fichiers volumineux afin d'éviter un out of memory sur les runners avec peu de RAM.
  • Sécurité des secrets : Ne jamais loguer la clé AES décryptée dans les logs de GitHub Actions. Utilisez des masquages via ::add-mask::.
  • Concurrence : Si vous traitez plusieurs profils, utilisez un errgroup.Group pour limiter le nombre de processus simultanés et éviter la saturation du CPU.
  • Typage fort : Définissez des structures strictes pour les schémas SQLite afin de faciliter la maintenance lors des mises à jour de Chrome.
  • Idempotence : Votre script doit pouvoir s'exécuter même si le dossier de destination existe déjà.
Points clés

  • L'extraction nécessite le décryptage préalable de la clé maître dans Local State.
  • Le préfixe 'v10' doit être supprimé avant le traitement AES-GCM.
  • Utilisez Windows-latest sur GitHub Actions pour un accès facile à DPAPI.
  • Copiez la base SQLite avant lecture pour éviter les verrous SQLite.
  • Le driver sqlite3 nécessite CGO_ENABLED=1.
  • La gestion des erreurs doit être granulaire sur le décodage Base64.
  • L'utilisation de Go garantit des performances supérieures à Python pour le parsing.
  • L'automatisation doit masquer les données sensibles dans les logs CI/CD.

❓ Questions fréquentes

Est-ce légal d'utiliser cet outil sur GitHub Actions ?

L'usage doit être strictement limité à des audits de sécurité autorisés ou des tests de conformité sur vos propres environnements. L'extraction sans consentement est illégale.

Pourquoi utiliser Go plutôt que Python ?

Go offre une gestion de la mémoire plus prévisible et une compilation statique facilitant le déploiement sur des runners sans dépendances Python complexes.

Est-ce que cela fonctionne sur Linux ?

Oui, mais la méthode de récupération de la clé maîtresse change (utilisation de Secret Service ou Libsecret au lieu de DPAPI).

Comment gérer les versions de Chrome 114+ ?

Le format AES-GCM est stable, mais vérifiez toujours la présence du préfixe de version dans le payload chiffré.

📚 Sur le même blog

🔗 Le même sujet sur nos autres blogs

📝 Conclusion

L'automatisation de l'extraction données navigateur est un levier puissant pour la sécurité proactive. La maîtrise du flux de décryptage, de la clé maîtresse au payload AES, permet de transformer un processus manuel complexe en une tâche de CI/CD fluide. Pour approfondir la gestion des flux binaires, consultez la documentation Go officielle. Une attention particulière à la gestion des verrous de fichiers SQLite reste la clé du succès en production.

Publications similaires

Laisser un commentaire

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