Quanto è grave questa nuova vulnerabilità di sicurezza ASP.NET e come posso risolverla?


189

Ho appena letto in rete una vulnerabilità di sicurezza recentemente scoperta in ASP.NET. Puoi leggere i dettagli qui.

Il problema risiede nel modo in cui ASP.NET implementa l'algoritmo di crittografia AES per proteggere l'integrità dei cookie generati da queste applicazioni per archiviare informazioni durante le sessioni dell'utente.

Questo è un po 'vago, ma qui è una parte più spaventosa:

La prima fase dell'attacco richiede alcune migliaia di richieste, ma una volta che ha successo e l'attaccante ottiene le chiavi segrete, è totalmente invisibile. Le conoscenze crittografiche richieste sono molto basilari.

Tutto sommato, non ho abbastanza familiarità con il tema della sicurezza / crittografia per sapere se questo è davvero così serio.

Quindi, tutti gli sviluppatori ASP.NET dovrebbero temere questa tecnica che può possedere qualsiasi sito Web ASP.NET in pochi secondi o cosa?

In che modo questo problema influisce sullo sviluppatore ASP.NET medio? Ci riguarda affatto? Nella vita reale, quali sono le conseguenze di questa vulnerabilità? E, infine: esiste qualche soluzione alternativa che previene questa vulnerabilità?

Grazie per le tue risposte!


EDIT: Fammi riassumere le risposte che ho ricevuto

Quindi, questo è fondamentalmente un tipo di attacco "padding oracle". @Sri ha fornito un'ottima spiegazione sul significato di questo tipo di attacco. Ecco un video scioccante sul problema!

Informazioni sulla gravità di questa vulnerabilità: Sì, è davvero serio. Consente all'attaccante di conoscere la chiave della macchina di un'applicazione. Quindi, può fare alcune cose molto indesiderate.

  • In posizione della chiave della macchina dell'app, l'utente malintenzionato può decrittografare i cookie di autenticazione.
  • Ancora peggio, può generare cookie di autenticazione con il nome di qualsiasi utente. Pertanto, può apparire come chiunque sul sito. L'applicazione non è in grado di distinguere tra te o l'hacker che ha generato un cookie di autenticazione con il tuo nome.
  • Gli consente anche di decrittografare (e anche generare) i cookie di sessione , sebbene non sia pericoloso come il precedente.
  • Non così grave: può decrittografare il ViewState crittografato delle pagine. (Se usi ViewState per archiviare dati riservati, non dovresti farlo comunque!)
  • Abbastanza inaspettato : con la conoscenza della chiave della macchina, l'attaccante può scaricare qualsiasi file arbitrario dall'applicazione Web, anche quelli che normalmente non possono essere scaricati! (Incluso Web.Config , ecc.)

Ecco alcune buone pratiche che non risolvono il problema ma aiutano a migliorare la sicurezza generale di un'applicazione Web.

Ora concentriamoci su questo problema.

La soluzione

  • Abilita customErrors e crea una singola pagina di errore a cui vengono reindirizzati tutti gli errori . Sì, anche 404s . (ScottGu ha detto che la differenziazione tra 404s e 500s è essenziale per questo attacco.) Inoltre, nel tuo Application_Erroro Error.aspxmetti del codice che fa un ritardo casuale. (Genera un numero casuale e usa Thread.Sleep per dormire così a lungo.) Ciò renderà impossibile all'aggressore decidere cosa è successo esattamente sul tuo server.
  • Alcune persone hanno raccomandato di tornare a 3DES. In teoria, se non si utilizza AES, non si riscontra la debolezza della sicurezza nell'implementazione di AES. A quanto pare, questo non è affatto raccomandato .

Alcuni altri pensieri

  • Sembra che non tutti pensino che la soluzione alternativa sia abbastanza buona.

Grazie a tutti coloro che hanno risposto alla mia domanda. Ho imparato molto non solo su questo problema, ma sulla sicurezza web in generale. Ho contrassegnato la risposta di @ Mikael come accettata, ma anche le altre risposte sono molto utili.


