Overview
Undici est un client HTTP/1.1 haute performance écrit pour Node.js qui peut être utilisé à la place de la bibliothèque native. Une partie du standard Fetch indique que les en-têtes de requête interdits, tels que les cookies, ne doivent jamais être transmis au site cible lors d'une redirection. Les versions d'undici antérieures à la 5.26.2 n'ont pas réussi à le faire. (Notez que pour Node 16, ce problème ne se pose que lorsque l'option --experimental-fetch est utilisée).
Cette vulnérabilité peut être combinée avec l'exploit Open Redirect dans lequel un attaquant fait rediriger un serveur vers un site qu'il contrôle. Si des données sensibles, telles que des jetons d'autorisation, sont contenues dans le cookie, le site de destination (qui peut être contrôlé par l'attaquant) reçoit les données sensibles.
Ce problème affecte les versions d'undici inférieures à 5.26.2.
Détails
Informations sur le module
Paquets concernés : unidici
Versions concernées : >5.26.2
Dépôt :https://github.com/nodejs/undici
Paquets publiés : unici
Gestionnaire de paquets : npm
Informations sur les vulnérabilités
Cette vulnérabilité de faible gravité est présente dans undici dans les versions inférieures à 5.26.2.
undici peut être importée indépendamment et est également incluse dans la distribution de Node.js. En général, il est préférable de mettre à jour Node.js vers une version qui inclut la version corrigée de la bibliothèque plutôt que d'essayer de mettre à jour uniquement la bibliothèque undici.
Étapes de la reproduction
- Importer une version vulnérable d'undici ou mettre en place une instance d'une version de Node.js qui contient une version vulnérable d'undici.
- Utilisez le code ci-dessous, qui provient du test pour cette vulnérabilité qui est inclus dans la correction :
'use strict'
const { test } = require('tap')
const { createServer } = require('http')
const { once } = require('events')
const { fetch } = require('../..')
test('Cross-origin redirects clear forbidden headers', async (t) => {
t.plan(5)
const server1 = createServer((req, res) => {
t.equal(req.headers.cookie, undefined)
t.equal(req.headers.authorization, undefined)
res.end('redirected')
}).listen(0)
const server2 = createServer((req, res) => {
t.equal(req.headers.authorization, 'test')
t.equal(req.headers.cookie, 'ddd=dddd')
res.writeHead(302, {
...req.headers,
Location: `http://localhost:${server1.address().port}`
})
res.end()
}).listen(0)
t.teardown(() => {
server1.close()
server2.close()
})
await Promise.all([
once(server1, 'listening'),
once(server2, 'listening')
])
const res = await fetch(`http://localhost:${server2.address().port}`, {
headers: {
Authorization: 'test',
Cookie: 'ddd=dddd'
}
})
const text = await res.text()
t.equal(text, 'redirected')
})
- Notez que les lignes ci-dessous affirment que les en-têtes spécifiques ne sont pas définis :
t.equal(req.headers.cookie, non défini)
t.equal(req.headers.authorization, non défini)
- Sur un système vulnérable, ces assertions échoueront car Server1 recevra les en-têtes Authorization et Cookie.
Il n'existe pas de solution de contournement.
Atténuation
undici est une bibliothèque populaire qui a été ajoutée dans Node 16 (en plus de la bibliothèque HTTP native). Tous les utilisateurs qui utilisent la version expérimentale de fetch doivent mettre à jour immédiatement.
Ressources complémentaires
- Entrée du NIST
https://nvd.nist.gov/vuln/detail/CVE-2023-45143 - https://github.com/advisories/GHSA-wqq4-5wpv-mx2g
Soyez alerté chaque fois qu'une nouvelle vulnérabilité est corrigée dans les logiciels open source que nous soutenons.