Negli ultimi anni ho notato una tendenza nelle app per dispositivi mobili e desktop con l'avvento di OAuth (e potrebbe interessare anche altri framework) per richiedere a un utente di registrarsi o accedere utilizzando provider di autenticazione di terze parti, in genere account social come Twitter, Facebook o Google. Il problema arriva quando non posso fidarmi dell'app in cui sto inserendo le credenziali, perché lo sviluppatore ha incorporato un browser in una finestra di dialogo di proprietà dell'app, e non ho nessun modo per sapere se la pagina che sto visualizzando è una pagina di accesso legittima o che l'agente utente (browser e livelli in alto) può essere considerato affidabile.
Non sto parlando di app di piccoli sviluppatori indie, sto parlando di software di aziende di grande fiducia (almeno nella comunità di sviluppo software dove trascorro la maggior parte del mio tempo). Alcuni esempi che ho visto nelle ultime settimane:
- Atlassian Sourcetree ti consente di accedere utilizzando il tuo account Google - in una finestra Atlassian
- Postino L'accesso a Google si verifica in una finestra Postman
- Microsoft Visual Studio e Office lo fanno con il tuo account Microsoft (garantito, questo è un po 'più attendibile in quanto l'app è di proprietà del provider di autenticazione, ma continua a sostenere il processo)
- Alcune app ti chiedono, per esempio, di accedere a Paypal in una finestra del browser all'interno della loro app
Domande simili poste in passato riguardo alle app mobili (ma il problema non è limitato ai dispositivi mobili):
- Come faccio verificare che le finestre di dialogo di accesso social in-app siano sicure?
- Come posso credere che si tratti di Google?
Una domanda relativa a un'app desktop:
E tangenzialmente correlato è l'uso degli iframe nelle applicazioni web:
Questo è un problema di fiducia per me quando si passa dallo spazio app al Web per autenticarsi, ottenere un token e tornare all'app. Potrei fidarmi delle aziende abbastanza da installare il loro software, ma non abbastanza da inserire le chiavi principali sul mio account Google (a tutti gli effetti) nel loro software.
Nella ricerca di questa domanda ho trovato questo progetto IETF che afferma:
Embedded user-agents are an alternative method for authorization native apps. They are however unsafe for use by third-parties to the authorization server by definition, as the app that hosts the embedded user-agent can access the user's full authentication credential, not just the OAuth authorization grant that was intended for the app.
EDIT: la bozza precedente è diventata RFC8252 , datata ottobre 2017, grazie a @Geir per avermi indirizzato a questo.
e una direttiva precedente, RFC6749 (datata ottobre 2012) che cita anche tra le altre curiosità:
An embedded user-agent poses a security challenge because resource owners are authenticating in an unidentified window without access to the visual protections found in most external user-agents. An embedded user-agent educates end-users to trust unidentified requests for authentication (making phishing attacks easier to execute).
Le mie domande:
-
Ho ragione di temere che questa sia una crescente opportunità per gli attacchi di phishing e MITM (browser falso o dirottato nel mezzo che ruba credenziali e / o token in tempo reale, sconfiggendo anche 2FA)? Non tanto che il software affidabile di per sé possa essere reso malizioso, ma questo uso diffuso scoraggia gli utenti dal verificare la fiducia end-to-end, condonando (anche incoraggiando) gli utenti a inserire ciecamente le credenziali in qualsiasi app che li richieda?
Penso che l'ultima sezione citata sopra risponda in modo inequivocabile in senso affermativo, ma sono interessato a ulteriori commenti e prospettive intorno a questo, in particolare come sviluppatore di software stesso.
-
L'ovvio modo "corretto" di farlo è inoltrare l'utente al proprio browser attendibile per l'autenticazione, tuttavia questa può essere un'esperienza utente scadente e in realtà non risolve il problema (uno sviluppatore malintenzionato potrebbe aprire una finestra dall'app principale che sembra come Chrome, ma non lo è - il fatto che le sessioni utente dalla finestra principale del browser non siano conservate, tra gli altri indizi visivi sarebbe probabilmente passare inosservato di più).
Esiste un modo migliore per progettare l'esperienza utente delle app in modo tale che un utente possa essere certo di utilizzare uno stack software affidabile (app e motore di rendering) in-app? Dovrebbe esserci una gestione a livello di dispositivo o di sistema di tali richieste di autorizzazione in un modo che è difficile da imitare?
-
Non sono molto coinvolto nella scena della sicurezza, solo un lurker qui, è una preoccupazione ben nota nel settore? Ci sono sforzi per limitare questo tipo di flusso di autenticazione?