12
Venemo, posso solo dire che non penso che questo sia un buon posto per questa richiesta (a giudicare dalle risposte). Votare non è un buon modo per risolvere questa domanda, deve essere risposto da un esperto (e non è necessario essere un esperto per votare). Raccomando: mail-archive.com/cryptography@metzdowd.com/maillist.html o, come qualcuno sotto menzionato, il commento ufficiale di Microsoft, che non deve inviare alcun messaggio di errore al client. Questo è l'approccio corretto. Non eseguire il downgrade a 3DES. È un consiglio scioccante.
Noon Silk,


3
@ RPM1984 - Non sono d'accordo. Ci sono molte risposte utilizzabili qui. @ Dan, perché?
Venemo,

2
Ok, abbiamo diverse interpretazioni di una domanda su SO. Per me, se si può rispondere correttamente, allora va bene. Le risposte sono interessanti / utili, non fraintendetemi, ma questo per me è un problema in cui l'unica "risposta" è una soluzione alternativa - fino a quando MS non rilascia una correzione. Per me, questo dovrebbe essere un wiki.
RPM1984,

4
Nel caso in cui qualcuno tornasse a questo thread alla ricerca della correzione di sicurezza, si trova su microsoft.com/technet/security/bulletin/MS10-070.mspx (scegli il tuo sistema operativo e la versione .NET).
Andy,

Risposte:


58

Cosa devo fare per proteggermi?

[Aggiornamento 29/09/2010]

Bollettino Microsoft sulla sicurezza

Articolo KB con riferimento alla correzione

ScottGu ha collegamenti per i download

[Aggiornamento 25/09/2010]

Mentre aspettiamo la correzione, ieri ScottGu ha pubblicato un aggiornamento su come aggiungere un ulteriore passaggio per proteggere i tuoi siti con una regola URLScan personalizzata.


Fondamentalmente assicurati di fornire una pagina di errore personalizzata in modo che un attaccante non sia esposto a errori .Net interni, che dovresti sempre comunque in modalità di rilascio / produzione.

Inoltre, aggiungi un periodo di inattività casuale nella pagina degli errori per evitare che l'attaccante cronometri le risposte per ulteriori informazioni sull'attacco.

In web.config

<configuration>
 <location allowOverride="false">
   <system.web>
     <customErrors mode="On" defaultRedirect="~/error.html" />
   </system.web>
 </location>
</configuration>

Ciò reindirizzerà qualsiasi errore a una pagina personalizzata restituita con un codice di stato 200. In questo modo un utente malintenzionato non può consultare il codice di errore o le informazioni di errore per le informazioni necessarie per ulteriori attacchi.

È anche sicuro da impostare customErrors mode="RemoteOnly" , in quanto reindirizzerà i client "reali". Solo la navigazione da localhost mostrerà errori .Net interni.

La parte importante è assicurarsi che tutti gli errori siano configurati per restituire la stessa pagina di errore. Ciò richiede di impostare esplicitamente l' defaultRedirectattributo nella <customErrors>sezione e assicurarsi che non siano impostati codici per stato.

Cosa c'è in ballo?

Se un utente malintenzionato riesce a utilizzare l'exploit menzionato, può scaricare file interni dall'applicazione Web. In genere web.config è un obiettivo e può contenere informazioni riservate come le informazioni di accesso in una stringa di connessione al database, o persino un collegamento a un database sql-express automatizzato di cui non si desidera ottenere qualcuno. Ma se stai seguendo le migliori pratiche usi la Configurazione protetta per crittografare tutti i dati sensibili nel tuo web.config.

Collegamenti a riferimenti

Leggi il commento ufficiale di Microsoft sulla vulnerabilità all'indirizzo http://www.microsoft.com/technet/security/advisory/2416728.mspx . In particolare la parte "Soluzione alternativa" per i dettagli di implementazione su questo problema.

Anche alcune informazioni sul blog di ScottGu , incluso uno script per trovare app ASP.Net vulnerabili sul tuo server web.

Per una spiegazione su "Comprensione degli attacchi Oracle di riempimento", leggi la risposta di @ sri .


Commenti sull'articolo:

L'attacco che Rizzo e Duong hanno implementato contro le app ASP.NET richiede che l'implementazione della crittografia sul sito Web abbia un oracolo che, quando viene inviato il testo cifrato, non solo decodificherà il testo, ma darà al mittente un messaggio sul fatto che il riempimento nel testo cifrato è valido .

