
React Server Components में CVE-2025-55182 प्रोटोटाइप प्रदूषण भेद्यता का CodeQL-आधारित विश्लेषण, शोषण POC और असुरक्षित संपत्ति ट्रैवर्सल के लिए स्थैतिक पहचान प्रश्नों के साथ।
बिल्ड और चलाएं:
docker compose build
docker compose run --rm --entrypoint 'npm install' node
docker compose run --rm --entrypoint 'npm run build' node
docker compose up
POC (https://github.com/msanft/CVE-2025-55182 से):
node poc.js
अनबंडल के साथ प्रयोग:
yarn --immutable
node --conditions react-server app.js
facebook/react को क्लोन करें और अनबंडल बनाएं:
yarn --immutable
yarn cross-env RELEASE_CHANNEL=experimental node ./scripts/rollup/build.js react-server-dom-webpack/ --type=NODE_DEV
cp ./build/node_modules/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js \
codeql/${version}/
CodeQL तैयार करें:
codeql database create db -l javascript -s codeql
cd queries && codeql pack install
codeql query run ./queries/PrototypeTraversal.ql -d db
Promise.resolve(userData) खोजने के लिए एक क्वेरी जोड़ें
await non-native-promise खोजने के लिए एक क्वेरी जोड़ें
await का उपयोग किसी विधि पर कर सकता है जो (कभी-कभी) कच्चा डेटा लौटाता हैइसने getOutlinedModel में पैच किए गए उपयोग को पकड़ा (hasOwnProperty.call जोड़ा गया) और createModelResolver में हटाए गए उपयोग को (अब fulfillReference).
मुझे नहीं पता कि पहला और दूसरा एक ही स्थान की ओर क्यों इंगित करते हैं, जबकि vuln.js में निकाला गया ऐसा नहीं करता।
codeql/tests.js में ये तीन प्रकार हैं:
var value = {};
for (let i = 0; i < path.length; i++) {
value = value[path[i]] // VarAccess
}
var value = {};
for (let i = 0; i < path.length; i++) {
let c = value[path[i]] // VarDecl
value = c
}
var value = {};
for (let i = 0; i < path.length; i++) {
let c
c = value[path[i]] // use VarRef
value = c
}
| filename | source | sink |
|---|
| ./19.2.0/react-server-dom-webpack-server.node.unbundled.development.js | parentObject[reference[key]] | parentObject[reference[key]] | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'parentObject' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./19.2.0/react-server-dom-webpack-server.node.unbundled.development.js | parentObject[reference[key]] | parentObject[reference[key]] | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'parentObject' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./19.2.0/react-server-dom-webpack-server.node.unbundled.development.js | value[path[i]] | value[path[i]] | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'value' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./tests.js | value[path[i]] | c | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'value' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./tests.js | value[path[i]] | c | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'value' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./tests.js | value[path[i]] | value[path[i]] | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'value' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./vuln.js | parentObject[reference[key]] | parentObject[reference[key]] | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'parentObject' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
| ./vuln.js | value[path[i]] | value[path[i]] | असुरक्षित प्रोटोटाइप ट्रैवर्सल: चर 'value' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |