90 votes

Comment puis-je m’assurer que mes fichiers JavaScript livrés sur un CDN ne soient pas modifiées ?

Je suis en train de travailler sur un scénario dans lequel certains fichiers JavaScript sont hébergés sur un CDN. Je veux avoir un mécanisme de sorte que lorsque ces fichiers sont téléchargés sur le côté utilisateur, je peux vous assurer que les fichiers n'ont pas été altérés et sont en effet en train à partir de cette CAN.

Je comprends que la tâche est très facile si je suis en utilisant le protocole SSL, mais encore, je veux m'assurer que les fichiers sont servis, même sur HTTP sans SSL.

Aussi loin que je pouvais de recherche, il n'existe aucun mécanisme comme la signature numérique pour les fichiers JavaScript qui est pris en charge sur les plates-formes. C'est peut-être pas nécessaire?

Est-il une méthode intégrée dans les navigateurs pour vérifier l'auteur des fichiers JavaScript? Est-ce que je peux faire pour le faire de façon sécurisée?

140voto

Timo Points 22864

Comme une question de fait, un tel dispositif est actuellement en cours d'élaboration sous le nom de sous-ressource de l'Intégrité. Regarder dans l' integrity attribut de l' <script> balise. Bien que pas encore complètement adopté à travers le conseil d'administration, il répond juste à cette fin.

integrity

Contient inline métadonnées qu'un agent utilisateur peut utiliser pour vérifier qu'un récupérés ressource a été expédié sans erreur de manipulation. Voir Sous-Ressource De L'Intégrité.

Source

Sous-ressource de l'Intégrité (SRI) est une fonction de sécurité qui permet aux navigateurs pour vérifier que les fichiers qu'ils fetch (par exemple, à partir d'un CDN) sont livrées sans erreur de manipulation. Il fonctionne en vous permettant de fournir un hachage cryptographique qu'un des fichiers récupérés doivent correspondre.

Source


Exemple:

<script src="https://example.com/example-framework.js"
    integrity="sha384-oqVuAfXRKap7fdgcCY5uykM6+R9GqQ8K/uxy9rx7HNQlGYl1kPzQho1wx4JwY8wC"
    crossorigin="anonymous"></script>

Notez toutefois que ce ne sera pas vous protéger contre l'Homme dans le Milieu des attaques si vous transférez vos ressources par l'intermédiaire de la plaine HTTP. Dans ce cas, le code de hachage peut être usurpée par l'attaquant, le rendu de la défense contre manipulé des fichiers de script inutile.

Pour cette raison, vous devriez toujours utiliser secure connexions HTTPS au lieu de HTTP normal en plus des mesures de sécurité décrites ci-dessus.

36voto

Brian Points 3041

Vous recherchez des contrôles d’intégrité subresource .

Par exemple, voici l’extrait de CDN de jQuery :

6voto

Fabio Beltramini Points 1016

Avertissement: Comme toujours, vous ne devez tenir compte de ces mécanismes pour être utiles lors de l'utilisation de https, car ils peuvent facilement être désactivé via MitM avec http

En complément de ce mécanisme dans les réponses ci-dessus, vous pouvez également utiliser le contenu politique de sécurité - têtes de réponse http de la page parent.

http://www.html5rocks.com/en/tutorials/security/content-security-policy/

Contenu de la Politique de Sécurité: script src 'sha256-qznLcsROx4GACP2dm0UCKCzCG-HiZ1guq6ZZDob_Tng='

Il y a quelques choses à noter ici. Le sha*- préfixe indique l'algorithme utilisé pour générer le hachage. Dans l'exemple ci-dessus, sha256 est utilisé. CSP prend également en charge sha384 et sha512-. Lors de la génération de la table de hachage ne comprennent pas les balises. Aussi la capitalisation et les espaces en question, y compris les espaces avant ni après.

À l'aide de Chrome 40 ou plus tard, vous pouvez ouvrir DevTools puis rechargez votre page. L'onglet Console va contenir des messages d'erreur avec le bon de hachage sha256 pour chacun de vos scripts inline.

Ce mécanisme a été autour depuis un certain temps, de sorte que la prise en charge du navigateur est probablement assez bon, juste être sûr de vérifier.

En outre, si vous voulez vous assurer que les anciens non-conformes, les navigateurs ne sont pas en sécurité, vous pouvez inclure un synchrones script de redirection en haut de la page qui n'est pas autorisé par la politique.

3voto

ddyer Points 1546

Il y a un point important sur ce que ce type de signature peut et ne peut pas faire. Il peut protéger l'utilisateur contre des attaques hypothétiques dans lesquelles quelqu'un modifie votre code. Il ne peut pas assurer votre site que votre code est le code en cours d'exécution. En d'autres termes, vous ne pouvez toujours pas faire confiance à tout ce qui provient de votre client sur votre site.

2voto

Eric Towers Points 1875

Si votre adversaire modèle permet à un attaquant de modifier des fichiers JavaScript car ils sont livrés à partir d'un CDN, puis votre adversaire modèle permet à un attaquant de modifier la source de référence qu'il est livré à supprimer toute tentative de vérification, de modifier l'adresse source à l'autre que la CAN, et/ou de supprimer la référence à l'JavaScript entièrement.

Et permet de ne pas ouvrir la boîte de pandore de la façon dont votre application peut déterminer si l'utilisateur du résolveur est ou n'est pas correctement la résolution à la CAN via des requêtes HTTP (ou de tout autre mécanisme qui n'a pas vérifié la chaîne de confiance).

/etc/hosts:

#  ...
1.2.3.4    vile-pirates.org    trustworthy.cdn
#  ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X