Se il riempimento non è valido, il messaggio di errore ricevuto dal mittente gli fornirà alcune informazioni sul modo in cui funziona il processo di decrittazione del sito.

Affinché l'attacco funzioni, deve essere vero quanto segue:

  • L'applicazione deve fornire un messaggio di errore in merito al riempimento non valido.
  • Qualcuno deve manomettere i cookie crittografati o il viewstate

Quindi, se nella tua app restituisci messaggi di errore leggibili come "Qualcosa è andato storto, per favore riprova" , dovresti essere al sicuro. Leggere un po 'i commenti sull'articolo fornisce anche informazioni preziose.

  • Archivia un ID sessione nel cookie crittografato
  • Archivia i dati reali nello stato della sessione (persistente in un db)
  • Aggiungi un'attesa casuale quando le informazioni dell'utente sono errate prima di restituire l'errore, quindi non puoi cronometrarle

In questo modo un cookie dirottato può essere utilizzato solo per recuperare una sessione che molto probabilmente non è più presente o invalidata.

Sarà interessante vedere cosa viene effettivamente presentato alla conferenza Ekoparty, ma in questo momento non sono troppo preoccupato per questa vulnerabilità.


1
@Venemo. Istead of Response.Cookies.Add (nuovo HttpCookie ("ruolo", "admin")); dovresti fare: string sessionId = Guid.NewGuid (). ToString (); Session [sessionId] = "role = admin"; Response.Cookies.Add (new HttpCookie ("s", sessionId)); e l'attacco è suscettibile di misurare i tempi delle risposte per capire la criptovaluta. Quindi aggiungere un Thread.Sleep (...) alla fine di una risposta eviterebbe tali tempi. Per quanto riguarda l'errore presumo (ed è quasi certo) è un errore dell'app, ma devo provarlo da solo. Quindi avere pagine di errore personalizzate non mostrerebbe l'errore di riempimento.
Mikael Svenson,

1
@Mikael, grazie! In ogni caso, che senso avrebbe memorizzare i ruoli in un cookie? Sono sicuro se lo uso Roles.AddUserToRole("Joe", "Admin")ma non lo conservo mai in un cookie?
Venemo,

1
@Venemo: leggi la mia modifica e il link al post sul blog. In genere i siti di accesso a Form memorizzano il ruolo in un cookie, ma come menziona @Aristos nella sua risposta, questo può essere disattivato e dovrebbe essere disattivato.
Mikael Svenson,

5
Cosa diavolo ...; NON eseguire il downgrade a 3DES, questo non aiuta affatto ed è davvero un cattivo consiglio.
Noon Silk,

2
@Mikael puoi anche aggiungere un link al blog di ScottGu, che ha alcune informazioni aggiuntive: weblogs.asp.net/scottgu/archive/2010/09/18/…
Eilon

40

Comprensione degli attacchi Oracle di riempimento

Supponiamo che la tua applicazione accetti una stringa crittografata come parametro, indipendentemente dal fatto che il parametro sia un cookie, un parametro url o qualcos'altro non è rilevante. Quando l'applicazione tenta di decodificarlo, ci sono 3 possibili risultati:

  1. Risultato 1 : la stringa crittografata è stata decodificata correttamente e l'applicazione è stata in grado di dargli un senso. Significato, se la stringa crittografata era un numero di conto di 10 cifre, dopo la decrittografia l'applicazione ha trovato qualcosa come "1234567890" e non "abcd1213ef"

  2. Risultato 2 : il padding era corretto, ma dopo la decrittazione la stringa ottenuta era incomprensibile e l'app non riusciva a capire. Ad esempio, la stringa è stata decodificata in "abcd1213ef", ma l'app si aspettava solo numeri. La maggior parte delle app mostrerà un messaggio come "Numero account non valido".

  3. Risultato 3 : il riempimento era errato e l'applicazione ha generato un messaggio di errore. La maggior parte delle app mostrerà un messaggio generico come "Si è verificato un errore".

Affinché un attacco di Padding Oracle abbia esito positivo, l'attaccante deve essere in grado di effettuare diverse migliaia di richieste e deve essere in grado di classificare la risposta in uno dei 3 bucket precedenti senza errori.

