
BlockGuard est un agent de prévention contre la perte de données (DLP) pour Windows qui intercepte et contrôle l'accès aux fichiers au niveau des processus. Il garantit que seuls les processus autorisés — identifiés par chemin d'exécutable, hachage cryptographique, signature Authenticode et niveau d'intégrité — peuvent lire les fichiers protégés.
BlockGuard est un agent Windows de prévention contre la perte de données (DLP) qui intercepte et contrôle l'accès aux fichiers au niveau des processus. Il garantit que seuls les processus autorisés — identifiés par chemin d'exécutable, empreinte cryptographique, signature Authenticode et niveau d'intégrité — peuvent lire les fichiers protégés. Tous les autres processus se voient refuser l'accès par défaut au niveau du noyau OS via les ACL NTFS.
BlockGuard utilise une architecture modulaire en trois couches :``` ┌─────────────────────────────────────────────────────────────────┐ │ BlockGuard.Agent (Windows Service) │ │ Orchestrates all layers │ ├───────────────────┬─────────────────────┬───────────────────────┤ │ Layer 1 │ Layer 2 │ Layer 3 │ │ MONITORING │ POLICY & IDENTITY │ PROTECTION │ │ │ │ │ │ • ETW Kernel │ • Process Identity │ • DPAPI Encryption │ │ File Trace │ Validator (6 │ • Structured Audit │ │ • ACL Enforcer │ checks) │ Logger (JSON) │ │ (deny-by- │ • Policy Evaluator │ │ │ default) │ (AND-logic │ │ │ │ rules) │ │ │ │ • Identity Cache │ │ │ │ (LRU + TTL) │ │ └───────────────────┴─────────────────────┴───────────────────────┘
---
## 🖥️ Interface de gestion de l'interface utilisateur
BlockGuard inclut une **application de bureau WPF** pour gérer les fichiers et dossiers protégés via une interface visuelle — pas besoin de modifier `appsettings.json` manuellement.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/12349/51a9b7894117382666d869cee59860a33698f666133bd23c6b6cd48b225d942c.png" alt="BlockGuard UI" width="640" />
</p>
### Fonctionnalités
- **Tableau de bord** — Aperçu de l'état de protection (nombre total de fichiers, dossiers, état du chiffrement)
- **Fichiers protégés** — Ajouter/supprimer des fichiers et dossiers à protéger de l'accès IA via des boîtes de dialogue de navigation
- **Journal d'activité** — Journal en temps réel de toutes les modifications de configuration
- **Paramètres** — Afficher le chemin du fichier de configuration et les informations sur l'agent
- **État de l'agent** — Indicateur en direct indiquant si le service agent BlockGuard est en cours d'exécution
### Comment lancer l'interface utilisateur```powershell
# From the project root
dotnet run --project src/BlockGuard.UI
Remarque : L'interface utilisateur lit et écrit
appsettings.jsondepuis le projet Agent. Après avoir enregistré les modifications, redémarrez le service BlockGuard Agent pour qu'elles prennent effet.
Avant d'exécuter BlockGuard, assurez-vous que les éléments suivants sont installés sur votre machine Windows :
winget install Microsoft.DotNet.SDK.9
---
## 🚀 Démarrage rapide
### 1. Cloner le dépôt```powershell
git clone [email protected]:m2l33k/BlockGuard.git
cd BlockGuard
dotnet restore BlockGuard.sln
### 3. Construire la solution```powershell
dotnet build BlockGuard.sln --configuration Release
Vous devriez voir:``` Build succeeded. 0 Warning(s) 0 Error(s)
### 4. Configurer les chemins protégés et les règles
Modifiez `src/BlockGuard.Agent/appsettings.json` pour définir **quels fichiers protéger** et **quels processus sont autorisés** :```json
{
"BlockGuard": {
"ProtectedPaths": [
"C:\\Secrets\\ai-model-keys",
"C:\\Secrets\\api-credentials.json"
],
"AuthorizedProcesses": [
{
"RuleName": "AI-Model-Inference-Engine",
"ExecutablePath": "C:\\Program Files\\MyAI\\inference.exe",
"MinimumIntegrityLevel": "Medium",
"RequireSignature": false
}
]
}
}
dotnet run --project src/BlockGuard.Agent
---
## ⚙️ Configuration
Toute la configuration se trouve dans `src/BlockGuard.Agent/appsettings.json` sous la section `"BlockGuard"`.
### Chemins protégés
Un tableau de fichiers ou répertoires à protéger. Les répertoires protègent tous les fichiers récursivement.```json
"ProtectedPaths": [
"C:\\Secrets\\ai-model-keys",
"C:\\Secrets\\api-credentials.json",
"D:\\Confidential\\reports"
]
Chaque règle définit les critères qu'un processus doit satisfaire pour obtenir l'accès. Tous les champs non nuls doivent correspondre (logique ET) :
Exemple : Règle basée sur le chemin (pour un processus de modèle IA)```json { "RuleName": "AI-Model-Inference-Engine", "ExecutablePath": "C:\Program Files\MyAI\inference.exe", "ExpectedFileHash": null, "ExpectedSignerSubject": null, "MinimumIntegrityLevel": "Medium", "RequireSignature": false }
**Exemple : Règle basée sur la signature (pour tout outil de gestion signé)**```json
{
"RuleName": "Signed-Management-Tool",
"ExecutablePath": null,
"ExpectedFileHash": null,
"ExpectedSignerSubject": "CN=Contoso Security",
"MinimumIntegrityLevel": "High",
"RequireSignature": true
}
Exemple : Règle avec empreinte fixe (pour une protection maximale contre la falsification)```json { "RuleName": "Pinned-Data-Processor", "ExecutablePath": "C:\Tools\processor.exe", "ExpectedFileHash": "a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890", "ExpectedSignerSubject": null, "MinimumIntegrityLevel": "Medium", "RequireSignature": false }
### Autres options
| Option | Valeur par défaut | Description |
|---|---|---|
| `IdentityCacheTtlSeconds` | `30` | Durée (en secondes) pendant laquelle une identité de processus validée reste en cache |
| `HandleTimeoutSeconds` | `60` | Durée maximale (en secondes) d'une concession ACL temporaire |
| `AuditLogPath` | `C:\ProgramData\BlockGuard\Logs\audit.json` | Chemin du fichier journal d'audit JSON |
| `EnableDpapiEncryption` | `true` | Chiffrer les fichiers protégés au repos avec DPAPI |
| `DpapiScope` | `LocalMachine` | Étendue DPAPI : `LocalMachine` ou `CurrentUser` |
---
## 🏃 Exécution de l'agent
### Option A : Mode développement (Console)
Idéal pour les tests et le débogage. Exécutez à partir d'un **PowerShell élevé (Administrateur)** :```powershell
dotnet run --project src/BlockGuard.Agent --configuration Release
[03:15:22 INF] [BlockGuard.Monitoring.AclEnforcer] Locked down file 'C:\Secrets\api-credentials.json' [03:15:22 INF] [BlockGuard.Protection.DpapiWrapper] Encrypted file 'C:\Secrets\api-credentials.json' [03:15:22 INF] [BlockGuard.Monitoring.EtwFileTraceSession] ETW file trace session started successfully. [03:15:22 INF] [BlockGuard.Agent.BlockGuardService] BlockGuard is now actively protecting 2 path(s).
Appuyez sur `Ctrl+C` pour arrêter.
### Option B: Installer en tant que service Windows (Production)```powershell
# 1. Publish a self-contained build
dotnet publish src/BlockGuard.Agent -c Release -r win-x64 --self-contained -o C:\BlockGuard
# 2. Create the Windows Service
sc.exe create BlockGuard binPath= "C:\BlockGuard\BlockGuard.Agent.exe" start= auto obj= "NT AUTHORITY\SYSTEM" DisplayName= "BlockGuard Security Agent"
# 3. Set the service description
sc.exe description BlockGuard "Process-based file access security agent (DLP)"
# 4. Start the service
sc.exe start BlockGuard
Gérer le service :```powershell
sc.exe query BlockGuard
sc.exe stop BlockGuard
sc.exe delete BlockGuard
## ✅ Vérification du fonctionnement
Suivez ces étapes pour confirmer que BlockGuard protège correctement les fichiers.
### Test 1 : Vérification de la construction```powershell
# From the project root directory
dotnet build BlockGuard.sln
# Expected: Build succeeded with 0 Error(s)
dotnet run --project src/BlockGuard.Agent
**✅ Résultat attendu :**
- Message `BlockGuard Security Agent Starting`
- Aucune erreur `CRITICAL` ou `FATAL`
- `ETW file trace session started successfully`
- `BlockGuard is now actively protecting X path(s)`
**❌ Si vous voyez `ETW session — insufficient privileges` :**
- Vous n'exécutez pas PowerShell en tant qu'Administrateur. Cliquez droit sur PowerShell → "Exécuter en tant qu'administrateur"
### Test 3 : Vérification du verrouillage ACL
Après le démarrage de l'agent, vérifiez que les fichiers protégés sont verrouillés :```powershell
# Create a test protected file
New-Item -Path "C:\Secrets" -ItemType Directory -Force
Set-Content -Path "C:\Secrets\api-credentials.json" -Value '{"api_key": "secret123"}'
# Start the agent (it will lock down the file)
dotnet run --project src/BlockGuard.Agent
# In ANOTHER non-admin terminal, try to read the file:
Get-Content "C:\Secrets\api-credentials.json"
# Expected: Access Denied error
icacls "C:\Secrets\api-credentials.json"
### Test 5: Inspection du journal d'audit
Après que l'agent s'est exécuté pendant un certain temps, vérifiez le journal d'audit :```powershell
# View the last 10 audit entries
Get-Content "C:\ProgramData\BlockGuard\Logs\audit.json" | Select-Object -Last 10
Sortie attendue (lignes JSON) :```json {"type":"operational","timestamp":"2026-03-05T02:30:00Z","eventType":"AgentStart","message":"BlockGuard security agent starting."} {"type":"access_decision","timestamp":"2026-03-05T02:30:05Z","verdict":"deny","reason":"No authorization rule matched this process identity.","file":"C:\Secrets\api-credentials.json","processId":5678}
# Test 6 : Vérifier la capture d'événements ETW
Ouvrez un second terminal et tentez d'accéder à un fichier protégé pendant que l'agent est en cours d'exécution :```powershell
# Terminal 1: Agent is running with console output
dotnet run --project src/BlockGuard.Agent
# Terminal 2: Try reading a protected file with notepad
notepad.exe "C:\Secrets\api-credentials.json"
Dans le terminal 1, vous devriez voir une entrée de journal comme :``` [03:20:15 WRN] [AUDIT] DENIED access to 'C:\Secrets\api-credentials.json' by PID 9876 (C:\Windows\System32\notepad.exe). Reason: No authorization rule matched
### Test 7 : Vérifier que l'accès non autorisé est bloqué (modèle IA)
Lorsqu'un processus (comme un modèle IA non autorisé) tente de lire un dossier ou un fichier protégé, l'agent refuse immédiatement l'accès. L'IA recevra une erreur stricte **Accès refusé** et la tentative est enregistrée :
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/12349/d2a2e20c0fc60e8b3a5f614b0a53c6c7275b634e93b1ce0b9fe4440c38215fac.png" alt="Unauthorized Access Denied" width="600" />
</p>
### Test 8 : Vérifier le chiffrement DPAPI```powershell
# Check that the .enc file was created
Test-Path "C:\Secrets\api-credentials.json.enc"
# Expected: True
# Check that the original plaintext file was securely deleted
Test-Path "C:\Secrets\api-credentials.json"
# Expected: False (if EnableDpapiEncryption is true)
Pendant que l'agent est en cours d'exécution, ajoutez manuellement une entrée ACL non autorisée :```powershell
icacls "C:\Secrets\api-credentials.json.enc" /grant Users:R
### Test 10: Vérifier le répertoire des logs```powershell
# Check both log locations
Get-ChildItem "C:\ProgramData\BlockGuard\Logs\"
# Expected files:
# audit.json (structured JSON audit log)
# blockguard-20260305.log (daily rolling application log)
BlockGuard/ ├── BlockGuard.sln # Solution file ├── README.md # This file ├── architecture_overview.md # Detailed architecture documentation ├── assets/ │ ├── Untitled.jpg # Project logo (Trusty mascot) │ └── blockguard_ui_mockup_*.png # UI mockup screenshot │ ├── src/ │ ├── BlockGuard.Core/ # Shared models, interfaces, configuration │ │ ├── Configuration/ │ │ │ └── BlockGuardOptions.cs # Strongly-typed config (paths, rules, timeouts) │ │ ├── Interfaces/ │ │ │ ├── IAclEnforcer.cs # ACL management contract │ │ │ ├── IAuditLogger.cs # Audit logging contract │ │ │ ├── IDpapiWrapper.cs # DPAPI encryption contract │ │ │ ├── IFileAccessMonitor.cs # ETW monitoring contract │ │ │ ├── IPolicyEvaluator.cs # Policy evaluation contract │ │ │ └── IProcessIdentityValidator.cs # Process identity contract │ │ └── Models/ │ │ ├── AccessDecision.cs # Verdict + reason + matched rule │ │ ├── FileAccessEvent.cs # ETW event: file, PID, operation │ │ └── ProcessIdentity.cs # Hash, signature, SID, integrity │ │ │ ├── BlockGuard.Monitoring/ # Layer 1: Monitoring & Interception │ │ ├── EtwFileTraceSession.cs # Real-time kernel file ETW consumer │ │ └── AclEnforcer.cs # NTFS ACL lockdown + temp grants │ │ │ ├── BlockGuard.Policy/ # Layer 2: Policy & Identity Engine │ │ ├── ProcessIdentityValidator.cs # 6-layer P/Invoke validation │ │ ├── PolicyEvaluator.cs # AND-logic rule matching │ │ └── IdentityCache.cs # Thread-safe LRU cache (TTL) │ │ │ ├── BlockGuard.Protection/ # Layer 3: Decryption & Handle Manager │ │ ├── DpapiWrapper.cs # DPAPI encrypt/decrypt + secure delete │ │ └── AuditLogger.cs # Structured JSON audit logging │ │ │ ├── BlockGuard.Agent/ # Windows Service entry point │ │ ├── Program.cs # DI container, Serilog, hosting │ │ ├── BlockGuardService.cs # Main orchestrator (5-phase startup) │ │ └── appsettings.json # Configuration file │ │ │ └── BlockGuard.UI/ # WPF Desktop Management Interface │ ├── App.xaml / App.xaml.cs # Application resources & dark theme │ ├── MainWindow.xaml / .cs # Main window with sidebar navigation │ ├── ViewModels/ │ │ └── MainViewModel.cs # MVVM ViewModel (commands, config I/O) │ └── Services/ │ └── ConfigurationService.cs # Reads/writes appsettings.json
## 🔬 Comment ça marche
### Séquence de démarrage (5 phases)```
Phase 1: ACL Lockdown
└─ Strip all permissions from protected files
└─ Grant access only to SYSTEM + Administrators
└─ Disable ACL inheritance
Phase 2: DPAPI Encryption (optional)
└─ Encrypt each protected file at rest
└─ Securely delete plaintext (overwrite with random data)
└─ Store ciphertext as .enc files
Phase 3: Event Subscription
└─ Register handler for file access events
Phase 4: ETW Monitoring
└─ Start kernel-level file trace session
└─ Filter events by protected paths
└─ Emit FileAccessEvent for each match
Phase 5: Integrity Check Loop
└─ Every 60 seconds, verify ACLs are intact
└─ Auto-remediate if tampering detected
┌─────────────┐ ┌───────────────┐ ┌──────────────────┐ │ Process │ │ ETW Kernel │ │ Policy │ │ reads file │────▶│ File Provider │────▶│ Evaluator │ └─────────────┘ └───────────────┘ └──────────────────┘ │ ┌────────┴────────┐ ▼ ▼ ┌──────────┐ ┌──────────┐ │ ALLOW │ │ DENY │ │ │ │ │ │ Grant │ │ ACL is │ │ temp ACL │ │ already │ │ (60s) │ │ blocking │ └──────────┘ └──────────┘ │ │ ▼ ▼ ┌────────────────────────────┐ │ Audit Logger (JSON) │ └────────────────────────────┘
### Validation de processus (6 vérifications)
Lorsqu'un processus accède à un fichier protégé, BlockGuard le valide via :
1. **Chemin de l'exécutable** — Résout et canonicalise le chemin complet (empêche le path traversal)
2. **Hash SHA-256** — Calcule le hash du binaire sur le disque (détecte le remplacement de fichier)
3. **Signature Authenticode** — Valide la chaîne de signature numérique (détecte les binaires non signés / modifiés)
4. **SID du propriétaire du processus** — Interroge le jeton pour identifier le compte exécutant
5. **Niveau d'intégrité** — Lit l'étiquette obligatoire (Untrusted/Low/Medium/High/System)
6. **ID du processus parent** — Trace la chaîne de création de processus (détecte l'injection)
Toutes les vérifications sont **fail-closed** : si une étape de validation échoue, l'accès est **REFUSÉ**.
---
## 🛠️ Dépannage
### "Session ETW — privilèges insuffisants"
**Cause:** L'agent ne s'exécute pas avec les privilèges Administrateur/SYSTEM.
**Correctif:**```powershell
# Right-click PowerShell → "Run as Administrator"
dotnet run --project src/BlockGuard.Agent
Cause: L'agent ne peut pas modifier les permissions des fichiers sans privilèges élevés.
Fix: Identique à ci-dessus — exécutez en tant qu'Administrateur.
Cause: Les chemins dans appsettings.json n'existent pas sur votre machine.
Fix: Créez d'abord les répertoires et les fichiers :```powershell New-Item -Path "C:\Secrets\ai-model-keys" -ItemType Directory -Force Set-Content -Path "C:\Secrets\api-credentials.json" -Value '{"key":"value"}'
### Erreurs de build après le clonage
**Correctif :** Restaurer les packages NuGet :```powershell
dotnet restore BlockGuard.sln
dotnet build BlockGuard.sln
Cause: Une instance précédente de l'agent a crashé et a laissé une session ETW zombie. Ceci est automatiquement nettoyé — c'est un AVERTISSEMENT, pas une erreur.
Cause: Probablement une erreur de configuration. Vérifiez le fichier journal:```powershell Get-Content "C:\ProgramData\BlockGuard\Logs\blockguard-*.log" | Select-Object -Last 50
---
## 🔒 Considérations de sécurité
### Ce que cet agent peut faire
- ✅ Empêcher les processus non autorisés de **lire** les fichiers protégés via l'application des ACL
- ✅ Détecter et **auditer** toutes les tentatives d'accès aux fichiers en temps réel via ETW
- ✅ Chiffrer les fichiers **au repos** à l'aide de DPAPI
- ✅ Détecter et **corriger automatiquement** les falsifications d'ACL
### Ce que cet agent ne peut pas faire
- ❌ **Bloquer les lectures de fichiers en transit** — Il s'agit d'un agent en mode utilisateur ; un véritable blocage en transit nécessite un pilote minifiltre noyau
- ❌ **Arrêter les attaques au niveau du noyau** — Un pilote noyau malveillant peut contourner les ACL NTFS
- ❌ **Empêcher les administrateurs de passer outre** — Les comptes administrateur peuvent supprimer les ACL (atténué par la détection de falsification)
### Recommandations pour la production
1. **Exécuter en tant que `NT AUTHORITY\SYSTEM`** — Utilisez un service Windows, pas une application console
2. **Signer le binaire de l'agent** avec un certificat Authenticode pour empêcher l'auto-falsification
3. **Activer BitLocker** sur le volume pour le chiffrement complet du disque (complète DPAPI)
4. **Transférer les journaux d'audit vers un SIEM** pour une surveillance centralisée
5. **Activer Secure Boot + Driver Signature Enforcement** pour empêcher le contournement au niveau du noyau
---
## 🤝 Contribution
1. Forkez le dépôt
2. Créez une branche de fonctionnalité : `git checkout -b feature/my-feature`
3. Commitez vos modifications : `git commit -m "Add my feature"`
4. Poussez vers la branche : `git push origin feature/my-feature`
5. Ouvrez une Pull Request
### Style de code
- Suivez les conventions de nommage C# (PascalCase pour les membres publics)
- Ajoutez des commentaires de documentation XML à toutes les API publiques
- Chaque validation doit **échouer en mode fermé** (refuser en cas d'erreur)
- Disposez explicitement tous les handles natifs dans les blocs `finally`
- Mettez à zéro les tampons mémoire sensibles après utilisation
---
## 📄 Licence
Ce projet est sous licence MIT. Voir [LICENSE](https://github.com/m2l33k/blockguard/blob/HEAD/LICENSE) pour plus de détails.
---
<p align="center">
<b>Conçu avec des principes de sécurité avant tout pour la protection des fichiers Windows.</b>
<br/>
<sub>BlockGuard — parce que vos données méritent un gardien, pas seulement un verrou.</sub>
</p>
| Fonctionnalité | Description |
|---|
| ACL par défaut refusées | Les fichiers protégés sont verrouillés au démarrage de l'agent — seuls SYSTEM et les Administrateurs conservent l'accès |
| Surveillance ETW en temps réel | Événements d'E/S de fichiers au niveau noyau capturés via Event Tracing for Windows |
| Validation de processus en 6 couches | Chemin d'exécutable, empreinte SHA-256, signature Authenticode, SID propriétaire, niveau d'intégrité, chaîne de processus parent |
| Chiffrement DPAPI des fichiers | Fichiers protégés chiffrés au repos à l'aide de l'API Windows Data Protection |
| Révocation automatique des accès temporaires | Les processus autorisés reçoivent des octrois ACL limités dans le temps qui expirent automatiquement |
| Détection de falsification | Vérifications d'intégrité périodiques détectent et corrigent automatiquement les modifications d'ACL |
| Journalisation d'audit structurée | Piste d'audit JSON de toutes les tentatives d'accès (prête pour SIEM) |
| Service Windows | S'exécute comme un service Windows d'arrière-plan sous NT AUTHORITY\SYSTEM |
| Exigence |
|---|
| Version minimale |
|---|
| Commande de vérification |
|---|
| Système d'exploitation Windows | Windows 10 / Serveur 2019 | winver |
| SDK .NET | 9.0 | dotnet --version |
| Privilèges d'administrateur | Requis | Exécutez le terminal en tant qu'administrateur |
| Champ | Type | Description |
|---|
RuleName | string | Nom lisible pour cette règle (utilisé dans les journaux d'audit) |
ExecutablePath | string? | Chemin complet vers l'exécutable autorisé (insensible à la casse) |
ExpectedFileHash | string? | Hash SHA-256 de l'exécutable (détection de falsification) |
ExpectedSignerSubject | string? | Sujet du certificat Authenticode (par ex., "CN=Contoso") |
MinimumIntegrityLevel | string | Niveau d'intégrité minimal Windows : Untrusted, Low, Medium, High, System |
RequireSignature | bool | Si true, l'exécutable doit avoir une signature Authenticode valide |
| # | Test | Comment vérifier | Résultat attendu |
|---|
| 1 | Build | dotnet build BlockGuard.sln | 0 erreurs |
| 2 | Agent démarre | dotnet run --project src/BlockGuard.Agent (en tant qu'Admin) | Bannière de démarrage, pas d'erreur CRITICAL |
| 3 | Verrouillage ACL | icacls <protected-file> | Seulement SYSTEM + Administrateurs |
| 4 | Blocage d'accès non autorisé | Lire le fichier protégé depuis un terminal non administrateur | Accès refusé |
| 5 | Capture ETW | Lire le fichier protégé pendant que l'agent s'exécute | Entrée de journal DENIED dans la console |
| 6 | Journal d'audit | Get-Content C:\ProgramData\BlockGuard\Logs\audit.json | Entrées JSON avec verdict |
| 7 | Chiffrement DPAPI | Test-Path <file>.enc | Le fichier .enc existe |
| 8 | Détection d'altération | icacls <file> /grant Users:R puis attendre 60s | Auto-réparation journalisée |