nodejs / nodejs/node

SRI should be checked before Unicode conversion

Offen
#39,707 1 Kommentar 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

never-stale policy security
Vorherrschende Sprache
JavaScript
Sterne
122k
Forks
37.3k
Ø Merge
4 T. 2 Std.
Gemergte PRs (30 T.)
283

Beschreibung

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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne mit den Reproduktionsdateien index.js und policy.json und führe dann den dokumentierten Befehl node --experimental-policy=policy.json index.js aus, um den Integritätsfehler zu beobachten. Sieh dir die Policy- und SRI-Behandlung von Node an und verwende den verlinkten PR als Kontext. Als erledigt gilt die Aufgabe, wenn das bereitgestellte, nur Kommentare enthaltende index.js seine deklarierte Integritätsprüfung besteht, ohne eine Ausgabe zu erzeugen, während tatsächlicher Code weiterhin durch die Integritätsvalidierung abgedeckt ist.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
javascript
Bereich
security
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.