Se queste due condizioni sono soddisfatte, l'autore dell'attacco può eventualmente decrittografare il messaggio e quindi crittografarlo nuovamente con qualsiasi cosa desideri. È solo una questione di tempo.

Cosa si può fare per prevenirlo?

  1. La cosa più semplice: qualsiasi cosa sensibile non dovrebbe mai essere inviata al client, crittografata o non crittografata. Tienilo sul server.

  2. Assicurati che il risultato 2 e il risultato 3 nell'elenco sopra appaiano esattamente gli stessi per l'attaccante. Non dovrebbe esserci modo di capire l'uno dall'altro. Questo non è poi così facile - un attaccante può discriminare usando un qualche tipo di attacco temporizzato.

  3. Come ultima linea di difesa, avere un Web Application Firewall. L'attacco all'oracolo di riempimento deve fare diverse richieste che sembrano quasi simili (cambiando un bit alla volta), quindi dovrebbe essere possibile per un WAF catturare e bloccare tali richieste.

PS Una buona spiegazione di Padding Oracle Attacks è disponibile in questo post del blog . Disclaimer: NON è il mio blog.


+1 Ottima spiegazione, grazie! Una domanda: "Assicurati che il risultato 2 e il risultato 3 nell'elenco sopra appaiano esattamente gli stessi per l'attaccante." -> Come posso raggiungere questo obiettivo in ASP.NET?
Venemo,

3
Affinché appaiano uguali, è necessario generare lo stesso messaggio di errore per i risultati 2 e 3, che indica un errore più generico. In questo modo non possono essere differenziati. Un buon errore potrebbe essere: "Si è verificato un errore, riprovare". Lo svantaggio potrebbe essere quello di dare meno messaggi informativi all'utente.
Mikael Svenson,

In che modo questo consente alle persone di scaricare web.config ??
Daniel Little,

@Lavinski - Nessuna informazione ancora chiara, ma si ritiene che WebResource.axd ti permetta di scaricare web.config (e altre risorse) se gli dai la chiave giusta. E per generare la chiave, è necessario l'oracolo di imbottitura.
Sripathi Krishnan,

13

Da quello che ho letto fino ad ora ...

L'attacco consente a qualcuno di decrittografare i cookie sniffati, che potrebbero contenere dati preziosi come i saldi bancari

Hanno bisogno del cookie crittografato di un utente che ha già effettuato l'accesso, su qualsiasi account. Devono anche trovare dati nei cookie - spero che gli sviluppatori non memorizzino i dati critici nei cookie :). E c'è un modo che ho di seguito per non lasciare che asp.net memorizzi i dati nel cookie di accesso.

Come si può ottenere il cookie di un utente che è online se non mette le mani sui dati del browser? O annusare il pacchetto IP?

Un modo per impedirlo è quello di non consentire il trasporto dei cookie senza la crittografia SSL.

<httpCookies httpOnlyCookies="true" requireSSL="true" />

Anche un'altra misura è quella di impedire la memorizzazione dei ruoli nei cookie.

<roleManager enabled="true" cacheRolesInCookie="false">

Ora, riguardo ai cookie che non sono sicuri per le pagine normali, è necessario un po 'di più pensando a cosa hai lasciato fare al tuo utente e cosa no, come ti fidi di lui, quale controllo extra puoi fare (ad esempio se vedi un cambiamento sull'ip , forse smetti di fidarti di lui fino a quando non accedi nuovamente dalla pagina di sicurezza).

Riferimento:
un hacker può rubare il cookie da un utente e accedere con quel nome su un sito web?

Come controllare da dove provengono gli attacchi e non restituire informazioni. Ho scritto qui un modo semplice per impedire il riempimento non valido e la registrazione allo stesso tempo per rintracciare gli aggressori: CryptographicException: Il riempimento non è valido e non può essere rimosso e la convalida del viewstate MAC non è riuscita

Il modo per rintracciare l'attaccante è verificare che il riempimento non sia valido. Con una semplice procedura puoi rintracciarli e bloccarli - hanno bisogno di alcune migliaia di chiamate sulla tua pagina per trovare la chiave!

Aggiornamento 1

