Enumerazione sensibile dei dati tramite i codici di errore HTTP

2

Supponiamo che ci sia un sito Web con un'API che supporta la seguente chiamata REST in cui l'utente autenticato Alice può inviare un utente registrato a Bob un messaggio sul suo cellulare che ha registrato sul nostro sito (ipoteticamente, per il bene di questo esempio ):

curl --header "Authorization: JWT $someTokenForAuthz" \
     --header "Content-Type: application/json" \
     --request POST \
     --data '{"phone":"+43 123 456","msg":"some text"}'
     http://example.com/text/send

Supponiamo di classificare il numero di telefono come dati sensibili (PII) e supponiamo che l'API restituisca la risposta seguente nel caso in cui venga inviato un numero di telefono, che non è stato registrato sul sito:

{"error": {"code":404,"message":"Phone number not found"}}

Immagina Eve che scrive uno script che itera attraverso i numeri di cellulare da +43 000 001 a +43 999 999 (ignorando le limitazioni del numero di telefono del mondo reale). Con il codice di errore e dopo 1 000 000 iterazioni del suo script, Eve ha elencato tutti i numeri registrati nel sito e può ad es. indirizzare gli utenti del sito in un modo più specifico.

È un problema di sicurezza restituire un codice di errore HTTP 404 quando nel nostro sistema non sono stati trovati dati sensibili come un numero di cellulare? Quale sarebbe un modo migliore in termini di gestione degli errori (come una strategia di backup nel caso in cui i limiti delle richieste / i meccanismi di rilevamento già presenti potrebbero non riuscire) per impedire la scoperta di tali dati sensibili? Un errore di 401 - not authorized più generale o qualcosa di completamente diverso?

    
posta SeeYouInDisneyland 11.09.2018 - 12:57
fonte

2 risposte

2

Quindi la vulnerabilità è che la restituzione di un codice di errore consente l'enumerazione dei numeri di telefono registrati. Se consentire la divulgazione dei numeri registrati è negativo, questo è un problema di sicurezza.

A more general 401 - not authorized error

No, hai appena cambiato il testo - non hai cambiato il comportamento.

Ci sono molte cose che potresti fare per rendere la soluzione più sicura - ma non abbiamo basi per sapere quali siano appropriate al tuo modello fittizio, ad es.

  • segnala sempre il successo
  • non utilizzare i numeri di telefono - utilizza un identificatore surrogato (con un'entità molto più alta) e richiede al client di mantenere le loro tabelle di ricerca
  • richiede l'accesso autenticato e revoca tale accesso in base alle percentuali di errore
  • semina i dati con honeypot e revoca l'accesso ai client quando tenta di usarne uno
  • limitare la velocità con cui un cliente può effettuare richieste
  • carica il cliente per ogni POST
  • richiede ai destinatari di opt-in per ricevere messaggi da un determinato client - restituisce lo stesso errore per un numero mancante come uno che non ha concesso l'autorizzazione
  • ...

    assuming that request limits/detection mechanisms are already in place

Quindi stai dicendo che hai dei meccanismi di protezione, ma non proteggono contro l'enumerazione? Allora la tua domanda è un ossimoro.

    
risposta data 11.09.2018 - 13:49
fonte
1

Il tuo frontend potrebbe comunicare all'utente solo i messaggi di stato relativi al frontend. Richiesta ricevuta? Se è così, dillo. Se la convalida fallisce, informali. Nient'altro. Se il back-end non può consegnare il messaggio per nessun motivo, il frontend non dovrebbe essere informato.

Restituire solo qualcosa come {"status": "success", "message": "Received"} è sufficiente. Eve non ha bisogno di sapere se il numero esiste o no. Se Eve invia un numero non valido (non valido, non non registrato), potresti lanciare {"status": "error", "message": "Invalid number"} in modo che possa correggere l'errore di battitura e riprovare.

    
risposta data 11.09.2018 - 15:20
fonte

Leggi altre domande sui tag