nodejs / nodejs/node

SRI should be checked before Unicode conversion

Ouverte
#39,707 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

never-stale policy security
Langage dominant
JavaScript
Étoiles
122k
Forks
37.3k
Merge moyen
4 j 2 h
PR mergées (30 j)
283

Description

Version

v16.6.1

Platform

Any

Subsystem

policy

What steps will reproduce the bug?
  1. Create a file index.js such that its contents change after Unicode processing. For example, use

    $ xxd -groupsize 1 index.js 
    00000000: 2f 2f 20 c0 af 0a 0a                             // ....
    
  2. Compute the SRI value, e.g., using OpenSSL:

    $ echo "sha384-$(cat index.js | openssl dgst -sha384 -binary | openssl base64 -A)"
    sha384-Z8NoAR4bc95cOnD/QrsnPsgs5pmETQ3ke3NpAVI0Ve08aqCW6aaHFRNVrhcsBCua
    
  3. Test the SRI value in a browser:

    <script src="index.js" integrity="sha384-Z8NoAR4bc95cOnD/QrsnPsgs5pmETQ3ke3NpAVI0Ve08aqCW6aaHFRNVrhcsBCua"></script>
    
  4. Create policy.json:

    {
      "resources": {
        "./index.js": {
          "integrity": "sha384-Z8NoAR4bc95cOnD/QrsnPsgs5pmETQ3ke3NpAVI0Ve08aqCW6aaHFRNVrhcsBCua"
        }
      }
    }
    
  5. Run the script with the policy file:

    node --experimental-policy=policy.json index.js
    
How often does it reproduce? Is there a required condition?

Always.

What is the expected behavior?

No output, unless index.js contains code. In the example above, index.js contains a comment only.

This behavior can be observed in Chrome and Firefox.

What do you see instead?
Error [ERR_MANIFEST_ASSERT_INTEGRITY]: The content of "file:///home/tniessen/dev/policy-test/index.js" does not match the expected integrity. Integrities found are: sha384-s+/FLC70SKA4cOtWba1RQAhBoGcQoMRXt/kU5mp0oDnO+hQVqm5/zQkIaG26qVa0
Additional information

It seems unlikely that this could cause any real security issues, but it does allow hash collisions. Different byte sequences can result in the same Unicode character sequences, which, when hashed, result in the same digests.

The issue arises from the fact that Node.js loads a byte sequence from the resource, converts the byte sequence to a Unicode string, and then converts the string back to a byte sequence for the SRI check.

Refs: https://github.com/nodejs/node/pull/37248

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par les fichiers de reproduction index.js et policy.json, puis exécutez la commande documentée node --experimental-policy=policy.json index.js pour observer l’échec d’intégrité. Examinez la gestion des policies et de SRI par Node, en utilisant la PR liée comme contexte. C’est terminé lorsque le index.js fourni, qui ne contient que des commentaires, réussit la vérification d’intégrité qui lui est déclarée sans produire de sortie, tandis que le code réel reste couvert par la validation d’intégrité.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
javascript
Domaine
security
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
42/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.