Ho scaricato lo strumento che suppone che trovi il KEY e decifrare i dati, e come ho detto la sua trap sul codice sopra che controlla il viewstate . Dai miei test questo strumento ha molti altri da correggere, ad esempio non è possibile scansionare lo stato di visualizzazione compresso così com'è e il suo arresto anomalo nei miei test.

Se qualcuno prova a utilizzare questo strumento o questo metodo, il codice sopra riportato può rintracciarli e puoi bloccarli fuori dalla tua pagina con un codice semplice come questo "Previeni Denial Of Service (DOS)" , o come questo codice per prevenire Negazione di servizio .

Aggiornamento 2

Sembra da quello che ho letto fino ad ora che l'unico pensiero che sia davvero necessario per non dare informazioni sull'errore e semplicemente posizionare una pagina di errore personalizzata e se ti piace puoi semplicemente creare e un ritardo casuale a questa pagina.

un video molto interessante su questo problema.

Quindi tutto quanto sopra è più misura per più protezioni ma non è necessario al 100% per questo particolare problema. Ad esempio, utilizzare ssl cookie è risolvere il problema snif, non memorizzare nella cache i ruoli nei cookie è utile non inviare e recuperare cookie di grandi dimensioni, ed evitare quelli che hanno tutti pronto a decifrare il codice, per posizionare il ruolo di amministratore il suo biscotto.

Il viewstate traccia solo un'altra misura per trovare l'attacco.


Aristos, quindi, dopo tutto, sembra praticamente un altro metodo generico basato sul furto di cookie, giusto? Quindi perché dicono che è così grave?
Venemo,

@Venemo perché se riescono davvero a ottenere quella chiave forse può fare qualche danno in più sul post sui dati in qualsiasi pagina perché infrangono quella sicurezza ... è grave ma è anche difficile da passare al passaggio successivo e reale rompere il sistema. Ad esempio questo sito mypetfriend.gr consente l'iniezione sql. Ma puoi romperlo? anche se la sicurezza è così bassa?
Aristos,

@Venemo Penso che l'ultimo avvolgente che chiedi in particolare in questo attacco sia quello di rintracciare e bloccare gli Ips che il prodotto invalida non più del normale! (e questo è quello che riparerò nei prossimi giorni) :)
Aristos,

1
@Aristos - Ho letto la tua risposta all'altra domanda che hai collegato. Si tratta di Viewstate però. Da quando utilizzo ASP.NET MVC, non utilizzo ViewState. E non sono riuscito a capirlo, come si traduce questa descrizione in questo problema di sicurezza?
Venemo,

@Venemo per MVC non posso dire perché non lo so. ViewState è la parte che attacca per trovare la chiave. Come MVC tiene traccia dell'integrità della pagina che non conosco.
Aristos,

12

Ecco la risposta alla SM. Tutto si riduce a "utilizzare una pagina di errore personalizzata" e non ti daremo alcun indizio.

EDIT
Ecco alcune informazioni più dettagliate da scottgu.


Grazie, questo è quello che ho chiesto da sempre. Quindi sostanzialmente una semplice pagina di errore personalizzata può salvarmi da tutte le implicazioni di questa vulnerabilità?
Venemo,

2
@Venemo: Sì, e le persone che raccomandano 3DES dovrebbero davvero essere messe a tacere; è incredibilmente irresponsabile e non affronta nemmeno il problema principale! È abbastanza scioccante. Per favore, spero che nessuno segua i loro consigli e faccia ciò che consiglia Microsoft ufficiale.
Noon Silk,

1
@Noon - Beh, questo tipo di pagina di errore personalizzata è un must per qualsiasi sito di produzione, quindi, a quanto pare, questo problema non è poi così grave. :)
Venemo,

12

Aggiunta delle risposte di ScottGu tratte dalla discussione su http://weblogs.asp.net/scottgu/archive/2010/09/18/important-asp-net-security-vulnerability.aspx

È interessato IHModule personalizzato invece di customErrors?

D: Non ho un elemento dichiarato nel mio web.config, ho invece un IHttpModule all'interno della sezione. Questo modulo registra l'errore e reindirizza a una pagina di ricerca (per 404) o a una pagina di errore (per 500). Sono vulnerabile?

