Domanda:
È una vulnerabilità di sicurezza dire a un utente quali caratteri di input sono validi / non validi?
csrowell
2020-01-15 02:41:57 UTC
view on stackexchange narkive permalink

Per la convalida dell'input su un sito web, ci sono problemi di sicurezza nel rivelare all'utente esattamente quali caratteri sono validi o non validi per un dato campo?

CWE-200: Information Exposure dice che si dovrebbe cercare di non divulgare informazioni "che potrebbero essere utili in un attacco ma normalmente non sono disponibili per l'attaccante". Un esempio specifico potrebbe impedire a un sistema di esporre le tracce dello stack (affrontato da CWE-209: Information Exposure Through an Error Message).

È necessario assicurarsi che i messaggi di errore siano vaghi, come "Il testo che hai inserito contiene caratteri non validi"?

È una vulnerabilità di sicurezza includere le espressioni regolari utilizzate per convalidare l'input nel codice lato client, come JavaScript, che sarebbe visibile agli aggressori? L'alternativa, la convalida degli input lato server, ridurrebbe in qualche modo l'usabilità in quanto richiederebbe più comunicazioni di backend (ad esempio, potrebbe far sì che il sito risponda e visualizzi gli errori più lentamente).

Oppure si tratta di una forma di "sicurezza attraverso l'oscurità" in quanto l'utente / aggressore può dedurre quali caratteri sono validi inviando ripetutamente caratteri diversi per vedere se producono errori?

Vale la pena fare i colpi all'esperienza utente per rallentare potenzialmente un attacco?

Dovrei notare, per quanto ne so, il Cheat Sheet di convalida dell'input e Guida allo sviluppo della convalida dei dati non forniscono indicazioni su questo argomento.

Modifica 17-01-2020:

Ci sono state diverse domande (comprese le risposte a cui sono andato allo sforzo di scrivere commenti che da allora sono state cancellato) sul perché si dovrebbe eseguire una convalida dell'input.

Prima di tutto, grazie a @Loek per il commento che punta allo Application Security Verification Standard di OWASP che fornisce una guida sulle password a pagina 21 e 22: "Verifica che non ci siano regole di composizione della password che limitano il tipo di caratteri consentito. Non dovrebbero esserci requisiti per lettere maiuscole o minuscole o numeri o caratteri speciali. ".

Penso che tutti possiamo essere d'accordo sul fatto che limitare i caratteri in una password sia generalmente una cattiva idea (vedi risposta di @ Merchako). Come @emory fa notare, probabilmente non può essere una regola rigida e veloce (ad esempio, ho visto molte app mobili che utilizzano un "PIN" secondario più facile da usare per proteggere l'app anche se qualcun altro ha accesso per accedere al dispositivo.) Non avevo in mente le password quando ho posto questa domanda, ma questa è una direzione in cui sono andati i commenti e le risposte. Quindi, ai fini di questa domanda, consideriamo che sia per campi non password.

La convalida dell'input fa parte della "difesa in profondità" per siti Web, servizi Web e app per prevenire attacchi di iniezione. Gli attacchi di iniezione, come affermato da OWASP, "possono causare la perdita di dati, il danneggiamento o la divulgazione a parti non autorizzate, la perdita di responsabilità o il rifiuto di accesso. L'iniezione a volte può portare alla completa acquisizione dell'host. L'impatto sul business dipende dalle esigenze del applicazione e dati. "

Vedi la vulnerabilità numero 1 di OWASP, A1-Injection e CWE-20: Improper Input Validation per informazioni più dettagliate. Si noti che entrambi affermano che la convalida dell'input non è una difesa completa, ma piuttosto uno strato di quella "difesa in profondità" per i prodotti software.

I commenti non sono per discussioni estese;questa conversazione è stata [spostata in chat] (https://chat.stackexchange.com/rooms/103507/discussion-on-question-by-csrowell-is-it-a-security-vulnerability-to-tell-a-utente).
@RoryAlsop Non vedo davvero il motivo per cui questo è stato spostato in chat - non è che ci fosse una rapida conversazione avanti e indietro in corso qui ... Inoltre rovina i miei collegamenti a commenti specifici ... È ancheterribile usabilità poiché la maggior parte delle persone non farà clic su un collegamento per leggere una conversazione ...
Più di 20 commenti compromettono gravemente la leggibilità ei commenti non sono esplicitamente oggetto di discussione.La chat è il posto giusto per questo.Qualsiasi cosa rilevante da quella discussione può quindi essere incorporata nei post, se necessario.
Ho pensato che fosse per questo che nascondono i commenti con voti bassi / nulli.Non è che mostrava tutti i commenti per impostazione predefinita.Ora non hai idea di quali commenti fossero importanti o con cui le persone fossero d'accordo (c'erano commenti con oltre 40 voti).Non vedo un modo per visualizzare i conteggi dei voti in Chat.Per quanto ne so sono stati spazzati via.
questo è in base alla progettazione.I commenti hanno lo scopo di essere temporanei per richiedere o suggerire miglioramenti a un post o per ottenere maggiore chiarezza.
Sette risposte:
Steffen Ullrich
2020-01-15 03:02:15 UTC
view on stackexchange narkive permalink

