
Script di exploit proof-of-concept per l'iniezione di comandi (CVE-2026-27626) nella gestione degli argomenti della password di OliveTin, che consente RCE tramite richieste API appositamente create.
OliveTin permette a un amministratore di definire "azioni": comandi shell con argomenti parametrizzati che gli utenti possono attivare da una web UI o da un'API. Prima di inserire un valore fornito dall'utente nel comando shell, OliveTin dovrebbe farlo passare da checkShellArgumentSafety(). Questa funzione controlla quattro tipi di argomento: string, int, bool, choice. Salta completamente password e restituisce true, ovvero "sicuro", senza guardare affatto il valore.
Quindi se un'azione ha un argomento di tipo password, e quell'argomento viene sostituito in una stringa di comando shell, puoi metterci qualsiasi cosa. Punti e virgola, backtick, $(), qualunque cosa. Se l'argomento è racchiuso tra virgolette nel comando sottostante (un pattern comune per cose come le password dei database), basta uscire dalle virgolette.
func checkShellArgumentSafety(argType string, value string) bool {
dangerousTypes := []string{"string", "int", "bool", "choice"}
for _, dt := range dangerousTypes {
if argType == dt {
return sanitizeInput(value)
}
}
// password type falls through here, unchecked
return true
}
Interessa OliveTin fino alla 3000.10.0. Corretto nella linea 3000.11.1 (commit 0.0.0-20260222101908-4bbd2eab1532), che aggiunge password ai tipi controllati. Advisory: GHSA-49gm-hh7w-wfvf. CVSS 9.9.
Qualunque cosa in cui un argomento di tipo password finisce dentro una stringa di shell, di solito tra virgolette:
- title: Backup database
id: backup_db
shell: "mysqldump -u {{ db_user }} -p'{{ db_pass }}' {{ db_name }} > /tmp/backup.sql"
arguments:
- name: db_user
type: ascii_identifier
- name: db_pass
type: password
- name: db_name
type: ascii_identifier
db_pass si trova tra virgolette singole senza alcun controllo. Invia '; id ;' come valore e OliveTin esegue id prima che la chiamata mysqldump malformata fallisca. Il fallimento non conta; il comando iniettato è già stato eseguito, con l'utente con cui gira OliveTin. In molte configurazioni si tratta di root, perché la gente lo esegue sotto systemd senza una direttiva User= e non ci pensa più.
Non servono credenziali per nulla di tutto questo se l'istanza ha authRequireGuestsToLogin: false, cosa comune nelle distribuzioni più piccole o hobbistiche.
pip install requests
python3 exploit.py -u <target> --action backup_db --arg db_pass -x "id"
| flag | a cosa serve | predefinito |
|---|---|---|
-u, --url | host o IP di destinazione | obbligatorio |
-p, --port | porta di OliveTin | 1337 |
--action | la bindingId dell'azione vulnerabile | obbligatorio |
--arg | nome dell'argomento di tipo password | obbligatorio |
-x, --cmd | comando da iniettare | id |
--extra-arg | altri argomenti necessari all'azione, name=value, ripetibile | nessuno |
Se l'azione ha bisogno di altri argomenti per girare senza errori prima che il comando iniettato venga eseguito, passali con --extra-arg:
python3 exploit.py -u 10.0.0.5 --action backup_db --arg db_pass \
--extra-arg db_user=admin --extra-arg db_name=prod -x "whoami"
Lo script fa una POST a StartAction, aspetta due secondi, poi interroga ExecutionStatus e stampa tutto quello che riceve. Di solito vedrai l'output del comando iniettato sopra un errore del comando legittimo che è stato eseguito subito dopo ed è fallito. È normale. L'errore è solo estetico; il tuo comando è già stato eseguito.
Aggiorna OliveTin oltre la 3000.10.0. Se non puoi ancora: rimuovi gli argomenti di tipo password dalle azioni raggiungibili da utenti non fidati, disattiva l'esecuzione ospite e smetti del tutto di far interpolare i valori degli argomenti nelle stringhe di shell, se puoi evitarlo. Passa invece i segreti tramite variabili d'ambiente o un file che OliveTin legge da un percorso fisso. E non eseguire il servizio come root. Non c'è alcun motivo per cui un task runner debba averlo.
exploit.py: lo script del PoCREADME.md: questo fileQuesto materiale è qui per chi applica le patch alle proprie istanze OliveTin, scrive regole di rilevamento o testa sistemi che è autorizzato a testare. Non puntarlo contro nulla che non possiedi o su cui non hai il permesso di intervenire. La responsabilità è tua, non di chi ha scritto questo.