Question:
Vous renvoyez volontairement le mauvais code de réponse HTTP?
Miles Luders
2017-02-09 00:25:06 UTC
view on stackexchange narkive permalink

J'écris une API REST simple et je souhaite limiter l'accès à mon client mobile uniquement. En d'autres termes, j'essaie d'empêcher un utilisateur malveillant de par ex. utiliser curl pour faire une requête POST non autorisée.

Bien sûr, c'est impossible. Cependant, il existe certaines contre-mesures qui rendent difficile la réussite d'un pirate informatique. À l'heure actuelle, je crypte toutes les demandes avec une clé privée, stockée côté client (évidemment, ce n'est pas idéal, mais la difficulté de rétro-ingénierie d'une application iOS dissuadera tous les pirates, sauf les plus déterminés).

Une idée simple que j'ai eue est de renvoyer le mauvais code de réponse HTTP pour une requête non autorisée. Plutôt que de renvoyer un "401 Unauthorized", pourquoi ne pas renvoyer par exemple «305 Use Proxy», c'est-à-dire être délibérément déroutant. Quelqu'un a-t-il déjà pensé à faire ça?

C'est ce qu'on appelle «la sécurité par l'obscurité».Cela peut ralentir quelqu'un, mais c'est à peu près tout.
Pour ce que ça vaut, j'ai lu quelque part dans un document officiel sur HTTP (désolé, je ne me souviens pas de la source), que le retour de 404 au lieu de 401 est autorisé afin de ne pas divulguer des informations sur l'existence de ressources à des clients non autorisés.
Les commentaires ne sont pas destinés à une discussion approfondie;cette conversation a été [déplacée vers le chat] (http://chat.stackexchange.com/rooms/53456/discussion-on-question-by-mpl-returning-the-wrong-http-response-code-on-purpose).
Si vous ne renvoyez pas les bons codes d'état HTTP, on peut dire qu'à proprement parler, vous ne parlez pas HTTP.Donc, une fois que vous êtes allé aussi loin, vous pouvez simplement implémenter votre propre protocole complètement différent ...
@Pascal c'est l'approche adoptée par GitHub (au moins) lors d'une tentative d'accès à un référentiel privé lorsqu'il n'est pas authentifié ou non autorisé.
@Pascal Vous pensez utiliser 404 au lieu de 403. [Le standard HTTP] (https://tools.ietf.org/html/rfc7231#section-6.5.3) permet explicitement de ne pas révéler l'existence d'une ressourceà un utilisateur qui n'est pas autorisé à y accéder.Vous pouvez empêcher un 401 de divulguer des informations sur l'existence si vous en avez besoin pour * tous * les emplacements qui correspondent au modèle d'autres emplacements qui nécessitent une authentification.(J'espère que republier ce commentaire est correct; je pense que c'est une information importante.)
Onze réponses:
tim
2017-02-09 00:47:01 UTC
view on stackexchange narkive permalink

Quelqu'un a-t-il déjà pensé à faire cela?

Oui, il y a eu une discussion à ce sujet exactement à la defcon 21 ( vidéo, diapositives).

Leur conclusion est que l'utilisation de codes de réponse en tant que sécurité offensive peut parfois entraîner un ralentissement sévère des scanners automatiques, des scanners qui ne fonctionnent pas et une quantité massive de faux positifs ou faux-négatifs (cela ne fera évidemment que peu ou rien pour les scans manuels).

Alors que la sécurité par l'obscurité ne devrait jamais être votre seule défense, elle peut être bénéfique comme défense en profondeur (autre exemple: il est recommandé de ne pas diffuser les numéros de version de tous les composants utilisés).

D'un autre côté, une API REST doit être aussi propre que possible, et répondre avec des codes HTTP volontairement erronés peut être déroutant pour les développeurs et les clients légitimes (c'est un peu moins un problème pour les navigateurs, où les utilisateurs ne voient pas réellement les codes). Pour cette raison, je ne le recommanderais pas dans votre cas, mais c'est toujours une idée intéressante.

Bien que je reconnaisse la légitimité de la `` sécurité par l'obscurité '' en tant que barrière à l'entrée (c'est-à-dire expulser les script kiddies), je pense qu'elle est si largement surutilisée qu'elle est gravement préjudiciable à la sécurité de l'application réelle.Parmi les deux domaines connexes - la cryptographie et la sécurité de l'information - l'un repose sur «l'obscurité», tandis que l'autre ne le fait pas.Soit dit en passant, celui qui ** fait ** devient plus facile la plupart du temps.De plus, l'obscurité s'applique à toutes les parties (y compris les pentesters que vous payez) et introduit une complexité supplémentaire, des vecteurs d'attaque ergo.
@K.Steff * "la cryptographie repose sur l'obscurité" *?Vouliez-vous écrire "stéganographie"?
@K.Steff Chaque gouvernement qui utilise des algorithmes cryptographiques classifiés utilise la «sécurité par l'obscurité» en cryptographie.
+1 pour la mention des développeurs.Lorsque je modifie un système et que j'obtiens soudainement un 404 alors que j'avais auparavant un 200, j'ai soudainement un jeu de whack-a-mole pour identifier où la décision a été prise d'envoyer une réponse différente.Tout ce que je peux dire à OP, c'est que si vous décidez de le faire, veuillez le documenter correctement ou votre nom deviendra de la boue dans le futur
Je pense que c'est une réponse très pratique.Cela me met en colère quand quelqu'un met la sécurité par l'obscurité parce qu'il lit que c'était mauvais sur un blog ou quelque chose comme ça.Dans le monde réel, cela peut certainement être utile.Cela ne peut tout simplement pas être le seul truc dans votre sac, c'est tout.
@ypercubeᵀᴹ Maintenant que j'ai lu mon commentaire, il semble que je dise que, alors que je voulais dire exactement le contraire - en cryptographie, le principe de Kerckhoff est essentiellement l'opposé idéologique de la «sécurité par l'obscurité».
Xiong Chiamiov
2017-02-09 00:34:55 UTC
view on stackexchange narkive permalink

Cela ne ralentira pas vraiment un attaquant de manière appréciable, mais cela rendra les futurs développeurs travaillant sur votre plate-forme vraiment ennuyés contre vous. Cela peut également empêcher certaines fonctionnalités intéressantes de vos bibliothèques de requêtes HTTP, car elles fonctionnent à partir d'informations incorrectes.

Il s'agit d'une forme très faible de sécurité par l'obscurité. Lors de la conception d'un système comme celui-ci, vous devriez penser à ralentir un attaquant de centaines d'années, pas de dizaines de minutes, sinon vous allez toujours perdre.

Dure, mais juste.Je l'aime :) .Il met en perspective la nature de la faiblesse.
Cette question concerne un scénario où la sécurité par l'obscurité est la seule possibilité.Votre premier paragraphe est bon, mais votre deuxième n'est pas pertinent.
@Nacht en quoi le second n'est-il pas pertinent?C'est très pertinent.Il dit que si vous utilisez la sécurité à travers l'obscurité, il vaut mieux que ce soit une sacrée bonne obscurité.Il dit que cette défense particulière ne ralentira pas du tout les sophistiqués
@Cruncher, non, la sécurité par l'obscurité ne ralentira jamais personne des centaines d'années.Il dit que vous avez besoin d'une sécurité «appropriée», ce qui est impossible avec la conception actuelle du PO.
@Nacht "la sécurité par l'obscurité est la seule possibilité" c'est-à-dire "aucune sécurité n'est la seule possibilité" (alerte hyperbole).Si vous ne pouvez pas sécuriser un système et que vous en avez besoin, ne le mettez pas en œuvre.Il en va de même pour les modèles commerciaux, comme les publicités.
"Lors de la conception d'un système comme celui-ci, vous devriez penser à ralentir un attaquant de centaines d'années, pas de dizaines de minutes - sinon vous allez toujours perdre." Contre un attaquant dévoué, déterminé et compétent?Oui.Mais pour vaincre les programmes d'attaque automatisés ou les attaquants humains à la recherche des cibles les plus faciles et les plus vulnérables à exploiter?Non, ils vont probablement avancer.Et cela, BTW, vous fournira souvent à son tour une meilleure visibilité pour repérer plus de menaces intentionnelles alors qu'elles sont confrontées à la défaite des meilleures mesures de sécurité «réelles» que vous êtes en mesure de déployer.
Je pense que cela dépend VRAIMENT d'hypothèses solides sur l'attaquant.Certes, cela ne ralentira pas un attaquant expérimenté ciblant spécifiquement le site, mais cela peut contrecarrer les tentatives d'analyse automatisée ou ralentir les attaquants qui pourraient finir par être confus par le code de réponse.Donc, cela n'ajoute pas * nécessairement * de sécurité, mais cela peut améliorer les choses.La question est de savoir si cela vaut la peine de mettre en œuvre quelque chose qui pourrait ralentir un attaquant moins déterminé.
@mostltinformed OP a spécifiquement mentionné un utilisateur malveillant utilisant curl ou une autre méthode pour effectuer des requêtes (non autorisées).L'attaquant a déjà procédé à une rétro-ingénierie de l'application iOS pour obtenir une clé nécessaire, entre autres, pour effectuer l'attaque.Il ne sera pas arrêté par un inconvénient mineur concernant les codes de retour.
J.A.K.
2017-02-09 00:45:45 UTC
view on stackexchange narkive permalink

Plutôt que de renvoyer un "401 Unauthorized", pourquoi ne pas renvoyer par exemple «305 Use Proxy», c'est-à-dire être délibérément déroutant.

Oui, cela déroutera un attaquant. Mais pour un entraîneur, cela ne durera peut-être pas plus de deux secondes. Et les codes d'état ne sont pas très utiles, principalement juste pour forcer les noms de fichiers.

Disons que j'ai une clé valide, et je peux vous observer renvoyer des codes de 200 plages pour mon authentification. Si je change un peu ma clé, et pour chaque demande que vous retournez 305s, je penserai immédiatement "Hmm. On dirait que le développeur a peut-être foiré". Si vous renvoyez des codes aléatoires, je saurai que c'était exprès et je les ignorerai simplement.

la difficulté de rétro-ingénierie d'une application iOS dissuadera tous les hackers sauf les plus déterminés

Oui, mais comme il n'en faut qu'un pour le publier, cela ralentit encore une fois.

Il y a longtemps, j'ai écrit un code qui lance une attaque contre quiconque essaie ce genre de chose.J'ai fini par apprendre que ce n'était pas la plus sage des idées.Une demande incorrecte pourrait être beaucoup plus saine -> IP interdite pendant 100 heures au niveau du pare-feu.
Dan Landberg
2017-02-09 00:33:59 UTC
view on stackexchange narkive permalink

C'est la sécurité par l'obscurité, c'est-à-dire qu'elle n'offre pas du tout beaucoup de sécurité. La solution que vous proposez ne fera que ralentir un attaquant, pas l'empêcher d'utiliser son propre client. En fait, votre méthode de cryptage des requêtes, en fonction de votre implémentation, peut en fait rendre votre application moins sécurisée en ouvrant des attaques sur d'autres parties du système cryptographique. Votre effort serait mieux dépensé pour essayer de sécuriser les fonctions de l'API elles-mêmes (c'est-à-dire les tester au stylo et les protéger contre des attaques telles que l'injection SQL), plutôt que d'essayer d'empêcher des clients non autorisés d'y accéder.

Je suis confus cependant.Tout le monde dit que OP a besoin d'une réelle sécurité et PERSONNE n'a encore mentionné comment le faire.Le problème est qu'ils ne veulent pas que le point final soit appelé à moins qu'une annonce ait été regardée.Comment y parviennent-ils?
C'est une question entièrement différente de la question initiale, et aussi toujours difficile.Vous auriez besoin d'un mécanisme côté serveur pour déterminer si l'utilisateur a vraiment et vraiment regardé l'annonce.Peut-être que vous envoyez un jeton signé numériquement qui comprend l'horodatage de la réception de la demande d'annonce et la longueur de l'annonce.Ensuite, ce jeton devra être resoumis et validé lorsque l'utilisateur souhaite demander le point de terminaison protégé.Je rechercherais des solutions DRM.Faire rouler celui-ci par vous-même sans expérience de cryptographie serait difficile à faire en toute sécurité.
Evi1M4chine
2017-02-09 15:58:04 UTC
view on stackexchange narkive permalink

Mais l'utilisateur utilise déjà votre protocole.

Votre problème est que l'interface de votre serveur de ce que l'utilisateur peut faire n'est pas sécurisée!
Vous décidez quelles données votre serveur envoie à qui!
(Bonjour, chers journaux en ligne. Oui, je vous regarde!)

Concevez-le , en supposant que l'utilisateur est le client. Pas votre code. Parce qu'il l'est. Le client utilisé ne devrait pas avoir d'importance.
Votre application s'exécute sur un processeur sous le contrôle matériel de l'utilisateur. Votre code n'est qu'une liste de commandes / données, et l'utilisateur et son processeur peuvent le traiter comme bon lui semble. Y compris ne pas le traiter.
Il décide de ce que fait son CPU. Ne confondez pas sa grâce d'accepter le code de votre application tel quel avec un droit d'exécution aveugle. C'est vous qui avez confiance ici, et cette confiance est très éphémère.
Surtout avec des tactiques sordides comme celle-ci.

Dans tous les cas: vous donnez à l'utilisateur la clé de cryptage et tout, et l'attendez de ne pas l'utiliser lui-même, car vous le mettez quelque part dans votre panier de code. … Tout comme DRM, c'est de l'huile de serpent et cela ne peut jamais fonctionner.
Il suffit de une personne pour trouver où vous mettez la clé. (Ce serait moi, par exemple.) Tout le monde doit simplement chercher sur Google.

Mais je suis surpris que vous ne pensiez qu'à chiffrer le protocole contre l'utilisateur, au lieu de pour sa protection contre les attaques de type "man-in-the-middle".
En supposant la raison pour laquelle cela est généralement fait (Oui, je vous parle à nouveau de "l'industrie du contenu".): Si votre utilisateur est votre ennemi, peut-être vous devriez rechercher un modèle commercial basé sur l'équité et un gagnant-gagnant, au lieu d'arracher l'utilisateur et d'avoir à faire face à des réactions négatives.

PS: Ignorez toutes les réponses «sécurité par l'obscurité». C'est une erreur qui aboutit à un comportement correct mais qui repose toujours sur des hypothèses invalides. L'utiliser comme argument est, au mieux, amateur et pas vraiment compétent.
En réalité, toute sécurité passe par l’obscurité. Certains sont simplement plus obscurs (= mieux déguisés). La vraie raison pour laquelle cela est mauvais, c'est parce que ce que nous appelons la sécurité réelle est un milliard fois plus obscur, ce qui lui donne une obscurité réelle (statistique) fiable, par opposition à très une simple obscurité qui est trop probable pour que quelqu'un vienne de rien.

Point de vue intéressant sur "toute sécurité passe par l'obscurité".Si quelque chose est impossible à craquer dans une vie humaine, n'est-ce pas sécurisé?:)
L '* obscurité * de l'expression * la sécurité par l'obscurité * se réfère spécifiquement à l'obscurité de la conception du système par opposition au matériel clé.C'est une manière de se référer au principe de Kerchov.
Votre affirmation selon laquelle «la sécurité par l'obscurité» n'est pas un concept utile n'est pas vraiment valable.Je suppose que votre argument est qu'avoir, par exemple, une clé secrète est juste une sécurité en gardant la clé obscure.Cependant, si je trouve votre clé secrète, vous pouvez simplement la remplacer par une nouvelle clé, vous remettre en marche et essayer d'être plus prudent avec votre nouvelle clé.Si je découvre votre algorithme secret, vous devez construire un tout nouveau système, ce qui demande beaucoup plus de travail.En outre, vous pouvez donner de bien meilleures limites sur le temps qu'il me faudra pour déterminer votre clé, par rapport au temps qu'il me faudra pour déterminer votre algorithme.
@DavidRicherby Je souhaite voter 100 fois pour ce commentaire.Il n'est pas du tout utile de regrouper toute la sécurité dans le même bac à des degrés différents.Nous avons inventé la terminologie «la sécurité par l'obscurité» pour une * très * bonne raison.
@DavidRicherby: Vous répétez mon argument même comme s'il s'agissait d'un contre-argument.C'est mon point, que toute sécurité ne diffère que par la quantité de travail qu'il faut pour craquer / réparer (aka l'obscurité), et * par conséquent * il n'y a pas de division magique spéciale avec la «sécurité réelle» «non basée sur l'obscurité».
@Evi1M4chine Non, je ne le suis pas.Vous dites que toute sécurité est, en fin de compte, la sécurité en gardant quelque chose d'obscur.Je dis que nous n'utilisons pas l'expression «sécurité par l'obscurité» pour signifier «la sécurité en gardant quelque chose d'obscur».C'est comme prétendre qu'aucun système n'est sécurisé parce que tout peut être piraté par un adversaire suffisamment déterminé et suffisamment puissant et, par conséquent, le mot «sécurité» est inutile car rien n'est vraiment sécurisé.Ce n'est pas ce que le mot «sécurité» est utilisé pour dire, et le mince dont vous parlez n'est pas ce que «sécurité par l'obscurité» signifie.
@Cruncher: Un bon signe quand les gens croient plus fort en quelque chose parce qu’ils y comprennent moins, c’est quand ils utilisent des arguments émotionnels comme «pour une * très * bonne raison», mais ne le soutiennent pas.Si ce n’était pas une croyance, ils indiqueraient simplement cette raison au lieu d’une phase usée.Une chose malheureusement très courante chez les humains.Tout comme la réflexion sur les arguments, l'interprétation sélective, les arguments d'homme de paille, prendre tout comme personnel et insultant, etc.
@Evi1M4chine "Pour une très bonne raison [mais non déclarée]" n'est pas un argument émotionnel.Mais c'est l'argument par l'obscurité.;-)
@DavidRicherby: Êtes-vous en train de me dire ce que * j'ai * dit ??^^ Mec, je suis d’accord avec toi!(Ou plutôt toi avec moi.) Que veux-tu de plus?Se détendre! Et n’interprétez pas des choses que je n’ai pas dites.Je n’ai pas dit que le terme «sécurité» était inutile. Et oui, il n'y a PAS de sécurité à 100%.Déjà.** Ce ne sont que des niveaux ** d'obscurité.Vous pouvez facilement choisir une définition arbitraire de «sécurisé», mais vous partez ensuite dans un pays fantastique.
@Evi1M4chine Non, je ne suis pas d'accord avec vous.Vous avez dit que le concept de sécurité par l'obscurité est "une erreur".J'ai dit que non.C'est un concept extrêmement utile.
P.S .: Ceci est un autre exemple de la raison pour laquelle le texte est un mauvais moyen de conversation humaine.Tous les malentendus.
@DavidRicherby: Et 1. pourquoi faites-vous des arguments contre cela alors, et 2. quand allez-vous commencer à faire des arguments pour le sauvegarder.:) / moi sent le trolling
@Evi1M4chine Pour quelqu'un qui a réprimandé les arguments "émotionnels", vous êtes sûr d'être très émotif.La «très bonne» raison était en fait plus un appel à l'autorité que tout autre chose.Rien d'émotionnel à ce sujet.Je ne vous ai même pas répondu directement.Je renforçais simplement l'argument de David.Nous ne sommes pas dans un débat ici.Le fait que mon argument soit incomplet ne signifie pas qu'il est invalide ou infondé.
Tom
2017-02-09 15:46:02 UTC
view on stackexchange narkive permalink

