Aller au contenu
Réussir mon BTS SIO

Tape une notion, une commande ou le nom d'une épreuve.

Par exemple

Chapitre 1316 minIntermédiaire

Sécurité d'une application mobile : l'OWASP MASVS appliqué

Par Josselyn C., prof de BTS SIO. Mis à jour le .

À la fin de ce chapitre, tu sauras

  • expliquer pourquoi une application mobile est un client non fiable ;
  • citer les huit catégories du MASVS et leurs contrôles ;
  • appliquer le MASVS à une application et justifier les choix ;
  • repérer les failles mobiles classiques dans un extrait de code.

3 exercices corrigés

La sécurité d'une application mobile part d'un constat : l'application tourne sur un appareil que son éditeur ne contrôle pas, qui peut être perdu, prêté ou modifié, et son code peut être lu. L'OWASP MASVS (Mobile Application Security Verification Standard) liste les exigences de sécurité d'une application mobile en huit catégories, et le MASTG (Mobile Application Security Testing Guide) explique comment les vérifier. Ce chapitre applique le MASVS à AppliFrais Mobile, catégorie par catégorie, avec ce que le code des chapitres précédents fait déjà et ce qu'il reste à faire. Les risques des API et le cadre général de la sécurité applicative sont dans le cours Sécurité des applications.

Une application mobile est un client non fiable

Tout ce qui est dans l'application est entre les mains de l'utilisateur, et d'un éventuel attaquant :

  • le code se lit : un APK ou une IPA se décompresse et se décompile avec des outils gratuits ; le bundle JavaScript, même compilé en bytecode Hermes, garde ses chaînes de caractères lisibles. L'adresse de l'API d'AppliFrais, injectée par EXPO_PUBLIC_API_URL, se retrouve en clair dans le fichier compilé ;
  • le code se modifie : sur un téléphone rooté (Android) ou jailbreaké (iOS), des outils d'instrumentation changent le comportement de l'application pendant son exécution, par exemple pour forcer un test à « vrai » ;
  • l'appareil se perd : un téléphone volé, ou prêté à un collègue, donne accès à ce qui est stocké et affiché ;
  • les communications passent par des réseaux inconnus : le Wi-Fi d'un hôtel, d'une gare, d'un hôpital.

D'où les deux règles qui résument la sécurité d'un client mobile : aucun secret dans l'application, et tout contrôle de sécurité refait par le serveur. Ces deux règles viennent du cours sécurité ; le MASVS les décline en exigences vérifiables.

OWASP MASVS, MASTG et Mobile Top 10

DocumentCe qu'il contientVersion en 2026
MASVSLes exigences : 24 contrôles répartis en 8 catégories2.1.0 (janvier 2024)
MASTGLe guide de test : comment vérifier chaque contrôle, sur Android et iOS, avec des exemples de code vulnérable et corrigé2.0 (juin 2026)
OWASP Mobile Top 10Les dix risques les plus fréquents, pour sensibiliserÉdition 2024 (les dix risques)

Le MASVS est l'équivalent mobile de l'ASVS du Web. Tous les contrôles ne s'appliquent pas à toutes les applications : le projet OWASP MAS définit des profils, du niveau de base, qui convient à toute application, aux exigences renforcées d'une application qui manipule des données sensibles (santé, banque), et à la résilience contre la rétro-ingénierie, réservée aux applications qui protègent un modèle économique ou un secret industriel.

Les huit catégories appliquées à AppliFrais

