
tough-cookie v2.5.0 corretto che risolve la vulnerabilità di prototype pollution CVE-2023-26136 con Object.create(null) in MemoryCookieStore, inclusa la dimostrazione dell'exploit e test unitari.
Questo repository contiene una versione patchata del pacchetto tough-cookie, versione 2.5.0, per risolvere la critica vulnerabilità Prototype Pollution (CVE-2023-26136). La vulnerabilità consente agli attaccanti di manipolare la catena dei prototipi iniettando proprietà negli oggetti JavaScript. Ciò può portare a comportamenti inattesi, rischi per la sicurezza come l'esecuzione remota di codice e problemi di compatibilità nelle applicazioni che si affidano a questo pacchetto.
Le versioni del pacchetto tough-cookie precedenti alla v4.1.3 sono vulnerabili alla Prototype Pollution quando si utilizza CookieJar con la modalità rejectPublicSuffixes=false. La vulnerabilità deriva da una gestione impropria dei cookie, in particolare quando cookie.domain viene impostato su . Ciò consente agli attaccanti di modificare l'oggetto principale , causando potenzialmente problemi diffusi in tutta l'applicazione.
__proto__Object.prototypePer maggiori dettagli sulla CVE-2023-26136, consulta:
La prototype pollution può introdurre diversi rischi critici, tra cui:
Vulnerabilità di sicurezza: Modificando l'Object.prototype di base, gli attaccanti possono manipolare il comportamento degli oggetti, potenzialmente aumentando i privilegi, accedendo a dati sensibili o aggirando i meccanismi di sicurezza nell'applicazione.
Denial of Service (DoS): L'inquinamento della catena dei prototipi può causare comportamenti imprevisti nel sistema, portando a crash, loop infiniti o esaurimento delle risorse, rendendo l'applicazione non disponibile per gli utenti legittimi.
Problemi di compatibilità: La modifica dell'Object.prototype può causare errori e comportamenti imprevisti nell'interazione con altre librerie o framework. Le dipendenze che si basano sulle catene dei prototipi potrebbero rompersi, portando a problemi di integrazione o a comportamenti errati dell'applicazione durante gli aggiornamenti.
Comportamento imprevisto dell'applicazione: La prototype pollution può portare a comportamenti irregolari del programma, inclusa la corruzione dei dati, violazioni della sicurezza e la potenziale esposizione dell'applicazione a ulteriori exploit.
La patch consiste nel modificare la classe MemoryCookieStore, in particolare il metodo putCookie, per prevenire la prototype pollution creando oggetti privi di prototipo. Le modifiche principali includono:
Object.create(null) invece di {} per creare oggetti senza prototipo.cookie.domain = __proto__.Per installare la versione patchata di tough-cookie, usa il seguente comando:
npm install ./tough-cookie-2.5.0-PATCHED.tgz
Questo repository include un test unitario progettato per verificare che la vulnerabilità di prototype pollution sia stata risolta con successo.
Il test, denominato prototype_pollution_test, verifica in particolare che l'impostazione di cookie con dominio __proto__ non influenzi più la catena dei prototipi JavaScript. Ciò garantisce che la prototype pollution sia prevenuta, mantenendo l'integrità dell'applicazione.
Per eseguire i test e confermare la correzione, esegui il seguente comando:
npm test
Per dimostrare l'exploit sia nella versione originale che in quella patchata, segui i passaggi seguenti:
Installa la versione vulnerabile di tough-cookie:
npm install [email protected] && node index.js
Output previsto:
Polluted object: {
Slonser: Cookie="Slonser=polluted; Domain=__proto__; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms",
Auth: Cookie="Auth=Lol; Domain=google.com; Path=/notauth; hostOnly=false; aAge=5ms; cAge=5ms"
} EXPLOITED SUCCESSFULLY
Questo indica che il prototipo di un oggetto è stato inquinato, confermando che la vulnerabilità è presente nella versione originale.
npm install ./tough-cookie-2.5.0-PATCHED.tgz && node index.js
Output previsto:
EXPLOIT FAILED
Questo mostra che l'exploit è stato bloccato con successo, confermando che la vulnerabilità di prototype pollution è stata corretta.
Il processo di risoluzione della vulnerabilità Prototype Pollution in tough-cookie v2.5.0 ha coinvolto diversi passaggi metodici per garantire che la correzione fosse completa ed efficace. Di seguito una panoramica dell'approccio che ho seguito:
Ho iniziato ricercando la Prototype Pollution (CVE-2023-26136) per comprenderne l'impatto. La vulnerabilità consente agli attaccanti di iniettare proprietà nella catena dei prototipi tramite la proprietà cookie.domain, causando potenzialmente rischi per la sicurezza come l'esecuzione remota di codice.
Ho esplorato le issue e le discussioni GitHub sulla vulnerabilità, inclusa la correzione in tough-cookie v4.1.3, che utilizza Object.create(null) per prevenire la prototype pollution. Questo mi ha aiutato a identificare le modifiche necessarie per correggere la v2.5.0.
Ho confrontato la v2.5.0 con la v4.1.3 per comprendere le differenze e individuare le modifiche necessarie. La modifica chiave consisteva nell'utilizzare oggetti privi di prototipo per prevenire lo sfruttamento.
Ho aggiornato la classe MemoryCookieStore per utilizzare Object.create(null) invece di {}, assicurando che non ci sia prototype pollution.
Ho scritto test unitari per verificare la correzione e ho creato uno script di dimostrazione dell'exploit (index.js) per mostrare come la vulnerabilità viene prevenuta nella versione patchata.
Infine, ho documentato la correzione, includendo le istruzioni di installazione e test, e ho creato il pacchetto della versione patchata (tough-cookie-2.5.0-PATCHED.tgz) per una facile distribuzione.
File aggiunti/modificati rispetto alla v2.5.0
index.js: Script principale per dimostrare la vulnerabilità e la correzione.lib/memstore.js: La classe MemoryCookieStore modificata per prevenire la prototype pollution.test/ietf_data/parser.json: Aggiornato per correggere le date obsolete nei dati di test.test/prototype_pollution_test.js: Test unitari per verificare che la prototype pollution sia corretta.tough-cookie-2.5.0-PATCHED.tgz: La versione patchata del pacchetto tough-cookie.