Comme d'autres l'ont déjà expliqué, la sécurité par l'obscurité ralentit au mieux un attaquant.

Dans votre cas particulier, je dirais que cela n'aura aucun effet appréciable. Pour arriver à ce stade, votre attaquant devait déjà procéder à une ingénierie inverse de votre application et extraire la clé privée. Cela signifie que votre agresseur n'est pas un idiot et sait ce qu'il fait. Un peu d'obscurité lui coûtera moins de temps qu'il n'en faut pour l'implémenter.

Eh bien, techniquement, il s'agit d'essayer de CACHER le fait qu'ils ont besoin d'obtenir la clé privée de l'application.Autrement dit, cela se produit en premier. Cependant, toute personne capable d'obtenir la clé de l'application ne sera pas du tout retenue par cela.
Tout attaquant non idiot observerait d'abord le trafic légitime et verrait immédiatement que les requêtes sont chiffrées.Ce serait littéralement la première chose qu'il remarque.
user2320464
2017-02-10 00:56:46 UTC
view on stackexchange narkive permalink

Comme d'autres l'ont déjà mentionné, vous proposez d'utiliser Security by Obscurity. Bien que cette technique ait son objectif, tenez compte des éléments suivants avant de choisir cette approche:

  • Fournir un support technique pour votre API. L'utilisation de codes de réponse HTTP trompeurs empêche quiconque d'autre que vous de fournir une assistance. Ils doivent se demander si la situation particulière envoie réellement le code de réponse approprié ou si elle envoie un code obscur. Si vous décidez de rester le seul contact pour toute demande d'assistance, cela ne devrait pas être un problème.
  • Qu'est-ce qu'un "utilisateur malveillant"? Soyez prudent lorsque vous catégorisez une demande comme malveillante car elle peut avoir des effets indésirables. Supposons qu'une adresse IP envoie du trafic malveillant et que des contre-mesures soient utilisées. Supposons maintenant que la même adresse IP soit en fait un proxy avec des centaines ou des milliers d'utilisateurs derrière. Vous avez maintenant appliqué votre contre-mesure à tous. Ce même principe peut être appliqué pour identifier les activités malveillantes dans les en-têtes et / ou le corps.
  • Le code d'application est le plus lent. La requête doit parcourir toute la pile pour finalement accéder à la logique de «sécurité». Cette architecture ne s'adapte pas bien et est lente. Les demandes incorrectes doivent être arrêtées le plus tôt possible, ce qui est la condition préalable à l'utilisation des pare-feu d'application Web (WAF).
  • Extension de l'accès. Si votre API devient accessible à plus de clients que celle pour laquelle elle a été conçue à l'origine, ces nouveaux clients devront être conscients de l'utilisation possible de codes de réponse HTTP trompeurs.
  • Utilisateurs malveillants persistants. Comme d'autres l'ont mentionné, cette technique n'est qu'un ralentisseur.

