Quali sono i problemi di sicurezza per i file JSON con codifica Base64? [chiuso]

0

In un'API REST, mi piacerebbe ricevere le immagini come base64 stringhe codificate in un oggetto JSON dal post dell'utente e salvarle su disco usando node.js fs module.

Il corpo della richiesta sono oggetti come:

 { file: 'data:image/png;base64,iVBORw0KGgoAAA...

Mi chiedo se ci sono alcune vulnerabilità associate a tale archiviazione di file e come evitarli?

    
posta Karlom 19.10.2018 - 11:24
fonte

2 risposte

4

Prima di tutto, ci sono tutti i rischi di sicurezza dei servizi Web standard (sicurezza delle connessioni, autenticazione, autorizzazione, gestione delle sessioni, negazione del servizio, registrazione, patching, ecc.). Per ora non parlerò più di quelli, ma tieni presente che hai bisogno di un ambiente sicuro per qualcosa di simile.

Per quanto riguarda i rischi specifici del tuo sistema e quelli simili ... Il rischio più ovvio si presenta se gli utenti hanno il controllo sul nome del file creato dal servizio. In tal caso, si corre il rischio di attraversare il file system, sovrascrivere i file di altri e così via. Non sembra che tu abbia intenzione di farlo, ma è qualcosa da tenere a mente.

Esiste anche il rischio di caricare contenuti che potrebbero essere utilizzati per attaccare il server o gli altri utenti. Questi attacchi sono più facili se l'attaccante può controllare il nome del file, ma è possibile se tutto ciò che possono controllare è l'estensione (e imparano il nome del file) e se c'è un'API web per scaricare il file. Per attaccare il server, caricare un file dannoso che il server considererà come eseguibile (ad esempio, una pagina PHP se il server supporta quelli) e quindi navigare verso di esso; questo potrebbe non essere possibile se stai usando un server Node ben configurato. Per attaccare altri utenti, carica un file HTML dannoso e prova a ingannare altri utenti per visualizzarlo nel browser (con conseguente XSS memorizzato); questo può essere mitigato rendendo i file recuperabili solo da un dominio diverso da quello per cui l'utente ha cookie / autenticazione e / o costringendo il browser a scaricare il file anziché visualizzarlo.

Esiste il rifiuto del servizio semplicemente caricando troppi dati. Valuta la quantità di dati che consentirai agli utenti di archiviare e il modo in cui applichi tale limite.

C'è il rischio di contenuti illegali. L'esempio standard qui è la pornografia infantile; se gli utenti caricano tali contenuti sul server e in seguito si scopre di essere "in possesso" di esso, le cose potrebbero andare male per te. Consiglio di verificare le leggi locali e, idealmente, di chiedere ad un avvocato, quali sono i tuoi diritti e le tue responsabilità quando si tratta di ospitare contenuti caricati dagli utenti.

Ci sono alcuni rischi per i parser JSON o Base64, anche se questi formati sono semplici e ampiamente implementati, quindi non mi aspetto problemi lì. Non capisco perché tu voglia usare questi formati, però; I tipi di contenuto MIME sono il modo standard per caricare file su un server web (e quindi includono l'analisi integrata nella maggior parte dei server Web) e sono meno dispendiosi dell'ampiezza di banda (base64 espande tutto il contenuto codificato a 4/3 della dimensione, ma non c'è ragione un corpo di richiesta HTTP deve essere composto solo da caratteri stampabili).

Dato che stai memorizzando molti dati utente, devi considerare la sicurezza dei dati a riposo. La crittografia dei singoli file, la crittografia dell'intero volume o l'utilizzo di un archivio esterno crittografato in modo trasparente rappresentano tutti i possibili modi per ottenere ciò, ma presentano anche il problema dell'archiviazione delle chiavi (come quasi tutti i cryptosystem). Non dimenticare di assicurare che anche i tuoi backup siano protetti; tonnellate di dati sensibili sono stati trapelati o rubati dopo che qualcuno ha ottenuto i nastri di backup o simili.

Potresti anche prendere in considerazione il problema della privacy degli utenti. Pur non essendo esattamente una funzionalità di sicurezza, la privacy (che impedisce agli utenti non autorizzati - potenzialmente inclusi, l'operatore del servizio - di vedere cosa è stato caricato) coinvolge una mentalità simile e viene spesso fornita utilizzando strumenti di sicurezza (come la crittografia). Hai taggato questa domanda come "crittografia dei file", ma in realtà non parli di crittografia (base64 è una codifica, ma non c'è alcuna chiave in gioco, chiunque voglia decodificarlo, quindi non è una crittografia schema).

    
risposta data 19.10.2018 - 12:20
fonte
1

Base64 è un modo comune per includere dati binari in documenti di testo, come JSON o e-mail. In effetti, questa codifica è stata creata per questo scopo.

Come nota a margine, questa codifica non è destinata a essere utilizzata per la memorizzazione dei dati, ma per la trasmissione di dati su protocolli di testo.

Le vulnerabilità potrebbero provenire dal parser di base64, ma poiché è un formato molto semplice, è improbabile rispetto ad altri formati di codifica. Tuttavia è ancora successo in passato, più volte. Quindi dovresti fare attenzione mentre scegli il parser.

Altre vulnerabilità potrebbero provenire dal parser JSON. Anche qui si applicano le stesse osservazioni rispetto a base64.

Le altre possibili vulnerabilità non sono specificamente dipendenti da base64 o JSON, quindi non le indirizzerò qui (e ciò risponderebbe a una domanda abbastanza ampia). In generale, fai attenzione mentre sviluppi la tua API REST. È possibile trovare liberamente delle buone guide, come OWASP per lo sviluppo web. Potresti anche eseguire una semplice valutazione del rischio per dare priorità alle tue attività di sicurezza.

    
risposta data 19.10.2018 - 12:01
fonte

Leggi altre domande sui tag