
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).
| 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' को लूप के अंदर अपनी ही प्रॉपर्टी के साथ अपडेट किया गया है। |
मुझे नहीं पता कि पहला और दूसरा एक ही स्थान की ओर क्यों इंगित करते हैं, जबकि 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
}