Download sicuro dei contenuti inviati dagli utenti

1

TL; DR Salviamo il carico utile della richiesta e l'intestazione Content-Type in un database. Dovrebbe essere JSON o CSV ma potrebbe non essere corretto. Supporta gli utenti a scaricare il carico utile della richiesta come file nei loro browser utilizzando Content-Disposition: attachment . Tentiamo di aggiungere un'estensione di file di .json o, l'impostazione predefinita, ".csv".

In che modo gli utenti dell'assistenza possono scaricare questo file in modo sicuro quando può contenere assolutamente qualcosa? Sono meno preoccupato per gli attacchi con tipo di bomba ZIP ma più spyware, ransomware, ecc. Ecc.

Sfondo

Abbiamo un'API REST che supporta sia i tipi di contenuti JSON e CSV.

L'API è protetta con un certificato client univoco per ciascun utente.

Per ragioni di arbitrato, dobbiamo tenere un registro di controllo del contenuto esatto inviato al servizio, lo facciamo memorizzando i byte direttamente nel database insieme all'intestazione del tipo di contenuto e ad altri campi dall'URL e dal certificato del cliente. Tutto ciò, ad eccezione del certificato, è la pre-convalida poiché è necessario registrare anche invii non validi.

Abbiamo un team di supporto molto attivo per loro è aiutare gli utenti che non sono in grado di inviare i loro documenti a causa di un contenuto malformato o b) il contenuto viola alcune regole aziendali.

Ora è arrivato il requisito di consentire al nostro team di supporto di scaricare le informazioni di controllo in modo che possano provare a riprodurre il problema degli utenti inviandolo a un sistema di test o semplicemente guardando il contenuto per individuare errori.

Forniremo un link al file con estensione .csv o .json se possiamo rilevare il tipo di contenuto.

Il problema

Ovviamente questo è ampiamente aperto a XSS dal punto dei campi non convalidati, ma questo è mitigato abbastanza facilmente codificandolo correttamente per la visualizzazione, ma non vedo come questo sia possibile per il file scaricato.

Ad esempio, invio un foglio di lavoro Excel con Content-Type: text/csv , un utente di supporto scarica il file e apre in Excel per visualizzare il CSV e viene avvisato "l'estensione del file non corrisponde al contenuto, vogliono comunque aprirsi ?" a cui fanno clic su "sì" perché stanno cercando di capire perché è malformato e il mio foglio di calcolo dannoso è aperto.

Anche se rimuoviamo il requisito dell'estensione del file, un utente di supporto potrebbe provare ad aprirlo in Excel comunque, visto che il contenuto dovrebbe essere un CSV.

Soluzioni

Non riesco a pensare a soluzioni solide;

  • Allenare gli utenti del supporto per aprire prima in editor di testo semplice, ma gli utenti sono fallibili)
  • Previene il download di contenuti che non sono dati di carattere, ma i dati di carattere possono ancora essere un vettore di attacco, ovvero un file .bat e non soddisfano i requisiti
  • Codifica il contenuto e visualizza sullo schermo copia / incolla assicurandoti che sia solo testo, i file potrebbero essere grandi e attualmente utilizzano lo streaming dal DB allo stream di output per mantenere basso il sovraccarico della memoria.
  • Fidati dei nostri utenti e mantengono i loro certificati client al sicuro

È solo che i requisiti saranno sempre in disaccordo con la sicurezza e non c'è modo di scaricare i file inviati dall'utente in sicurezza?

    
posta James 31.03.2016 - 18:02
fonte

3 risposte

2

IMHO, il tuo problema chiave è che non stai convalidando il contenuto che stai caricando. Dato che qui stiamo parlando solo di JSON e CSV, è banale scrivere codice per convalidarli. Non prenderà tutti i problemi, ma otterrà la maggior parte di loro. E almeno puoi dire all'errore di caricamento che hanno commesso un errore nel momento in cui stanno caricando, piuttosto che dire a un consumatore di contenuti dopo qualche tempo che non possono avere il contenuto.

Come minimo suggerirei di convalidare il set di caratteri e la struttura del file - e controllarlo corrisponde al mimetype inviato. Tuttavia, vi è una complicazione nel fatto che non tutte le cose che sono considerate CSV sono conformi a RFC 4180 e RFC 4180 descrive in realtà molte varianti del formato di file CSV (in particolare come i simboli utilizzati per i meta-dati sono rappresentati quando si verificano all'interno dei dati).

Vorrei strongmente sconsigliare a chiunque di scaricare contenuti che non sono stati controllati tramite il browser. Poiché dovrebbe essere possibile rappresentare il contenuto utilizzando UTF-8 o UTF-16, è banale creare una rappresentazione del contenuto con i caratteri non conformi sostituiti e visualizzati in un PRE ... / Blocco PRE all'interno di una pagina html (anche con le htmlentities tradotte).

    
risposta data 01.04.2016 - 18:05
fonte
1

Suppongo che i tuoi addetti all'assistenza scaricheranno questi file utilizzando un browser web.

Se hai intenzione di visualizzare il file in linea nel browser:

  1. Devi disabilitare lo sniffing del contenuto. Un utente malintenzionato potrebbe provare a caricare uno script con un tipo di contenuto falso e alcuni browser tentano di "annusare" il tipo di contenuto effettivo ed eseguirlo. Imposta l'intestazione di risposta X-Content-Type-Options: nosniff sul server

  2. Si desidera ospitare il contenuto dell'utente su un nome di dominio completamente diverso rispetto al sito che si utilizza per ottenerlo. Ad esempio, Google utilizza googleusercontent.com per i dati caricati dall'utente per gmail.com. Ciò impedirebbe a un caricamento errato di rubare o sovrascrivere i tuoi cookie sul tuo dominio

Else:

  1. Imposta il tuo server per inviare il file come allegato, non in linea, in modo che uno script dannoso non possa essere eseguito nel browser. Content-Disposition: attachment; filename="filename.csv" intestazione risposta

  2. Se browser IE, è possibile utilizzare un protocollo personalizzato per forzare l'apertura del file in un'applicazione specifica (ad esempio Blocco note). Vedi link

Entrambi:

  1. Potresti utilizzare le librerie sul tuo server per verificare che i documenti caricati siano ben formati. Jackson per JSON e Super CSV per CSV con Java
risposta data 31.03.2016 - 21:33
fonte
1

Come ho capito la tua domanda, il vero problema è:

Users can upload arbitrary bytes and then trick my help desk people into opening that data as a file in Excel.

What if, for example the bytes contain not a csv but a excel file with a macro virus?

What can I do?

Bene. potresti

  • avere excel non installato sulle loro workstation
  • limita l'esecuzione di macro
  • verifica la plausibilità sul server ("è un testo semplice? È analizzabile csv o json?"), generando un errore else.
  • man mano che gli invii sono firmati, fatturare al cliente che l'ha inviato per tutte le interruzioni risultanti da abuso o attacco.
risposta data 31.03.2016 - 21:45
fonte

Leggi altre domande sui tag