Va bene avere un livello di convalida prima del livello di controllo dell'accesso


24

Sto creando un'applicazione Web con striature API e in questa applicazione abbiamo diversi livelli che stanno facendo il proprio lavoro.

Primo strato è di convalida strato che l'input dell'utente validate e se passa la convalida si sposta che al secondo strato (che è Access Control Layer) altrimenti restituisce il messaggio di errore

Il secondo livello è Controllo accessi che verifica se l'utente dispone dell'autorizzazione per eseguire l'attività che desidera eseguire, se l'utente dispone dell'autorizzazione sposta la richiesta al livello successivo, altrimenti restituisce un messaggio di errore

Il terzo livello è il livello del controller in cui abbiamo la logica dell'applicazione

La mia domanda è che va bene avere un livello di validazione prima del controllo degli accessi? Cosa succede se l'utente sta tentando di eseguire un'attività per la quale l'utente non dispone dell'autorizzazione e restituiamo un messaggio di errore di convalida? L'utente invia richieste a un endpoint e parla con il livello di convalida e, una volta superata la convalida, vedrà il messaggioYou can't access this!

Mi sembra strano, quindi va bene così o quali potrebbero essere le mie altre opzioni nell'infrastruttura?


10
Vale anche la pena ricordare che le convalide spesso devono raggiungere il database per fare il loro lavoro o un archivio di file. Se lo fai prima di verificare la presenza di violazioni del controllo degli accessi, essenzialmente permetti agli aggressori di eseguire il DDoS sul tuo database o file system lanciando enormi quantità di traffico su quel particolare URL.
Greg Burghardt,

Nel mio caso lo stesso vale per Access Control Middleware, controlla una risorsa e verifica se il tipo di risorsa è accessibile dall'utente, se è accessibile autorizzo l'accesso altrimenti
Muhammad

È vero. Durante un DDoS quel livello colpirà comunque il tuo archivio dati. Con l'esecuzione di quel livello per primo non colpirai il tuo archivio dati per le convalide E il controllo degli accessi - lo colpirai solo per il controllo degli accessi. Riduce le dimensioni dello tsunami, ma non gli impedisce di colpire la spiaggia. Offre a te o al tuo team di server la possibilità di combattere per rispondere a un attacco prima che l'intero sistema venga impantanato.
Greg Burghardt,

5
Da un punto di vista pratico, il controllo degli accessi dovrebbe comunque arrivare prima della convalida: come puoi convalidare la correttezza della richiesta di un utente se in primo luogo non può accedere alla richiesta?
Zibbobz,

La convalida di @Zibbobz è semplice come verificare se l'utente sta inviando lo schema corretto, come il parametro che dovrebbe essere intero è intero o qualcos'altro
Muhammad

Risposte:


57

Dipende dal fatto se conoscere la validità di alcuni input per un'attività che non è consentito eseguire sia una perdita di sicurezza. Se lo è, dovresti davvero farlo al contrario.

L'unica risposta sicura a un utente non autorizzato è "accesso negato". Se a volte la risposta è "richiesta errata" e altre volte "accesso negato", si inviano informazioni a un utente non autorizzato.

Ad esempio, è possibile verificare la convalida dell'attività "elimina documento" dell'esistenza del documento indicato. Qualcuno senza autorizzazioni sarebbe in grado di discernere se esiste qualcosa tentando di eliminarlo e confrontando quale errore ricevono. Un utente malintenzionato particolarmente determinato potrebbe enumerare tutti i nomi dei documenti (sotto una certa lunghezza), per vedere quali esistono.


7
+1, assolutamente. Se i tuoi dati sono in qualche modo identificabili personalmente o sensibili in qualsiasi altro modo, le implicazioni sulla sicurezza sono molto, molto più gravi delle implicazioni sull'usabilità.
Kilian Foth,

4
@caleth in realtà non ti farebbe sapere se un certo documento è nel sistema o meno, questo tipo di informazioni può essere dato solo quando raggiungi il livello del controller. La convalida controlla solo lo schema, non accede al database - solo il controllo dell'accesso e livelli più profondi fanno l'accesso al database. Inoltre, il livello di controllo dell'accesso mostra solo le stesse cose mentre esiste o meno una risorsa. L'unica cosa compromettente è lo schema che sto pensando se va bene o no
Muhammad,

@Caleth Potresti approfondire il tuo ultimo commento? Non vedo come sia il caso dato il commento dei PO. Sembra in ogni caso che le uniche informazioni restituite siano informazioni non privilegiate se lo schema è documentato pubblicamente.
Rotem,

11
@Rotem È sostanzialmente impossibile determinare in anticipo quali informazioni un utente malintenzionato potrebbe trarre vantaggio. Solo perché non hai trovato un modo per imparare qualcosa che non dovresti, non significa che non esiste un modo simile. Per fare un esempio estremo, potrebbe non esserci alcuna vulnerabilità ora , ma in futuro qualcuno potrebbe aggiungere un assegno allo strato di convalida che fa perdita di informazioni, perché non sapevano che non era protetto.
Kamil Drakari,

4
@KamilDrakari non è un esempio estremo, è un esempio perfettamente ragionevole. Detto in altro modo: se si esegue la convalida prima del controllo dell'accesso, ogni volta che uno sviluppatore desidera aggiungere una fase di convalida, deve decidere se tale convalida espone qualcosa di sensibile. La possibilità che ogni sviluppatore ottenga quella chiamata giusta sembra minuscola.
mfrankli,

24

