ビルドして実行:
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
unbundled での実験:
yarn --immutable
node --conditions react-server app.js
facebook/react をクローンして unbundled を作成:
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)を検出しました。
| ファイル名 | ソース | シンク | |
|---|---|---|---|
| ./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' はループ内で自身のプロパティによって更新されます。 |
最初と2番目が同じ場所を指すのに、vuln.js に抽出したものがそうならない理由はわかりません。
codeql/tests.js には次の3つのバリアントがあります:
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
}