CatégorieContrôles (résumés)Dans AppliFrais
MASVS-STORAGE1. Stocker les données sensibles de façon sûre. 2. Empêcher leur fuiteJeton dans SecureStore ; données locales effacées à la déconnexion ; aucun jeton dans les journaux
MASVS-CRYPTO1. Une cryptographie actuelle, bien utilisée. 2. Une bonne gestion des clésPas de chiffrement fait maison : le Keystore et le trousseau gèrent les clés
MASVS-AUTH1. Des protocoles d'authentification et d'autorisation sûrs. 2. Une authentification locale conforme à la plateforme. 3. Une authentification renforcée pour les opérations sensiblesJetons courts et rafraîchissement avec rotation ; biométrie par le système ; contrôles refaits par l'API
MASVS-NETWORK1. Tout le trafic sécurisé. 2. L'épinglage d'identité pour les serveurs de l'éditeurHTTPS seulement en publication ; épinglage non retenu, avec justification
MASVS-PLATFORM1. Des communications entre applications sûres. 2. Des WebView sûres. 3. Une interface sûreLiens profonds validés ; pas de WebView ; écrans sensibles protégés des captures
MASVS-CODE1. Une version de système à jour exigée. 2. Un mécanisme pour imposer les mises à jour. 3. Aucun composant vulnérable connu. 4. Toutes les entrées validéesSDK récent ; version minimale vérifiée au démarrage ; npm audit ; requêtes SQLite préparées
MASVS-RESILIENCE1. Vérifier l'intégrité de la plateforme. 2. Résister à la modification. 3. À l'analyse statique. 4. À l'analyse dynamiqueNon requis pour AppliFrais (profil de base), à justifier
MASVS-PRIVACY1. Minimiser l'accès aux données. 2. Empêcher l'identification de l'utilisateur. 3. Être transparent sur la collecte. 4. Laisser l'utilisateur maître de ses donnéesPermissions au minimum ; position réduite à une commune ; déclarations des magasins ; politique de confidentialité

Les sections qui suivent détaillent chaque catégorie.

Stockage : ce qui reste sur le téléphone

MASVS-STORAGE-1 demande de ranger les données sensibles dans le stockage prévu par la plateforme. Dans AppliFrais, le seul secret durable, le jeton de rafraîchissement, est dans SecureStore ; le jeton d'accès ne quitte pas la mémoire (chapitre 7).

MASVS-STORAGE-2 demande d'empêcher les fuites, qui passent souvent par des chemins inattendus :

FuiteExempleParade
Les journauxconsole.log('jeton', jeton) oublié : les journaux d'un téléphone se lisent par USBAucune donnée sensible dans les journaux ; retirer les console.log de débogage
Les captures et le sélecteur d'applicationsL'aperçu de l'application dans la liste des applications ouvertes montre une ficheexpo-screen-capture sur les écrans sensibles
Les sauvegardesLa base locale copiée dans une sauvegarde du téléphoneNe garder localement que le nécessaire ; SecureStore est exclu des sauvegardes
Le presse-papiersUn numéro copié reste lisible par d'autres applicationsNe pas copier de données sensibles
Le clavierLe correcteur apprend ce qui est tapésecureTextEntry sur le mot de passe, autoCorrect={false} sur les champs sensibles
Les notificationsUn montant affiché sur l'écran verrouilléDes notifications sans donnée sensible (chapitre 9)

Pour un écran qui affiche des données sensibles, le module expo-screen-capture bloque les captures d'écran et masque l'aperçu dans le sélecteur d'applications sur Android :

tsx
import { usePreventScreenCapture } from 'expo-screen-capture';

export function EcranSensible() {
  usePreventScreenCapture(); // actif tant que l'écran est affiché
  // …
}

Sur iOS, la fonction enableAppSwitcherProtectionAsync du même module floute l'aperçu de l'application dans le sélecteur. Ces protections gênent aussi l'utilisateur légitime (impossible de faire une capture pour le support) : réserve-les aux écrans qui le méritent.

Cryptographie : ne rien inventer

MASVS-CRYPTO demande des algorithmes actuels et une bonne gestion des clés. Pour une application de gestion, la règle tient en une phrase : ne chiffre rien toi-même. Le transport est chiffré par HTTPS (TLS), le stockage des secrets par SecureStore, qui s'appuie sur des clés matérielles du Keystore et du trousseau. Les erreurs classiques à repérer dans un code (et dans un sujet d'E7) : une clé de chiffrement écrite en dur dans le code, un algorithme dépassé (MD5, SHA-1, DES, AES en mode ECB), un « chiffrement » qui n'est qu'un encodage Base64. Les principes sont dans le cours Cryptographie.

Authentification : le serveur reste le juge

