# T1505.001 - SQL Stored Procedures
## Técnica Pai
[[t1505-server-software-component|T1505 - Componente de Software Servidor]]
## Descrição
Adversários abusam de stored procedures SQL para estabelecer persistência em servidores de banco de dados. Stored procedures são blocos de código SQL armazenados no próprio banco de dados que podem ser invocados por nome, agendados via eventos internos ou disparados automaticamente na inicialização do servidor - criando um vetor de persistência altamente discreto e muitas vezes fora do escopo do monitoramento tradicional de endpoints.
O mecanismo é especialmente relevante em ambientes corporativos onde bancos de dados como **Microsoft SQL Server**, **MySQL** e **PostgreSQL** são componentes críticos de aplicações de negócio, ERP e sistemas financeiros - incluindo infraestruturas amplamente presentes no Brasil.
> [!example] Malware Associado
> O [[s0603-stuxnet|Stuxnet]] - um dos malwares mais sofisticados já analisados - utilizou stored procedures SQL como parte de seu mecanismo de persistência em ambientes SCADA/ICS, demonstrando a viabilidade do vetor mesmo em sistemas de alta segurança.
## Como Funciona
```mermaid
graph TB
A["Acesso inicial ao banco<br/>(credencial comprometida ou SQLi)"]
B["Escalonamento de privilégio<br/>no banco de dados"]
C["Habilitação de funcionalidades perigosas<br/>(ex: xp_cmdshell no MSSQL)"]
D["Criação de stored procedure<br/>maliciosa"]
E["Procedimento vinculado a<br/>evento de startup ou trigger"]
F["Persistência estabelecida:<br/>execução automática em cada restart"]
G["Execução de comandos SO<br/>a partir do contexto do banco"]
A --> B
B --> C
C --> D
D --> E
E --> F
F --> G
classDef initial fill:#e74c3c,color:#fff
classDef step fill:#3498db,color:#fff
classDef persist fill:#8e44ad,color:#fff
classDef impact fill:#e67e22,color:#fff
class A initial
class B,C,D,E step
class F persist
class G impact
```
## Vetores de Abuso no MSSQL
### xp_cmdshell - Execução de Comandos do SO
O `xp_cmdshell` é uma extended stored procedure nativa do Microsoft SQL Server que permite executar comandos do sistema operacional diretamente a partir de uma query SQL. Desabilitado por padrão desde o SQL Server 2005, adversários com privilégios `sysadmin` podem reativá-lo:
```sql
-- Reabilitar xp_cmdshell
EXEC sp_configure 'show advanced options', 1;
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1;
RECONFIGURE;
-- Executar comando no SO
EXEC xp_cmdshell 'powershell -enc <base64_payload>';
```
Uma vez habilitado, o adversário pode criar uma stored procedure que reabilita `xp_cmdshell` e executa um payload a cada reinicialização do serviço SQL Server.
### CLR Integration - Assemblies .NET Maliciosas
O SQL Server suporta integração com o Common Language Runtime (CLR) do .NET, permitindo stored procedures escritas em C#, VB.NET ou F#. Adversários exploram esse recurso para carregar assemblies .NET maliciosas diretamente no contexto do banco:
```sql
-- Habilitar CLR
EXEC sp_configure 'clr enabled', 1;
RECONFIGURE;
-- Criar assembly a partir de bytes hex (bypass de disco)
CREATE ASSEMBLY MaliciousAssembly
FROM 0x4D5A... -- bytes da DLL maliciosa
WITH PERMISSION_SET = UNSAFE;
-- Vincular stored procedure à assembly
CREATE PROCEDURE dbo.BackdoorProc
AS EXTERNAL NAME MaliciousAssembly.[Namespace.Class].Method;
```
Esse método é particularmente evasivo porque o código malicioso reside no banco de dados, não no sistema de arquivos - escapando de varreduras de AV tradicionais.
### Startup Stored Procedures
No MSSQL, stored procedures marcadas para execução automática rodam quando o serviço SQL Server é iniciado:
```sql
-- Marcar procedure para execução no startup do SQL Server
EXEC sp_procoption 'MaliciousProc', 'startup', 'true';
```
Qualquer stored procedure com essa flag executa automaticamente a cada reinicialização do serviço - sem necessidade de agendamento externo ou interação do usuário.
## Contexto de Ameaça
> [!warning] Relevância para Ambientes Corporativos Brasileiros
> Sistemas ERP (SAP, TOTVS, Oracle EBS), plataformas de pagamento e sistemas bancários amplamente adotados no Brasil dependem de SQL Server e PostgreSQL. Acesso ao banco de dados via credenciais comprometidas ou injeção SQL cria oportunidade direta para abuso de stored procedures. O [[g0032-lazarus-group|Lazarus Group]] historicamente utiliza bancos de dados como pivot em campanhas financeiras.
## Detecção
```mermaid
graph TB
A["Logs de auditoria SQL<br/>(SQL Server Audit / pgaudit)"]
B{"xp_cmdshell habilitado<br/>ou CLR habilitado?"}
C["ALERTA CRÍTICO:<br/>habilitação de feature perigosa"]
D{"Nova stored procedure<br/>criada com PERMISSION_SET=UNSAFE?"}
E["ALERTA ALTO:<br/>possível CLR backdoor"]
F{"sp_procoption com<br/>'startup'='true'?"}
G["ALERTA ALTO:<br/>persistência via startup proc"]
H["EDR - Process Creation"]
I{"sqlservr.exe invocando<br/>cmd.exe ou powershell.exe?"}
J["ALERTA CRÍTICO:<br/>execução SO via banco"]
A --> B
B -->|Sim| C
A --> D
D -->|Sim| E
A --> F
F -->|Sim| G
H --> I
I -->|Sim| J
classDef monitor fill:#27ae60,color:#fff
classDef check fill:#3498db,color:#fff
classDef alert fill:#e74c3c,color:#fff
class A,H monitor
class B,D,F,I check
class C,E,G,J alert
```
### Queries de Detecção (MSSQL)
```sql
-- Verificar stored procedures com flag de startup
SELECT name, is_auto_executed
FROM sys.procedures
WHERE is_auto_executed = 1;
-- Verificar assemblies CLR instaladas
SELECT name, permission_set_desc, creaté_daté
FROM sys.assemblies
WHERE is_user_defined = 1;
-- Verificar se xp_cmdshell está habilitado
SELECT value_in_use
FROM sys.configurations
WHERE name = 'xp_cmdshell';
```
### Fontes de Dados para SIEM
| Fonte | O que monitorar |
|-------|----------------|
| SQL Server Audit | `ALTER SERVER CONFIGURATION`, criação de assemblies CLR, chamadas a `sp_procoption` |
| Windows Event Log | Processo filho de `sqlservr.exe` (cmd.exe, powershell.exe, wscript.exe) |
| Sysmon Event 1 | `ParentImage` = `sqlservr.exe` com `CommandLine` suspeito |
| Netflow/EDR | Conexões de rede originadas pelo processo `sqlservr.exe` |
## Mitigações
| ID | Mitigação | Aplicação |
|----|-----------|-----------|
| [[m1026-privileged-account-management\|M1026 - Privileged Account Management]] | Limitar contas com papel `sysadmin` no SQL Server; separar conta de serviço SQL de contas administrativas | Alta prioridade |
| [[m1047-audit\|M1047 - Audit]] | Habilitar SQL Server Audit para capturar DDL em stored procedures, criação de assemblies e alterações de configuração | Alta prioridade |
| [[m1045-code-signing\|M1045 - Code Signing]] | Exigir que assemblies CLR sejam assinadas com certificado de confiança; bloquear `PERMISSION_SET=UNSAFE` | Média prioridade |
### Hardening Adicional
- Desabilitar `xp_cmdshell` e manter desabilitado com monitoramento de tentativas de reabilitação
- Desabilitar CLR integration se não for utilizado pela aplicação
- Aplicar princípio do menor privilégio: contas de aplicação não devem ter permissão `ALTER ANY ASSEMBLY` ou `CONTROL SERVER`
- Segregar o serviço SQL Server em conta de serviço dedicada sem privilégios de domínio
## Software Associado
- [[s0603-stuxnet|Stuxnet]] - utilizou stored procedures SQL como componente de persistência em sistemas SCADA
---
*Fonte: MITRE ATT&CK - T1505.001 (https://attack.mitre.org/techniques/T1505/001)*