OliveTin es una interfaz web autoalojada para exponer comandos de shell predefinidos a los usuarios finales. Este repositorio contiene una prueba de concepto que demuestra dos vectores independientes de inyección de comandos del sistema operativo en la ruta de ejecución del modo Shell de OliveTin, ambos de los cuales evitan las comprobaciones de seguridad de argumentos de shell previstas por la aplicación.
| ID de CVE | CVE-2026-27626 |
| Componente | OliveTin |
| Clase de Vulnerabilidad | CWE-78: Neutralización Incorrecta de Elementos Especiales usados en un Comando del SO |
| 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 |
| Versiones Afectadas | Todas las versiones ≤ 3000.10.0 (commits anteriores a 0.0.0-20260222101908-4bbd2eab1532) |
| Versión Corregida | 0.0.0-20260222101908-4bbd2eab1532 o posterior |
| Aviso | GHSA-49gm-hh7w-wfvf |
| Divulgado | 2026-02-22 (aviso), 2026-02-25 (NVD) |
OliveTin es una interfaz web autogestionada para exponer comandos shell predefinidos a los usuarios finales. Este repositorio contiene una prueba de concepto que demuestra dos vectores independientes de inyección de comandos del SO en la ruta de ejecución del modo Shell de OliveTin, ambos de los cuales eluden las comprobaciones de seguridad de argumentos shell previstas por la aplicación.
OliveTin permite a un administrador definir Acciones — comandos shell con argumentos parametrizados — que los usuarios autenticados (o, según la configuración, anónimos) pueden ejecutar desde una interfaz web o mediante webhooks. Para evitar que los usuarios se salgan del comando previsto a través de los valores de los argumentos, OliveTin procesa cada argumento proporcionado por el usuario mediante checkShellArgumentSafety() antes de insertarlo en una cadena de comando y pasarlo a sh -c.
Este es el límite de seguridad que la vulnerabilidad rompe. OliveTin distingue explícitamente «el administrador define el comando» de «el usuario proporciona el valor» — la comprobación de seguridad existe específicamente para que un usuario no pueda convertir un valor de argumento en una forma de ejecutar comandos arbitrarios.
password no está verificadocheckShellArgumentSafety() solo sanitiza una lista fija de tipos de argumentos 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 es un tipo de argumento documentado y previsto para aceptar información sensible del usuario, pero no está en dangerousTypes, por lo que pasa sin ser sanitizado a return true. Cualquier usuario capaz de rellenar un argumento de tipo password en una Acción en modo Shell puede inyectar metacaracteres shell (;, |, `, $(), etc.) que ejecuten comandos arbitrarios como el usuario del proceso OliveTin.
La explotabilidad aquí se ve amplificada por los valores predeterminados de OliveTin: el auto-registro está habilitado y authType: none de serie, por lo que en muchas implementaciones reales «usuario autenticado» no requiere ninguna barrera real.
Independientemente del Vector 1, el manejador de webhooks de OliveTin extrae pares clave/valor arbitrarios del cuerpo JSON de un webhook entrante y los inyecta directamente en ExecutionRequest.Arguments (service/internal/executor/handler.go:153-157).
Debido a que estas claves derivadas del webhook no tienen un ActionArgument correspondiente definido en la configuración de la acción, parseActionArguments() (arguments.go) no encuentra un tipo de argumento contra el cual verificar y omite checkShellArgumentSafety() por completo — no solo para password, sino para todos los tipos. El valor en bruto se inserta en el comando shell y se pasa a sh -c sin validación alguna.
Dado que recibir webhooks entrantes desde fuentes externas/no confiables es uno de los casos de uso principales compatibles con OliveTin, este vector no requiere autenticación en absoluto.
Una instancia de OliveTin que ejecute el modo Shell con cualquier Acción activada por webhook es vulnerable a la ejecución remota de código no autenticada, con los privilegios del proceso OliveTin — potencialmente un compromiso completo del host dependiendo de cómo esté desplegado OliveTin (metal desnudo vs. contenedor, capacidades concedidas, etc.).
Es probable que seas vulnerable si tu instancia de OliveTin:
password expuesto a usuarios no confiables o con privilegios reducidos (Vector 1), opython3 CVE-2026-27626.py -u <TARGET> [OPTIONS]
| Opción | Descripción | Predeterminado |
|---|---|---|
-u, --url | Host/IP objetivo | Requerido |
-p, --port | Puerto de OliveTin | 1337 |
-x, --cmd | Comando a ejecutar | id |
0.0.0-20260222101908-4bbd2eab1532 o posterior tan pronto esté disponible en tu canal de actualizaciones.password en cualquier Acción accesible por usuarios no confiables.authType distinto de none).| Fecha | Evento |
|---|---|
| 2026-02-20 | CVE reservado |
| 2026-02-22 | Aviso de Seguridad de GitHub publicado |
| 2026-02-25 | Publicación en NVD |
| 2026-02-27 | Aviso actualizado |
Este PoC se publica únicamente con fines de investigación defensiva, ingeniería de detección y pruebas de penetración autorizadas. No lo ejecutes contra sistemas que no poseas o para los que no tengas autorización explícita por escrito para probar. El mal uso de este código contra sistemas de terceros puede violar las leyes de delitos informáticos (por ejemplo, la CFAA en EE. UU., la Computer Misuse Act en el Reino Unido y estatutos equivalentes en otros lugares) y es responsabilidad exclusiva de la persona que lo ejecuta.
Md Saikat (0xh7ml)