web-dev-qa-db-fra.com

Que faire quand vous ne pouvez pas protéger les clés secrètes d'applications mobiles?

Nous avons une application mobile pour iOS et Android Disponible dans Apple et google Play Stores. L'application communique avec nos services Web de notre serveur via HTTPS.

Nous avons des attaquants capables de spoiser le trafic app. Cela signifie probablement que nos attaquants décryptaient et surveillent la demande/réponse Web de HTTPS-cryptée avec un outil tel que Fiddler .

Notre prochaine étape consiste à chiffrer dans l'application mobile. Nous chiffrons la charge utile du service Web dans les deux sens à l'aide de AES en mode CBC avec HMAC. Cela signifie que notre serveur et l'application mobile téléchargeable ont une clé secrète partagée (en fait, au moins deux).

Le problème est qu'il est tout à fait possible d'ingénieur ingénieur iOS ou Android Applications mobiles et récolte toutes les clés secrètes. Pour être sûr, nous avons un niveau de sécurité plus élevé. Il faut plus d'expertise pour inverser- Ingénieur Une application mobile que nécessaire pour observer le trafic HTTPS via Fiddler.

Nous ne pouvons peut-être pas être une cible assez grande pour que quiconque se préoccupe de récolter nos clés secrètes. Mais nous aimerions grandir au point où l'attaque en vaut la peine!

Tout protocole d'échange de clé dont je suis au courant nécessite l'application mobile d'avoir une clé secrète quelque part dans le processus. Avec l'application disponible en tant que téléchargement gratuit de Apple App Store et Google Play, je n'ai tout simplement aucun moyen de vous assurer que son secret reste secret.

arxan.com Réclamations pour fournir une solution de qualité d'entreprise qui semble être un processus suffisamment complexe de cacher les clés des attaquants potentiels. Je ne suis pas encore prêt à leur demander des prix!

J'ai regardé une manière, ma question est: "Comment protéger une clé secrète dans une application mobile à l'état sauvage?" J'ai vu deux réponses claires:

  • Vous ne pouvez pas.
  • Utilisez HTTPS. Cependant, nous faisons cela et il est clair pour nous que notre trafic soit toujours surveillé.

Donc, je pense que ma question devient une authentification par opposition à l'autorisation: sur le côté serveur, comment faire la distinction entre un attaquant prétendant être notre application mobile et un trafic légitime de notre application?

En supposant que nous cryptions et utilisons correctement HMAC, un message valide nous dit:

  • Le message n'a pas été modifié.
  • L'expéditeur est en possession de nos clés secrètes partagées.

Tout pour ce point dépend de la clé secrète ne faisant pas compromettre.

La seule réponse que j'ai pensée à Jusqu'à présent est l'analyse de la circulation. Nous détectons le trafic d'attaque de force brute et certains autres profils de trafic. Nous détectons diverses formes d'attaque de replay.

Nous pourrions donc en déduire que notre clé secrète a été compromise, si jamais, et invalider la clé (invalidez donc toutes les installations mobiles dans la nature). Mais il s'agit de raisonner que si un attaquant peut comprendre une clé secrète, cet attaquant peut également comprendre la clé suivante. Nous voulons pas non plus invalider toute notre base d'utilisateurs légitimes installée-application!

Nous pouvons installer un certificat à l'intérieur de notre application, mais cela résoudra-t-il le problème? Et si oui, comment? N'avons-nous pas le même numéro de l'application d'être inverse et spoofed?

Edit: Qu'essayons-nous de protéger?

  1. Notre attaquant peut exécuter une liste de mots de passe contre nous en parpoffrant la séquence Web de la connexion à l'utilisateur de notre application. Étant donné que notre attaquant est capable d'observer le trafic HTTPS car il quitte l'application, notre attaquant sait construire la demande de service Web et l'authentification.

  2. Nous pouvons crypter les informations de connexion (et autres) avant qu'il ne quitte l'application. Cela devrait empêcher la renonciation et l'entrepoiffage, en supposant que notre attaquant ne possède pas les clés secrètes utilisées dans le cryptage.

  3. Étant donné que le trafic entrant (au serveur) est plus important de protéger, le cryptage clé publique serait une possibilité. Seul le serveur pourrait le déchiffrer. Cependant, étant donné que la clé est publique, notre attaquant pourrait toujours exécuter une liste de mots de passe prétendant être l'application.

