Conclusions et conditions de décision
- Classifiez d'abord les fonctions par perte métier et retour sur investissement pour l'attaquant, puis choisissez entre VMP, Java2C, obfuscation du flux de contrôle ou obfuscation des noms.
- Les séquences de démarrage, boucles de rendu, opérations de chiffrement/déchiffrement haute fréquence et frontières inter-langages sont des chemins à haute sensibilité ; ils ne peuvent reposer sur une régression fonctionnelle standard au lieu de références de performance et de compatibilité.
- Les listes de protection doivent être versionnées et liées à un candidat de version unique, une identité de signature, une configuration de build et des enregistrements de régression ; sans quoi, les anomalies ne peuvent être attribuées.
- Le VMP augmente le coût de l'analyse et de la réutilisation du code côté client, mais ne remplace ni la gouvernance des signatures, ni les signaux d'intégrité de la plateforme, ni l'autorisation côté serveur, ni le contrôle des risques.
Transformer la liste de fonctions en inventaire d'actifs métier
Le problème principal d'une couverture généralisée n'est pas la performance, mais l'absence de critères de sélection. Les dépôts de code contiennent simultanément des algorithmes cœur, des vérifications d'autorisation, l'encodage/décodage de protocoles, des liaisons UI, des utilitaires génériques et des couches d'adaptation tierces. L'impact de la rétro-ingénierie de ces composants varie considérablement. Sélectionner des cibles uniquement par nom de paquet, de classe ou par nombre de fonctions consume rapidement le budget de protection sur du code à faible valeur, laissant les chemins critiques sans ressources de régression stables.
Une approche actionnable exige que les équipes métier, sécurité et ingénierie remplissent conjointement un inventaire d'actifs. Chaque fonction candidate doit répondre à quatre questions : Que gagne un attaquant en comprenant ceci ? Quels dommages résultent de sa modification ? La logique peut-elle être migrée vers le serveur ? Existe-t-il un repli sûr en cas d'échec ? Seuls les chemins présentant un potentiel de perte clair, une exécution obligatoire sur l'appareil et des frontières testables doivent passer à la sélection technique.
L'OWASP MASVS catégorise l'anti-rétro-ingénierie et l'anti-altération comme des mesures de défense en profondeur, stipulant explicitement qu'elles ne peuvent remplacer une architecture de sécurité saine. Cette frontière implique que les critères de sélection du VMP doivent découler de la modélisation des menaces, plutôt que d'assimiler directement un nom de technologie à un résultat de sécurité.
| Dimension d'évaluation | Questions auxquelles répondre | Signaux adaptés à une protection haute intensité | Signaux nécessitant une rétrogradation ou un report |
|---|---|---|---|
| Perte métier | Que perd-on si la logique est copiée, contournée ou modifiée ? | L'autorisation, les droits, les algorithmes cœur ou les protocoles critiques peuvent être directement contournés. | N'affecte que la présentation UI ou des fonctionnalités auxiliaires à faible valeur. |
| Nécessité côté client | La décision finale doit-elle rester sur l'appareil ? | Les exigences hors ligne, les contraintes de latence ou les capacités de la plateforme imposent une exécution côté client. | Les décisions à haut risque peuvent être finalisées sur le serveur. |
| Caractéristiques d'exécution | Quelles sont la fréquence d'invocation, le contexte de thread et la phase de démarrage ? | Faible fréquence, frontières claires et mesurables en isolation. | Démarrage sur le thread principal, boucles haute fréquence ou temps d'exécution non borné. |
| Repli en cas d'échec | Le système peut-il s'arrêter ou basculer en toute sécurité en cas d'échec de la protection ? | Des états d'échec clairs et des configurations de rollback existent. | Les échecs bloquent le démarrage et ne peuvent être isolés rapidement. |
| Vérifiabilité | Comment prouver la justesse métier après protection ? | Les entrées/sorties, scénarios et propriétaires d'acceptation sont clairement définis. | Repose sur un état implicite sans chemins de test stables. |
- Le propriétaire de l'actif valide le modèle de perte.
- L'équipe d'ingénierie valide les limites d'invocation et les dépendances.
- L'assurance qualité valide des parcours d'acceptation reproductibles.
- Le responsable de la publication valide les conditions de retour arrière.
VMP modifie la représentation de l'exécution, pas la responsabilité globale en matière de sécurité.
L'obfuscation des noms réduit la lisibilité des symboles et de la structure ; l'obfuscation du flux de contrôle accroît l'effort nécessaire pour restaurer les chemins d'exécution ; Java2C migre certaines parties du code managé vers une représentation native ; VMP exécute une logique sélectionnée via de nouveaux jeux d'instructions et mécanismes d'exécution. Bien que ces techniques puissent être superposées, elles résolvent des problèmes distincts, engendrent des coûts d'exécution spécifiques et présentent des modes de défaillance uniques. Définir une stratégie configurable et stratifiée est plus simple à valider que d'appliquer un niveau de protection uniforme à toutes les fonctions.
Les attaquants peuvent toujours observer les entrées/sorties, le timing des invocations, le comportement réseau et l'état d'exécution. Pour les paiements, les droits d'accès, l'autorisation de compte ou l'accès aux ressources à haut risque, le serveur doit toujours vérifier les permissions du compte, les ensembles de versions, le contexte de la requête et les signaux d'intégrité de la plateforme. Le rôle de la protection côté client est d'augmenter le coût de l'analyse, de la modification et de la réutilisation à grande échelle, et non de transformer le client en un environnement absolument fiable.
Le périmètre de protection doit également prendre en compte la maintenabilité. Un code de liaison métier fréquemment modifié, soumis à un traitement intensif à chaque version, augmente les deltas de build et la surface de tests de régression. Les modules centraux stables et à haute valeur ajoutée, dotés d'interfaces claires, sont mieux adaptés comme unités de protection à long terme.
| Couche de protection | Fonction principale | Coûts typiques | Contrôles toujours requis |
|---|---|---|---|
| Obfuscation des noms et de la structure | Réduit l'efficacité de la lecture statique et de la localisation en masse. | Débogage, attribution des plantages et gestion des fichiers de mappage. | Vérifications d'intégrité, autorisation côté serveur, protection de la logique critique. |
| Traitement du flux de contrôle et des chaînes de caractères | Augmente les coûts de restauration locale ; réduit les indices sensibles directs. | Taille du paquet, surcharge d'exécution et risques de compatibilité. | Gouvernance des clés, assainissement des journaux, vérification d'exécution. |
| Java2C ou conversion native | Modifie la surface d'analyse pour certaines parties du code managé. | Limites JNI, compatibilité ABI et plantages natifs. | Dépendances SO, symboles, gestion des exceptions et vérifications de threads. |
| VMP | Modifie la représentation de l'exécution et les chemins d'analyse pour le code sélectionné. | Performance, rayon d'impact et tests de régression sur la candidate de publication. | Signatures, versionnement, politiques côté serveur et portes de validation de publication. |
Les chaînes de démarrage et les chemins à haute fréquence nécessitent d'abord des bases de référence comparables.
Le démarrage de l'application n'est pas un point unique. Android décompose officiellement le démarrage à froid en création de processus, création de l'objet Application, démarrage du thread principal, création de l'Activity, gonflage de la mise en page et premier rendu, en utilisant TTID (Time to Initial Display) et TTFD (Time to Fully Drawn) pour observer respectivement les temps du premier affichage et de l'interactivité complète. Si le code protégé réside dans l'objet Application, un ContentProvider, l'initialisation de classe ou des chemins critiques du premier écran, des défaillances peuvent survenir avant l'initialisation des SDK de surveillance, ce qui signifie que les journaux en ligne standards peuvent ne pas les capturer entièrement.
Le risque lié aux fonctions à haute fréquence découle des coûts cumulatifs. Une légère augmentation du temps d'exécution par appel est amplifiée dans les boucles de rendu, le traitement audio/vidéo, les boucles de protocole ou le traitement de données par lots. La validation ne peut reposer sur une seule valeur moyenne ; elle doit comparer les distributions, les queues longues, l'occupation du thread principal, les variations de mémoire et les taux d'exception dans des états de dispositif identiques et avec les mêmes identités de candidates de publication. Cet article ne fournit aucun chiffre générique de surcharge, car les résultats spécifiques dépendent de la structure de la fonction, de la configuration de protection, du dispositif, du compilateur et de la fréquence d'exécution.
Les démarrages à froid, les démarrages à chaud et les environnements de test préchauffés ne doivent pas être confondus. Au minimum, figez l'état d'installation, l'état du processus, les données de compte et les conditions réseau, en mesurant à la fois la référence non protégée et le candidat de version protégé selon la même méthodologie.
| Chemin | Pourquoi il est sensible | Éléments à observer | Conditions de publication |
|---|---|---|---|
| Application et ContentProvider | Se produit avant le rendu du premier écran et l'initialisation de la plupart des systèmes de surveillance. | Création de processus, ordre d'initialisation, premières exceptions, TTID. | Aucune nouvelle défaillance au démarrage ; variance temporelle dans les limites du budget projet. |
| Fonctions du thread principal à haute fréquence | La latence cumulative impacte directement l'interactivité. | Nombre d'invocations, durée unitaire/totale, saccades (jank) et ANR. | Les distributions des parcours utilisateurs critiques sont acceptables sans nouvelles queues de distribution étendues. |
| Limites Native et JNI | Implique l'ABI, l'enregistrement, les exceptions et les contraintes de threads. | Chargement de bibliothèques, exceptions JNI, ABI cible, piles d'appel de plantage. | La matrice cible valide chaque élément individuellement ; les éléments non couverts sont signalés. |
| Traitement par lots en arrière-plan | Peut amplifier les coûts CPU, batterie et mémoire. | Durée des tâches, pic d'utilisation des ressources, annulations et nouvelles tentatives. | Ne viole pas les limites système ni les échéances métier. |
- Enregistrez séparément les temps de démarrage à froid et les temps d'interaction métier.
- Utilisez des conditions identiques d'installation et de données de compte.
- Observez à la fois les valeurs moyennes et les distributions de queue de distribution.
- Intégrez les budgets de performance dans les critères d'acceptation, pas dans des explications a posteriori.
Définir le périmètre de protection comme une configuration auditable et prête au retour arrière
Une liste de protection maintenable ne peut se réduire à une série de cases à cocher dans une interface outil. Elle doit entrer dans le contrôle de version comme les configurations de release, en enregistrant les identifiants d'actifs, la justification de la sélection, les niveaux de protection, les dépendances, les budgets de performance, les responsables et les conditions de retour arrière. Cela permet à l'équipe de répondre à la question de savoir pourquoi une fonction spécifique a été protégée, depuis quelle version, et qui l'a validée en cas de problème.
Les modifications de configuration doivent procéder par petits lots. Commencez par sélectionner quelques chemins à plus haute valeur aux limites les plus claires pour former une preuve de concept (PoC), puis étendez groupe par groupe. Chaque extension doit générer une nouvelle identité de candidat de version et un registre de tests de régression ; ne jamais écraser d'anciens artefacts sous le même nom de fichier.
Le YAML suivant est un exemple public et sûr de structure de données ; il ne correspond pas aux formats de configuration internes de Yudun, ni ne contient de noms de classes, de noms de fonctions ou d'implémentations produits réels.
- Chaque sélection possède une justification métier.
- Les modifications de configuration sont mappées à des candidats de version spécifiques.
- Les chemins à haut risque disposent de suites de tests de régression indépendantes.
- Le retour arrière ne dépend pas de la devinette des anciennes configurations.
asset: premium-entitlement-decision
owner: commerce-team
client_required: true
threats:
- unauthorized-logic-reuse
- local-branch-tampering
execution:
phase: post-login
frequency: low
main_thread: false
protection:
tier: high
rollback_group: entitlement-v1
acceptance:
- output-parity
- latency-budget
- target-os-matrix
- signed-candidate-identityL'acceptation doit être liée au même candidat de version et à la même chaîne de publication
Une construction réussie prouve seulement que la chaîne d'outils a généré des artefacts ; une installation réussie prouve seulement que le paquet actuel remplit les conditions d'installation sur l'appareil actuel. L'acceptation finale doit également couvrir l'identité de signature, les mises à jour depuis les versions en production, les démarrages à froid, les parcours métier critiques, la récupération d'exceptions, les systèmes cibles et les ABI cibles. L'analyse statique, les mesures de performance et les tests de régression de compatibilité doivent tous pointer vers la même identité de fichier.
Il est recommandé d'enregistrer les digests de fichiers, les noms de paquets, les versions, les digests de certificats de signature, les sources de construction, les versions de configuration de protection et les ordres de traitement de canal, tant pour la référence non protégée que pour chaque candidat de version protégé. Toute reconstruction, re-signature ou modification de canal génère une nouvelle identité de candidat, nécessitant une réentrée dans les étapes de vérification concernées.
Les décisions de publication doivent clairement énoncer trois conclusions : périmètre vérifié, périmètre non exécuté et périmètre échoué. En l'absence de données sur l'appareil, le système ou le métier, marquez les zones comme « non couvertes » et limitez les déploiements canaris, plutôt que d'emprunter des résultats de succès provenant d'une autre version ou d'un autre appareil.
| Barrière | Preuve | Substituts inacceptables | Action en cas d'échec |
|---|---|---|---|
| Identité du candidat | Empreinte, version, signature, configuration et source de construction. | Même nom de fichier ou confirmation verbale. | Arrêter la propagation et corriger à nouveau les artefacts. |
| Cohérence fonctionnelle | Comparaison des principaux flux d'E/S et des chemins d'exception. | Simple ouverture de l'écran d'accueil ou d'une seule démo. | Réduire la portée et localiser la première divergence. |
| Budget de performance | Distributions du démarrage et du chemin critique dans des conditions identiques. | Valeur moyenne unique provenant d'un appareil différent. | Revenir en arrière sur les chemins à haute fréquence ou ajuster les niveaux. |
| Matrice de compatibilité | Systèmes cibles, ABI, types d'appareils et chemins tiers. | Émulateurs ou une seule nouvelle version du système. | Marquer comme non couvert et restreindre la publication. |
| Clôture de la version | Mises à niveau, signatures, canaux, surveillance et exercices de retour arrière. | Un paquet différent après re-signature. | Réexécuter les portes affectées. |
Scénarios où la portée VMP ne doit pas être étendue directement
Si l'équipe ne peut pas encore définir les actifs clés, manque de candidats de publication stables, omet les matrices de systèmes cibles, ou même manque d'une base de référence non protégée, l'extension de la portée ajoute uniquement des variables non attribuables. La bonne action consiste à finaliser la définition des actifs et les conditions de test, et non à utiliser une couverture plus élevée pour masquer les lacunes de vérification.
La réflexion, la sérialisation, le chargement dynamique de classes, les correctifs à chaud, les frameworks de plugins, l'enregistrement JNI, l'auto-validation tierce et les SDK de phase de démarrage peuvent avoir des dépendances implicites sur les noms, la disposition du code, l'ordre de chargement ou le comportement des exceptions. Ceux-ci ne sont pas universellement interdits de protection, mais doivent être listés séparément et vérifiés aux points d'entrée métier réels.
Les décisions à haut risque que le serveur peut gérer doivent prioriser la formation de l'autorisation finale côté serveur. Le VMP côté client peut protéger les calculs locaux nécessaires et les matériaux de décision, mais il ne peut garantir que l'environnement d'exécution reste éternellement fiable, ni empêcher seul l'abus d'identifiants clients valides.
La portée finale n'est pas une conclusion permanente issue d'une réunion unique. À mesure que la logique métier, les chaînes de compilation, les SDK et les systèmes cibles évoluent, la valeur des actifs, la fréquence d'exécution et les limites de compatibilité doivent être réévaluées.
- Établir des bases de référence avant d'étendre la portée.
- Ne pas étendre le rayon d'impact sans plan de retour arrière.
- Créer des groupes distincts pour les chemins ayant des dépendances implicites.
- Ne pas laisser les décisions gérables par le serveur au seul client.
Limites des preuves et de l’applicabilité
Cette section sépare les faits documentés sur la plate-forme, le jugement technique et les limites qui ne peuvent pas être généralisées à des allégations de produit non vérifiées.
| Article jugement | Base factuelle ou technique | Limite d'applicabilité |
|---|---|---|
| Le VMP doit servir de défense en profondeur pilotée par les menaces, et non de substitut à l'architecture de sécurité. | OWASP MASVS-RESILIENCE liste l'obscurcissement, la protection contre la falsification et la protection contre l'analyse statique/dynamique comme contrôles pour améliorer la résilience, tout en soulignant que la sécurité repose toujours sur une conception vérifiable, la cryptographie et la validation côté serveur. | Cette norme définit des objectifs de contrôle ; elle ne prouve pas qu'un produit ou une configuration spécifique les a atteints. |
| Les chemins de démarrage nécessitent des bases de référence de performance indépendantes. | Android catégorise officiellement le démarrage en états froid, tiède et chaud, utilisant TTID et TTFD pour distinguer les temps entre la première image et l'interactivité complète. | Les définitions officielles des métriques ne peuvent remplacer la mesure sur de véritables candidats de publication et appareils cibles pour un projet spécifique. |
| La continuité de la signature et de la mise à niveau doit être acceptée indépendamment. | La documentation Android stipule que chaque APK doit être signé, et la plateforme utilise l'identité de signature pour déterminer si une mise à jour d'une application installée provient du même détenteur de clé. | La cohérence de la signature ne prouve qu'une partie de la chaîne d'identité de la publication ; elle ne prouve pas que la logique métier n'a pas été abusée. |
| Les signaux d'intégrité de la plateforme doivent être intégrés aux politiques côté serveur. | Play Integrity renvoie des verdicts relatifs à l'application, l'appareil, le compte et l'environnement, permettant aux backends de répondre selon une gradation des risques. | Les signaux peuvent être indisponibles ou restreints par les environnements de distribution ; un verdict unique ne peut être traité comme une confiance absolue. |
| Aucun chiffre générique de surcharge de performance n'existe hors des fonctions, des appareils et des configurations. | Les coûts du VMP dépendent de la fréquence d'exécution, du nombre de threads, de la structure du code, de l'implémentation de la protection, du compilateur et du périphérique ; par conséquent, les conclusions doivent reposer sur des comparaisons contrôlées dans des conditions identiques. | Il s'agit d'un jugement technique, non d'une affirmation empirique de performance pour Yudun ou d'autres produits. |
Questions d'ingénierie
Une couverture plus élevée implique-t-elle systématiquement des coûts de rétro-ingénierie plus importants ?
Une couverture accrue peut augmenter l'effort d'analyse pour certaines parties, mais elle alourdit également les coûts liés aux performances, à la compatibilité et aux tests de régression. L'impact réel sur le retour sur investissement de l'attaquant dépend de l'efficacité de la protection des chemins critiques et de la formation d'une boucle fermée entre signatures, vérifications d'intégrité et politiques côté serveur.
Les fonctions de démarrage sont-elles absolument interdites au VMP ?
Non, elles ne sont pas strictement interdites. Toutefois, les défaillances lors de la phase de démarrage ont un rayon d'impact étendu et la surveillance peut ne pas encore être initialisée. Des références de démarrage à froid claires, des budgets définis, des matrices de systèmes cibles et des plans de retour arrière rapides sont des prérequis indispensables.
Comment déterminer si une fonction est critique ?
Évaluez si sa rétro-ingénierie ou sa modification pourrait contourner l'autorisation, reproduire des algorithmes, exploiter des protocoles ou causer une perte commerciale directe. Confirmez simultanément que la logique doit rester sur l'appareil et pouvoir faire l'objet de tests de régression indépendants.
Le périmètre final peut-il être déterminé sans candidate de version actuelle ?
Un classement préliminaire des actifs et des listes de preuves de concept peuvent être établis, mais aucune garantie ne peut être donnée à l'avance concernant les performances, la compatibilité ou les effets finaux de la protection. Le périmètre définitif doit être validé par des résultats comparatifs issus de candidates de version réelles.
Le contrôle des risques côté serveur reste-t-il nécessaire après l'application du VMP ?
Oui. La protection côté client augmente les coûts d'analyse et de modification, mais l'autorisation des comptes, les transactions, les droits d'accès et l'accès aux ressources à haut risque doivent toujours être validés par le serveur en combinant les signaux de version, de compte et de risque.
Vous voulez tester cela sur votre propre application ?
Soumettez la version candidate, les systèmes cibles et les chemins commerciaux critiques pour une évaluation Yudun PoC et de compatibilité.
Continuez avec: Qu'est-ce que la protection VMP et comment sélectionner sa portée