Gli URL privati ​​non indovinabili equivalgono all'autenticazione basata su password?


128

Voglio esporre una risorsa sul web. Voglio proteggere questa risorsa: assicurarsi che sia accessibile solo a determinate persone.

Potrei impostare una sorta di autenticazione basata su password . Ad esempio, ho potuto consentire l'accesso alla risorsa solo tramite un server Web che controlla le richieste in arrivo per le credenziali corrette (forse rispetto ad alcuni database di backup degli utenti) prima di pubblicare il file.

In alternativa, potrei semplicemente usare un URL privato . Cioè, potrei semplicemente ospitare la risorsa in un percorso impossibile da indovinare, ad esempio https://example.com/23idcojj20ijf..., che limita l'accesso a coloro che conoscono la stringa esatta.

Dal punto di vista di un malfattore che vuole accedere a questa risorsa, questi approcci sono equivalenti? In caso contrario, cosa li rende diversi? E per quanto riguarda la manutenibilità, ci sono pro e contro di entrambi gli approcci di cui dovrei essere a conoscenza prima di implementare l'uno o l'altro?


45
Questo approccio viene generalmente utilizzato senza autenticazione per cose come la reimpostazione della password. Il collegamento non indicabile in genere scade entro un breve periodo di tempo e può essere utilizzato solo da qualcuno già semi-autenticato (ovvero il sito Web conosce già l'indirizzo e-mail a cui è stato inviato il collegamento).
Robert Harvey,

6
Discussione correlata su security.SE: security.stackexchange.com/q/58215/37496
Marco

9
@MonkeyZeus non è sicurezza attraverso l'oscurità. Il segreto, che normalmente è una password, in questo caso è un URL.
Davidmh,

16
@MonkeyZeus: sicurezza attraverso l'oscurità si riferisce a mantenere segreta l' implementazione del meccanismo, non usando chiavi oscure. Se gli URL indecifrabili sono sicurezza attraverso l'oscurità, lo sono anche le password complesse.
JacquesB,

1
@GladstoneKeep tieni a mente gli accorciatori di URL. Una volta che qualcuno malizioso ne utilizza uno, il collegamento sarà molto più facile da indovinare / scrivere.
RookieTEC9,

Risposte:


203

Un URL privato è in qualche modo più debole dell'autenticazione con credenziali, anche se la dimensione in bit dell'URL è uguale a quella delle credenziali. Il motivo è che l'URL potrebbe "falla" più facilmente. Viene memorizzato nella cache del browser, registrato sul server e così via. Se si dispone di collegamenti in uscita, l'URL privato potrebbe essere visualizzato nell'intestazione del referrer su altri siti. (Può essere visto anche da persone che guardano alle tue spalle.)

Se perde (per caso o per negligenza dell'utente), potrebbe finire per essere pubblico e persino indicizzato da Google, il che consentirebbe a un utente malintenzionato di cercare facilmente tutti gli URL trapelati sul tuo sito!

Per questo motivo, gli URL privati ​​vengono generalmente utilizzati solo per operazioni one-shot come il ripristino delle password e in genere sono attivi solo per un periodo di tempo limitato.


C'è un thread correlato su Sicurezza delle informazioni: gli URL casuali sono un modo sicuro per proteggere le foto del profilo ? - una risposta condivide questa storia: Dropbox disabilita i vecchi link condivisi dopo che le dichiarazioni fiscali sono finite su Google . Quindi non è solo un rischio teorico.


7
Un piccolo cavillo, ma "tipicamente usato solo per operazioni one-shot" sembra una dichiarazione eccessiva dato che Dropbox (e forse altri servizi nuvolosi) li stanno usando per "proteggere" l'accesso ai file.
Steve Jessop,

4
Vorrei aggiungere che agli utenti viene insegnato, con scarso successo, di proteggere le loro password, ma non di proteggere i loro URL.
svavil,

1
Dovresti aggiungere che molte delle preoccupazioni tecniche possono essere mitigate usando un parametro nell'URL privato, quindi xzy.com/myDoc?auth=8502375 e un reindirizzamento automatico a un semplice URL dopo il checkout dell'autenticazione. - Ma questo non risolve tutti i possibili problemi
Falco,

3
TL; DR: non esiste un URL segreto. C'è un attacco in corso che espone gli URL a un attore dannoso negli hotspot WiFi anche se normalmente invii l'URL su HTTPS. L'attacco abusa di Web Proxy Autodiscovery (WPAD), costringendo il browser a inviare tutti i tuoi URL all'attaccante. Vedi (es.) Arstechnica.com/security/2016/07/…
Harald

5
@JacquesB Alcuni dei rischi che hai identificato non sono mitigati mettendo la parte privata nella porzione di frammento dell'URL (cioè dopo "#", come ad esempio Stack Exchange fa per le sue risposte di autenticazione Oauth)? Ad esempio, l'intestazione del referer non può includere il frammento .
Jason C,

48

Nota:

Molte persone sembrano confondere un URL "privato" con l'autenticazione. Inoltre, sembra esserci una certa confusione sul fatto che l'invio del collegamento tramite un'entità attendibile sia un tentativo di autenticazione a due fattori. Per essere chiari, stiamo parlando di una risorsa accessibile al pubblico, sebbene sia sufficientemente difficile da indovinare.

Quando si utilizza un URL privato, si dovrebbe sempre presumere che possa essere compromesso - è necessario progettare tale URL in modo tale che, anche se compromesso, la risorsa non perda le informazioni all'attaccante.


Gli URL privati ​​/ difficili da indovinare non equivalgono all'autenticazione basata su password. Per natura, gli URL privati ​​non sono affatto privati: sono risorse accessibili al pubblico. Penso che il termine URL "privato" sia un termine improprio, piuttosto sono URL "oscuri".

Ci sono alcuni casi in cui l'utilizzo di un URL "privato" è accettabile, ma sono intrinsecamente meno sicuri rispetto ai metodi di autenticazione tradizionali come l'autenticazione con password o l'autenticazione basata su chiave.

Alcuni dei luoghi che ho visto comunemente usati URL "privati" sono:

  1. Email di reimpostazione password
  2. Email di generazione certificati
  3. Email di conferma account / email
  4. Consegna dei contenuti acquistati (ebook, ecc.)
  5. Altre cose varie come il check-in dei voli, la stampa della carta d'imbarco, l'uso di URL privati ​​oltre all'autenticazione tradizionale

La cosa comune qui è che gli URL casuali sono in genere buoni solo per le operazioni one-shot. Inoltre, l'autenticazione tradizionale e gli URL casuali non si escludono a vicenda , anzi, possono essere utilizzati insieme per fornire ulteriore sicurezza durante la consegna di una risorsa.


Come ha sottolineato Robert Harvey, l'unico modo per utilizzare in modo sicuro un URL casuale / privato è generare la pagina in modo dinamico e inviare l'URL all'utente in modo tale che l'utente possa essere considerato semi-autenticato. Questo potrebbe essere e-mail, SMS, ecc.

Un URL privato / generato in modo casuale ha in genere alcune proprietà:

  1. Dovrebbe scadere dopo un ragionevole lasso di tempo
  2. Dovrebbe essere un URL monouso: IE dovrebbe scadere dopo il primo accesso.
  3. Dovrebbe rinviare l'autenticazione dell'utente a qualche altra entità di cui si fida per autenticare in modo sicuro l'utente. (Inviando il collegamento via e-mail o SMS, ecc.)
  4. Dovrebbe essere impossibile per un computer moderno forzare bruscamente l'URL nel periodo precedente la scadenza - o limitando la velocità dell'API che espone la risorsa o creando un endpoint url con entropia sufficiente in modo che non possa essere indovinato.
  5. Non dovrebbe perdere informazioni sull'utente. IE: se la pagina deve reimpostare una password: la pagina non deve visualizzare le informazioni sull'account dei richiedenti. Se Alice richiede un collegamento per reimpostare la password e Bob indovina in qualche modo l'URL, Bob non dovrebbe avere modo di sapere di chi sta reimpostando la password.
  6. Se perde informazioni sull'utente, dovrebbe essere utilizzato in aggiunta all'autenticazione tradizionale, ad esempio una pagina può considerare un utente autenticato se ha un cookie impostato o se il suo session_id è ancora valido.

Risorse diverse richiedono diversi livelli di sicurezza. Se vuoi condividere una ricetta segreta con alcuni amici, ad esempio, sarebbe accettabile usare un URL casuale / privato per condividerlo con loro. Tuttavia, se la risorsa potesse essere utilizzata per rubare l'identità di qualcuno o compromettere i propri account con altri fornitori di servizi, è probabile che ti interessi molto di più a limitare l'accesso a tale risorsa.


4
Se volessi condividere la ricetta segreta per la Coca-Cola con il mio team di sviluppo prodotto, ciò richiederebbe qualcosa di diverso rispetto a se volessi condividere la ricetta per l'insalata di patate che ho servito ai vicini durante una festa barbecue di quartiere. Ancora una volta, contesto. :-)
un CVn il

7
@ MichaelKjörling Non sono sicuro di come qualcuno avrebbe dedotto diversamente dal mio post. Abbastanza chiaramente ho affermato che risorse diverse richiedono livelli diversi di autenticazione. La ricetta per la coca cola sarebbe molto più preziosa della ricetta per i biscotti della nonna.
Charles Addis,

9
@CharlesAddis Chiaramente non hai mai assaggiato i biscotti di mia nonna!
Brian,

1
Penso che, anche se potrei sbagliarmi, che @ Michael sta dicendo la tua descrizione in 5 punti delle proprietà che dovrebbe avere un URL segreto, è già eccessivo per la condivisione di una ricetta segreta con gli amici. Rendere ciascuno monouso (e quindi aver bisogno di un URL separato per amico che accede alla ricetta) in particolare sembra molto fastidio per un beneficio trascurabile, specialmente se c'è anche un tempo di scadenza. Ho letto la tua risposta nel senso che "è accettabile utilizzare un URL privato, ma gli URL privati ​​dovrebbero avere queste 5 proprietà" e IMO è leggermente sbagliato.
Steve Jessop,

1
@BenjaminHodgson che è precisamente la ragione per l'articolo # 5 => se il link / URL finisce nelle mani sbagliate, non dovrebbe perdere alcuna informazione sull'utente che lo ha richiesto.
Charles Addis,

8

Praticamente tutti gli schemi di autenticazione si riducono a dimostrare che si conosce un segreto. Ti autentichi in qualche servizio dimostrando di conoscere una password segreta o un URL segreto o, ...

Alcuni protocolli più avanzati (ad es. OAUTH, Kerberos, ...) ti consentono di dimostrare di conoscere il segreto senza trasmetterlo effettivamente . Questo è importante perché ci sono altri modi per ottenere un segreto "indiscutibile" oltre a indovinarlo.

Potrei essere seduto nello stesso Internet café di te, intercettando la tua connessione WiFi quando digiti il ​​tuo URL "non indelebile". A quel punto, se non stavi usando SSL, o se potessi sfruttare l'ultimo nuovo bug nella tua implementazione SSL, allora conoscerei anche il tuo segreto.


1
Ad essere onesti, questo vale anche per l'autenticazione o qualsiasi comunicazione.
Andy,

"intercettare la tua connessione WiFi" funziona su qualsiasi cosa: URL, CSRF protetti <form>, dati crittografati JavaScript di livello militare (forse sarà necessario lo sniffing attivo). Ripararlo è semplice: usa HTTPS.
Gustavo Rodrigues,

@GustavoRodrigues Prima di tutto, se l'orecchio intercettasse davvero "funzionava su qualsiasi cosa ", allora avrebbe funzionato su HTTPS. Altrimenti, cosa significa "qualsiasi cosa"? Oppure, quale magia pensi sia in HTTPS che lo mette al di sopra di tutto il resto?
Solomon Slow,

2
... ma non v'è magia che scongiura intercettazioni: E 'la crittografia a chiave pubblica. Ecco un semplice esempio: un servizio mi invia una sfida contenente un numero casuale e un timestamp. Firmo la sfida con la mia chiave privata e la restituisco. Se riescono a convalidare la mia risposta con la mia chiave pubblica registrata, ciò dimostra che conosco il segreto (il segreto è la mia chiave privata), ma l'ho provato senza mai rivelarlo a un potenziale intercettatore. Non aiuterà l'ascoltatore a ripetere la mia risposta, perché il servizio non invierà mai la stessa sfida due volte.
Solomon Slow,

HTTPS (ovvero HTTP su SSL) utilizza la crittografia a chiave pubblica, ma FYI, le implementazioni più popolari di SSL hanno una storia di bug che hanno permesso ai intercettatori di entrare anche a dispetto della crittografia. Nuovi bug (noti anche come "exploit") sembrano essere scoperti due o tre volte all'anno e tutti gli sviluppatori di tutti i prodotti che utilizzano SSL devono correre in giro con i capelli in fiamme fino a quando l'ultimo exploit non viene corretto. (Non chiedermi come lo so!)
Solomon Slow,

3

Molte buone risposte già in questa discussione, ma per rispondere direttamente alla domanda:

Dal punto di vista di un malfattore che vuole accedere a questa risorsa, questi approcci sono equivalenti? In caso contrario, cosa li rende diversi?

Vorrei stabilire una definizione. "Autenticazione" è la fornitura di credenziali per dimostrare una rivendicazione di identità. Il controllo degli accessi si basa generalmente sull'identificazione dell'utente.

Il tuo URL segreto non è associato a un utente specifico. Come altri hanno sottolineato, potrebbe finire nel file di registro di un proxy o in una richiesta di ricerca che viene indicizzata da Google o in molti altri modi in cui potrebbe fuoriuscire.

D'altra parte, una password è legata a un account utente univoco. Hai la possibilità di ripristinarlo o di consentirne l'utilizzo solo dalla posizione di residenza dell'utente, dall'indirizzo IP noto o da un numero qualsiasi di altri controlli.

Un nome utente / password ti dà un controllo molto più granulare dell'accesso.

Il controllo di accesso consente a un'identità (soggetto) di accedere a una risorsa (oggetto). Nel tuo esempio di URL l'identità è "chiunque abbia mai ricevuto l'URL, con qualsiasi mezzo".

Vai con il nome utente / password se puoi. Gli URL si perdono nel tempo in molti modi inaspettati.


1

Un URL segreto è sicuro quanto una password segreta. Tuttavia, le password sono più facili da mantenere segrete rispetto agli URL, poiché tutti e i loro programmi sanno che le password devono rimanere segrete.

Ad esempio, il tuo browser non mostrerà una password sullo schermo, memorizzerà solo le password con la tua autorizzazione e offrirà i mezzi per proteggere quella password (come la memoria crittografata sbloccata da una password principale). Al contrario, mostrerà sempre gli URL sullo schermo, potrebbe eventualmente perderli attraverso l'intestazione del referrer e salvarli automaticamente nella cronologia di navigazione senza ulteriore protezione.

Allo stesso modo, i proxy HTTP di solito non registrano le password, mentre gli URL vengono comunemente registrati.

L'uso degli URL per l'autenticazione significa anche che la condivisione degli URL condivide l'autenticazione, il che rende difficile revocare (o registrare) individualmente l'accesso.

E, naturalmente, gli URL segreti ereditano tutti i punti deboli delle password segrete. In particolare, l'utilizzo di una password per l'autenticazione rivelerà tale password al server e a chiunque sia in grado di leggere la comunicazione.


3
Questa risposta fa molte ipotesi errate. Se accedi a un sito con HTTPS e digiti il ​​nome utente e la password, i passaggi intermedi e i proxy non conosceranno la tua password.
Pieter B,

Con "intercettare la tua comunicazione" intendevo la capacità di ricostruirne il contenuto. Questo può essere impedito o meno da HTTPS. In particolare, affidarsi a un singolo certificato non valido (ad esempio da un proxy HTTPS aziendale che utilizza la stessa chiave privata per tutte le installazioni) consente a un utente malintenzionato di gestire il traffico HTTPS.
Meriton,

2
ma codificando il segreto nell'URL, fondamentalmente rendi HTTPS totalmente inutilizzabile. Ogni passaggio tra il client e il server ha il segreto. Non sono necessari certificati compromessi.
Pieter B,

4
Senza senso; in HTTPS, l'URL viene trasmesso solo nel flusso crittografato. Devi confonderlo con il dominio o IP, che sono rispettivamente visibili nei campi di ricerca DNS e nei campi dell'intestazione IP.
Meriton,

1

Un altro elemento non notato da nessuna parte è la limitazione di "ipotesi". Per la maggior parte dei sistemi di autenticazione con password, si ottiene un numero limitato di tentativi di indovinare una password per un utente prima che ulteriori tentativi di autenticazione siano bloccati o limitati.

Mentre potresti fare qualcosa di simile con "ipotesi" contro il tuo schema URL, sarebbe un po 'più difficile da implementare. Se esiste un modello riconoscibile per la generazione dell'URL, potrebbe essere difficile impedire a qualcuno di configurarsi per farsi strada nello spazio URL "casuale".


0

C'è un altro aspetto che non ho ancora visto menzionato: accorciatori di URL.

In una recente pubblicazione (aprile 2016), è stato affermato che i servizi di abbreviazione di URL annullano completamente la maggiore sicurezza fornita da URL "non indovinabili" generati casualmente. Lo spazio URL del servizio shorterner è considerevolmente più piccolo dell'URL generato casualmente, il che significa che qualsiasi URL "sicuro" condiviso con un servizio abbreviato può essere indovinato in modo più semplice del previsto.

Per illustrare, supponiamo che l'URL casuale sia lungo 128 bit (ovvero un guid). Inoltre, supponiamo che il tuo generatore di numeri casuali sia davvero forte e che generi quei bit in modo uniforme. Indovinare un numero a 128 bit è molto difficile e può richiedere molto tempo: l'URL è effettivamente protetto con chiave a 128 bit.

Quindi, supponiamo che qualcuno abbia condiviso questo URL sull'accorciatore di URL di Google. Oggi quel servizio emette un ID lungo 10 caratteri, composto da lettere e numeri. (26 + 10) ^ 10 ~ = 3,6 * 10 ^ 15 <2 ^ 52 - quindi abbiamo dimezzato l'intensità della chiave da 128 bit a 52 bit.

Aggiungete a ciò che i generatori non usano l'intero spazio a causa di altre considerazioni e potete montare un attacco efficace che combina la forza bruta con i canali laterali (molto probabilmente buffer di URL casuali pre-allocati).

L'articolo originale: http://arxiv.org/pdf/1604.02734v1.pdf
Un post sul blog che sintetizza l'articolo (dell'autore): https://freedom-to-tinker.com/blog/vitaly/gone-in- sei personaggi-corto-urls-considerato nocivo-per-nube-services /


2
Bene, sì, ma si spera che chiunque utilizzi tali servizi per dati sensibili sappia meglio che pubblicare gli URL ovunque , incluso un servizio di abbreviazione. Questo non è affatto diverso dal dire che Gah! My password/private key is too long and complex. I know! I'll just write it in a text document and put that in a zip file with an easier password.entrambi sono fallimenti trasparenti, che si spera contro la speranza che le persone non siano abbastanza sciocche da fare. Ma sì, in realtà, purtroppo probabilmente è necessario il tuo avvertimento;)
underscore_d

@underscore_d sì, esattamente - se conosci questo argomento in modo sufficientemente dettagliato da commentare, questo non è un punto degno del blog.
Robert Grant,
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.