Alors qu'est-ce que nous essayons de protéger? Nous essayons de nous protéger d'un attaquant dans les comptes d'utilisateurs via nos services Web. Spécifiquement, comment pouvons-nous nous protéger d'un attaquant suffisamment motivé à l'ingénieur inverseur de notre application mobile à l'état sauvage?

Deuxième édition: Essayons de reposer le problème.

Comment pourrions-nous concevoir une API de services Web robustes et sécurisés? Il doit être capable de résister à l'observation par un attaquant potentiel. Nous devons être capables de distinguer et de rejeter des messages parasites d'un attaquant potentiel.

Plus précisément, nous voulons:

  • Empêchez notre attaquant d'utiliser notre API de services Web pour exécuter une liste de mots de passe et vous connecter potentiellement à un compte membre. Nous avons d'autres mesures de détection de force brute, mais nous aimerions obtenir directement notre API de cette attaque.

  • Empêchez notre attaquant d'utiliser notre API de services Web pour sonder notre serveur pour d'autres possibilités d'attaque.

16
Edward Barnard

Je pense que je peux aider à résoudre vos préoccupations.

Alors qu'est-ce que nous essayons de protéger? Nous essayons de nous protéger d'un attaquant dans les comptes d'utilisateurs via nos services Web. Spécifiquement, comment pouvons-nous nous protéger d'un attaquant suffisamment motivé à l'ingénieur inverseur de notre application mobile à l'état sauvage?

Vous ne pouvez pas. C'est si simple. Essayer de faire l'impossible est ce qui cause votre préoccupation. Concevez et implémentez votre serveur sous l'hypothèse que le client peut être votre application ou un client malveillant inconnu. Si vous ne pouvez pas sécuriser votre application avec ces hypothèses, vous devrez acheter une application non sécurisée (probablement un mauvais choix) ou avoir uniquement des clients dans des endroits où vous avez un contrôle physique (également probablement un mauvais choix).

Permettez-moi d'aborder certaines de vos déclarations spécifiques:

Je dois assumer que les applications bancaires mobiles ont ceci. Mais ils ne sont pas si susceptibles de partager cette connaissance ici!

Non, c'est faux. Je ne suis pas sûr de savoir qui vous pensez que ces développeurs d'applications Secretive Mobile Banking sont, mais je peux vous assurer que beaucoup sur ce site ont développé des applications bancaires, mobiles ou autrement, et ont contribué à les sécuriser.

Notre attaquant peut exécuter une liste de mots de passe contre nous en parpoffrant la séquence Web de la connexion à l'utilisateur de notre application. Étant donné que notre attaquant est capable d'observer le trafic HTTPS car il quitte l'application, notre attaquant sait construire la demande de service Web et l'authentification.

Absolument raison. L'attaquant peut exécuter une attaque de mot de passe de force brute sur votre serveur. Techniques telles que le verrouillage de compte, délai exponentiel , et [~ # ~ # ~ # ~ # ~] aidera à défendre contre cela.

Nous pouvons crypter les informations de connexion (et autres) avant qu'il ne quitte l'application. Cela devrait empêcher la renonciation et l'entrepoiffage, en supposant que notre attaquant ne possède pas les clés secrètes utilisées dans le cryptage.

Étant donné que le trafic entrant (au serveur) est plus important de protéger, le cryptage clé publique serait une possibilité. Seul le serveur pourrait le déchiffrer.

