Protéger contre l'extension du navigateur code Javascript injecté

Les navigateurs permettent aux extensions d'injecter du code, de manipuler le DOM, etc.

Au fil des ans, j'ai remarqué beaucoup et diverses erreurs non interceptées (en utilisant window.onerror) sur un site web (application) que je regarde, généré par des extensions de navigateur inconnues sur Firefox, Chrome et Internet Explorer (toutes les versions).

Ces erreurs ne semblaient pas interrompre quoi que ce soit. Maintenant, je veux augmenter la sécurité de ce site web, car il va commencer à traiter les cartes de crédit. J'ai vu de mes propres eyes malware / spyware infectant les navigateurs avec des extensions de navigateur modifiées (extension de navigateur innocente, modifiée pour signaler aux attaquants / script kiddies) travaillant comme enregistreurs de frappe (en utilisant des gestionnaires d'événements OnKey* triviaux, ou simplement en entrée.la valeur des contrôles).

Y a - t-il un moyen (balise meta, etc.) pour informer un navigateur pour interdire l'injection de code ou la lecture du DOM, standard ou non standard? la page web est déjà SSL, mais cela ne semble pas avoir d'importance (comme dans donner un indice au navigateur pour l'activer sécurité plus stricte pour les extensions).

.

Possible solutions de contournement (sorte d'étirement par rapport à une simple balise meta) suggérée par d'autres ou du haut de ma tête:

  • clavier virtuel pour entrer des nombres + entrées non textuelles (aka img pour les chiffres)
  • remote desktop utilisant Flash (quelqu'un a suggéré HTML5, mais cela ne résout pas l'extension du navigateur écoutant sur les événements de clavier; seulement Flash, Java, etc. peut).
  • très complexe basé sur Javascript protection (supprime les écouteurs d'événements non listés en blanc, les valeurs d'entrée en mémoire ainsi que les entrées protégées par des caractères Astérix réels, etc.) (impossible, sauf si elle existe déjà)
  • extension de navigateur avec le rôle d'un antivirus ou qui pourrait en quelque sorte protéger une page Web spécifique (ce n'est pas faisable, peut-être même pas possible sans créer un énorme éventail de problèmes)

Edit : Google Chrome désactive les extensions en mode navigation privée, cependant, il n'y a pas de manière standard pour détecter ou activer automatiquement le mode de navigation privée et donc un avertissement permanent doit être affiché.

29
demandé sur Tiberiu-Ionuț Stan 2012-09-19 16:11:28

6 réponses

Ce n'est pas une solution complète, mais vous pouvez contourner la journalisation des clés en utilisant une invite javascript. J'ai écrit un petit cas de test (qui a fini par devenir un peu incontrôlable). Ce cas de test fait ce qui suit:

  • utilise une invite () pour demander le numéro de carte de crédit sur focus.
  • fournit une sécurité intégrée lorsque les utilisateurs cochent "empêcher les boîtes de dialogue supplémentaires" ou si l'utilisateur est en mesure de taper dans le champ CC
  • vérifie périodiquement pour s'assurer que les gestionnaires d'événements n'ont pas été supprimés ou usurpés et rebinds / avertit l'utilisateur si nécessaire.

Http://jsfiddle.net/ryanwheale/wQTtf/

Testé dans IE7+, Chrome, FF 3.6+, Android 2.3.5, iPad 2 (iOS 6.0)

5
répondu Ryan Wheale 2012-09-28 10:39:50

Être capable de désactiver l'extension du navigateur de quelqu'un implique généralement de prendre le contrôle du navigateur. Je ne pense pas que c'est possible. Ce serait un énorme risque pour la sécurité. Votre but peut-être légitime, mais considérez le scénario de webmasters désactivant par programme addblockers pour les utilisateurs afin de les amener à voir les publicités.

En fin de compte, c'est la responsabilité de l'utilisateur de s'assurer qu'il a un système d'exploitation propre lors des transactions bancaires en ligne. Ce n'est pas la faute du site Web que l'utilisateur est compromis

Mettre à jour On devrait boucler les choses. Quelque chose comme:

<meta name="disable-extension-feature" content="read-dom" />

Ou

<script type="text/javascript">
    Browser.MakeExtension.MallwareLogger.to.not.read.that.user.types(true);
</script>

N'existe pas et je suis sûr qu'il ne sera pas implémenté dans un proche avenir. Utilisez tous les moyens nécessaires pour utiliser au mieux les technologies actuelles et actuelles et concevoir votre application du mieux que vous pouvez en matière de sécurité. Ne gaspillez pas votre énergie à essayer de couvrir les utilisateurs qui n'effectuent pas de paiements sur internet en premier lieu

13
répondu Vlad Balmos 2012-09-19 13:17:23

Votre question est intéressante, et réfléchie (+1'D), mais malheureusement la sécurité proposée ne fournit pas de sécurité réelle, donc aucun navigateur ne l'implémentera jamais.

L'un des principes de base sur la sécurité du navigateur/web/réseau est de résister à la volonté d'implémenter une fausse fonctionnalité de sécurité. Web sera moins sécurisé avec la fonctionnalité que sans!

Écoutez-moi:

Tout ce qui est exécuté côté client peut être manipulé. Les navigateurs sont juste un autre HTTP les clients qui parlent au serveur; le serveur ne doit jamais faire confiance au résultat du calcul ou aux vérifications effectuées en JavaScript frontal. Si quelqu'un peut simplement contourner votre code de vérification "sécurité" exécuté dans un navigateur avec une extension, il peut sûrement déclencher la requête HTTP directement sur votre serveur avec curl pour le faire. Au moins, dans un navigateur, les utilisateurs qualifiés peuvent se tourner vers Firebug ou Web Inspector et contourner votre script, tout comme ce que vous faites lorsque vous déboguez votre site web.

La balise <meta> s'arrête les extensions d'injection rendent le site Web plus robuste, mais pas plus sécurisé. Il y a mille façons d'écrire JavaScript robuste que de prier pour ne pas avoir une extension maléfique. Masquez vos fonctions/objets globaux en étant l'un d'entre eux, et effectuez un contrôle de santé mentale de l'environnement en étant un autre. GMail vérifie Firebug, par exemple. De nombreux sites Web détecte le blocage des annonces.

La balise <meta> a du sens en termes de confidentialité (encore une fois, Pas sécurité). Il devrait y avoir un moyen de dire au navigateur que les informations actuellement présentes dans le DOM sont sensibles (par exemple mon solde bancaire) et ne doivent pas être exposées à des tiers. Pourtant, si un utilisateur utilise le système D'exploitation de vender a, le navigateur de vender B, l'extension de vender C Sans lire son code source pour savoir exactement ce qu'ils font, l'Utilisateur a déjà déclaré sa confiance à ces vendeurs. Votre site web ne sera pas en faute. Les utilisateurs qui se soucient vraiment de la vie privée se tourneront vers leur système d'exploitation et leur navigateur de confiance, et en utiliseront un autre profil ou mode privé du navigateur pour vérifier leurs informations sensibles.

Conclusion: Si vous effectuez toutes les vérifications d'entrée du côté serveur (encore une fois), votre site web est suffisamment sécurisé pour qu'aucune balise <meta> ne le rende plus sécurisé. À la bonne heure!

2
répondu timdream 2012-09-26 09:19:36

Cela ne fonctionnera pas, mais je vais essayer quelque chose autour du document.createElement = fonction(){}; Cela devrait affecter les scripts côté client (greasemonkey)

Vous pouvez également essayer de soumettre le DOM actuel en utilisant une entrée masquée myform.onsubmit=function(){myform.hiddeninput.value=document.body.innerHTML;} et vérifiez côté serveur pour les éléments DOM indésirables. Je suppose que l'utilisation d'un id/jeton généré côté serveur sur chaque élément peut aider ici (car le nœud DOM injecté va sûrement le manquer)

= > la page devrait ressembler à

<html uniqueid="121234"> <body uniqueid="121234"><form  uniqueid="121234"> ...

Donc trouver des éléments non suivis dans L'action POST devrait être facile (en utilisant xpath par exemple)

<?php
simplexml_load_string($_POST['currentdom'])->xpath("*:not(@uniqueid)") //style

Quelque chose autour de cela pour le problème D'injection DOM.

En ce qui concerne la partie keylogging, Je ne pense pas que vous puissiez faire quoi que ce soit pour empêcher keylogger du point de vue du client (sauf en utilisant le clavier virtuel et so), car il n'y a aucun moyen de les discerner à partir des internes du navigateur. Si vous êtes paranoïaque, vous devriez essayer un design généré par 100% canvas (imitant L'élément HTML et l'interaction) car cela pourrait vous protéger (PAS de DOM élément à lier), mais cela signifierait créer un navigateur dans un navigateur.

2
répondu 131 2012-09-26 20:04:46

J'ai vu quelque chose de similaire se fait à plusieurs reprises, bien que la protection a été dirigée dans l'autre sens: un certain nombre de sites, quand ils offrent des informations sensibles sous forme de texte utiliseraient un widget Flash pour afficher le texte (par exemple, les adresses e-mail, qui serait autrement trouvé par les bots et spammé).

L'applet Flash peut être configurée pour rejeter tout code provenant de la page HTML, en fait, à moins que vous ne vous attendiez spécifiquement à ce que cela soit possible, cela ne fonctionnera pas boîte. Flash n'envoie pas non plus d'événements au navigateur, donc si le keylogger fonctionne au niveau du navigateur, il ne pourra pas enregistrer les touches enfoncées. Certes, Flash a ses propres inconvénients, mais compte tenu de toutes les autres options, cela semble le plus faisable. Donc, vous n'avez pas besoin de bureau à distance via Flash, simple applet intégré sera tout aussi bon. En outre, Flash seul ne peut pas être utilisé pour faire un client de bureau à distance entièrement fonctionnel, vous chercheriez NaCl ou JavaFX, ce qui rendrait cela uniquement utilisable par les utilisateurs d'entreprise et seulement éventuellement par les utilisateurs privés.

Autres choses à considérer: écrivez votre propre extension. Faire l'extension Firefox est vraiment facile + vous pouvez réutiliser beaucoup de votre code JavaScript car il peut également utiliser JavaScript. Je n'ai jamais écrit une extension Google Chrome ou MSIE, mais j'imagine que ce n'est pas beaucoup plus difficile. Mais vous n'avez pas besoin de le transformer en une extension antivirus. Avec les outils disponibles, vous pouvez le faire pour qu'aucune autre extension ne puisse écouter ce qui se passe à l'intérieur de votre propre extension. Je ne suis pas sûr à quel point votre public accueillera cela, mais si vous ciblez le secteur des entreprises, alors ce public est, d'une certaine manière, très bon, car ils ne peuvent pas choisir leurs outils... donc, vous pouvez simplement les obliger à utiliser l'extension.

D'autres idées? - Eh bien, celui-ci est Très simple et efficace: demandez aux utilisateurs d'ouvrir une fenêtre pop-up / onglet séparé et de désactiver JavaScript:) je veux dire, vous pourriez refuser d'accepter une carte de crédit info si le JavaScript est activé dans le navigateur - évidemment, il est très facile de vérifier. Cela nécessiterait un effort mental des utilisateurs pour trouver le paramètre, où ils peuvent le désactiver + ils feront rage sur une fenêtre pop-up... mais presque certainement cela désactivera toute l'injection de code:)

1
répondu 2012-09-22 00:45:21

Et juste que nous savons tous que nous ne pouvons pas bloquer explicitement les extensions de notre code, une autre façon peut être de trouver la liste des écouteurs d'événements attachés à des champs clés comme mot de passe, ssn et aussi des événements sur le corps comme keypress, keyup, keydown et vérifier si l'écouteur appartient à votre code, sinon simplement lancer un message flash pour désactiver les addons.

Et vous pouvez attacher des événements de mutation à votre page et voir s'il y a de nouveaux nœuds créés / générés par un tiers à part à partir de votre code.

Ok il est évident que vous aurez des problèmes de performance, mais c'est un compromis pour votre sécurité.

Des preneurs ?

1
répondu Chandra Sekhar Walajapet 2012-09-28 05:27:08