{ "schema_version": 1, "selection_date": "2026-09-12", "selection_basis": "PMPro optimization plus NodeGoat documented eval injection; Ghost independent production Node module/async reserve. No scanner results used for new selection.", "capability_prerequisites": { "php/wordpress/injection": [ "Independent untouched PHP/WordPress vulnerable/fixed/benign population missing." ], "python/flask/injection": [ "Independent untouched Python/Flask paired changes missing." ], "python/flask/access_control": [ "Independent untouched Python/Flask paired changes missing." ], "javascript/express/injection": [ "Ghost supported-family pair review missing; NodeGoat is inspected teaching data." ], "c/libpng/memory_safety": [ "Unsupported abstract domain; envelope cannot earn detection admission." ] }, "snapshots": [ { "id": "pmpro-vulnerable", "recipe": "../repos/pmpro.toml", "files": [ { "path": "license.txt", "size": 1039, "sha256": "98424ae7dd8610cd5e3a29dd2775347552444e4793653823bc74c010d39265ff" }, { "path": "classes/class.memberorder.php", "size": 55918, "sha256": "3d32b8414eb9a6bfe8962aafa8ab2caf826d2816811caf51d299db3398f54c26" }, { "path": "includes/rest-api.php", "size": 36224, "sha256": "f52c146967d1d154b65dc5fb289ee831a7a0d31d7a9bba4876f40eee903624b0" } ] }, { "id": "pmpro-fixed", "recipe": "../repos/pmpro.toml", "files": [ { "path": "license.txt", "size": 1039, "sha256": "98424ae7dd8610cd5e3a29dd2775347552444e4793653823bc74c010d39265ff" }, { "path": "classes/class.memberorder.php", "size": 56202, "sha256": "6877bdc6f9322fe990be8aedfd1778718fc3e06b67c96eff47be16824eb9b312" }, { "path": "includes/rest-api.php", "size": 36224, "sha256": "f52c146967d1d154b65dc5fb289ee831a7a0d31d7a9bba4876f40eee903624b0" } ], "commit": "2f65530f9442b4d7ccfb56821836b056217358c1" }, { "id": "pmpro-benign", "recipe": "../repos/pmpro.toml", "files": [ { "path": "license.txt", "size": 1039, "sha256": "98424ae7dd8610cd5e3a29dd2775347552444e4793653823bc74c010d39265ff" }, { "path": "classes/class.memberorder.php", "original_sha256": "3d32b8414eb9a6bfe8962aafa8ab2caf826d2816811caf51d299db3398f54c26", "edit": { "before": "function getMemberOrderByCode($code)", "after": "/* Load an order by its external code. */\n\t\tfunction getMemberOrderByCode($code)", "provenance": "authored comment-only change; existing SQL injection remains" }, "size": 55962, "sha256": "457cfa61eddb5d339502143ab59fd93db93d577a1557f6552081c6a6fc2ebf8b" }, { "path": "includes/rest-api.php", "size": 36224, "sha256": "f52c146967d1d154b65dc5fb289ee831a7a0d31d7a9bba4876f40eee903624b0" } ] }, { "id": "nodegoat-vulnerable", "recipe": "../repos/nodegoat.toml", "files": [ { "path": "LICENSE", "size": 10273, "sha256": "73ba74dfaa520b49a401b5d21459a8523a146f3b7518a833eea5efa85130bf68" }, { "path": "package.json", "size": 1979, "sha256": "138377cf0f19b955d6ba043e49c24fb5eec4041a789fea5134e1fecda620c829" }, { "path": "app/routes/index.js", "size": 3149, "sha256": "3ab970b2888bc1501515db24a83cc7851ac9c09d00948c652300401515185eb5" }, { "path": "app/routes/contributions.js", "size": 2485, "sha256": "196bdeaa22da4cfe8a851b1b932710b2fcedd21f14ed75d70b739ba759a01003" }, { "path": "app/data/contributions-dao.js", "size": 2791, "sha256": "363065e8b3c32f0997ce2dcb17341eb3e40b7f43b00b72c576dfebf73f551c85" } ] }, { "id": "nodegoat-fixed", "recipe": "../repos/nodegoat.toml", "files": [ { "path": "LICENSE", "size": 10273, "sha256": "73ba74dfaa520b49a401b5d21459a8523a146f3b7518a833eea5efa85130bf68" }, { "path": "package.json", "size": 1979, "sha256": "138377cf0f19b955d6ba043e49c24fb5eec4041a789fea5134e1fecda620c829" }, { "path": "app/routes/index.js", "size": 3149, "sha256": "3ab970b2888bc1501515db24a83cc7851ac9c09d00948c652300401515185eb5" }, { "path": "app/routes/contributions.js", "original_sha256": "196bdeaa22da4cfe8a851b1b932710b2fcedd21f14ed75d70b739ba759a01003", "edit": { "before": "const preTax = eval(req.body.preTax);\n const afterTax = eval(req.body.afterTax);\n const roth = eval(req.body.roth);", "after": "const preTax = Number(req.body.preTax);\n const afterTax = Number(req.body.afterTax);\n const roth = Number(req.body.roth);", "provenance": "authored numeric conversion repair removes evaluation of JavaScript; not an upstream CVE fix" }, "size": 2491, "sha256": "9dc0a0bc147adc4c76c27faae75f316dd537ddaf4fb35fa693002450bd4b4e92" }, { "path": "app/data/contributions-dao.js", "size": 2791, "sha256": "363065e8b3c32f0997ce2dcb17341eb3e40b7f43b00b72c576dfebf73f551c85" } ] }, { "id": "nodegoat-benign", "recipe": "../repos/nodegoat.toml", "files": [ { "path": "LICENSE", "size": 10273, "sha256": "73ba74dfaa520b49a401b5d21459a8523a146f3b7518a833eea5efa85130bf68" }, { "path": "package.json", "size": 1979, "sha256": "138377cf0f19b955d6ba043e49c24fb5eec4041a789fea5134e1fecda620c829" }, { "path": "app/routes/index.js", "size": 3149, "sha256": "3ab970b2888bc1501515db24a83cc7851ac9c09d00948c652300401515185eb5" }, { "path": "app/routes/contributions.js", "original_sha256": "196bdeaa22da4cfe8a851b1b932710b2fcedd21f14ed75d70b739ba759a01003", "edit": { "before": "//validate contributions", "after": "// Validate contribution percentages.", "provenance": "authored comment-only change; existing eval injection remains" }, "size": 2498, "sha256": "66b97183be80e55fa3d690d2fc7103aabddb4e10ef9db439c22bce6c7651bcc4" }, { "path": "app/data/contributions-dao.js", "size": 2791, "sha256": "363065e8b3c32f0997ce2dcb17341eb3e40b7f43b00b72c576dfebf73f551c85" } ] }, { "id": "vampi-regression", "recipe": "../repos/vampi.toml", "files": [ { "path": "LICENSE", "size": 1063, "sha256": "e3e05b9d17e397de650aa7a9a9784cf076ba8bf566efebe88a0e24ecb2d2b92a" }, { "path": "models/user_model.py", "size": 3642, "sha256": "4ce47b9850812e47140b2d2f2e20c08ae4b5338d168ce72f23e3127986ef6e1b" }, { "path": "api_views/users.py", "size": 9257, "sha256": "46006eb7207ebbae163f5320b13e3bf0ec464cef201a51fb2cd43b5cfdb4116c" }, { "path": "api_views/books.py", "size": 3043, "sha256": "78e2eb77d655573f03b7a4d0bca73dc27383b0c5ec7882a5aa8608caa52828e8" }, { "path": "app.py", "size": 536, "sha256": "ad26b12cfbdaab311bea86942f5ebd368dca331a0f4cdba803393739baadf42e" } ] }, { "id": "libpng-envelope", "recipe": "../repos/libpng.toml", "files": [ { "path": "LICENSE", "size": 5345, "sha256": "16d9daaafbf63a31a5bdc91d4600972548fef5aaa1244202393288dbd079c49a" }, { "path": "pngread.c", "size": 141758, "sha256": "c12022962f04abe1f7156753315bf68091398711025450803d0506dcefda3552" } ] }, { "id": "ghost-reserved", "recipe": "ghost-reserved.toml", "files": [ { "path": "LICENSE", "size": 1065, "sha256": "56df280a26071c1e84578abcb1e7dce02502d27816bce1184617e93ee5b086bf" }, { "path": "ghost/core/package.json", "size": 12646, "sha256": "f63492ad63f64ecf0c3648f57e196b904af1d79855d296ec3db659aae8cd5701" }, { "path": "ghost/core/core/server/api/endpoints/posts.js", "size": 8008, "sha256": "f51acc472f2fb217acd99a3bd378f6b6117d19f4c50233c58cf22538f3ea864f" } ] } ], "cases": [ { "id": "pmpro-introduce", "base": "pmpro-fixed", "tip": "pmpro-vulnerable", "label": "vulnerable", "role": "development", "capability": "php/wordpress/injection", "provenance": "Authored replay direction reintroducing the reviewed operation; not a claim about the historical introducing commit.", "prerequisites": [] }, { "id": "pmpro-repair", "base": "pmpro-vulnerable", "tip": "pmpro-fixed", "label": "fixed", "role": "development", "capability": "php/wordpress/injection", "provenance": "PMPro upstream2.9.7 to2.9.8 parameter binding fix for CVE-2023-23488.", "prerequisites": [] }, { "id": "pmpro-benign", "base": "pmpro-vulnerable", "tip": "pmpro-benign", "label": "benign", "role": "development", "capability": "php/wordpress/injection", "provenance": "Authored comment-only change: no new defect; vulnerable backlog remains. This label does not mean repository-clean.", "prerequisites": [] }, { "id": "nodegoat-introduce", "base": "nodegoat-fixed", "tip": "nodegoat-vulnerable", "label": "vulnerable", "role": "transfer", "capability": "javascript/express/injection", "provenance": "Authored replay direction reintroducing the reviewed operation; not a claim about the historical introducing commit.", "prerequisites": [] }, { "id": "nodegoat-repair", "base": "nodegoat-vulnerable", "tip": "nodegoat-fixed", "label": "fixed", "role": "transfer", "capability": "javascript/express/injection", "provenance": "Authored replacement of three eval calls with Number conversion; source tutorial also documents alternate numeric parsing.", "prerequisites": [] }, { "id": "nodegoat-benign", "base": "nodegoat-vulnerable", "tip": "nodegoat-benign", "label": "benign", "role": "transfer", "capability": "javascript/express/injection", "provenance": "Authored comment-only change: no new defect; vulnerable backlog remains. This label does not mean repository-clean.", "prerequisites": [] }, { "id": "VAmPI-SQLI", "base": "vampi-regression", "tip": "vampi-regression", "label": "regression", "role": "regression", "capability": "python/flask/injection", "provenance": "Existing recipe known target, full target population retained; environment vulnerable=1. Snapshot regression, not an introducing push.", "prerequisites": [ "Reviewed independent vulnerable/fixed/benign push pair required before hook admission." ] }, { "id": "VAmPI-BOLA", "base": "vampi-regression", "tip": "vampi-regression", "label": "regression", "role": "regression", "capability": "python/flask/access_control", "provenance": "Existing recipe known target, full target population retained; environment vulnerable=1. Snapshot regression, not an introducing push.", "prerequisites": [ "Reviewed independent vulnerable/fixed/benign push pair required before hook admission." ] }, { "id": "VAmPI-BOLA-BOOKS", "base": "vampi-regression", "tip": "vampi-regression", "label": "regression", "role": "regression", "capability": "python/flask/access_control", "provenance": "Existing recipe known target, full target population retained; environment vulnerable=1. Snapshot regression, not an introducing push.", "prerequisites": [ "Reviewed independent vulnerable/fixed/benign push pair required before hook admission." ] }, { "id": "libpng-CVE-2025-66293", "base": "libpng-envelope", "tip": "libpng-envelope", "label": "unsupported", "role": "envelope", "capability": "c/libpng/memory_safety", "provenance": "Arithmetic/bounds is outside the current abstract domain; measures graph/cost envelope only.", "prerequisites": [] }, { "id": "ghost-reserved-population", "base": "ghost-reserved", "tip": "ghost-reserved", "label": "unreviewed", "role": "reserved_holdout", "capability": "javascript/express/unreviewed", "provenance": "Reserved from production API/module/async shape and public security-fix history before scanner results. Manifest6.64.0-rc.0, Express4.22.2. Not an ESM or Express5 coverage claim.", "prerequisites": [ "Review and freeze supported positive/fixed/benign changes from independent history; select family before scanning.", "Freeze core and existing facts after development; preserve reservation and record any contamination." ] } ] }