
Uma análise aprofundada do CVE 2023 38408, uma vulnerabilidade crítica do OpenSSH, incluindo contexto técnico, exploração em ambientes controlados e estratégias de mitigação.
O objetivo deste relatório é analisar o CVE-2023-38408, uma vulnerabilidade crítica do mundo real descoberta no OpenSSH, por meio tanto da compreensão teórica quanto da simulação prática. O relatório explica os fundamentos técnicos da vulnerabilidade, demonstra como ela pode ser explorada em ambientes controlados e examina as medidas de mitigação implementadas.
Compreender vulnerabilidades de segurança do mundo real por meio de simulação prática não só ajuda a proteger sistemas, mas também fortalece a conscientização de desenvolvedores e administradores de sistemas sobre possíveis vetores de ataque. Analisar tais vulnerabilidades preenche a lacuna entre a teoria e a implementação prática de segurança.
CVE-2023-38408 é uma vulnerabilidade que afeta o ssh-agent no OpenSSH quando o suporte PKCS#11 está habilitado. Ela permite a execução remota de código em uma máquina cliente se o usuário se conectar a um servidor comprometido com o encaminhamento de agente ativado (ssh -A). Esta vulnerabilidade tem implicações graves para qualquer sistema que dependa do OpenSSH para autenticação segura.
| Detalhes do CVE | Informação |
|---|---|
| ID do CVE | CVE-2023-38408 |
| Pontuação CVSS | 9.8 (Crítico) |
| Versões Afetadas | OpenSSH < 9.3p2 |
| Vetor de Ataque | Rede |
| Privilégios Necessários | Nenhum |
| Interação do Usuário | Requerida |
| Impacto | Comprometimento total do sistema |
SSH (Secure Shell) é um protocolo de rede criptográfico usado para comunicação segura em redes não seguras. Ele fornece canais criptografados para login remoto, execução de comandos, transferência de arquivos e muito mais.```mermaid graph LR A[SSH Client] -->|Encrypted Connection| B[SSH Server] A -->|Authentication| C[ssh-agent] C -->|Private Keys| D[Key Store] B -->|Agent Forwarding| E[Remote ssh-agent Proxy]
### 2.2 O que é ssh-agent
`ssh-agent` é um processo em segundo plano que armazena suas chaves SSH privadas descriptografadas na memória, permitindo que você as use sem redigitar senhas toda vez que se conectar a um sistema remoto.
#### Encaminhamento de Agente (ssh -A)
O encaminhamento de agente permite que um sistema remoto acesse seu `ssh-agent` local através de um socket de domínio Unix. Isso é útil para encadear conexões SSH, mas introduz riscos significativos de segurança se a máquina remota estiver comprometida.```mermaid
sequenceDiagram
participant Client as SSH Client
participant Agent as ssh-agent
participant Server as Remote Server
participant Proxy as Agent Proxy
Client->>Agent: Start agent
Client->>Server: ssh -A user@server
Server->>Proxy: Create proxy socket
Note over Server,Proxy: SSH_AUTH_SOCK=/tmp/ssh-xxx/agent.xxx
Server->>Proxy: ssh-add request
Proxy->>Client: Forward request
Client->>Agent: Process request
Agent->>Client: Response
Client->>Proxy: Forward response
Proxy->>Server: Final response
Tecnicamente, quando você usa ssh -A, o cliente SSH configura um socket de domínio Unix no servidor remoto que atua como um proxy para seu ssh-agent local. A variável de ambiente SSH_AUTH_SOCK é definida para apontar para este socket proxy. Quaisquer chamadas feitas para SSH_AUTH_SOCK no servidor remoto são encaminhadas de volta através da conexão SSH e processadas pelo seu ssh-agent local.
PKCS#11 é uma API padrão para interagir com tokens criptográficos, como smartcards, YubiKeys ou módulos de segurança de hardware virtuais (HSMs).
| Função PKCS#11 | Finalidade | Nível de Risco |
|---|---|---|
C_Initialize() | Inicializar a biblioteca | Baixo |
C_GetSlotList() | Listar slots disponíveis | Baixo |
C_FindObjects() | Encontrar objetos criptográficos | Médio |
C_Sign() | Assinar dados | Alto |
dlopen() | Carregar biblioteca compartilhada | Crítico |
O ssh-agent do OpenSSH suporta o carregamento de provedores PKCS#11 (bibliotecas compartilhadas .so) usando o comando ssh-add -s /caminho/para/provider.so. Essas bibliotecas permitem que o agente interaja com módulos de hardware ou software seguros para usar chaves privadas sem expô-las diretamente.
Internamente, quando ssh-add -s é chamado, ele realiza o seguinte:
.so é carregado dinamicamente na memória usando dlopen().C_Initialize(), C_GetSlotList(), C_FindObjects() e C_Sign() através da API PKCS#11.| Atributo | Detalhes |
|---|---|
| ID | CVE-2023-38408 |
| Severidade | Alta (CVSS 9.8) |
| Cronologia | Divulgado em julho de 2023, corrigido no OpenSSH 9.3p2 |
| Software Aferado | Versões do OpenSSH anteriores a 9.3p2 com suporte a PKCS#11 |
| Complexidade do Ataque | Baixa |
| Vetor de Ataque | Rede via encaminhamento de agente SSH |
A vulnerabilidade decorre do ssh-agent carregar qualquer arquivo de objeto compartilhado (.so) fornecido via ssh-add -s, sem validar se era um provedor PKCS#11 legítimo.```mermaid
graph TD
A[Attacker sends ssh-add -s malicious.so] --> B[Request forwarded to victim's ssh-agent]
B --> C[ssh-agent calls dlopen on malicious.so]
C --> D[Constructor function executes immediately]
D --> E[Arbitrary code runs on victim machine]
### 3.3 Análise de Fluxo de Ataque```mermaid
sequenceDiagram
participant V as Victim
participant A as Attacker
participant Agent as ssh-agent
participant Lib as Malicious .so
V->>A: ssh -A attacker@host
Note over V,A: Agent forwarding enabled
A->>Agent: ssh-add -s /path/to/malicious.so
Agent->>Lib: dlopen("/path/to/malicious.so")
Note over Lib: Constructor executes
Lib->>V: Malicious code runs
Note over V: System compromised
Ao nível mais baixo, a sequência de eventos inclui: