Come estrarre in modo sicuro un file tar non attendibile?


30

Vorrei essere in grado di estrarre un file tar, in modo tale che tutti i file estratti siano collocati in una determinata directory di prefissi. Qualsiasi tentativo da parte dei file tar di scrivere su directory esterne dovrebbe impedire l'estrazione.

Come puoi immaginare, è così che posso estrarre in modo sicuro un file tar non attendibile.

Come posso farlo con GNU tar?

Mi è venuta in mente:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

ma non sono sicuro che questo sia abbastanza paranoico.


2
Non è abbastanza paranoico. In passato ho costruito alcuni tarball cattivi che sono saliti attraverso collegamenti simbolici che ha creato. Ho finito per creare il mio tar che era setuid-root in modo che potesse eseguire chroot (".") E rilasciare i privilegi.
Giosuè,

8
@Joshua, quindi la tua soluzione per rendere più sicura un'utilità ampiamente testata è stata quella di creare la tua versione e dargli i privilegi di root?
Smetti di fare del male a Monica il

4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || exit (1); setuid (getuid ()); è facile da controllare.
Giosuè,

2
Potresti anche voler controllare cosa c'è dentro il file tar usando l' -topzione.
Thomas,

Risposte:


40

Non hai affatto bisogno della paranoia. GNU tar- e in effetti qualsiasitar programma ben scritto prodotto negli ultimi 30 anni circa - rifiuterà di estrarre i file nel tarball che iniziano con una barra o che contengono ..elementi, per impostazione predefinita.

Devi fare di tutto per forzare i tarprogrammi moderni a estrarre tali tarball potenzialmente dannosi: sia GNU che BSD hanno tarbisogno -Pdell'opzione per far loro disabilitare questa protezione. Vedi la sezione Nomi di file assoluti nel manuale tar di GNU.

Il -Pflag non è specificato da POSIX, ¹, quindi altri tarprogrammi potrebbero avere modi diversi di affrontarlo. Ad esempio, il starprogramma Schily Tools utilizza -/e -..disabilita queste protezioni.

L'unica cosa che potresti considerare di aggiungere a un tarcomando ingenuo è un -Cflag per forzarlo ad estrarre le cose in una directory temporanea sicura, quindi non devi cdprima accedervi.


A parte :

  1. Tecnicamente, tarnon è più specificato da POSIX. Hanno cercato di dire al mondo dell'informatica Unix che dovremmo usare paxora invece di tare cpio, ma il mondo dell'informatica li ha ampiamente ignorati.

    È rilevante qui notare che la specifica POSIX per paxnon dice come dovrebbe gestire barre o ..elementi incorporati . C'è un --insecureflag non standard per BSDpax per sopprimere le protezioni contro gli ..elementi del percorso incorporati , ma apparentemente non esiste una protezione predefinita contro le barre iniziali; la paxpagina man di BSD raccomanda indirettamente di scrivere -sregole di sostituzione per affrontare il rischio di percorso assoluto.

    Questo è il genere di cose che accade quando uno standard di fatto rimane in uso attivo mentre lo standard di diritto è ampiamente ignorato.


7
pax - portable archive interchangeAwww, che carino, POSIX pensa che sostituirà forse il formato di archivio più utilizzato: P
cat

1
@cat Il formato di archivio predefinito è una variante tar ragionevolmente ampiamente supportata (AIUI dovrebbe anche supportare il formato cpio). Pax è piuttosto un tentativo di sostituire l' interfaccia di comando per gestire tali archivi, poiché la gestione degli argomenti di comando di tar è ... eccentrica.
Casuale 832,

Nota a margine casuale: sono abbastanza sicuro che sia "de jour", ovvero la parola francese, anziché "de jure".
Finanzia la causa di Monica il

7
@QPaysTaxes non lo è. de jure è latino e contrasta con la situazione attuale, vale a dire ciò che è di fatto. De jour dovrebbe anche essere du jour per obbedire alle regole grammaticali francesi.
Primo

