OliveTin est une interface Web auto-hébergée pour exposer des commandes shell prédéfinies aux utilisateurs finaux. Ce dépôt contient une preuve de concept démontrant deux vecteurs indépendants d'injection de commande OS dans le chemin d'exécution du mode Shell d'OliveTin, qui contournent tous deux les contrôles de sécurité des arguments shell prévus par l'application.
| Identifiant CVE | CVE-2026-27626 |
| Composant | OliveTin |
| Classe de vulnérabilité | CWE-78 : Neutralisation incorrecte d'éléments spéciaux utilisés dans une commande OS |
| CVSS 3.1 | 9.9–10.0 (Critique) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Versions affectées | Toutes les versions ≤ 3000.10.0 (commits antérieurs à 0.0.0-20260222101908-4bbd2eab1532) |
| Version corrigée | 0.0.0-20260222101908-4bbd2eab1532 ou ultérieure |
| Avis de sécurité | GHSA-49gm-hh7w-wfvf |
| Divulgué | 2026-02-22 (avis), 2026-02-25 (NVD) |
OliveTin est une interface web auto-hébergée permettant d'exposer des commandes shell prédéfinies aux utilisateurs finaux. Ce dépôt contient une preuve de concept démontrant deux vecteurs indépendants d'injection de commandes OS dans le chemin d'exécution du mode Shell d'OliveTin, qui contournent tous deux les contrôles de sécurité prévus sur les arguments shell de l'application.
OliveTin permet à un administrateur de définir des Actions — des commandes shell avec des arguments paramétrés — que des utilisateurs authentifiés (ou, selon la configuration, anonymes) peuvent déclencher depuis une interface web ou via des webhooks. Pour empêcher les utilisateurs de sortir de la commande prévue via les valeurs des arguments, OliveTin exécute chaque argument fourni par l'utilisateur à travers checkShellArgumentSafety() avant de le transformer en une chaîne de commande et de la passer à sh -c.
C'est la frontière de sécurité que la vulnérabilité brise. OliveTin distingue explicitement « l'admin définit la commande » de « l'utilisateur fournit la valeur » — le contrôle de sécurité existe spécifiquement pour qu'un utilisateur ne puisse pas transformer une valeur d'argument en un moyen d'exécuter des commandes arbitraires.
password n'est pas vérifiécheckShellArgumentSafety() ne nettoie qu'une liste fixe de types d'arguments autorisés :
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// BUG: le type "password" n'est pas vérifié
return true // Suppose sans risque
}
password est un type d'argument documenté, destiné à accepter des entrées utilisateur sensibles — mais il n'est pas dans dangerousTypes, donc il passe à travers jusqu'à return true sans être assaini. Tout utilisateur capable de renseigner un argument de type password dans une Action en mode Shell peut injecter des métacaractères shell (;, |, `, $(), etc.) qui exécutent des commandes arbitraires avec l'utilisateur du processus OliveTin.
L'exploitabilité ici est amplifiée par les valeurs par défaut d'OliveTin : l'auto-inscription est activée et authType: none est prêt à l'emploi, donc dans de nombreux déploiements réels, « utilisateur authentifié » ne nécessite aucune barrière réelle.
Indépendamment du vecteur 1, le gestionnaire de webhook d'OliveTin extrait des paires clé/valeur arbitraires du corps JSON d'un webhook entrant et les injecte directement dans ExecutionRequest.Arguments (service/internal/executor/handler.go:153-157).
Parce que ces clés dérivées du webhook n'ont pas de ActionArgument correspondant défini dans la configuration de l'action, parseActionArguments() (arguments.go) ne trouve aucun type d'argument à vérifier et ignore complètement checkShellArgumentSafety() — pas seulement pour password, mais pour tous les types. La valeur brute est intégrée dans la commande shell et passée à sh -c sans aucune validation.
Étant donné que la réception de webhooks entrants provenant de sources externes/non fiables est l'un des principaux cas d'utilisation pris en charge par OliveTin, ce vecteur ne nécessite aucune authentification.
Une instance d'OliveTin exécutant le mode Shell avec une Action déclenchée par webhook est vulnérable à une exécution de code à distance sans authentification, avec les privilèges du processus OliveTin — potentiellement un compromis complet de l'hôte selon le déploiement d'OliveTin (bare metal vs conteneur, capacités accordées, etc.).
Vous êtes probablement vulnérable si votre instance OliveTin :
password exposé à des utilisateurs non fiables/à privilèges réduits (Vecteur 1), oupython3 CVE-2026-27626.py -u <TARGET> [OPTIONS]
| Option | Description | Défaut |
|---|---|---|
-u, --url | Hôte/IP cible | Requis |
-p, --port | Port OliveTin | 1337 |
-x, --cmd | Commande à exécuter | id |
0.0.0-20260222101908-4bbd2eab1532 ou une version ultérieure dès qu'elle est disponible dans votre canal de mise à jour.password sur toute Action accessible par des utilisateurs non fiables.authType autre que none).| Date | Événement |
|---|---|
| 2026-02-20 | CVE réservé |
| 2026-02-22 | Avis de sécurité GitHub publié |
| 2026-02-25 | Publication NVD |
| 2026-02-27 | Avis mis à jour |
Ce PoC est publié à des fins de recherche défensive, d'ingénierie de détection et de tests de pénétration autorisés uniquement. Ne l'exécutez pas contre des systèmes dont vous n'êtes pas propriétaire ou pour lesquels vous n'avez pas d'autorisation écrite explicite de tester. Toute utilisation abusive de ce code contre des systèmes tiers peut violer les lois sur la criminalité informatique (par exemple, le CFAA aux États-Unis, le Computer Misuse Act au Royaume-Uni, et les lois équivalentes ailleurs) et relève de la seule responsabilité de la personne qui l'exécute.
Md Saikat (0xh7ml)