
BlockGuard é um agente de Prevenção de Perda de Dados (DLP) do Windows que intercepta e controla o acesso a arquivos no nível do processo. Ele garante que apenas processos autorizados — identificados pelo caminho executável, hash criptográfico, assinatura Authenticode e nível de integridade — possam ler arquivos protegidos.
BlockGuard é um agente de Prevenção contra Perda de Dados (DLP) para Windows que intercepta e controla o acesso a arquivos no nível do processo. Ele garante que apenas processos autorizados — identificados pelo caminho do executável, hash criptográfico, assinatura Authenticode e nível de integridade — possam ler arquivos protegidos. Todos os outros processos têm o acesso negado por padrão no nível do kernel do sistema operacional via ACLs do NTFS.
O BlockGuard utiliza uma arquitetura modular em três camadas:``` ┌─────────────────────────────────────────────────────────────────┐ │ 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 Gerenciamento da IU
O BlockGuard inclui um **aplicativo desktop WPF** para gerenciar arquivos e pastas protegidos através de uma interface visual — sem necessidade de editar `appsettings.json` manualmente.
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/12349/51a9b7894117382666d869cee59860a33698f666133bd23c6b6cd48b225d942c.png" alt="BlockGuard UI" width="640" />
</p>
### Recursos
- **Painel** — Visão geral do status de proteção (total de arquivos, pastas, estado de criptografia)
- **Arquivos Protegidos** — Adicionar/remover arquivos e pastas para proteger do acesso de IA através de diálogos do navegador de arquivos
- **Registro de Atividades** — Registro em tempo real de todas as alterações de configuração
- **Configurações** — Visualizar caminho do arquivo de configuração e informações do agente
- **Status do Agente** — Indicador ao vivo mostrando se o serviço do agente BlockGuard está em execução
### Como Iniciar a IU```powershell
# From the project root
dotnet run --project src/BlockGuard.UI
Nota: A interface lê e escreve o
appsettings.jsondo projeto Agent. Após salvar as alterações, reinicie o serviço BlockGuard Agent para que elas tenham efeito.
Antes de executar o BlockGuard, certifique-se de que os seguintes itens estão instalados na sua máquina Windows:
| Requisito |
|---|
winget install Microsoft.DotNet.SDK.9
---
## 🚀 Início Rápido
### 1. Clone o Repositório```powershell
git clone [email protected]:m2l33k/BlockGuard.git
cd BlockGuard
dotnet restore BlockGuard.sln
### 3. Construir a Solução```powershell
dotnet build BlockGuard.sln --configuration Release
Você deve ver:``` Build succeeded. 0 Warning(s) 0 Error(s)
### 4. Configurar Caminhos Protegidos e Regras
Edite `src/BlockGuard.Agent/appsettings.json` para definir **quais arquivos proteger** e **quais processos são autorizados**:```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
---
## ⚙️ Configuração
Toda a configuração está em `src/BlockGuard.Agent/appsettings.json` na seção `"BlockGuard"`.
### Caminhos Protegidos
Um array de arquivos ou diretórios para proteger. Diretórios protegem todos os arquivos recursivamente.```json
"ProtectedPaths": [
"C:\\Secrets\\ai-model-keys",
"C:\\Secrets\\api-credentials.json",
"D:\\Confidential\\reports"
]
Cada regra define os critérios que um processo deve atender para obter acesso. Todos os campos não nulos devem corresponder (lógica AND):
Exemplo: Regra baseada em caminho (para um processo de modelo de IA)```json { "RuleName": "AI-Model-Inference-Engine", "ExecutablePath": "C:\Program Files\MyAI\inference.exe", "ExpectedFileHash": null, "ExpectedSignerSubject": null, "MinimumIntegrityLevel": "Medium", "RequireSignature": false }
**Exemplo: Regra baseada em assinatura (para qualquer ferramenta de gerenciamento assinada)**```json
{
"RuleName": "Signed-Management-Tool",
"ExecutablePath": null,
"ExpectedFileHash": null,
"ExpectedSignerSubject": "CN=Contoso Security",
"MinimumIntegrityLevel": "High",
"RequireSignature": true
}
Exemplo: Regra com hash fixo (para máxima proteção contra adulteração)```json { "RuleName": "Pinned-Data-Processor", "ExecutablePath": "C:\Tools\processor.exe", "ExpectedFileHash": "a1b2c3d4e5f67890abcdef1234567890abcdef1234567890abcdef1234567890", "ExpectedSignerSubject": null, "MinimumIntegrityLevel": "Medium", "RequireSignature": false }
### Outras Opções
| Opção | Padrão | Descrição |
|---|---|---|
| `IdentityCacheTtlSeconds` | `30` | Quanto tempo (segundos) uma identidade de processo validada permanece em cache |
| `HandleTimeoutSeconds` | `60` | Duração máxima (segundos) de uma concessão temporária de ACL |
| `AuditLogPath` | `C:\ProgramData\BlockGuard\Logs\audit.json` | Caminho para o arquivo de log de auditoria JSON |
| `EnableDpapiEncryption` | `true` | Criptografar arquivos protegidos em repouso com DPAPI |
| `DpapiScope` | `LocalMachine` | Escopo DPAPI: `LocalMachine` ou `CurrentUser` |
---
## 🏃 Executando o Agente
### Opção A: Modo de Desenvolvimento (Console)
Melhor para testes e depuração. Execute a partir de um **PowerShell elevado (Administrador)**:```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).
Pressione `Ctrl+C` para parar.
### Opção B: Instalar como um Serviço do Windows (Produção)```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
Gerenciar o serviço:```powershell
sc.exe query BlockGuard
sc.exe stop BlockGuard
sc.exe delete BlockGuard
## ✅ Verificando se Funciona
Siga estas etapas para confirmar que o BlockGuard está protegendo os arquivos corretamente.
### Teste 1: Verificação de Build```powershell
# From the project root directory
dotnet build BlockGuard.sln
# Expected: Build succeeded with 0 Error(s)
dotnet run --project src/BlockGuard.Agent
**✅ Saída esperada:**
- Mensagem `BlockGuard Security Agent Starting`
- Nenhum erro `CRITICAL` ou `FATAL`
- `ETW file trace session started successfully`
- `BlockGuard is now actively protecting X path(s)`
**❌ Se você vir `ETW session — insufficient privileges`:**
- Você NÃO está executando como Administrador. Clique com o botão direito no PowerShell → "Executar como Administrador"
### Teste 3: Verificação de Bloqueio de ACL
Após a inicialização do agente, verifique se os arquivos protegidos estão bloqueados:```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"
### Teste 5: Inspeção do Log de Auditoria
Depois que o agente executar por um tempo, verifique o log de auditoria:```powershell
# View the last 10 audit entries
Get-Content "C:\ProgramData\BlockGuard\Logs\audit.json" | Select-Object -Last 10
Saída esperada (linhas 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}
### Teste 6: Verificar Captura de Eventos ETW
Abra um segundo terminal e tente acessar um arquivo protegido enquanto o agente está em execução:```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"
No Terminal 1, você deve ver uma entrada de log como:``` [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
### Teste 7: Verificar Acesso Não Autorizado Bloqueado (Modelo de IA)
Quando um processo (como um modelo de IA não autorizado) tenta ler uma pasta ou arquivo protegido, o agente nega imediatamente o acesso. A IA receberá um erro estrito de **Acesso Negado** e a tentativa será registrada:
<p align="center">
<img src="https://assets.kitploit.com/production/public/readmes/12349/d2a2e20c0fc60e8b3a5f614b0a53c6c7275b634e93b1ce0b9fe4440c38215fac.png" alt="Acesso Não Autorizado Negado" width="600" />
</p>
### Teste 8: Verificar Criptografia 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)
Enquanto o agente está em execução, adicione manualmente uma entrada ACL não autorizada:```powershell
icacls "C:\Secrets\api-credentials.json.enc" /grant Users:R
### Test 10: Verificar diretório de 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
---
## 🔬 Como Funciona
### Sequência de Inicialização (5 Fases)```
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) │ └────────────────────────────┘
### Validação de Processo (6 Verificações)
Quando um processo acessa um arquivo protegido, o BlockGuard o valida através de:
1. **Executable Path** — Resolve e canoniza o caminho completo (impede traversal de caminho)
2. **SHA-256 Hash** — Calcula o hash do binário em disco (detecta substituição de arquivo)
3. **Authenticode Signature** — Valida a cadeia de assinatura digital (detecta binários não assinados/adulterados)
4. **Process Owner SID** — Consulta o token para identificar a conta em execução
5. **Integrity Level** — Lê o rótulo obrigatório (Untrusted/Low/Medium/High/System)
6. **Parent Process ID** — Rastreia a cadeia de criação do processo (detecta injeção)
Todas as verificações **fail-closed**: se qualquer etapa de validação falhar, o acesso é **NEGADO**.
---
## 🛠️ Solução de Problemas
### "ETW session — privilégios insuficientes"
**Causa:** O agente não está em execução com privilégios de Administrador/SISTEMA.
**Solução:**```powershell
# Right-click PowerShell → "Run as Administrator"
dotnet run --project src/BlockGuard.Agent
Causa: O agente não pode alterar permissões de arquivo sem privilégios elevados.
Correção: Igual ao anterior — execute como Administrador.
Causa: Os caminhos em appsettings.json não existem na sua máquina.
Correção: Crie os diretórios e arquivos primeiro:```powershell New-Item -Path "C:\Secrets\ai-model-keys" -ItemType Directory -Force Set-Content -Path "C:\Secrets\api-credentials.json" -Value '{"key":"value"}'
### Erros de compilação após clonagem
**Correção:** Restaure os pacotes NuGet:```powershell
dotnet restore BlockGuard.sln
dotnet build BlockGuard.sln
Causa: Uma instância anterior do agente falhou e deixou uma sessão ETW zumbi. Isso é limpo automaticamente — é um AVISO, não um erro.
Causa: Provavelmente um erro de configuração. Verifique o arquivo de log:```powershell Get-Content "C:\ProgramData\BlockGuard\Logs\blockguard-*.log" | Select-Object -Last 50
---
## 🔒 Considerações de Segurança
### O Que Este Agente Pode Fazer
- ✅ Impedir que processos não autorizados **leiam** arquivos protegidos via imposição de ACL
- ✅ Detectar e **auditar** todas as tentativas de acesso a arquivos em tempo real via ETW
- ✅ Criptografar arquivos **em repouso** usando DPAPI
- ✅ Detectar e **corrigir automaticamente** adulteração de ACL
### O Que Este Agente Não Pode Fazer
- ❌ **Bloquear leituras de arquivos em tempo real** — Este é um agente em modo de usuário; o bloqueio verdadeiro em tempo real requer um driver de filtro no kernel
- ❌ **Impedir ataques em nível de kernel** — Um driver malicioso do kernel pode ignorar ACLs do NTFS
- ❌ **Impedir que Administradores substituam** — Contas de administrador podem remover ACLs (mitigado pela detecção de adulteração)
### Recomendações para Produção
1. **Executar como `NT AUTHORITY\SYSTEM`** — Use um Serviço Windows, não um aplicativo de console
2. **Assinar o binário do agente** com um certificado Authenticode para evitar adulteração
3. **Habilitar o BitLocker** no volume para criptografia de disco completo (complementa DPAPI)
4. **Encaminhar logs de auditoria para um SIEM** para monitoramento centralizado
5. **Habilitar Secure Boot + Driver Signature Enforcement** para evitar bypass em nível de kernel
---
## 🤝 Contribuindo
1. Faça um fork do repositório
2. Crie um branch de funcionalidade: `git checkout -b feature/my-feature`
3. Faça commit das suas alterações: `git commit -m "Add my feature"`
4. Envie para o branch: `git push origin feature/my-feature`
5. Abra um Pull Request
### Estilo de Código
- Siga as convenções de nomenclatura C# (PascalCase para membros públicos)
- Adicione comentários de documentação XML para todas as APIs públicas
- Toda validação deve **falhar-fechado** (negar em erro)
- Descartar explicitamente todos os handles nativos em blocos `finally`
- Zerar buffers de memória sensíveis após o uso
---
## 📄 Licença
Este projeto é licenciado sob a Licença MIT. Veja [LICENSE](https://github.com/m2l33k/blockguard/blob/HEAD/LICENSE) para detalhes.
---
<p align="center">
<b>Construído com princípios de segurança em primeiro lugar para proteção de arquivos Windows.</b>
<br/>
<sub>BlockGuard — porque seus dados merecem um guarda, não apenas uma fechadura.</sub>
</p>
| Recurso | Descrição |
|---|
| ACLs de Negação por Padrão | Arquivos protegidos são bloqueados na inicialização do agente — somente SYSTEM e Administradores mantêm acesso |
| Monitoramento ETW em Tempo Real | Eventos de I/O de arquivos no nível do kernel capturados via Rastreamento de Eventos para Windows |
| Validação de Processo em 6 Camadas | Caminho do executável, hash SHA-256, assinatura Authenticode, SID do proprietário, nível de integridade, cadeia de processos pai |
| Criptografia DPAPI de Arquivos | Arquivos protegidos criptografados em repouso usando a API de Proteção de Dados do Windows |
| Revogação Automática de Acesso Temporário | Processos autorizados recebem concessões de ACL com tempo limitado que expiram automaticamente |
| Detecção de Violação | Verificações periódicas de integridade detectam e corrigem automaticamente modificações nas ACLs |
| Registro de Auditoria Estruturado | Trilha de auditoria em JSON de todas as tentativas de acesso (pronto para SIEM) |
| Serviço do Windows | Executa como um serviço de plano de fundo do Windows sob NT AUTHORITY\SYSTEM |
| Versão Mínima |
|---|
| Comando de Verificação |
|---|
| Sistema Operacional Windows | Windows 10 / Server 2019 | winver |
| SDK .NET | 9.0 | dotnet --version |
| Privilégios de Administrador | Necessário | Executar terminal como Admin |
| Campo | Tipo | Descrição |
|---|
RuleName | string | Nome legível para esta regra (usado em logs de auditoria) |
ExecutablePath | string? | Caminho completo para o executável autorizado (não diferencia maiúsculas/minúsculas) |
ExpectedFileHash | string? | Hash SHA-256 do executável (detecção de adulteração) |
ExpectedSignerSubject | string? | Sujeito do certificado Authenticode (ex.: "CN=Contoso") |
MinimumIntegrityLevel | string | Nível mínimo de integridade do Windows: Untrusted, Low, Medium, High, System |
RequireSignature | bool | Se true, o executável deve ter uma assinatura Authenticode válida |
| # | Teste | Como Verificar | Resultado Esperado |
|---|
| 1 | Compilação | dotnet build BlockGuard.sln | 0 erros |
| 2 | Agente inicia | dotnet run --project src/BlockGuard.Agent (como Administrador) | Banner de inicialização, sem erros CRÍTICOS |
| 3 | Bloqueio de ACL | icacls <arquivo-protegido> | Apenas SYSTEM + Administradores |
| 4 | Acesso não autorizado bloqueado | Ler arquivo protegido de terminal não administrador | Acesso Negado |
| 5 | Captura ETW | Ler arquivo protegido enquanto o agente executa | Entrada REGISTADA (DENIED) no console |
| 6 | Registo de auditoria | Get-Content C:\ProgramData\BlockGuard\Logs\audit.json | Entradas JSON com veredito |
| 7 | Criptografia DPAPI | Test-Path <arquivo>.enc | Ficheiro .enc existe |
| 8 | Deteção de adulteração | icacls <arquivo> /grant Users:R e aguardar 60s | Remediação automática registada |