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 :
| App | Bundle iOS / Android | Audience | SDK Expo | Source |
|---|---|---|---|---|
| Nex | com.noki.services.nokipay | Consumer (particuliers) | SDK 55 / RN 0.83 | apps/mobile-client/ |
| Nex Pro | com.paywithnex.pro | Agent, master-agent | SDK 55 / RN 0.83 | apps/mobile-pro/ |
| Nex Business | com.paywithnex.business | Merchant | SDK 55 / RN 0.83 | apps/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 | État | Dé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 | État | Détail |
|---|---|---|
| Algos éprouvés uniquement | ✅ | PBKDF2-SHA256 pour PIN local (@nex/mobile-auth), AES-256-GCM pour QR (ADR-0013). |
| Pas de clés hard-codées | ✅ | Device keys QR générées serveur, jamais embarquées dans le bundle. |
| Random cryptographiquement sûr | ✅ | react-native-quick-crypto (JSI natif). |
| Vérification tag GCM stricte | ✅ | Cf. ADR-0013. |
MASVS-AUTH — Authentification & autorisation
| Contrôle | État | Détail |
|---|---|---|
| Pas d'auth uniquement côté client | ✅ | PIN vérifié côté serveur (bcrypt) + vérification offline secondaire via PBKDF2. |
| Lockout après tentatives multiples | ✅ | MAX_PIN_ATTEMPTS, LOCKOUT_MS dans @nex/mobile-auth (LockoutStore). |
| Biométrie comme second facteur, pas remplaçant l'auth serveur | ✅ | expo-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 | État | Détail |
|---|---|---|
| TLS 1.2+ obligatoire | ✅ | TLS 1.2 minimum côté Cloudflare (cf. ADR-0010). |
| SSL pinning des certificats backend | ❌ | Absent — cf. known-gaps. Risque : MITM via root cert installé sur device compromis. |
| Pas de cleartext HTTP | ✅ | usesCleartextTraffic=false Android / NSAllowsArbitraryLoads=false iOS [À CONFIRMER dans app.json ou natif]. |
MASVS-PLATFORM — Interaction avec la plateforme
| Contrôle | État | Dé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 | État | Détail |
|---|---|---|
| Pas de debug logs en prod | ⚠️ | Babel plugin de strip console en prod : à confirmer dans metro.config.js. |
| Validation des inputs côté UI | ✅ | Formulaires Zustand + validation. |
| Gestion des erreurs sans leak d'info sensible | ⚠️ | À auditer. |
MASVS-RESILIENCE — Anti-tampering / RASP
| Contrôle | État | Détail |
|---|---|---|
| Jailbreak / root detection | ❌ | Absent — 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-debug | ❌ | Pas 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 | État | Dé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 :
| # | Gap | Sévérité | Action |
|---|---|---|---|
| 1 | SSL pinning absent | Critical | Ajouter pinning via react-native-ssl-pinning ou config Expo |
| 2 | Jailbreak/root detection absent | High | Ajouter jail-monkey ou équivalent + comportement défini (warning, blocage opérations sensibles) |
| 3 | Code obfuscation à vérifier | Medium | Confirmer/activer obfuscator + Hermes bytecode |
| 4 | Permissions natives à auditer | Medium | Revue manifest iOS/Android par app |
| 5 | Strip console logs en prod | Medium | Activer babel-plugin-transform-remove-console |
| 6 | Effacement données à logout / désinstall | Medium | Documenter + tester |
| 7 | Validation 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 :
AppPrivacyCovermasque l'écran en background.
5. Roadmap mobile security
Court terme :
- Adopter
react-native-ssl-pinningou 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-consoleen 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
- OWASP MASVS : https://mas.owasp.org/MASVS/
- OWASP MASTG (Mobile Application Security Testing Guide) : https://mas.owasp.org/MASTG/
- Expo SDK 55 security best practices : doc Expo officielle
- ADR-0013 : QR code AES-256-GCM