MASVS-AUTH-1 porte sur le protocole : AppliFrais utilise un jeton d'accès de 15 minutes et un jeton de rafraîchissement révocable, avec rotation, et la déconnexion révoque le jeton côté serveur (chapitre 6). Surtout, chaque contrôle d'accès est refait par l'API : la garde d'Expo Router cache des écrans, elle ne protège aucune donnée. Une faille BOLA dans l'API (lire la fiche d'un autre visiteur en changeant l'identifiant) se corrige sur le serveur, jamais dans l'application.

MASVS-AUTH-2 porte sur l'authentification locale : la biométrie doit passer par les mécanismes du système (BiometricPrompt sur Android, LocalAuthentication sur iOS, que expo-local-authentication utilise), et idéalement débloquer une clé plutôt que renvoyer un simple booléen (chapitre 9).

MASVS-AUTH-3 demande une authentification renforcée pour les opérations sensibles. Dans AppliFrais, la clôture d'une fiche, qui la rend définitive, pourrait redemander l'empreinte ; dans une application bancaire, un virement redemande toujours une confirmation.

Réseau : HTTPS partout

MASVS-NETWORK-1 exige que tout le trafic soit chiffré et que les certificats soient vérifiés. Android (depuis la version 9 pour les applications récentes) et iOS (App Transport Security) refusent par défaut le HTTP en clair dans une application publiée. Les erreurs à ne jamais commettre :

  • réautoriser le HTTP en clair « pour que ça marche » (option usesCleartextTraffic sur Android, exceptions ATS sur iOS) ;
  • désactiver la vérification des certificats pendant les tests : ce code finit en production ;
  • envoyer un jeton dans l'adresse (?token=…), qui finit dans les journaux des serveurs et des proxys.

MASVS-NETWORK-2 concerne l'épinglage de certificat (certificate pinning) : l'application n'accepte que le certificat, ou la clé publique, attendu pour le serveur de l'éditeur, même si une autorité de certification compromise en délivrait un autre. Il protège mieux, mais complique le renouvellement des certificats : un épinglage mal géré rend l'application inutilisable le jour où le certificat change. Pour AppliFrais, il n'est pas retenu ; c'est un choix à justifier dans la documentation, pas un oubli. Une application de santé ou de paiement l'adopterait, avec une clé de secours.

Plateforme : liens profonds, WebView et écran

MASVS-PLATFORM-1 concerne les échanges avec les autres applications, et d'abord les liens profonds (chapitre 4). N'importe quelle application ou page web peut ouvrir applifrais://fiche/12 ; le lien est donc une entrée non fiable :

  • valider chaque paramètre (Number.isInteger(Number(id))) avant de l'utiliser ;
  • ne jamais déclencher une action (supprimer, clôturer, valider) depuis un lien sans que l'utilisateur la confirme dans l'application ;
  • ne jamais mettre de jeton ni de donnée sensible dans un lien.

Un autre risque touche les schémas personnalisés : rien n'empêche une autre application de déclarer le même schéma applifrais:// et d'intercepter les liens. Pour un lien qui transporte quelque chose d'important (un retour d'authentification OAuth, par exemple), on utilise les App Links et Universal Links, liés à un domaine vérifié.

MASVS-PLATFORM-2 concerne les WebView. AppliFrais n'en a pas. Une application qui en affiche une ne doit y charger que ses propres pages, en HTTPS, sans exposer de fonctions natives au JavaScript de la page ; une WebView qui ouvre n'importe quelle adresse reçue devient une porte d'entrée.

MASVS-PLATFORM-3 concerne l'interface : masquer les champs sensibles, protéger les écrans sensibles des captures (vu plus haut), ne pas afficher plus de données que nécessaire.

Code : versions, dépendances et entrées

MASVS-CODE-1 demande une version de système récente : le SDK 58 fixe le minimum à Android 7 et iOS 16.4, et tenir le SDK à jour fait suivre ces minimums.

MASVS-CODE-2 demande un mécanisme pour imposer une mise à jour. Au démarrage, l'application demande à l'API la version minimale acceptée et la compare à la sienne (Constants.expoConfig?.version, de expo-constants) ; si elle est trop ancienne, elle affiche un écran qui renvoie vers le magasin. Sans ce mécanisme, une version vulnérable reste en circulation indéfiniment.