1
Questo è il caso di uno sfortunato falso affine. Il francese "du jour" ("del giorno") assomiglia / suona molto al latino "de jure" ("della legge") qui contrastato con "de facto" ("di fatto"). Si potrebbe sostenere che pax è lo "standard del mese" o "standard du jour" per prendere in giro il modo in cui i nuovi standard vengono proposti così spesso, mentre il vasto corpus di utenti rimane semplicemente con ciò che funziona per loro (standard di fatto), sapendo che (metaforicamente) domani ci sarà un nuovo standard da ignorare.
Monty Harder,

19

Con GNU tar, è semplicemente

tar -xvf untrusted_file.tar

in una directory vuota. Tar GNU rimuove automaticamente i /nomi dei membri principali durante l'estrazione, a meno che non sia esplicitamente indicato diversamente con l' --absolute-namesopzione . GNU tar rileva anche quando l'uso di fa ../sì che un file venga estratto al di fuori della directory di livello superiore e inserisce invece quei file nella directory di livello superiore, ad esempio un componente foo/../../bar/quxverrà estratto come bar/quxnella directory di livello superiore anziché bar/quxnel padre della directory di livello superiore . GNU tar si occupa anche dei collegamenti simbolici che puntano all'esterno della directory di livello superiore, ad esempio foo -> ../..e foo/barnon causeranno barl'estrazione all'esterno della directory di livello superiore.

Si noti che questo vale solo per (versioni sufficientemente recenti di) tar GNU (così come per alcune altre implementazioni, ad esempio * tar BSD e tar BusyBox). Alcune altre implementazioni non hanno tale protezione.

A causa dei collegamenti simbolici, le protezioni utilizzate non sarebbero sufficienti: l'archivio potrebbe contenere un collegamento simbolico che punta a una directory all'esterno dell'albero ed estrarre i file in quella directory. Non c'è modo di risolvere quel problema basandosi esclusivamente sui nomi dei membri, è necessario esaminare l'obiettivo dei collegamenti simbolici.

Se stai estraendo in una directory che contiene già collegamenti simbolici, la garanzia potrebbe non essere più valida.


6

Per coprire alcuni punti, le altre risposte non hanno:

  1. Innanzitutto, guarda cosa c'è nel file prima di estrarlo:

    tar -tvf untrusted_tar_file.tar
    

    Se c'è qualcosa dentro di cui non ti fidi o che vuoi estrarre, non estrarre il tarball.

  2. In secondo luogo, estrarre il tarball come utente non root che ha accesso in scrittura alla sola directory in cui si sta estraendo il tarball. Ad esempio, estrarre il tarball dalla directory home dell'utente non root.

4
1. Questo non è pratico per le operazioni batch. 2. A meno che non si stia eseguendo un'installazione personalizzata, alcuni percorsi possono essere scritti da tutti gli utenti, in particolare / tmp /
pipe

@pipe uno potrebbe anche creare una directory e un nuovo utente, e solo quell'utente ha accesso solo a quella directory, quindi eseguire il comando. Mi piace abbastanza la mia directory home, grazie.
gatto

2
@pipe Perché sulla buona di Dio Terra sarebbe voi mai passare non attendibili i dati attraverso un'operazione batch? Se non ti fidi, NON lo esegui incustodito.
Andrew Henle,

6
@AndrewHenle Uhm, ok. Come pensi che funzioni tutti i server su Internet? Pensi che un tipo su stackexchange esegua questo commento attraverso il proprio database e il sistema di markup monitorando manualmente l'operazione? Perché questo input è costituito da dati non attendibili tramite un'operazione batch.
pipe

Non consiglierei di estrarre un file non attendibile direttamente in una directory home. Non vuoi che ti sovrascriva .bashrc e altri .config / files, giusto?
Hugal31
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.