Skip to content
DraftAudienceSécuritéDevAudit banqueOwner@security-teamDernière revue2026-05-21

Sécurité mobile (MASVS)

Statut : draft. Mapping des apps mobiles Nex (consumer), Nex Pro (agent), Nex Business (merchant) contre OWASP MASVS 2.x — Mobile Application Security Verification Standard. Cible : MASVS Level 2 (L2) pour une app fintech.

1. Périmètre

Les 3 apps mobiles partagent une partie significative de leur surface technique :

AppBundle iOS / AndroidAudienceSDK ExpoSource
Nexcom.noki.services.nokipayConsumer (particuliers)SDK 55 / RN 0.83apps/mobile-client/
Nex Procom.paywithnex.proAgent, master-agentSDK 55 / RN 0.83apps/mobile-pro/
Nex Businesscom.paywithnex.businessMerchantSDK 55 / RN 0.83apps/mobile-business/

Packages partagés sécurité-critiques : @nex/mobile-auth, @nex/mobile-bootstrap, @nex/ui-mobile.

2. Chapitres MASVS — état Nex

Légende : ✅ couvert · ⚠️ partiel ou à documenter · ❌ gap · N/A non applicable.

MASVS-STORAGE — Stockage local sécurisé

ContrôleÉtatDétail
Données sensibles uniquement dans SecureStore (Keychain iOS / KeyStore Android)⚠️PIN vault dans SecureStore via expo-secure-store ✅. Tokens auth en SecureStore [À CONFIRMER]. AsyncStorage utilisé pour des données non-sensibles.
Pas de PII en clair persisté⚠️Profil utilisateur en cache local : à audit.
Effacement à logout / désinstallation⚠️À documenter par app.

MASVS-CRYPTO — Cryptographie

ContrôleÉtatDétail
Algos éprouvés uniquementPBKDF2-SHA256 pour PIN local (@nex/mobile-auth), AES-256-GCM pour QR (ADR-0013).
Pas de clés hard-codéesDevice keys QR générées serveur, jamais embarquées dans le bundle.
Random cryptographiquement sûrreact-native-quick-crypto (JSI natif).
Vérification tag GCM stricteCf. ADR-0013.

MASVS-AUTH — Authentification & autorisation

ContrôleÉtatDétail
Pas d'auth uniquement côté clientPIN vérifié côté serveur (bcrypt) + vérification offline secondaire via PBKDF2.
Lockout après tentatives multiplesMAX_PIN_ATTEMPTS, LOCKOUT_MS dans @nex/mobile-auth (LockoutStore).
Biométrie comme second facteur, pas remplaçant l'auth serveurexpo-local-authentication via BiometricService. Fallback PIN systématique.
Logout serveur effectif (invalidation token)⚠️À confirmer côté service auth.

MASVS-NETWORK — Communications réseau

ContrôleÉtatDétail
TLS 1.2+ obligatoireTLS 1.2 minimum côté Cloudflare (cf. ADR-0010).
SSL pinning des certificats backendAbsent — cf. known-gaps. Risque : MITM via root cert installé sur device compromis.
Pas de cleartext HTTPusesCleartextTraffic=false Android / NSAllowsArbitraryLoads=false iOS [À CONFIRMER dans app.json ou natif].

MASVS-PLATFORM — Interaction avec la plateforme

ContrôleÉtatDétail
Permissions natives minimales⚠️À auditer par app : Camera (KYC, QR), Notifications (push), Biometric. Pas de Contacts, Location, Microphone sauf justification.
Pas d'export d'activités sensibles (Android android:exported)⚠️À vérifier sur AndroidManifest.xml.
Pas d'URL schemes ambigus⚠️Schemes nexbusiness://, nex://, nexpro:// — vérifier qu'ils ne sont pas exploitables pour bypass.

MASVS-CODE — Qualité du code

ContrôleÉtatDétail
Pas de debug logs en prod⚠️Babel plugin de strip console en prod : à confirmer dans metro.config.js.
Validation des inputs côté UIFormulaires Zustand + validation.
Gestion des erreurs sans leak d'info sensible⚠️À auditer.

MASVS-RESILIENCE — Anti-tampering / RASP

ContrôleÉtatDétail
Jailbreak / root detectionAbsent — cf. known-gaps. Faciliter l'exécution dans un environnement compromis.
Code obfuscation (Hermes bytecode + obfuscator ?)⚠️Mentionné dans CLAUDE.md mobile-business, à vérifier dans la configuration build.
Anti-debugPas de protection observée.
AppPrivacyCover (masquage écran en background)Composant fourni par @nex/mobile-auth.
Validation intégrité de l'app (Play Integrity, App Attest)À évaluer.

MASVS-PRIVACY — Privacy

ContrôleÉtatDétail
Consentement explicite pour collecte⚠️À auditer par flow KYC.
Mentions légales accessibles in-app⚠️À vérifier menu Paramètres.
Droit à l'oubli (suppression compte)⚠️Procédure à documenter (cf. RGPD si data EU).
Pas de tracking publicitaire tiers[À CONFIRMER]Pas de SDK marketing apparent en scan rapide.

3. Synthèse — niveau MASVS estimé

Estimation MASVS L1 partiel, pas encore L2. Pour atteindre L2 fintech, gaps critiques à corriger :

#GapSévéritéAction
1SSL pinning absentCriticalAjouter pinning via react-native-ssl-pinning ou config Expo
2Jailbreak/root detection absentHighAjouter jail-monkey ou équivalent + comportement défini (warning, blocage opérations sensibles)
3Code obfuscation à vérifierMediumConfirmer/activer obfuscator + Hermes bytecode
4Permissions natives à auditerMediumRevue manifest iOS/Android par app
5Strip console logs en prodMediumActiver babel-plugin-transform-remove-console
6Effacement données à logout / désinstallMediumDocumenter + tester
7Validation intégrité (Play Integrity, App Attest)Low-MediumÉvaluer pour scope audit

4. Couche partagée — @nex/mobile-auth

Cf. /services/mobile-auth/ pour le détail du package. Points-clés pour MASVS :

  • MASVS-STORAGE : PIN vault dans SecureStore (SECURE_KEY_PIN_VAULT).
  • MASVS-CRYPTO : PBKDF2-SHA256 via JSI natif (react-native-quick-crypto).
  • MASVS-AUTH : lockout (LockoutStore), biométrie en second facteur.
  • MASVS-RESILIENCE : AppPrivacyCover masque l'écran en background.

5. Roadmap mobile security

Court terme :

  • Adopter react-native-ssl-pinning ou config equivalent Expo (SDK 55 supporte les Network Security Config natifs).
  • Ajouter jailbreak/root detection avec stratégie (warning soft sur Nex consumer, blocage soft sur Nex Pro / Nex Business).
  • Activer babel-plugin-transform-remove-console en build production.
  • Confirmer le strip des logs Expo en production.

Moyen terme :

  • Mettre en place Play Integrity (Android) + App Attest (iOS).
  • Pentest mobile externe annuel (MASVS L2 oriented).
  • Audit des permissions natives, retrait des permissions non justifiées.

6. Références

Nex — Plateforme fintech CEMAC