MASVS-CODE-3 interdit les composants vulnérables connus. Une application Expo embarque des centaines de dépendances npm :

bash
npm audit                # vulnérabilités connues des dépendances
npx expo install --check # versions incompatibles avec le SDK
npx expo-doctor          # problèmes de configuration

La gestion des dépendances, les SBOM et l'automatisation dans la chaîne d'intégration sont dans le cours Sécurité des applications.

MASVS-CODE-4 demande de valider toutes les entrées : la saisie (validation dans l'application et dans l'API), les réponses de l'API, les liens profonds, les QR codes, les notifications. Et les requêtes SQLite locales sont préparées, comme sur un serveur (chapitre 7).

Résilience : freiner la rétro-ingénierie

MASVS-RESILIENCE regroupe les mesures qui ralentissent un attaquant qui analyse ou modifie l'application : détection d'un téléphone rooté ou jailbreaké, vérification de l'intégrité de l'application, offuscation du code, détection d'un débogueur. Elles ne remplacent jamais les autres contrôles : un attaquant motivé les contourne. Elles se justifient pour une application qui protège un modèle économique (un jeu, un service payant), des données très sensibles, ou contre la fraude. Pour AppliFrais, dont la sécurité repose sur l'API, elles ne sont pas exigées : la compilation de publication Android raccourcit déjà les noms du code Java et Kotlin (R8), et le bytecode Hermes rend la lecture du JavaScript moins immédiate, sans plus.

Vie privée : collecter le minimum

MASVS-PRIVACY, ajoutée dans la version 2 du MASVS, rejoint le RGPD :

  • minimiser (PRIVACY-1) : demander la caméra mais ni la photothèque ni le micro (chapitre 8), la position au premier plan et approximative, réduite à une commune ;
  • ne pas permettre l'identification au-delà du nécessaire (PRIVACY-2) : pas d'identifiant publicitaire, pas de bibliothèque de mesure d'audience qui envoie l'identifiant de l'appareil à un tiers ;
  • être transparent (PRIVACY-3) : la politique de confidentialité, le formulaire Sécurité des données de Google Play, les étiquettes App Privacy d'Apple, qui doivent décrire exactement ce que fait l'application ;
  • laisser l'utilisateur maître (PRIVACY-4) : désactiver le rappel, refuser la position, se déconnecter en effaçant les données locales, demander la suppression de son compte.

Ces obligations découlent du RGPD : finalité, minimisation, information, droits des personnes (le RGPD au BTS SIO).

Vérifier : le MASTG et la revue de code

Le MASTG décrit, pour chaque contrôle, comment le tester : par une revue du code source, par l'analyse du fichier compilé (analyse statique), et par l'observation de l'application en fonctionnement (analyse dynamique). Pour un projet de BTS, la vérification réaliste combine :

  • une revue de code avec une liste de contrôle tirée du tableau des huit catégories ;
  • npm audit et npx expo-doctor dans la chaîne d'intégration continue ;
  • des tests de refus dans la recette : jeton expiré, fiche d'un autre visiteur, lien profond avec un identifiant invalide, permission refusée ;
  • une analyse de l'APK par un outil d'analyse statique open source comme MobSF (Mobile Security Framework), qui signale les permissions, les configurations dangereuses et les secrets visibles dans le fichier.

Exercice 1 sur 3 Classer dans le MASVS Réussi À revoir

Donne la catégorie MASVS de chaque constat, et propose une correction.

  1. Le jeton de rafraîchissement est enregistré avec Storage.setItem (kv-store).
  2. console.log('Réponse connexion', corps) affiche les jetons dans les journaux.
  3. L'application accepte http:// en production « parce que le serveur de recette n'a pas de certificat ».
  4. Le lien applifrais://fiche/12/cloturer clôture la fiche sans confirmation.
  5. L'application demande l'accès aux contacts « pour plus tard ».
  6. Une version de l'application, connue pour une faille, est encore utilisée par un tiers des visiteurs six mois après la correction.