A: Consiglio di aggiornare temporaneamente il modulo per reindirizzare sempre alla pagina di ricerca. Uno dei modi in cui funziona questo attacco è la ricerca di una differenziazione tra 404 e 500 errori. Restituire sempre lo stesso codice HTTP e inviarlo nello stesso posto è un modo per aiutarlo a bloccarlo.

Si noti che quando la patch viene rilasciata per risolvere questo problema, non sarà necessario farlo (e è possibile ripristinare il vecchio comportamento). Ma per ora consiglierei di non differenziare tra 404 e 500 per i clienti.

Posso continuare a utilizzare diversi errori per gli errori 404 e 500?

D: Presumo che possiamo ancora definire una pagina 404 personalizzata oltre al reindirizzamento predefinito in caso di errore, senza violare i principi sopra descritti?

A: No - fino a quando non rilasciamo una patch per la correzione reale, raccomandiamo la soluzione precedente che omogeneizza tutti gli errori. Uno dei modi in cui funziona questo attacco è la ricerca di una differenziazione tra 404 e 500 errori. Restituire sempre lo stesso codice HTTP e inviarlo nello stesso posto è un modo per aiutarlo a bloccarlo.

Si noti che quando la patch viene rilasciata per risolvere questo problema, non sarà necessario farlo (e è possibile ripristinare il vecchio comportamento). Ma per ora non dovresti distinguere tra 404 e 500 tra i clienti.

In che modo ciò consente l'esposizione di web.config?

D: In che modo ciò consente l'esposizione di web.config? Questo sembra abilitare solo la decodifica di ViewState, esiste un'altra vulnerabilità correlata che consente anche la divulgazione delle informazioni? Esiste un white paper che descrive in dettaglio l'attacco per una migliore spiegazione di ciò che sta accadendo?

