
OliveTin is a self-hosted web UI for exposing predefined shell commands to end users. This repository contains a proof-of-concept demonstrating two independent OS command injection vectors in OliveTin's Shell mode execution path, both of which bypass the application's intended shell-argument safety checks.
| CVE-ID | CVE-2026-27626 |
| Komponente | OliveTin |
| Sicherheitslückenklasse | CWE-78: Unzureichende Neutralisierung spezieller Elemente in einem OS-Befehl |
| CVSS 3.1 | 9.9–10.0 (Kritisch) — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H |
| Betroffene Versionen | Alle Versionen ≤ 3000.10.0 (Commits vor 0.0.0-20260222101908-4bbd2eab1532) |
| Behobene Version | 0.0.0-20260222101908-4bbd2eab1532 oder neuer |
| Sicherheitshinweis | GHSA-49gm-hh7w-wfvf |
| Veröffentlicht | 2026-02-22 (Sicherheitshinweis), 2026-02-25 (NVD) |
OliveTin ist eine selbst gehostete Weboberfläche zur Bereitstellung vordefinierter Shell-Befehle für Endbenutzer. Dieses Repository enthält einen Proof-of-Concept, der zwei unabhängige OS-Befehlseinschleusungsvektoren im Shell-Modus-Ausführungspfad von OliveTin demonstriert, die beide die beabsichtigten Sicherheitsprüfungen für Shell-Argumente der Anwendung umgehen.
OliveTin ermöglicht es einem Administrator, Aktionen zu definieren – Shell-Befehle mit parametrisierten Argumenten – die authentifizierte (oder je nach Konfiguration anonyme) Benutzer über eine Weboberfläche oder über Webhooks auslösen können. Um zu verhindern, dass Benutzer durch Argumentwerte aus dem beabsichtigten Befehl ausbrechen, führt OliveTin jedes benutzergelieferte Argument durch checkShellArgumentSafety(), bevor es in eine Befehlszeichenfolge eingefügt und an sh -c übergeben wird.
Dies ist die Sicherheitsgrenze, die die Sicherheitslücke durchbricht. OliveTin unterscheidet explizit zwischen „Administrator definiert den Befehl“ und „Benutzer liefert den Wert“ – die Sicherheitsprüfung existiert speziell, damit ein Benutzer einen Argumentwert nicht in eine Möglichkeit verwandeln kann, beliebige Befehle auszuführen.
password wird nicht geprüftcheckShellArgumentSafety() bereinigt nur eine feste Positivliste von Argumenttypen:
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// FEHLER: Typ "password" wird nicht geprüft
return true // Geht von Sicherheit aus
}
password ist ein dokumentierter, vorgesehener Argumenttyp zur Annahme vertraulicher Benutzereingaben – er ist jedoch nicht in dangerousTypes enthalten, sodass die Funktion mit return true ohne Bereinigung durchfällt. Jeder Benutzer, der ein Argument vom Typ password in einer Aktion im Shell-Modus befüllen kann, kann Shell-Metazeichen (;, |, `, $() usw.) einschleusen, die als Benutzer des OliveTin-Prozesses beliebige Befehle ausführen.
Die Ausnutzbarkeit wird durch die Standardeinstellungen von OliveTin verstärkt: Selbstregistrierung ist aktiviert und authType: none ist standardmäßig eingestellt, sodass in vielen realen Bereitstellungen „authentifizierter Benutzer“ praktisch keine Hürde darstellt.
Unabhängig von Vektor 1 extrahiert der Webhook-Handler von OliveTin beliebige Schlüssel/Wert-Paare aus dem JSON-Body eines eingehenden Webhooks und fügt sie direkt in ExecutionRequest.Arguments ein (service/internal/executor/handler.go:152-156).
Da diese aus Webhooks stammenden Schlüssel kein entsprechendes ActionArgument in der Konfiguration der Aktion haben, findet parseActionArguments() (arguments.go) keinen zu prüfenden Argumenttyp und überspringt checkShellArgumentSafety() vollständig – nicht nur für password, sondern für jeden Typ. Der Rohwert wird in den Shell-Befehl eingefügt und ohne Validierung an sh -c übergeben.
Da der Empfang eingehender Webhooks von externen/nicht vertrauenswürdigen Quellen einer der primären unterstützten Anwendungsfälle von OliveTin ist, erfordert dieser Vektor überhaupt keine Authentifizierung.
Eine OliveTin-Instanz, die den Shell-Modus mit einer über Webhook auslösbaren Aktion verwendet, ist anfällig für nicht authentifizierte Remote-Codeausführung mit den Rechten des OliveTin-Prozesses – je nach Bereitstellung (Bare Metal vs. Container, gewährte Capabilities usw.) möglicherweise eine vollständige Kompromittierung des Hosts.
Sie sind wahrscheinlich anfällig, wenn Ihre OliveTin-Instanz:
password hat, das für nicht vertrauenswürdige / mit niedrigeren Rechten ausgestattete Benutzer freigegeben ist (Vektor 1), oderpython3 CVE-2026-27626.py -u <ZIEL> [OPTIONEN]
0.0.0-20260222101908-4bbd2eab1532 oder neuer durch, sobald es in Ihrem Update-Kanal verfügbar ist.password bei jeder Aktion, die für nicht vertrauenswürdige Benutzer erreichbar ist.authType anders als none).| Datum | Ereignis |
|---|---|
| 2026-02-20 | CVE reserviert |
| 2026-02-22 | GitHub Security Advisory veröffentlicht |
| 2026-02-25 | NVD-Veröffentlichung |
| 2026-02-27 | Advisory aktualisiert |
Dieser PoC wird ausschließlich zu defensiven Forschungszwecken, für die Erkennungsentwicklung und für autorisierte Penetrationstests veröffentlicht. Führen Sie ihn nicht gegen Systeme aus, die Sie nicht besitzen oder für die Sie keine ausdrückliche schriftliche Genehmigung zum Testen haben. Die missbräuchliche Verwendung dieses Codes gegen Systeme Dritter kann gegen Computerstrafgesetze verstoßen (z. B. CFAA in den USA, Computer Misuse Act im Vereinigten Königreich und entsprechende Gesetze in anderen Ländern) und liegt in der alleinigen Verantwortung der Person, die ihn ausführt.
Md Saikat (0xh7ml)
| Option | Beschreibung | Standard |
|---|
-u, --url | Ziel-Host/IP | Erforderlich |
-p, --port | OliveTin-Port | 1337 |
-x, --cmd | Auszuführender Befehl | id |