Meilleure approche

Concentrez votre temps sur la liste blanche de toutes les bonnes demandes connues. C'est tellement plus facile que d'essayer d'identifier toutes les mauvaises demandes potentielles. Tout ce qui n'apparaît pas sur la liste blanche devrait immédiatement obtenir un code de réponse approprié tel que HTTP 400 ou HTTP 405 si vous filtrez sur des verbes HTTP (à titre d'exemples). De préférence, cela se produit avant que la demande n'atteigne le code de votre application.

En plus des demandes autorisées pour les listes blanches, assurez-vous que votre application est sécurisée conformément aux Directives OWASP. Vous obtiendrez de bien meilleurs résultats en passant votre temps avec OWASP, puis vous essaierez de déterminer ce qu'est un utilisateur malveillant et de renvoyer un code de réponse HTTP obscur.

rosuav
2017-02-10 14:28:14 UTC
view on stackexchange narkive permalink

Fondamentalement, vous NE POUVEZ PAS empêcher des clients non autorisés d'envoyer des demandes. La chose la plus proche possible serait de faire effectuer une sorte de vérification cryptographique chez le client, mais comme Sherlock Holmes l'a dit, "ce que l'on peut inventer, un autre peut le découvrir". (Je le sais avec certitude, car j'ai piraté la sécurité côté client des gens à plusieurs reprises.)

Au lieu de cela, construisez votre API de telle sorte que quiconque soit autorisé à l'utiliser en utilisant des clients personnalisés. Rendez-le convivial. Que perdez-vous par cela? Les attaquants attaqueront quoi que vous fassiez, et si vous rendez votre API facile à utiliser, quelqu'un proposera quelque chose auquel vous n'avez jamais pensé et rendra votre serveur encore plus grand que vous ne l'auriez jamais imaginé. Que pourrait faire un client qui parle à la fois à votre API et à une autre? Quelles sont les myriades de possibilités et est-ce que cela vous fera vraiment mal de les autoriser?

netikras
2017-02-13 13:28:24 UTC
view on stackexchange narkive permalink

Je ne ferais pas ça. Cela signifie généralement que vous créez votre propre standard, ce qui fait que:

  1. votre API est prédictive après avoir fait une carte de vos réponses http avec leur signification réelle. Changer les réponses HTTP pourrait fonctionner sur certains "hackers" qui abandonneraient après quelques tentatives, mais ce ne sera pas le cas pour d'autres, plus déterminés. Voulez-vous protéger votre API uniquement contre l'ancien type, c'est-à-dire les 11 ans? Je ne pense pas.

  2. une certaine confusion pour les développeurs et probablement les testeurs, en particulier ceux qui sont habitués à fonctionner selon les normes mondiales.

  3. Choisissez une autre manière. Il y en a certainement quelques-uns. Je me bats moi-même avec le même headscratcher depuis quelques semaines et j'ai trouvé au moins 2 moyens plus ou moins fiables pour obtenir les restrictions souhaitées [je ne peux pas les publier ici].

  4. ol >

    Il existe certainement des moyens meilleurs et BEAUCOUP plus efficaces pour obtenir ce que vous voulez. Essayez de regarder votre API sous un angle différent ... Si vous étiez un hacker et que votre vie dépendait du piratage de cette API, que feriez-vous pour réussir? Que devrait-il arriver pour que vous soyez frustré dans vos tentatives de le briser?

james
2017-02-13 05:07:28 UTC
view on stackexchange narkive permalink

Une bonne raison pour ne pas le faire, en particulier pour une application mobile, est qu'il est très probable que votre application communique déjà avec votre serveur via plusieurs proxys, par exemple dans la compagnie de téléphone. La plupart des grandes entreprises utilisent des proxys sur leur réseau pour essayer de protéger leurs systèmes contre le contenu malveillant, et de nombreuses compagnies de téléphone réduisent la qualité des vidéos ou des images en transit. Cela rendra également inutile l'utilisation des différentes bibliothèques système pour HTTP sur votre plate-forme. Une approche couramment utilisée consiste à dériver une clé ou un jeton d'informations que l'utilisateur est peu susceptible de vouloir partager, comme le hachage de son adresse nom et des détails de sa carte de crédit. De cette façon, même si votre application est piratée, les gens hésiteront à donner les informations requises à un programme aléatoire qu'ils ont téléchargé, ce qui limite la capacité de partage de toute attaque éprouvée.

Jon Hanna
2017-02-13 07:57:07 UTC
view on stackexchange narkive permalink

En général, ce n'est pas une bonne idée.

J'en ai fait une utilisation très ciblée une fois avec succès lorsque le site Web d'un client était utilisé par un réseau de blanchiment de cartes de crédit volé. Il y avait des caractéristiques d'identification partagées uniquement par les transactions frauduleuses, donc plutôt que de les refuser poliment, je demanderais au site de retarder la réponse de quelques minutes (personne n'aime un site Web qui prend quelques minutes pour faire quelque chose), puis de renvoyer un 500 avec celui du site. Message standard "désolé, ce n'est pas vous, c'est moi" pour les erreurs de serveur (il a également enregistré des détails à transmettre aux forces de l'ordre). Nous avons eu trois tentatives de transactions qui ont obtenu cette réponse d'opposum et nous n'avons plus jamais entendu parler d'eux.

Mais c'était:

  1. En réponse à quelque chose que nous savions être une attaque plutôt que d'être désagréable pour les utilisateurs ayant un problème.
  2. Pas une défense contre une attaque contre la sécurité du protocole lui-même, mais au niveau humain au-dessus de cela.
  3. Explicable par d'autres explications , c'est-à-dire que nous faisions semblant d'avoir un site Web vraiment nul dans une situation où cela était plausible (il y a beaucoup de sites Web nulles là-bas) et nous n'étions pas une cible spécifique (les perps passeraient à quelqu'un d'autre).

Les utilisateurs ayant un problème devraient être aidés et non abusés. «Je ne peux pas faire ça parce que vous n'êtes pas correctement autorisé» refuse de faire quelque chose de manière utile. "Je ne peux pas faire ça parce que vous devez utiliser un proxy" quand quelqu'un n'a pas besoin d'utiliser un proxy est abusif. Être délibérément inutile n'est approprié que lorsque vous savez que vous êtes attaqué et que cela ne devrait pas ressembler à un message manifestement faux ou que vous n'avez rien caché (vous avez potentiellement révélé quelque chose si le même statut faux n'est pas utilisé pour chaque erreur client).

Cela dit, il est approprié de prendre des mesures pour que les statuts ne fuient pas d'informations. Par exemple. il est acceptable (décrit comme tel dans les normes) pour / admin / à 404 alors que ce serait 200 dans un autre cas (utilisateur autorisé, adresses IP client autorisées, etc.) Alternativement si / members / mon-profil sera de 200 pour un utilisateur autorisé et 403 ou 401 sinon, alors si / members / fdsasafdasfwefaxc ferait 404 pour un utilisateur autorisé, c'est une bonne idée pour 403 ou 401 pour l'utilisateur non autorisé. Il ne s’agit pas tant de la sécurité par l’obscurité que de considérer quels URI se rapportent aux ressources comme l’un des éléments d’information protégés.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...