A: L'attacco mostrato al pubblico si basa su una funzionalità di ASP.NET che consente di scaricare file (in genere javascript e css) e che è protetto con una chiave inviata come parte della richiesta. Sfortunatamente se sei in grado di forgiare una chiave puoi usare questa funzione per scaricare il file web.config di un'applicazione (ma non i file al di fuori dell'applicazione). Rilasceremo ovviamente una patch per questo - fino ad allora la soluzione precedente chiude il vettore di attacco.

EDIT: FAQ aggiuntive disponibili nel secondo blog post su http://weblogs.asp.net/scottgu/archive/2010/09/20/frequently-asked-questions-about-the-asp-net-security-vulnerability.aspx


La risposta alla seconda domanda termina con due asterischi. Si suppone che ci sia qualche nota o testo di qualificazione aggiunto da qualche parte?
Scott Mitchell,

@Scott Mitchell: No, è solo il mio errore di battitura. (la parte di testo era in grassetto nella prima versione del post e ho dimenticato di rimuovere tutto il codice di formattazione quando il testo è stato modificato). Fisso. Ci scusiamo per averti maltrattato.
Martin Vobr,


3

Alcuni link significativi:

[Per rispondere all'aspetto di gravità di questo (ciò che è stato pubblicato e le soluzioni alternative sono coperte da altre risposte).]

La chiave che viene attaccata viene utilizzata per proteggere sia i cookie di stato che quelli di sessione. Normalmente questa chiave viene generata internamente da ASP.NET con ogni nuova istanza dell'app Web. Ciò limiterà l'entità del danno alla durata del processo di lavoro, ovviamente per un'applicazione occupata potrebbero essere giorni (ovvero non un limite). Durante questo periodo l'attaccante può modificare (o iniettare) i valori in ViewState e modificare la propria sessione.

Ancora più seriamente se si desidera che le sessioni siano in grado di estendere la durata dei processi dei lavoratori o consentire alle web farm (ovvero tutte le istanze della farm in grado di gestire qualsiasi sessione utente) la chiave deve essere codificata, questo viene fatto in web.config:

[...]
  <system.web>
    <machineKey
        decryption="AES"
        validation="SHA1"
        decryptionKey="57726C59BA73E8A4E95E47F4BC9FB2DD"
        validationKey="158B6D89EE90A814874F1B3129ED00FB8FD34DD3"
      />

Quelle sono, ovviamente, chiavi appena create, utilizzo il seguente PowerShell per accedere al generatore di numeri casuali crittografici di Windows:

$rng = New-Object "System.Security.Cryptography.RNGCryptoServiceProvider"
$bytes = [Array]::CreateInstance([byte], 20)
$rng.GetBytes($bytes)
$bytes | ForEach-Object -begin { $s = "" } -process { $s = $s + ("{0:X2}" -f $_) } -end { $s}

(Utilizzando una lunghezza di array di 20 per la convalida e 16 per le chiavi di decrittazione.)

Oltre a modificare le pagine di errore pubbliche per non perdere l'errore specifico, sembrerebbe un buon momento per cambiare le chiavi di cui sopra (o cicli i processi di lavoro se sono in esecuzione da un po ').

[Modifica 21/09/2010: collegamenti aggiunti all'inizio]


Per impostazione predefinita, i processi di lavoro vengono riciclati dopo 27-29 ore (a seconda della versione di IIS) se durano così a lungo, quindi non dovresti averne uno in giro per giorni, anche su un sito pesantemente trafficato.
squig

2

Ho appena pubblicato la mia opinione completa su questo nel mio blog , dopo ulteriori ricerche sul problema. Penso che sia importante chiarire perché stanno arrivando a forgiare un cookie di autenticazione.


Voglio solo chiarire alcuni fatti:

  1. attacco non ti consente di ottenere direttamente la chiave della macchina. Detto questo, è praticamente come aveva fatto, poiché consente di decrittografare i messaggi e di modificarli / crittografarne di nuovi.
  2. il modo in cui ottenere le chiavi effettive è usando la loro capacità di modificare re / crittografare come in 1 e ottenere web.config. Sfortunatamente ci sono ragioni per cui alcuni inseriscono queste chiavi in ​​web.config a livello di sito (discussione diversa) e nel video di esempio traggono vantaggio dal fatto che è l'impostazione predefinita di DotnetNuke.
  3. per ottenere tutto il web.config indica che stanno usando webresources.axd e / o scriptresources.axd. Pensavo che funzionassero solo con risorse incorporate, ma sembra che non sia così.
  4. se l'app è asp.net MVC non abbiamo davvero bisogno di webresources.axd e / o scriptresources.axd, quindi quelli possono essere disattivati. Inoltre non utilizziamo viewstate. Detto questo, non mi è chiaro se una qualsiasi delle altre funzionalità di asp.net fornisce informazioni diverse con la soluzione alternativa in atto, cioè non so se il riempimento fornisce risultati non validi in errore mentre il riempimento include risultati validi nel ticket di autenticazione ignorato (non lo so se è o meno il caso) ... la stessa analisi dovrebbe essere applicata al cookie di sessione.
  5. I ruoli del provider di appartenenze asp.net "memorizzano nella cache" i cookie, disattivalo.

Circa 1, dopo che i messaggi crittografati non possono essere arbitrari al 100%, è necessario tollerare un piccolo pezzo di immondizia da qualche parte nel messaggio, poiché nel messaggio è presente un blocco che decodifica il valore che non può essere controllato.

Infine, vorrei dire che questo problema è dovuto al fatto che ms non segue le proprie indicazioni in questo caso: una funzione si basa sul fatto che qualcosa inviato al client sia a prova di manomissione.


Più su:

Non so se il riempimento fornisce risultati non validi in caso di errore, mentre il riempimento genera risultati validi nel ticket di autenticazione ignorato (non so se è il caso o meno) ... la stessa analisi dovrebbe essere applicata al cookie di sessione.

Il cookie di autenticazione è firmato e dalle informazioni nel documento non dovrebbero essere in grado di generare un cookie firmato se non ottengono le chiavi effettive (come hanno fatto nel video prima di forgiare il cookie di autenticazione).

Come menzionato Aristos, per l'id di sessione nel cookie, è casuale per la sessione dell'utente, quindi dovrebbe essere annusato da un utente con il livello di sicurezza di destinazione e decifrato mentre quella sessione è attiva. Anche in questo caso, se fai affidamento sull'autenticazione per assegnare / autorizzare le operazioni dell'utente, l'impatto sarebbe minimo / dipenderà molto da ciò per cui Session viene utilizzata in quell'app.



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.