Voir la réponseMasquer la réponse de l'exercice 1
  1. MASVS-STORAGE-1 : un secret dans un stockage en clair. Le ranger dans SecureStore.
  2. MASVS-STORAGE-2 : fuite par les journaux. Supprimer le journal, ou n'y écrire que des informations non sensibles (le code de statut).
  3. MASVS-NETWORK-1 : trafic en clair. Mettre un certificat sur le serveur de recette (gratuit avec Let's Encrypt) et retirer l'exception.
  4. MASVS-PLATFORM-1 : un lien profond déclenche une action sensible. Le lien ouvre la fiche ; la clôture demande une confirmation dans l'application, éventuellement renforcée par la biométrie (MASVS-AUTH-3).
  5. MASVS-PRIVACY-1 : collecte non nécessaire. Retirer la permission ; la demander le jour où une fonction en a besoin.
  6. MASVS-CODE-2 : pas de mise à jour imposée. Au démarrage, comparer la version de l'application à la version minimale fournie par l'API, et bloquer avec un renvoi vers le magasin.

Tu avais trouvé ?

Exercice 2 sur 3 Revue de code Réussi À revoir

Relève les problèmes de sécurité de cet extrait d'une application mobile.

ts
const CLE_API_CARTO = 'sk_live_8f2b…';

export async function connexion(login: string, motDePasse: string) {
  const reponse = await fetch(`http://api.gsb.example/v1/auth/connexion?login=${login}&mdp=${motDePasse}`);
  const corps = await reponse.json();
  await Storage.setItem('motDePasse', motDePasse);
  if (corps.role === 'comptable') router.replace('/validation');
}
Voir la réponseMasquer la réponse de l'exercice 2
  • Clé d'API secrète dans le code (CLE_API_CARTO) : elle se lit dans le fichier publié. Elle doit rester sur le serveur, qui appelle le service de cartographie (STORAGE, et M1 du Mobile Top 10).
  • HTTP en clair : identifiants et jetons circulent sans chiffrement (NETWORK-1).
  • Identifiant et mot de passe dans l'adresse, avec une requête GET : ils finissent dans les journaux des serveurs et des proxys, et l'adresse n'est même pas encodée. Il faut un POST avec un corps JSON (AUTH-1).
  • Mot de passe enregistré dans un stockage en clair : on ne stocke jamais le mot de passe ; c'est le rôle du jeton de rafraîchissement, dans SecureStore (STORAGE-1).
  • Le rôle lu dans la réponse pilote l'accès à l'écran de validation : acceptable pour l'affichage, à condition que l'API vérifie elle-même le rôle à chaque requête de validation (AUTH-1). Si l'écran donnait accès à des données sans contrôle côté serveur, ce serait une faille.
  • Pas de vérification de reponse.ok : une erreur 401 serait traitée comme une réussite.

Tu avais trouvé ?

Exercice 3 sur 3 Épingler ou non ? Réussi À revoir

Le responsable de GSB demande d'ajouter l'épinglage de certificat à AppliFrais Mobile « pour être plus sûr ». Donne un avantage, deux inconvénients, et ta recommandation argumentée.

Voir la réponseMasquer la réponse de l'exercice 3
  • Avantage : l'application refuse tout certificat autre que celui attendu, même délivré par une autorité de certification compromise ou installée sur le téléphone par un tiers ; une interception devient beaucoup plus difficile.
  • Inconvénients : au renouvellement du certificat du serveur, toutes les versions installées qui n'ont pas la nouvelle empreinte cessent de fonctionner ; il faut gérer une clé de secours et planifier les renouvellements. Et l'épinglage gêne aussi les outils d'inspection légitimes de l'entreprise.
  • Recommandation : pour AppliFrais, qui traite des notes de frais, HTTPS avec la vérification standard des certificats suffit au profil de base du MASVS. L'épinglage se justifierait pour des données de santé ou de paiement ; s'il est adopté, épingler la clé publique (stable d'un certificat à l'autre) avec une clé de secours, et l'inscrire dans la procédure de renouvellement.

Tu avais trouvé ?

Chapitre terminé !

Fais les 3 exercices avant de passer à la suite : c'est en t'entraînant que tout se fixe.

chapitres
–
de série
–
du cours
–
Chapitre suivant : Une application mobile à l'E6 et à l'E7 SLAMRevoir le sommaire du cours