wordexp(3) pericoloso, espande comandi anche con WRDE_NOCMD
Testo scritto con l’intelligenza artificiale a partire da una fonte citata, senza revisione umana prima della pubblicazione.
La API POSIX per le espansioni di shell può eseguire sostituzioni di comandi di default e alcune libc (musl, l'helper macOS) permettono bypass concreti, quindi non usare wordexp su input non attendibili.
Usare wordexp(3) su input non attendibili può eseguire comandi anche con WRDE_NOCMD: evitalo e implementa solo le espansioni necessarie1.
wordexp(3) replica le espansioni della shell. Per impostazione predefinita abilita tutto, compresa la sostituzione di comandi. Esempi tipici: $(echo test) o id vengono valutati dalla shell. Su input controllato dall’utente, questo significa esecuzione arbitraria di comandi1.
Il flag WRDE_NOCMD dovrebbe disabilitare le esecuzioni. Non è sempre così. In alcune libc il filtro è incompleto: lascia passare pattern che la shell considera validi. Il risultato è un bypass possibile anche con WRDE_NOCMD1.
musl è il caso descritto con più chiarezza. Implementa wordexp(3) delegando alla shell di sistema. Prima di delegare, scansiona l’input per bloccare le sostituzioni di comando. La scansione è sommaria. Non intercetta tutti i casi che una shell come GNU Bash accetta. Quei casi arrivano alla shell e si trasformano in comandi eseguiti, nonostante WRDE_NOCMD1.
Su macOS il percorso è simile: la libc passa il lavoro a un helper di sistema, /usr/lib/system/wordexp-helper1. Secondo Julian Squires, questa catena ha esposto lo stesso tipo di bypass visto su musl fino al 2023. Non risulta un test dopo il cambio della shell predefinita di macOS da bash a zsh. La verifica resta aperta1.
Raccomandazione operativa: non usare wordexp(3) con input non attendibili, nemmeno con WRDE_NOCMD. L’API eredita la semantica della shell e, quando delega a componenti esterni, i filtri preliminari possono non coprire tutti i pattern ammessi dalla shell1.
Chi cerca wordexp(3) spesso vuole solo la tilde: trasformare ~/foo in /home/utente/foo. È meglio implementare quella singola espansione in proprio, senza tirarsi dietro l’intero set di comportamenti della shell. In alternativa, limitare drasticamente l’input: accettare solo percorsi già normalizzati, senza metacaratteri e senza variabili. Se serve un elenco di file, usare API che non interpretano metacaratteri della shell, e comporre i parametri in modo esplicito1.
Nota storica su macOS: in passato wordexp(3) delegava a Perl. Oggi passa per l’helper di sistema. La strada tecnica cambia, il rischio no: quando l’implementazione esternalizza il lavoro e il filtro non vede tutti i casi, la sostituzione di comandi può riattivarsi1.
Fonti
Come è nato questo articolo Scritto da un sistema di intelligenza artificiale, con controlli automatici
Millebit non ha giornalisti che scrivono gli articoli: li scrive un motore editoriale basato su modelli di intelligenza artificiale, a partire dalle fonti elencate qui sopra. Prima di uscire, ogni testo passa questi controlli:
- Fedeltà alle fonti. Un secondo passaggio toglie ogni affermazione che le fonti non sostengono. Valutazione su questo pezzo: 9/10.
- Anti-cliché. Un filtro scarta frasi fatte, enfasi e tic della prosa artificiale: superato.
- Giudizio editoriale. Un modello valuta il pezzo su sette criteri (apertura, chiarezza, economia, concretezza, voce, struttura, fedeltà) e sotto 7,8/10 non si pubblica. Questo articolo ha preso 8,7/10 dopo 1 revisione.
I controlli riducono gli errori ma non li eliminano: un modello può fraintendere una fonte. Per le decisioni importanti, risali alla fonte originale. Se trovi un errore, segnalacelo.
Per vedere Millebit nelle notizie principali di Google, aggiungilo alle tue fonti preferite. Oppure segui l’edizione di oggi, il feed RSS o La Sintesi.