Bene, ci sono diversi tipi di validazione:

  1. Controllo di integrità di base economico, che verifica che la richiesta non sia ovviamente malformata.

    Questo è in genere almeno parzialmente duplicato sul lato client, per evitare inutili round trip.

    Comunque, dovrebbe essere fatto prima del controllo degli accessi per rendere le cose più facili e meno soggette ad errori, in quanto non rischia alcuna perdita di informazioni.

  2. Convalida più costosa che non dipende ancora da dati applicativi protetti.

    Se esiste una tale ulteriore convalida, potrebbe essere dopo il controllo dell'accesso non a evitare la perdita di dati, ma a ostacolare gli attacchi DOS.
    A volte la semplice esecuzione della richiesta comporta implicitamente una parte di tale convalida a costi ridotti o nulli, quindi potrebbe essere lasciata fuori da qui.

    Se viene duplicata tutta la convalida del primo passaggio, potrebbe avere senso duplicare anche parti di questo lato client.

  3. Convalida aggiuntiva a seconda dei dati dell'applicazione protetti.

    Farlo prima del controllo degli accessi rischia ovviamente di perdere informazioni. Quindi, per prima cosa controlla l'accesso.


3
Sarebbe ideale eseguire il controllo degli accessi in un punto di applicazione delle politiche nella tua infrastruttura anche prima di raggiungere l'API. Un set statico di base di convalida (es: OpenAPI) sarebbe il primo, seguito da una convalida aziendale più approfondita. Anche una certa convalida statica potrebbe potenzialmente avere un impatto sulla disponibilità degli attacchi ReDOS precedenti .
Felickz,

@felickz: Sì, gli attacchi DOS sono un motivo valido per rinviare la convalida fino a dopo l'autorizzazione. È un atto di equilibrio. Ad ogni modo, ho diviso il mio primo punto per tenerne adeguatamente conto.
Deduplicatore,

Fare costose convalide prima del controllo degli accessi rischia anche di perdere informazioni a causa di attacchi temporali. Se il sistema impiega tempi più o meno lunghi a seconda della risorsa, l'utente malintenzionato può dedurre aspetti della risorsa richiesta.
Lie Ryan

@LieRyan: qual è la ragione per cui tutta la convalida che è potenzialmente prima del controllo degli accessi non dipende affatto dai dati protetti dell'applicazione.
Deduplicatore

13

Deve essere presente una convalida prima del controllo dell'accesso. Supponiamo che l'API di SO abbia un endpoint "modifica risposta", quindi se l'utente può modificare una determinata risposta può dipendere dalla risposta (al di sotto di una certa reputazione, un utente può solo modificare le proprie risposte). Pertanto, il parametro "ID risposta" ben formato deve essere verificato prima che il livello di controllo accessi entri in gioco; forse anche che la risposta esiste.

OTOH, come menzionano Caleth e Greg, mettere una convalida più ampia prima del controllo degli accessi è un potenziale rischio per la sicurezza.

Quindi le regole difficili sono

  1. Non è necessario divulgare alcuna informazione attraverso la convalida che l'utente non dovrebbe altrimenti essere in grado di scoprire.
  2. È necessario convalidare i dati prima che il controllo degli accessi possa utilizzarli nella misura in cui il controllo degli accessi ne ha bisogno.

Seguire entrambe queste regole può significare che è necessario disporre di alcune convalide prima e alcune dopo il controllo degli accessi.


3
Questa è la risposta realistica. Se la sua convalida semplice e diretta della struttura dei dati di input, allora non ci devono essere scrupoli prima di tutto. Protegge anche il livello di controllo dell'accesso da input / pacchetti appositamente progettati. La convalida che in realtà comporta una perdita o un'ipotesi di informazioni sicure, deve essere effettuata dopo i controlli di accesso.
SD,

Ciò presuppone che le risposte siano pubbliche. Oserei dire che molte API non ti mostreranno nemmeno i dati senza la tua autenticazione.
TomTom,

6

Oltre alla possibile frustrazione di ricevere un "accesso negato" dopo la convalida dell'input; tieni inoltre presente che il livello di convalida , a meno che non sia molto semplice, può sempre richiedere informazioni dal controller . Tenendo presente questo, credo che posizionare la convalida dietro il controllo degli accessi , più vicino al controller, abbia più senso.


2

Dipende da cosa intendi per livello di convalida - se con ciò intendi semplicemente verificare la sintassi della richiesta, è sicuro e devi fare qualcosa comunque. Se il 'convalida' utilizza qualsiasi informazione che un utente senza privilegi non ha accesso a, esso non è più sicuro.

Dovresti assolutamente avere un controllo di integrità prima di tentare il controllo degli accessi, ma dovresti aver cura di comunicare in modo molto chiaro a tutti i manutentori (attuali e futuri) che questa parte non deve usare informazioni privilegiate; Qualsiasi controllo di questo tipo deve essere eseguito in una fase di convalida separata dopo l' autenticazione.

Come controllo di integrità per il controllo di integrità, non dovrebbe effettivamente avere dipendenze di codice da qualsiasi parte del codice più in basso nella pipeline e dovrebbe essere separabile nel proprio pacchetto che dovrebbe essere pubblicamente pubblicabile senza problemi (oltre a possibili problemi legali) . Se non riesci a farlo, il tuo "livello di validazione" sta facendo troppo (o la tua base di codice è un casino).


1

No. Non va bene.

Se hai un bug nel tuo livello di convalida, potrebbe aggirare il livello di sicurezza.

È un errore comune considerare la sicurezza come parte dei requisiti aziendali. "solo gli utenti con il ruolo di vendite, dovrebbero essere in grado di vedere le cifre trimestrali" sembra una regola commerciale.

Ma se vuoi essere sicuro, devi leggere una regola come "solo gli utenti nel ruolo di vendita, dovrebbero essere in grado di eseguire codice su questo endpoint" Devi assicurarti che il tuo server restituisca sempre "accesso negato" prima di arrivare a qualsiasi tipo di codice che hai scritto o file sul server.

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.