Indipendentemente dal flusso PKCE OAuth2 o da qualsiasi altro flusso, la domanda si riduce a "il server può verificare l'integrità dell'applicazione?". La risposta a questa domanda è semplicemente NO.
L'applicazione risiede nella terra dell'utente, il che significa che un utente malintenzionato ha il controllo completo dell'applicazione. L'utente malintenzionato può installarlo sul suo dispositivo, correggerlo, cambiarne il comportamento in modo dinamico (aggancio) o modificare i valori in memoria, ecc ...
L'unica cosa che puoi fare è rendere difficile a un utente malintenzionato pasticciare con la tua applicazione. Alcuni contromisure sono:
- Rilevamento root / jailbreak
- Offuscamento del codice: include il metodo offuscamento / nomi di variabili, l'offuscamento del flusso di controllo, ecc ...
- Qualcosa chiamato Runtime Application Self Protection (RASP): questo di solito include il rilevamento e l'ampli del gancio; rilevamento del debug.
- Crittografia: ad esempio in Android è possibile caricare dinamicamente un file DEX, alcune applicazioni caricano un file DEX crittografato in memoria e lo decodificano.
- Stampa di impronte digitali: controlla ad esempio se il dispositivo viene eseguito all'interno dell'emulatore.
Le contromisure di cui sopra possono essere implementate in modi diversi. Ci sono prodotti là fuori che possono farlo per te. Alla fine, è possibile ignorare tutte queste misure, ma richiede uno sforzo. La domanda di solito si riduce alla modellazione delle minacce: cosa stai cercando di proteggere? Quanto vuoi spendere per tali soluzioni? Cosa può ottenere un utente malintenzionato se queste soluzioni vengono aggirate? Quanto è facile / difficile?
Inoltre, non dimenticare il rafforzamento della comunicazione. È possibile implementare tutte le misure precedenti, ma un utente malintenzionato può ad esempio utilizzare anche un proxy mitm come Burp per intercettare e modificare i dati in transito. Quindi, utilizzare TLS ovunque potrebbe essere un dato, ma non dimenticare le misure di rafforzamento come il pinning di TLS. Ad essere onesti, questo è facile da bypassare se me lo chiedi. Ho visto alcune persone diventare creative e fare cose come: crittografare e firmare i payload inviati al server, usando protocolli binari invece di HTTP e molto altro.
Ricorda, alla fine della giornata, un attaccante motivato può superare tutti questi ostacoli.