... che potrebbe essere utile in un attacco ma normalmente non è disponibile per l'attaccante

La conoscenza dei caratteri di input non validi è utile ma può essere facilmente trovata dall'attaccante con pochi tentativi. Pertanto, queste informazioni non sono realmente segrete e tenere tutti gli utenti all'oscuro di ciò che è andato storto esattamente non scoraggia gli aggressori, ma tiene lontani gli utenti innocenti poiché non possono continuare.

IMO questo è il punto centrale della domanda.Sono d'accordo con la risposta, ma lo stesso accade con la versione server, se divulgata tramite intestazioni HTTP.Quest'ultimo, tuttavia, rientra nell'ambito del CWE perché 1) la divulgazione dei caratteri di input è * utile * per l'utente e facile da scoprire e 2) la versione del software server * non ha alcun effetto di usabilità / compatibilità * mentre aumenta la superficie di attacco
@usr-local-ΕΨΗΕΛΩΝ: In caso di caratteri non validi, l'attaccante può scoprire rapidamente quali non sono validi provandone alcuni.Nel caso della versione server, l'attaccante non può determinare facilmente la versione a meno che il server non la fornisca esplicitamente (nell'intestazione).Pertanto fornire la versione del server è un problema mentre fornire quali caratteri non sono validi no.
Sebbene non sia una vulnerabilità di sicurezza di per sé, quando un sito web mi dice di non usare `'`, `` `, barra rovesciata e` -` nella mia password, ciò mette immediatamente in dubbio se hanno problemi di SQL injection e / o utilizzano l'archiviazione di testo normaleper le informazioni inserite.
@SeinopSys Potrebbe anche essere un approccio approfondito alla sicurezza.È possibile utilizzare query parametrizzate ovunque ma anche disabilitare tutti i caratteri SQL injection se possono essere evitati in determinati input.Quindi, se qualcuno inserisce una possibile vulnerabilità durante lo sviluppo, hai la possibilità che sia un po 'più difficile da sfruttare.
"La versione del software del server non ha alcun effetto di usabilità / compatibilità mentre aumenta la superficie di attacco" ** questa è la protezione dall'oscurità e non impedisce nulla **.Piuttosto che nascondere la versione del server, è necessario aggiornarla a una versione sicura.Mentire / nascondersi non fa nulla per prevenire il problema e rende solo leggermente più difficile l'attacco.
@Vinz243: Questa sarebbe sicurezza per oscurità solo se il server eseguisse una versione del software non sicura e l'amministratore lo sapesse e non la correggesse.Per il resto, nascondere tali informazioni è solo una parte di una difesa in profondità, ovvero rendere più difficile per l'attaccante ottenere informazioni sull'infrastruttura.
Security.SE ha già molte domande sull'argomento come nascondere le versioni del server: [Versione nascosta: valore o solo sicurezza per oscurità?] (Https://security.stackexchange.com/q/14709/10843), [Viene visualizzatoquale server sto eseguendo sulle pagine di errore è un rischio per la sicurezza?] (https://security.stackexchange.com/q/4940/10843), e più in generale [Il ruolo valido dell'oscurità] (https: //security.stackexchange.com / q / 2430/10843).
Merchako
2020-01-15 19:42:36 UTC
view on stackexchange narkive permalink

Creare una situazione psicologicamente frustrante per gli utenti potrebbe indurli a prendere decisioni meno sicure. Ad esempio, provano a scrivere una password in svedese, ma il tuo input rifiuta il carattere å senza spiegazione. Invece di scegliere una buona password diversa senza å , alzano le mani e usano password123 , che può essere facilmente sconfitta con un attacco del dizionario.

Così , hai tentato di creare un sistema "più sicuro" attraverso l'oscurità, ma una volta che teniamo conto dei comportamenti degli utenti, in realtà è meno sicuro.

I caratteri validi sono alla fine individuabili attraverso mezzi sistematici. Nasconderli non vale il danno che potresti arrecare ai comportamenti degli utenti.


Per ulteriori letture, vedere " Sicurezza e pregiudizi cognitivi: esplorazione del ruolo della mente" e " Misurazione degli impatti sulla sicurezza dei criteri per le password utilizzando cognitivo comportamentale Modellazione basata su agenti "di Sean Smith et al.

Buon punto.Qualcuno qui ha detto: "La sicurezza al costo della convenienza arriva al costo della sicurezza".
mentallurg
2020-01-15 03:32:36 UTC
view on stackexchange narkive permalink

Dipende.

Se il messaggio descrive un errore dal punto di vista degli utenti normali, come "Il terzo carattere deve essere una cifra", non è una vulnerabilità di sicurezza. Ma visualizzare l'espressione regolare utilizzata per la convalida significa divulgare dettagli di implementazione che possono essere un punto debole, ad es. alcune librerie utilizzano ampiamente chiamate ricorsive e alcune espressioni possono causare un overflow dello stack o un elevato utilizzo di memoria e CPU, il che può portare a DoS.

Il CWE-200 definisce la divulgazione di informazioni come un punto debole solo se l'utente non è esplicitamente autorizzato ad avere accesso a tali informazioni . Stai considerando l'input dell'utente. Significa che l'utente è autorizzato a inserire queste informazioni e quindi gli è permesso di vedere queste informazioni e, naturalmente, gli è consentito vedere qualsiasi messaggio di errore di convalida relativo a questo input.

Stack trace così come altri messaggi tecnici possono fornire informazioni sulle tecnologie utilizzate nell'applicazione (ad esempio quale versione di quali librerie vengono utilizzate), sull'ambiente (ad esempio layout di directory e permessi, tipo di sistema operativo e versione), ecc. Un utente malintenzionato può utilizzare queste informazioni in modo efficace scegliere exploit per queste particolari tecnologie, librerie, sistemi operativi, ecc. Ecco perché divulgare tali informazioni all'utente è potenzialmente una debolezza.

Non spiegare all'utente cosa c'è di sbagliato nel suo input è sicuramente una cattiva UX, ma non sicurezza miglioramento.

Non confonderlo con casi simili, quando i dati sono sensibili e qualsiasi convalida ad essi correlata può essere sensibile. Ad esempio, se l'utente ha immesso lettere nel campo in cui ci si aspetta un anno, spiegare tale errore all'utente è sicuro. Ma se l'utente inserisce un indirizzo e-mail e controlli se tale indirizzo è registrato nel tuo sistema, qualsiasi informazione (l'indirizzo è noto, l'indirizzo è sconosciuto) può essere un punto debole. Ecco perché quando implementerai messaggi di convalida o qualsiasi altro feedback sull'input dell'utente, valuta le conseguenze. Ma vietare qualsiasi feedback per impostazione predefinita per tutti i campi può essere una scarsa UX con una falsa sensazione di sicurezza.

Spiacenti, non era mia intenzione suggerire di mostrare all'utente la RegEx.Era più simile a chiedersi se una RegEx non dovesse essere incorporata nel codice lato client.Rivedrò la mia domanda per renderlo più chiaro.
@csrowell Non dimenticare che TUTTO ciò che è lato client è "mostrato".Anche se non lo mostri sullo schermo, viene mostrato al tipo di utente malintenzionato (che sicuramente controlla tutto il codice client che gli viene trasmesso).
@Thomas: sì, e penso che questo fosse il punto dell'OP.È sicuro utilizzare regex nel JS lato client nel codice che aiuta l'utente a capire perché il loro input non era valido?(Perché questo rivelerà le regole agli aggressori).
@PeterCordes Non vedo come sia importante, dal momento che il controllo deve ancora essere duplicato sul server (altrimenti un utente malintenzionato potrebbe creare una password inaccettabile e inviarla, bypassando il controllo lato client).Se esegui già controlli lato client oltre a lato server (ad esempio per ridurre il carico del server in caso di tentativi non validi), non ha senso nascondere caratteri inaccettabili,
@DanM .: Giusto, la risposta alla domanda è che mantenere questo oscurato danneggia l'usabilità più che aiuta a difendere qualsiasi cosa.Sto solo cercando di affermare ciò che l'OP stava chiedendo, non di chiederlo io stesso.
Filipe dos Santos
2020-01-15 02:56:49 UTC
view on stackexchange narkive permalink

Questo è solo uno dei tanti scenari in cui sono previsti compromessi di sicurezza a favore dell'usabilità del sistema.

Tuttavia, c'è un'enorme differenza tra la visualizzazione delle tracce dello stack (scarsa gestione degli errori) e declinare quali caratteri sono previsti o proibiti in un campo di input.

Per la maggior parte degli scenari, si può sostenere che negare quali caratteri sono previsti o proibiti in un campo di input è non una vulnerabilità di sicurezza a tutti, se sono in atto altri meccanismi di sicurezza, come limitare i tentativi di password.

È possibile determinare utilizzando un framework di modellazione delle minacce che questo è un rischio accettato del sistema.

dandavis
2020-01-15 03:57:37 UTC
view on stackexchange narkive permalink

L'oscurità non è sicurezza. Un buon sistema è sicuro anche quando un utente malintenzionato sa tutto al riguardo. Nel tuo caso, ridurre le ipotesi di cracking sprecate di una certa percentuale, diciamo il 25%, non dovrebbe creare o distruggere la praticità del cracking: 1 trilione di anni è pratico quanto 0,75 trilioni di anni. Avere dettagli di implementazione non occlusi aiuta anche i nuovi bravi ragazzi a difendersi.

Ci sono anche considerazioni sociali. Un segno "ATTENZIONE AL CANE" potrebbe far trapelare dettagli sull'implementazione della sicurezza, ma scoraggia anche una certa scala di attacchi comuni. Il cane aiuta, noto o sconosciuto, ma un cartello potrebbe ridurre i costi di manutenzione della recinzione, liberando risorse per combattere altre battaglie.

"Un buon sistema è sicuro anche quando un utente malintenzionato sa tutto al riguardo."Questa saggezza convenzionale è ovviamente vera.Ma quando non ottieni alcun vantaggio dalla divulgazione di informazioni all'utente, non farlo.Questo perché i sistemi complicati essenzialmente non sono mai sicuri al 100%.In questo caso specifico c'è ovviamente un enorme vantaggio di usabilità, e sicuramente non un problema di sicurezza, ma è necessario fare attenzione quando si applica questa logica al caso generale
bolov
2020-01-17 20:49:45 UTC
view on stackexchange narkive permalink

Le altre risposte mostrano come divulgare questo non sia un problema di sicurezza.

Sosterrò con un vero aneddoto che la mancata divulgazione può portare non solo a frustrare gli utenti ma anche a una minore sicurezza.

Questo mi è successo più di una volta su siti che non chiarivano quali caratteri sono consentiti. A quel tempo non usavo un generatore di password, quindi avevo uno schema mentale per ricordare le password. Comprendeva l'uso di alcuni caratteri speciali come $ @. & . Alcuni tentativi frustrati in cui tutto ciò che ho ottenuto erano "caratteri non validi nella password" e ho iniziato progressivamente a eliminare i caratteri speciali. Poi è arrivato "la tua password non è abbastanza sicura, prova ad aggiungere alcune cifre e simboli" ... sì ... sono decisamente rilassato a questo punto.

Finalmente ho capito per accettare la mia password. Che non solo conteneva un solo carattere speciale, ma non si adattava a nessuno dei miei schemi per ricordare le password, quindi ho dovuto ... hmm ... conservarlo da qualche altra parte (questo era prima ancora che conoscessi i gestori di password, quindi immaginate come l'ho assicurato. Vi dirò che era come un elicottero e come una corda).

Sango
2020-01-15 18:45:33 UTC
view on stackexchange narkive permalink

Non vedo alcun problema nel rivelare il set di caratteri tra cui l'utente può scegliere, a patto che queste regole siano da un lato anche applicate e verificate. Vale a dire, se l'utente non è autorizzato a utilizzare \ nel campo, non è sufficiente verificarlo nell'ingresso JS, ma anche prima di inserirlo, ovvero nel DB e quando vengono utilizzati i dati. Quindi le regole devono essere applicate sempre (TOCTOU). L'altra parte è che non è un problema ridurre il set di caratteri, purché l'entropia sia ancora data. Puoi ridurre i caratteri della password a "a" e "b", ma poi devi aumentare la lunghezza minima della PW di conseguenza (e verificare che non stiano solo tenendo premuto il tasto "a" finché non è abbastanza lungo). Con una password abbastanza lunga (casuale), anche questa sarebbe una password sicura. Alla fine, tutto ciò che c'è in un carattere sono bit, e tutti sanno che questi sono 0 & 1, quindi l'alfabeto (reale) è sempre noto, come molti possibili accordi ci sono, sta a te specificarli (e verificarli).



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 4.0 con cui è distribuito.
Loading...