C # Image.FromStream è sicuro?

7

dopo aver letto i dati dalla richiesta come Stream ho avuto bisogno di convertirlo in Immagine così ho usato questo metodo:

Stream inputStream = HttpContext.Current.Request.InputStream;
Image img = Image.FromStream(inputStream)

quindi, mentre non sono in grado di sapere cosa c'era in quel inputStream (il formato del file è già fatto ma ancora ..) potrebbe esserci un virus o malware, quindi in quel caso FromStream (Stream) genererebbe ArgumentException. dal momento che non è un'immagine.

la mia domanda è: se il file caricato contiene un virus e il metodo genera un'eccezione durante il tentativo di convertire il flusso in Immagine: ha fatto del male al server? se sì, come evitarlo? quale dovrebbe essere lo scenario per gestire il caricamento di file nel server? mi sto semplicemente chiedendo piuttosto o no ho bisogno di cercare virus nello scenario del caricamento delle foto.

    
posta Yaniv 21.02.2012 - 19:01
fonte

2 risposte

6

Se il file caricato è in un formato immagine valido, .FromStream non genererà un'eccezione, anche se contiene un virus. Cioè, non ci sono virus che ci controllino.

D'altro canto, non è possibile attivare il virus, poiché il file a questo punto viene gestito solo come byte non elaborati.
(È certamente possibile, se non fattibile, che contenga un attacco indirizzato direttamente alla classe Image .NET, ad esempio tramite buffer overflow.Tuttavia, oltre ad essere altamente improbabile che esista una tale vulnerabilità, è ancora più improbabile che qualcuno prendersi la briga di prendere di mira un tale vettore di nicchia).

Quindi, a questo punto sei perfettamente (realisticamente parlando) sicuro, ma non hai idea se il file è pulito o meno.

La vera domanda diventa, cosa succede dopo questo file?

Viene salvato su disco e utilizzato localmente?
In questo caso dovresti avere qualche forma di antivirus per controllarlo, se non altro per il tuo beneficio - se credi in esso, puoi semplicemente fare in modo che il motore AV locale lo scannerizzi.

È in seguito restituito ad altri utenti e quindi può utilizzare il tuo sistema per la diffusione?
Dovresti sicuramente avere qualche forma di scansione AV prima di salvare il file. Si noti che questo potrebbe non essere così semplice, dal momento che si potrebbero archiviare le immagini nel database (ci sono scanner AV che possono essere attivati dall'API per un segmento di memoria, prima che venga salvato nel file) ... In ogni caso, I Sono categoricamente contrario all'esecuzione di scansioni antivirus direttamente sui vostri sistemi attuali. Faresti meglio ad avere una qualche forma di scanner AV gateway, prima che colpisca anche il tuo sistema.

Tuttavia, tieni conto che quando consenti agli utenti casuali di caricare file arbitrari, la pulizia dei virus non è il massimo delle tue preoccupazioni.

  • Per esempio, puoi essere sommerso - sia da file enormi, sia da molti più piccoli, quindi eseguendo il server.
  • Se l'utente può specificare il percorso del file salvato, potrebbe potenzialmente sovrascrivere i file di sistema o caricare il codice eseguibile.
  • Se gli attributi del file vengono salvati e visualizzati successivamente (inclusi nome file e nome utente, ma anche descrizione, tipo di file, posizione, ecc.), questo può portare ad altri attacchi Web standard, come XSS o SQL Injection.
  • Fai una ricerca qui per GIFAR - questi sono file che sono sia file di immagine validi, sia file JAR validi (Java Archive - codice eseguibile per il browser). Questi naturalmente non sono un virus ...
  • A seconda del sistema, potresti essere a rischio di danni legali, se i tuoi utenti caricano, ad es. immagini protette da copyright, ad es. pornografia infantile. Certo, consulta il tuo avvocato, perché non lo sono.

TL; DR

In breve, accettare caricamenti arbitrari ti porta in un intero casino di potenziali problemi e la scansione antivirus non è la cosa peggiore.

    
risposta data 21.02.2012 - 20:22
fonte
4

Sì, la funzione è protetta da tutti i buffer overflow conosciuti, poiché Microsoft invia patch per la base di codice .NET. Ma non è una soluzione completa.

Per ulteriori informazioni vedi questi link:

Ecco le protezioni che utilizzerei per accettare immagini da fonti non attendibili :

  • Patch del server: la classe Image fa parte del framework .NET, quindi finché sei su un framework supportato, MSFT preverrà i buffer overflow.

  • Gestisci la ArgumentException da questa classe, poiché tenta di caricare non immagini getterà un'eccezione. Puoi ricevere un avviso tempestivo sui tentativi di "hack" con questa eccezione.

  • Verifica l'estensione e il nome dell'immagine

  • Non consentire all'utente di specificare la directory (o controllarla strettamente se lo fai)

  • Controlla il tipo di contenuto contro l'estensione.

  • Esegui un controllo antivirus sull'immagine (ad es. VirusTotal )

  • Utilizza l'intestazione X-Content-Type-Options : Nosniff ( maggiori informazioni ) a proteggersi dagli attacchi in stile GIFR .

  • Non mostrare i metadati dell'immagine agli utenti finali. Strumenti come Exiv2 consentono la visualizzazione e la modifica di dati non attendibili.

  • Limite dimensioni: racchiude la classe Stream e consente di interrompere i tentativi di caricare file di grandi dimensioni. Se si utilizza ASP.NET, per impostazione predefinita il componente lato server salva prima tutti i dati nella RAM. Evita l'esaurimento della memoria DoS utilizzando un HTTPHandler che salva direttamente sul disco.

  • Utilizza un dominio DNS separato per la pubblicazione di immagini ( altre informazioni )

  • Converti tutte le immagini caricate in BMP, quindi in un formato comune (PNG, ecc.) ( maggiori informazioni )

  • Assicurati che l'area di gestione temporanea della conversione sopra menzionata non sia accessibile al pubblico

  • Inietti l'immagine con rumore ( maggiori informazioni )

risposta data 21.02.2012 - 19:29
fonte

Leggi altre domande sui tag