
OliveTin é uma interface web auto-hospedada para expor comandos shell predefinidos aos usuários finais. Este repositório contém uma prova de conceito demonstrando dois vetores independentes de injeção de comandos do SO no caminho de execução do modo Shell do OliveTin, ambos contornando as verificações de segurança de argumentos de shell pretendidas pela aplicação.
| ID do CVE | CVE-2026-27626 |
| Componente | OliveTin |
| Classe de Vulnerabilidade | CWE-78: Neutralização Incorreta de Elementos Especiais usados em um Comando do Sistema Operacional |
| CVSS 3.1 | 9.9–10.0 (Crítico) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Versões Afetadas | Todas as versões ≤ 3000.10.0 (commits anteriores a 0.0.0-20260222101908-4bbd2eab1532) |
| Versão Corrigida | 0.0.0-20260222101908-4bbd2eab1532 ou superior |
| Aviso | GHSA-49gm-hh7w-wfvf |
| Divulgado | 2026-02-22 (aviso), 2026-02-25 (NVD) |
OliveTin é uma interface web auto-hospedada para expor comandos shell predefinidos a usuários finais. Este repositório contém uma prova de conceito demonstrando dois vetores independentes de injeção de comandos do sistema operacional no caminho de execução do modo Shell do OliveTin, ambos contornando as verificações de segurança de argumentos shell pretendidas pela aplicação.
OliveTin permite que um administrador defina Ações — comandos shell com argumentos parametrizados — que usuários autenticados (ou, dependendo da configuração, anônimos) podem acionar a partir de uma interface web ou via webhooks. Para evitar que usuários escapem do comando pretendido por meio de valores de argumento, o OliveTin executa cada argumento fornecido pelo usuário através de checkShellArgumentSafety() antes de inseri-lo em uma string de comando e passá-lo para sh -c.
Esta é a fronteira de segurança que a vulnerabilidade quebra. O OliveTin distingue explicitamente "o administrador define o comando" de "o usuário fornece o valor" — a verificação de segurança existe especificamente para que um usuário não possa transformar um valor de argumento em uma forma de executar comandos arbitrários.
password não é verificadocheckShellArgumentSafety() apenas sanitiza uma lista fixa de tipos de argumento permitidos:
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// BUG: "password" type not checked
return true // Assumes safe
}
password é um tipo de argumento documentado e intencional para aceitar entrada sensível do usuário — mas não está em dangerousTypes, então cai para return true sem ser sanitizado. Qualquer usuário capaz de preencher um argumento do tipo password em uma Ação no modo Shell pode injetar metacaracteres de shell (;, |, `, $(), etc.) que executam comandos arbitrários como o usuário do processo OliveTin.
A explorabilidade aqui é ampliada pelos padrões do OliveTin: o auto-registro está habilitado e authType: none por padrão, então em muitas implantações reais, "usuário autenticado" não requer nenhuma barreira real.
Independente do Vetor 1, o manipulador de webhooks do OliveTin extrai pares chave/valor arbitrários do corpo JSON de um webhook recebido e os injeta diretamente em ExecutionRequest.Arguments (service/internal/executor/handler.go:153-157).
Como essas chaves derivadas do webhook não possuem um ActionArgument correspondente definido na configuração da ação, parseActionArguments() (arguments.go) não encontra um tipo de argumento para verificar e pula checkShellArgumentSafety() completamente — não apenas para password, mas para todos os tipos. O valor bruto é interpolado no comando shell e passado para sh -c sem nenhuma validação.
Como receber webhooks de fontes externas/não confiáveis é um dos principais casos de uso suportados do OliveTin, este vetor não requer nenhuma autenticação.
Uma instância do OliveTin executando em modo Shell com qualquer Ação acionada por webhook é vulnerável a execução remota de código não autenticada, com os privilégios do processo OliveTin — potencialmente comprometendo totalmente o host, dependendo de como o OliveTin é implantado (bare metal vs. contêiner, capacidades concedidas, etc.).
Você provavelmente está vulnerável se sua instância do OliveTin:
password exposta a usuários não confiáveis/privilegiados inferiores (Vetor 1), oupython3 CVE-2026-27626.py -u <ALVO> [OPÇÕES]
0.0.0-20260222101908-4bbd2eab1532 ou superior assim que estiver disponível no seu canal de atualização.password em qualquer Ação acessível por usuários não confiáveis.authType diferente de none).| Data | Evento |
|---|---|
| 2026-02-20 | CVE reservado |
| 2026-02-22 | Aviso de Segurança do GitHub publicado |
| 2026-02-25 | Publicação no NVD |
| 2026-02-27 | Aviso atualizado |
Este PoC é publicado apenas para fins de pesquisa defensiva, engenharia de detecção e testes de penetração autorizados. Não o execute contra sistemas que você não possui ou para os quais não possui autorização explícita por escrito para testar. O mau uso deste código contra sistemas de terceiros pode violar leis de crimes cibernéticos (ex.: CFAA nos EUA, Computer Misuse Act no Reino Unido e estatutos equivalentes em outros locais) e é de responsabilidade exclusiva da pessoa que o executa.
Md Saikat (0xh7ml)
| Opção | Descrição | Padrão |
|---|
-u, --url | Host/IP alvo | Obrigatório |
-p, --port | Porta do OliveTin | 1337 |
-x, --cmd | Comando a executar | id |