Trust SSL. Il est bien testé et fonctionne bien. Il n'est pas nécessaire de disposer de cryptage basé sur des applications pour protéger contre une attaque MITM . Je sais que c'est Freaky de connecter un proxy de débogage comme Fiddler et de voir votre trafic supposé crypté dans un texte clair, mais ce n'est pas vraiment un problème de sécurité. Ce sont les données de l'utilisateur, laissez-les le voir s'ils le souhaitent. Et être le serveur a été écrit avec le concept qu'il ne peut jamais savoir quelle application le client est en cours d'exécution, votre protocole devrait pouvoir résister à l'examen par un attaquant potentiel. Notez que vous devez toujours effectuer une validation SSL appropriée pour empêcher une attaque de MITM tiers.

Alors, sautez le cryptage de l'application HMAC et côté client lors de l'utilisation de SSL. Au lieu de cela, écrivez une API robuste et sécurisée. Pas parce que je le dis, mais parce qu'il n'y a pas d'alternative. Votre propre analyse a prouvé cela.

Edit:

Empêchez notre attaquant d'utiliser notre API de services Web pour exécuter une liste de mots de passe et vous connecter potentiellement à un compte membre. Nous avons d'autres mesures de détection de force brute, mais nous aimerions obtenir directement notre API de cette attaque.

J'ai déjà mentionné le verrouillage de compte, bien que le Guide de l'Owasp semble moins favorable sur eux en raison du fait qu'ils peuvent être utilisés dans un DOS. La mentionne de retarder la réponse sur des tentatives écrasées répétées.

Le guide continue à dire:

Bien que des attaques de force brute soient difficiles à arrêter complètement, elles sont faciles à détecter car chaque tentative de connexion échouée enregistre un code d'état HTTP 401 dans vos journaux de serveur Web. Il est important de surveiller vos fichiers journaux des attaques de force brute - en particulier, les 200 codes de statut mêlés que l'attaquant a trouvé un mot de passe valide.

Bien que personne ne souhaite que leurs utilisateurs soient piratés, la reconnaissance et la réaction à une attaque de mot de passe réussie réduiront considérablement le coût de l'attaque. La surveillance peut également vous permettre (temporairement) des adresses IP de verrouillage (temporairement) pour terminer les utilisateurs malveillants (bien qu'une attaque forte viendra probablement de nombreuses adresses IP rendant cela difficile à faire).

L'authentification à deux facteurs réduit l'impact d'un mot de passe volé.

Empêchez notre attaquant d'utiliser notre API de services Web pour sonder notre serveur pour d'autres possibilités d'attaque.

Désolé mais vous ne pouvez pas vraiment faire cela sans sécurité physique. Vous pouvez intégrer des secrets dans votre application, l'obscurez-le, etc. Mais rien de tout cela ne rend vraiment l'application plus sécurisée, cela soulève simplement le coût d'une attaque, car ceux-ci peuvent être conçus en arrière. Donc, que vous mettiez sur ces stratégies ou non, vous devez toujours concevoir votre API comme si un attaquant a accès à vos secrets et à vos codes.

Je suis un grand fan de la fois Sast et Dast . Exécutez des analyses statiques et résolvez toutes les questions hautes/critiques avant chaque déploiement. La même chose pour une analyse dynamique. Les scanners de vulnérabilité peuvent également vérifier votre site pour connaître les vulnérabilités connues et la mauvaise configuration.

26
Neil Smithline

Le certificat Pining est un autre contrôle couramment utilisé contre les attaques de données en transit. La poignée de main TLS ne démarre jamais si le client ne reçoit pas de clé publique dans la liste des broches connues du client (l'application mobile).

J'ai utilisé CERT épingler en tant que compliment au cryptage de la charge de charge. Les éléments suivants deviennent peut-être la norme de base pour les données de l'application mobile sensible? Il ressemble à des tweets et les mises à jour de l'état Facebook utilisent les trois:

  1. Certificat Pinning
  2. Cryptage de charge utile
  3. Tls

Tous ces éléments peuvent être vaincus. Mais n'êtes-nous pas dans un jeu de couches de défense et ralentissez-vous dans l'attaquant?

Vous avez résumé le problème parfaitement; Comment connaissez-vous que l'application mobile est là? Cela pourrait être un outil comme des demandes d'automatisation de facteur ou de patte. Cela défait tout si la clé secrète de cryptage de charge utile est connue.

1
Rusty Magnet