Perché utilizzare un proxy per nascondere le credenziali del client OAuth nelle chiamate di concessione della password?

6

In un articolo di novembre 2014 di Alex Bilbie, gli utenti di OAuth sono stati sconsigliati a fare inviare il client le sue credenziali ( client_id e client_secret ) quando si esegue Password proprietario risorsa concedere chiamate. L'idea, a quanto ho capito, è che il client sia in grado di aggiungere le sue credenziali alle sue richieste, quelle credenziali devono essere scritte nel suo codice sorgente (spesso HTML / JS) e quindi accessibili ai possibili attaccanti, che potrebbero quindi usarle per eseguire chiamate all'API impersonando il client.

In commenti di un altro post del blog , l'autore ha aggiunto:

If I can view source and copy the client credentials there’s nothing stopping me building my own app that can authenticate against your OAuth service and then call the API.

La soluzione proposta è che il client non deve chiamare direttamente l'API, ma piuttosto un proxy sottile che sarebbe responsabile per l'aggiunta delle credenziali del client alla richiesta e quindi per l'inoltro all'API.

Come novellino OAuth ingenuo, non capisco perché questo impedirebbe agli attaccanti di eseguire chiamate alla mia API. Se il cliente non deve aggiungere le sue credenziali alle sue richieste, nessuno lo fa. Poiché il proxy aggiunge automaticamente le credenziali, ogni richiesta inviata all'API viene quindi considerata come proveniente dal client autorizzato.

Qualcuno ha chiesto ad Alex Bilbie questa stessa domanda su Twitter. Ecco la sua risposta:

how would you secure the proxy? Can't the attacker just send a request to the proxy and have the secret happily filled in?

the point is that you’re hiding implementation details of your backend and therefore retaining more control

Sarei grato se qualcuno potesse elaborare questa risposta, dato che non riesco a vedere cosa potrei ottenere (per quanto riguarda la sicurezza) dal nascondere i dettagli di implementazione e allo stesso tempo rimuovere la necessità per un client di autenticarsi.

    
posta marcv 22.08.2015 - 19:16
fonte

1 risposta

3

Dopo aver letto il post del blog collegato e dopo aver fatto riferimento ai suoi problemi con la RFC OAuth 2.0 ho alcuni problemi con le sue preoccupazioni. Nella prima sezione del suo post sul blog, ha due problemi principali nell'utilizzo di OAuth in un'applicazione web a pagina singola utilizzando la autorizzazione per le credenziali delle password del proprietario di risorse :

  1. Il client_id e client_secret sono cotti nel Javascript.
  2. Un utente malintenzionato può anche accedere a access_token e refresh_token da Javascript.

Affrontare il primo problema, sezione 4.3.2 della RFC elenca i requisiti per la richiesta un access_token utilizzando il flusso Risorsa credenziali password proprietario risorse . Questi requisiti non includono un client_secret poiché il provider considera attendibile il client. Se questo flusso è stato utilizzato per i client non fidati, il client non avrebbe bisogno di un client_secret perché il client potrebbe semplicemente autenticarsi con il provider utilizzando gli utenti username e password . Questo flusso replica sostanzialmente schemi di autenticazione basati su password tradizionali.

Il secondo problema esiste, tuttavia l'autore non spiega realmente l'impatto. Per ottenere l'accesso al access_token dell'utente, l'utente malintenzionato ha bisogno di un accesso fisico al computer dell'utente o di sfruttare una vulnerabilità separata come lo scripting cross-site all'interno del web. Un access_token è fondamentalmente equivalente a un cookie di sessione, tranne che il browser non ha meccanismi integrati come secure e http-only cookie flags per proteggere un access_token .

Insieme significa che non esiste un motivo valido per inviare le richieste API tramite un proxy sottile perché l'applicazione non deve esporre dati segreti che un'applicazione Web non esporrà normalmente.

    
risposta data 24.08.2015 - 17:48
fonte

Leggi altre domande sui tag