@clear-capabilities/agentic-security-scanner 0.76.1 → 0.78.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin/.agentic-security/findings.json +320 -9
- package/bin/.agentic-security/last-scan.json +320 -9
- package/bin/.agentic-security/last-scan.json.sig +1 -1
- package/bin/.agentic-security/scan-history.json +17 -377
- package/bin/.agentic-security/streak.json +11 -16
- package/bin/agentic-security.js +33 -2
- package/dist/178.index.js +1 -1
- package/dist/384.index.js +1 -1
- package/dist/637.index.js +1 -1
- package/dist/718.index.js +106 -0
- package/dist/824.index.js +126 -0
- package/dist/838.index.js +1 -1
- package/dist/agentic-security.mjs +32 -32
- package/dist/agentic-security.mjs.sha256 +1 -1
- package/package.json +7 -7
- package/src/.agentic-security/findings.json +5731 -3933
- package/src/.agentic-security/last-scan.json +5731 -3933
- package/src/.agentic-security/last-scan.json.sig +1 -1
- package/src/.agentic-security/scan-history.json +2533 -887
- package/src/.agentic-security/streak.json +11 -16
- package/src/dataflow/.agentic-security/findings.json +52 -24
- package/src/dataflow/.agentic-security/last-scan.json +52 -24
- package/src/dataflow/.agentic-security/last-scan.json.sig +1 -1
- package/src/dataflow/.agentic-security/scan-history.json +101 -134
- package/src/dataflow/.agentic-security/streak.json +8 -10
- package/src/dataflow/async-sequencing.js +16 -7
- package/src/dataflow/builtin-summaries.js +131 -0
- package/src/dataflow/catalog.js +107 -0
- package/src/dataflow/cross-repo.js +75 -1
- package/src/dataflow/engine.js +129 -0
- package/src/dataflow/implicit-flow.js +24 -6
- package/src/dataflow/stub-aware-filter.js +69 -11
- package/src/dataflow/summaries.js +28 -3
- package/src/engine-parallel.js +70 -0
- package/src/engine.js +165 -15
- package/src/ir/.agentic-security/findings.json +757 -16
- package/src/ir/.agentic-security/last-scan.json +757 -16
- package/src/ir/.agentic-security/last-scan.json.sig +1 -1
- package/src/ir/.agentic-security/scan-history.json +545 -138
- package/src/ir/.agentic-security/streak.json +11 -13
- package/src/ir/index.js +22 -1
- package/src/ir/parser-go.js +403 -0
- package/src/ir/parser-js.js +2 -0
- package/src/ir/parser-php.js +330 -0
- package/src/ir/parser-py.helper.py +137 -11
- package/src/ir/parser-rb.js +309 -0
- package/src/posture/.agentic-security/findings.json +407 -84
- package/src/posture/.agentic-security/last-scan.json +407 -84
- package/src/posture/.agentic-security/last-scan.json.sig +1 -1
- package/src/posture/.agentic-security/scan-history.json +16 -4923
- package/src/posture/.agentic-security/streak.json +10 -14
- package/src/posture/calibration.js +14 -0
- package/src/posture/triage.js +13 -0
- package/src/report/.agentic-security/findings.json +6 -5
- package/src/report/.agentic-security/last-scan.json +6 -5
- package/src/report/.agentic-security/last-scan.json.sig +1 -1
- package/src/report/.agentic-security/scan-history.json +3 -300
- package/src/report/.agentic-security/streak.json +7 -8
- package/src/report/index.js +23 -2
- package/src/sast/.agentic-security/findings.json +195 -56
- package/src/sast/.agentic-security/last-scan.json +195 -56
- package/src/sast/.agentic-security/last-scan.json.sig +1 -1
- package/src/sast/.agentic-security/scan-history.json +14 -394
- package/src/sast/.agentic-security/streak.json +10 -13
- package/src/sast/cache-poisoning.js +77 -0
- package/src/sast/comparison-safety.js +73 -0
- package/src/sast/db-taint.js +54 -0
- package/src/sast/graphql.js +127 -0
- package/src/sast/llm-stored-prompt.js +57 -0
- package/src/sast/mutation-xss.js +43 -0
- package/src/sast/nosql-injection.js +5 -0
- package/src/sast/null-byte-injection.js +76 -0
- package/src/sast/redos-nfa.js +338 -0
- package/src/sast/sensitive-data-logging.js +73 -0
- package/src/sast/weak-password-hash.js +77 -0
- package/src/sast/weak-randomness.js +100 -0
- package/src/sca/.agentic-security/findings.json +502 -11
- package/src/sca/.agentic-security/last-scan.json +502 -11
- package/src/sca/.agentic-security/last-scan.json.sig +1 -1
- package/src/sca/.agentic-security/scan-history.json +19 -1
- package/src/sca/.agentic-security/streak.json +6 -6
- package/src/sca/llm-function-extract.js +107 -0
- package/src/sca/vendor-detect.js +91 -0
- package/dist/218.index.js +0 -793
- package/dist/601.index.js +0 -1038
- package/dist/634.index.js +0 -1892
- package/src/integrations/.agentic-security/findings.json +0 -1504
- package/src/integrations/.agentic-security/last-scan.json +0 -1504
- package/src/integrations/.agentic-security/scan-history.json +0 -40
- package/src/integrations/.agentic-security/streak.json +0 -21
- package/src/llm-validator/.agentic-security/findings.json +0 -1891
- package/src/llm-validator/.agentic-security/last-scan.json +0 -1891
- package/src/llm-validator/.agentic-security/last-scan.json.sig +0 -1
- package/src/llm-validator/.agentic-security/scan-history.json +0 -168
- package/src/llm-validator/.agentic-security/streak.json +0 -20
- package/src/lsp/.agentic-security/findings.json +0 -28
- package/src/lsp/.agentic-security/last-scan.json +0 -28
- package/src/lsp/.agentic-security/scan-history.json +0 -79
- package/src/lsp/.agentic-security/streak.json +0 -22
- package/src/mcp/.agentic-security/findings.json +0 -8403
- package/src/mcp/.agentic-security/last-scan.json +0 -8403
- package/src/mcp/.agentic-security/last-scan.json.sig +0 -1
- package/src/mcp/.agentic-security/scan-history.json +0 -1182
- package/src/mcp/.agentic-security/streak.json +0 -22
- package/src/sast/bench-shape/.agentic-security/findings.json +0 -28
- package/src/sast/bench-shape/.agentic-security/last-scan.json +0 -28
- package/src/sast/bench-shape/.agentic-security/scan-history.json +0 -24
- package/src/sast/bench-shape/.agentic-security/streak.json +0 -22
|
@@ -1,26 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
-
"firstScanDate": "2026-05-
|
|
3
|
-
"lastScanDate": "2026-05-
|
|
4
|
-
"totalScans":
|
|
2
|
+
"firstScanDate": "2026-05-27T01:13:03.739Z",
|
|
3
|
+
"lastScanDate": "2026-05-27T13:31:16.009Z",
|
|
4
|
+
"totalScans": 31,
|
|
5
5
|
"daysCleanCritical": 0,
|
|
6
|
-
"lastCleanDate":
|
|
7
|
-
"lastCriticalDate": "2026-05-
|
|
6
|
+
"lastCleanDate": null,
|
|
7
|
+
"lastCriticalDate": "2026-05-27",
|
|
8
8
|
"hasEverHadCritical": true,
|
|
9
|
-
"bestDaysCleanCritical":
|
|
10
|
-
"totalFindingsAtFirstScan":
|
|
11
|
-
"totalFindingsAtLastScan":
|
|
12
|
-
"totalFixesInferred":
|
|
9
|
+
"bestDaysCleanCritical": 0,
|
|
10
|
+
"totalFindingsAtFirstScan": 412,
|
|
11
|
+
"totalFindingsAtLastScan": 414,
|
|
12
|
+
"totalFixesInferred": 0,
|
|
13
13
|
"lastGrade": "C",
|
|
14
|
-
"bestGrade": "
|
|
14
|
+
"bestGrade": "C",
|
|
15
15
|
"launchCheckPassedAt": null,
|
|
16
16
|
"achievements": [
|
|
17
|
-
"clean-sweep",
|
|
18
|
-
"first-fix",
|
|
19
17
|
"first-scan",
|
|
20
|
-
"scan-veteran-
|
|
21
|
-
"scan-veteran-25",
|
|
22
|
-
"triage-master",
|
|
23
|
-
"triage-silver"
|
|
18
|
+
"scan-veteran-25"
|
|
24
19
|
],
|
|
25
20
|
"previousGrade": "C"
|
|
26
21
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"scanId": "
|
|
3
|
-
"startedAt": "2026-05-
|
|
4
|
-
"durationMs":
|
|
2
|
+
"scanId": "e19aeff8-8736-4df3-9d8d-a4d227edb6b1",
|
|
3
|
+
"startedAt": "2026-05-27T09:30:01.863Z",
|
|
4
|
+
"durationMs": 501,
|
|
5
5
|
"scanned": {
|
|
6
|
-
"files":
|
|
6
|
+
"files": 28,
|
|
7
7
|
"lines": 0
|
|
8
8
|
},
|
|
9
9
|
"findings": [
|
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"unvalidated": true,
|
|
117
117
|
"cross_language": false,
|
|
118
118
|
"family": "dos-sync-io",
|
|
119
|
+
"parser": "STRUCTURAL",
|
|
119
120
|
"_unsigned": false,
|
|
120
121
|
"_passThroughSigning": false,
|
|
121
122
|
"signatureStatus": "verified",
|
|
@@ -344,6 +345,7 @@
|
|
|
344
345
|
"unvalidated": true,
|
|
345
346
|
"cross_language": false,
|
|
346
347
|
"family": "dos-sync-io",
|
|
348
|
+
"parser": "STRUCTURAL",
|
|
347
349
|
"_unsigned": false,
|
|
348
350
|
"_passThroughSigning": false,
|
|
349
351
|
"signatureStatus": "verified",
|
|
@@ -572,6 +574,7 @@
|
|
|
572
574
|
"unvalidated": true,
|
|
573
575
|
"cross_language": false,
|
|
574
576
|
"family": "dos-sync-io",
|
|
577
|
+
"parser": "STRUCTURAL",
|
|
575
578
|
"_unsigned": false,
|
|
576
579
|
"_passThroughSigning": false,
|
|
577
580
|
"signatureStatus": "verified",
|
|
@@ -800,6 +803,7 @@
|
|
|
800
803
|
"unvalidated": true,
|
|
801
804
|
"cross_language": false,
|
|
802
805
|
"family": "dos-sync-io",
|
|
806
|
+
"parser": "STRUCTURAL",
|
|
803
807
|
"_unsigned": false,
|
|
804
808
|
"_passThroughSigning": false,
|
|
805
809
|
"signatureStatus": "verified",
|
|
@@ -1028,6 +1032,7 @@
|
|
|
1028
1032
|
"unvalidated": true,
|
|
1029
1033
|
"cross_language": false,
|
|
1030
1034
|
"family": "dos-sync-io",
|
|
1035
|
+
"parser": "STRUCTURAL",
|
|
1031
1036
|
"_unsigned": false,
|
|
1032
1037
|
"_passThroughSigning": false,
|
|
1033
1038
|
"signatureStatus": "verified",
|
|
@@ -1256,6 +1261,7 @@
|
|
|
1256
1261
|
"unvalidated": true,
|
|
1257
1262
|
"cross_language": false,
|
|
1258
1263
|
"family": "dos-sync-io",
|
|
1264
|
+
"parser": "STRUCTURAL",
|
|
1259
1265
|
"_unsigned": false,
|
|
1260
1266
|
"_passThroughSigning": false,
|
|
1261
1267
|
"signatureStatus": "verified",
|
|
@@ -1484,6 +1490,7 @@
|
|
|
1484
1490
|
"unvalidated": true,
|
|
1485
1491
|
"cross_language": false,
|
|
1486
1492
|
"family": "dos-sync-io",
|
|
1493
|
+
"parser": "STRUCTURAL",
|
|
1487
1494
|
"_unsigned": false,
|
|
1488
1495
|
"_passThroughSigning": false,
|
|
1489
1496
|
"signatureStatus": "verified",
|
|
@@ -1712,6 +1719,7 @@
|
|
|
1712
1719
|
"unvalidated": true,
|
|
1713
1720
|
"cross_language": false,
|
|
1714
1721
|
"family": "dos-sync-io",
|
|
1722
|
+
"parser": "STRUCTURAL",
|
|
1715
1723
|
"_unsigned": false,
|
|
1716
1724
|
"_passThroughSigning": false,
|
|
1717
1725
|
"signatureStatus": "verified",
|
|
@@ -1940,6 +1948,7 @@
|
|
|
1940
1948
|
"unvalidated": true,
|
|
1941
1949
|
"cross_language": false,
|
|
1942
1950
|
"family": "dos-sync-io",
|
|
1951
|
+
"parser": "STRUCTURAL",
|
|
1943
1952
|
"_unsigned": false,
|
|
1944
1953
|
"_passThroughSigning": false,
|
|
1945
1954
|
"signatureStatus": "verified",
|
|
@@ -2060,7 +2069,7 @@
|
|
|
2060
2069
|
"attackPlaybook": null
|
|
2061
2070
|
},
|
|
2062
2071
|
{
|
|
2063
|
-
"id": "ssrf-meta-hardcoded:catalog.js:
|
|
2072
|
+
"id": "ssrf-meta-hardcoded:catalog.js:538",
|
|
2064
2073
|
"kind": "sast",
|
|
2065
2074
|
"severity": "medium",
|
|
2066
2075
|
"vuln": "SSRF: explicit reference to cloud instance-metadata endpoint",
|
|
@@ -2068,7 +2077,7 @@
|
|
|
2068
2077
|
"owaspLlm": null,
|
|
2069
2078
|
"stride": "Information Disclosure",
|
|
2070
2079
|
"file": "catalog.js",
|
|
2071
|
-
"line":
|
|
2080
|
+
"line": 538,
|
|
2072
2081
|
"snippet": "remediation: 'Resolve the host first, reject 169.254.169.254 / RFC1918 / localhost; or proxy through a server-side allow-list.' } },",
|
|
2073
2082
|
"fix": null,
|
|
2074
2083
|
"reachable": false,
|
|
@@ -2149,7 +2158,7 @@
|
|
|
2149
2158
|
"dominantDriver": "legal counsel",
|
|
2150
2159
|
"comparable": "Capital One 2019 SSRF → $190M settlement (100M records, $1.90/rec)",
|
|
2151
2160
|
"confidence": "low",
|
|
2152
|
-
"narrative": "SSRF: explicit reference to cloud instance-metadata endpoint on `catalog.js:
|
|
2161
|
+
"narrative": "SSRF: explicit reference to cloud instance-metadata endpoint on `catalog.js:538` could expose production credentials and API keys. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $24k · likely $138k · worst $778k. Dominant driver: legal counsel. Comparable: Capital One 2019 SSRF → $190M settlement (100M records, $1.90/rec)."
|
|
2153
2162
|
},
|
|
2154
2163
|
"stableId": "3dfe482b8d5e3a09",
|
|
2155
2164
|
"confidenceTier": "medium",
|
|
@@ -2166,15 +2175,16 @@
|
|
|
2166
2175
|
"unvalidated": true,
|
|
2167
2176
|
"cross_language": false,
|
|
2168
2177
|
"family": "ssrf",
|
|
2178
|
+
"parser": "SSRF-METADATA",
|
|
2169
2179
|
"_unsigned": false,
|
|
2170
2180
|
"_passThroughSigning": false,
|
|
2171
2181
|
"signatureStatus": "verified",
|
|
2172
2182
|
"regression_test": {
|
|
2173
2183
|
"lang": "node",
|
|
2174
|
-
"framework":
|
|
2175
|
-
"filename":
|
|
2176
|
-
"runHint":
|
|
2177
|
-
"code":
|
|
2184
|
+
"framework": null,
|
|
2185
|
+
"filename": null,
|
|
2186
|
+
"runHint": null,
|
|
2187
|
+
"code": null
|
|
2178
2188
|
},
|
|
2179
2189
|
"poc": {
|
|
2180
2190
|
"lang": "node",
|
|
@@ -2182,7 +2192,10 @@
|
|
|
2182
2192
|
"cwe": "CWE-918",
|
|
2183
2193
|
"family": "ssrf",
|
|
2184
2194
|
"runHint": "node poc.mjs",
|
|
2185
|
-
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n"
|
|
2195
|
+
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n",
|
|
2196
|
+
"paramKey": null,
|
|
2197
|
+
"paramKeyConfidence": "low",
|
|
2198
|
+
"paramKeyInferred": false
|
|
2186
2199
|
},
|
|
2187
2200
|
"calibrated_confidence": null,
|
|
2188
2201
|
"calibrated_confidence_ci": null,
|
|
@@ -2409,15 +2422,16 @@
|
|
|
2409
2422
|
"unvalidated": true,
|
|
2410
2423
|
"cross_language": false,
|
|
2411
2424
|
"family": "ssrf",
|
|
2425
|
+
"parser": "SSRF-METADATA",
|
|
2412
2426
|
"_unsigned": false,
|
|
2413
2427
|
"_passThroughSigning": false,
|
|
2414
2428
|
"signatureStatus": "verified",
|
|
2415
2429
|
"regression_test": {
|
|
2416
2430
|
"lang": "node",
|
|
2417
|
-
"framework":
|
|
2418
|
-
"filename":
|
|
2419
|
-
"runHint":
|
|
2420
|
-
"code":
|
|
2431
|
+
"framework": null,
|
|
2432
|
+
"filename": null,
|
|
2433
|
+
"runHint": null,
|
|
2434
|
+
"code": null
|
|
2421
2435
|
},
|
|
2422
2436
|
"poc": {
|
|
2423
2437
|
"lang": "node",
|
|
@@ -2425,7 +2439,10 @@
|
|
|
2425
2439
|
"cwe": "CWE-918",
|
|
2426
2440
|
"family": "ssrf",
|
|
2427
2441
|
"runHint": "node poc.mjs",
|
|
2428
|
-
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n"
|
|
2442
|
+
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n",
|
|
2443
|
+
"paramKey": null,
|
|
2444
|
+
"paramKeyConfidence": "low",
|
|
2445
|
+
"paramKeyInferred": false
|
|
2429
2446
|
},
|
|
2430
2447
|
"calibrated_confidence": null,
|
|
2431
2448
|
"calibrated_confidence_ci": null,
|
|
@@ -2650,6 +2667,7 @@
|
|
|
2650
2667
|
"unvalidated": true,
|
|
2651
2668
|
"cross_language": false,
|
|
2652
2669
|
"family": "toctou-file-existence-permission-check-b",
|
|
2670
|
+
"parser": "TOCTOU",
|
|
2653
2671
|
"_unsigned": false,
|
|
2654
2672
|
"_passThroughSigning": false,
|
|
2655
2673
|
"signatureStatus": "verified",
|
|
@@ -2871,6 +2889,7 @@
|
|
|
2871
2889
|
"unvalidated": true,
|
|
2872
2890
|
"cross_language": false,
|
|
2873
2891
|
"family": "toctou-file-existence-permission-check-b",
|
|
2892
|
+
"parser": "TOCTOU",
|
|
2874
2893
|
"_unsigned": false,
|
|
2875
2894
|
"_passThroughSigning": false,
|
|
2876
2895
|
"signatureStatus": "verified",
|
|
@@ -3064,7 +3083,9 @@
|
|
|
3064
3083
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3065
3084
|
"confidence": "low",
|
|
3066
3085
|
"narrative": "Race Condition (TOCTOU) on `incremental.js:223` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3067
|
-
}
|
|
3086
|
+
},
|
|
3087
|
+
"parser": "LOGIC",
|
|
3088
|
+
"family": null
|
|
3068
3089
|
},
|
|
3069
3090
|
{
|
|
3070
3091
|
"id": "logic:incremental.js:50:TOCTOU:_existsSync_followed_by_file_op",
|
|
@@ -3145,7 +3166,9 @@
|
|
|
3145
3166
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3146
3167
|
"confidence": "low",
|
|
3147
3168
|
"narrative": "TOCTOU: existsSync followed by file op on `incremental.js:50` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3148
|
-
}
|
|
3169
|
+
},
|
|
3170
|
+
"parser": "LOGIC",
|
|
3171
|
+
"family": null
|
|
3149
3172
|
},
|
|
3150
3173
|
{
|
|
3151
3174
|
"id": "logic:incremental.js:68:TOCTOU:_existsSync_followed_by_file_op",
|
|
@@ -3226,7 +3249,9 @@
|
|
|
3226
3249
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3227
3250
|
"confidence": "low",
|
|
3228
3251
|
"narrative": "TOCTOU: existsSync followed by file op on `incremental.js:68` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3229
|
-
}
|
|
3252
|
+
},
|
|
3253
|
+
"parser": "LOGIC",
|
|
3254
|
+
"family": null
|
|
3230
3255
|
},
|
|
3231
3256
|
{
|
|
3232
3257
|
"id": "logic:incremental.js:223:TOCTOU:_existsSync_followed_by_file_op",
|
|
@@ -3307,7 +3332,9 @@
|
|
|
3307
3332
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3308
3333
|
"confidence": "low",
|
|
3309
3334
|
"narrative": "TOCTOU: existsSync followed by file op on `incremental.js:223` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3310
|
-
}
|
|
3335
|
+
},
|
|
3336
|
+
"parser": "LOGIC",
|
|
3337
|
+
"family": null
|
|
3311
3338
|
}
|
|
3312
3339
|
],
|
|
3313
3340
|
"bundles": [],
|
|
@@ -3331,7 +3358,7 @@
|
|
|
3331
3358
|
"_v3": {
|
|
3332
3359
|
"counterfactual": {
|
|
3333
3360
|
"spofControls": [],
|
|
3334
|
-
"controlsDetected":
|
|
3361
|
+
"controlsDetected": 219
|
|
3335
3362
|
},
|
|
3336
3363
|
"threatModel": {
|
|
3337
3364
|
"summary": {
|
|
@@ -3367,7 +3394,7 @@
|
|
|
3367
3394
|
{
|
|
3368
3395
|
"vuln": "SSRF: explicit reference to cloud instance-metadata endpoint",
|
|
3369
3396
|
"file": "catalog.js",
|
|
3370
|
-
"line":
|
|
3397
|
+
"line": 538,
|
|
3371
3398
|
"severity": "medium"
|
|
3372
3399
|
},
|
|
3373
3400
|
{
|
|
@@ -3483,5 +3510,6 @@
|
|
|
3483
3510
|
"alarms": [],
|
|
3484
3511
|
"note": "no-feedback-data"
|
|
3485
3512
|
}
|
|
3486
|
-
}
|
|
3513
|
+
},
|
|
3514
|
+
"annotatorErrors": []
|
|
3487
3515
|
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"scanId": "
|
|
3
|
-
"startedAt": "2026-05-
|
|
4
|
-
"durationMs":
|
|
2
|
+
"scanId": "e19aeff8-8736-4df3-9d8d-a4d227edb6b1",
|
|
3
|
+
"startedAt": "2026-05-27T09:30:01.863Z",
|
|
4
|
+
"durationMs": 501,
|
|
5
5
|
"scanned": {
|
|
6
|
-
"files":
|
|
6
|
+
"files": 28,
|
|
7
7
|
"lines": 0
|
|
8
8
|
},
|
|
9
9
|
"findings": [
|
|
@@ -116,6 +116,7 @@
|
|
|
116
116
|
"unvalidated": true,
|
|
117
117
|
"cross_language": false,
|
|
118
118
|
"family": "dos-sync-io",
|
|
119
|
+
"parser": "STRUCTURAL",
|
|
119
120
|
"_unsigned": false,
|
|
120
121
|
"_passThroughSigning": false,
|
|
121
122
|
"signatureStatus": "verified",
|
|
@@ -344,6 +345,7 @@
|
|
|
344
345
|
"unvalidated": true,
|
|
345
346
|
"cross_language": false,
|
|
346
347
|
"family": "dos-sync-io",
|
|
348
|
+
"parser": "STRUCTURAL",
|
|
347
349
|
"_unsigned": false,
|
|
348
350
|
"_passThroughSigning": false,
|
|
349
351
|
"signatureStatus": "verified",
|
|
@@ -572,6 +574,7 @@
|
|
|
572
574
|
"unvalidated": true,
|
|
573
575
|
"cross_language": false,
|
|
574
576
|
"family": "dos-sync-io",
|
|
577
|
+
"parser": "STRUCTURAL",
|
|
575
578
|
"_unsigned": false,
|
|
576
579
|
"_passThroughSigning": false,
|
|
577
580
|
"signatureStatus": "verified",
|
|
@@ -800,6 +803,7 @@
|
|
|
800
803
|
"unvalidated": true,
|
|
801
804
|
"cross_language": false,
|
|
802
805
|
"family": "dos-sync-io",
|
|
806
|
+
"parser": "STRUCTURAL",
|
|
803
807
|
"_unsigned": false,
|
|
804
808
|
"_passThroughSigning": false,
|
|
805
809
|
"signatureStatus": "verified",
|
|
@@ -1028,6 +1032,7 @@
|
|
|
1028
1032
|
"unvalidated": true,
|
|
1029
1033
|
"cross_language": false,
|
|
1030
1034
|
"family": "dos-sync-io",
|
|
1035
|
+
"parser": "STRUCTURAL",
|
|
1031
1036
|
"_unsigned": false,
|
|
1032
1037
|
"_passThroughSigning": false,
|
|
1033
1038
|
"signatureStatus": "verified",
|
|
@@ -1256,6 +1261,7 @@
|
|
|
1256
1261
|
"unvalidated": true,
|
|
1257
1262
|
"cross_language": false,
|
|
1258
1263
|
"family": "dos-sync-io",
|
|
1264
|
+
"parser": "STRUCTURAL",
|
|
1259
1265
|
"_unsigned": false,
|
|
1260
1266
|
"_passThroughSigning": false,
|
|
1261
1267
|
"signatureStatus": "verified",
|
|
@@ -1484,6 +1490,7 @@
|
|
|
1484
1490
|
"unvalidated": true,
|
|
1485
1491
|
"cross_language": false,
|
|
1486
1492
|
"family": "dos-sync-io",
|
|
1493
|
+
"parser": "STRUCTURAL",
|
|
1487
1494
|
"_unsigned": false,
|
|
1488
1495
|
"_passThroughSigning": false,
|
|
1489
1496
|
"signatureStatus": "verified",
|
|
@@ -1712,6 +1719,7 @@
|
|
|
1712
1719
|
"unvalidated": true,
|
|
1713
1720
|
"cross_language": false,
|
|
1714
1721
|
"family": "dos-sync-io",
|
|
1722
|
+
"parser": "STRUCTURAL",
|
|
1715
1723
|
"_unsigned": false,
|
|
1716
1724
|
"_passThroughSigning": false,
|
|
1717
1725
|
"signatureStatus": "verified",
|
|
@@ -1940,6 +1948,7 @@
|
|
|
1940
1948
|
"unvalidated": true,
|
|
1941
1949
|
"cross_language": false,
|
|
1942
1950
|
"family": "dos-sync-io",
|
|
1951
|
+
"parser": "STRUCTURAL",
|
|
1943
1952
|
"_unsigned": false,
|
|
1944
1953
|
"_passThroughSigning": false,
|
|
1945
1954
|
"signatureStatus": "verified",
|
|
@@ -2060,7 +2069,7 @@
|
|
|
2060
2069
|
"attackPlaybook": null
|
|
2061
2070
|
},
|
|
2062
2071
|
{
|
|
2063
|
-
"id": "ssrf-meta-hardcoded:catalog.js:
|
|
2072
|
+
"id": "ssrf-meta-hardcoded:catalog.js:538",
|
|
2064
2073
|
"kind": "sast",
|
|
2065
2074
|
"severity": "medium",
|
|
2066
2075
|
"vuln": "SSRF: explicit reference to cloud instance-metadata endpoint",
|
|
@@ -2068,7 +2077,7 @@
|
|
|
2068
2077
|
"owaspLlm": null,
|
|
2069
2078
|
"stride": "Information Disclosure",
|
|
2070
2079
|
"file": "catalog.js",
|
|
2071
|
-
"line":
|
|
2080
|
+
"line": 538,
|
|
2072
2081
|
"snippet": "remediation: 'Resolve the host first, reject 169.254.169.254 / RFC1918 / localhost; or proxy through a server-side allow-list.' } },",
|
|
2073
2082
|
"fix": null,
|
|
2074
2083
|
"reachable": false,
|
|
@@ -2149,7 +2158,7 @@
|
|
|
2149
2158
|
"dominantDriver": "legal counsel",
|
|
2150
2159
|
"comparable": "Capital One 2019 SSRF → $190M settlement (100M records, $1.90/rec)",
|
|
2151
2160
|
"confidence": "low",
|
|
2152
|
-
"narrative": "SSRF: explicit reference to cloud instance-metadata endpoint on `catalog.js:
|
|
2161
|
+
"narrative": "SSRF: explicit reference to cloud instance-metadata endpoint on `catalog.js:538` could expose production credentials and API keys. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $24k · likely $138k · worst $778k. Dominant driver: legal counsel. Comparable: Capital One 2019 SSRF → $190M settlement (100M records, $1.90/rec)."
|
|
2153
2162
|
},
|
|
2154
2163
|
"stableId": "3dfe482b8d5e3a09",
|
|
2155
2164
|
"confidenceTier": "medium",
|
|
@@ -2166,15 +2175,16 @@
|
|
|
2166
2175
|
"unvalidated": true,
|
|
2167
2176
|
"cross_language": false,
|
|
2168
2177
|
"family": "ssrf",
|
|
2178
|
+
"parser": "SSRF-METADATA",
|
|
2169
2179
|
"_unsigned": false,
|
|
2170
2180
|
"_passThroughSigning": false,
|
|
2171
2181
|
"signatureStatus": "verified",
|
|
2172
2182
|
"regression_test": {
|
|
2173
2183
|
"lang": "node",
|
|
2174
|
-
"framework":
|
|
2175
|
-
"filename":
|
|
2176
|
-
"runHint":
|
|
2177
|
-
"code":
|
|
2184
|
+
"framework": null,
|
|
2185
|
+
"filename": null,
|
|
2186
|
+
"runHint": null,
|
|
2187
|
+
"code": null
|
|
2178
2188
|
},
|
|
2179
2189
|
"poc": {
|
|
2180
2190
|
"lang": "node",
|
|
@@ -2182,7 +2192,10 @@
|
|
|
2182
2192
|
"cwe": "CWE-918",
|
|
2183
2193
|
"family": "ssrf",
|
|
2184
2194
|
"runHint": "node poc.mjs",
|
|
2185
|
-
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n"
|
|
2195
|
+
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n",
|
|
2196
|
+
"paramKey": null,
|
|
2197
|
+
"paramKeyConfidence": "low",
|
|
2198
|
+
"paramKeyInferred": false
|
|
2186
2199
|
},
|
|
2187
2200
|
"calibrated_confidence": null,
|
|
2188
2201
|
"calibrated_confidence_ci": null,
|
|
@@ -2409,15 +2422,16 @@
|
|
|
2409
2422
|
"unvalidated": true,
|
|
2410
2423
|
"cross_language": false,
|
|
2411
2424
|
"family": "ssrf",
|
|
2425
|
+
"parser": "SSRF-METADATA",
|
|
2412
2426
|
"_unsigned": false,
|
|
2413
2427
|
"_passThroughSigning": false,
|
|
2414
2428
|
"signatureStatus": "verified",
|
|
2415
2429
|
"regression_test": {
|
|
2416
2430
|
"lang": "node",
|
|
2417
|
-
"framework":
|
|
2418
|
-
"filename":
|
|
2419
|
-
"runHint":
|
|
2420
|
-
"code":
|
|
2431
|
+
"framework": null,
|
|
2432
|
+
"filename": null,
|
|
2433
|
+
"runHint": null,
|
|
2434
|
+
"code": null
|
|
2421
2435
|
},
|
|
2422
2436
|
"poc": {
|
|
2423
2437
|
"lang": "node",
|
|
@@ -2425,7 +2439,10 @@
|
|
|
2425
2439
|
"cwe": "CWE-918",
|
|
2426
2440
|
"family": "ssrf",
|
|
2427
2441
|
"runHint": "node poc.mjs",
|
|
2428
|
-
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n"
|
|
2442
|
+
"code": "// Demonstrates SSRF by forcing the server to fetch a localhost sentinel URL.\n// Endpoint: POST http://localhost:3000/REPLACE-WITH-ENDPOINT\n// Payload: http://127.0.0.1:65533/poc-ssrf-sentinel\n// Expect: sentinel server logs a request from the target — proves the target made an outbound call we controlled\n// Run: node poc.mjs\n// Exit code: 0 = exploit demonstrated, 1 = not demonstrated, 2 = error\n\nconst URL_ = \"http://localhost:3000/REPLACE-WITH-ENDPOINT\";\nconst METHOD = \"POST\";\nconst PAYLOAD = `http://127.0.0.1:65533/poc-ssrf-sentinel`;\n\nconst body = METHOD === 'GET'\n ? null\n : JSON.stringify({ \"input\": PAYLOAD });\n\nconst headers = { 'Content-Type': 'application/json' };\n\nconst reqUrl = METHOD === 'GET'\n ? URL_ + (URL_.includes('?') ? '&' : '?') + \"input\" + '=' + encodeURIComponent(PAYLOAD)\n : URL_;\n\ntry {\n const r = await fetch(reqUrl, { method: METHOD, headers, body, redirect: 'follow' });\n const text = await r.text();\n const sig = (text.includes(\"http://127.0.0.1:65533/poc-ssrf-sentinel\") ? 'payload reflected' : '');\n if (sig) {\n process.stderr.write('PoC: exploit demonstrated — ' + sig + '\\n');\n process.exit(0);\n }\n process.stderr.write('PoC: payload sent (status ' + r.status + '), no exploit evidence in response\\n');\n process.exit(1);\n} catch (e) {\n process.stderr.write('PoC: error reaching target — ' + e.message + '\\n');\n process.exit(2);\n}\n",
|
|
2443
|
+
"paramKey": null,
|
|
2444
|
+
"paramKeyConfidence": "low",
|
|
2445
|
+
"paramKeyInferred": false
|
|
2429
2446
|
},
|
|
2430
2447
|
"calibrated_confidence": null,
|
|
2431
2448
|
"calibrated_confidence_ci": null,
|
|
@@ -2650,6 +2667,7 @@
|
|
|
2650
2667
|
"unvalidated": true,
|
|
2651
2668
|
"cross_language": false,
|
|
2652
2669
|
"family": "toctou-file-existence-permission-check-b",
|
|
2670
|
+
"parser": "TOCTOU",
|
|
2653
2671
|
"_unsigned": false,
|
|
2654
2672
|
"_passThroughSigning": false,
|
|
2655
2673
|
"signatureStatus": "verified",
|
|
@@ -2871,6 +2889,7 @@
|
|
|
2871
2889
|
"unvalidated": true,
|
|
2872
2890
|
"cross_language": false,
|
|
2873
2891
|
"family": "toctou-file-existence-permission-check-b",
|
|
2892
|
+
"parser": "TOCTOU",
|
|
2874
2893
|
"_unsigned": false,
|
|
2875
2894
|
"_passThroughSigning": false,
|
|
2876
2895
|
"signatureStatus": "verified",
|
|
@@ -3064,7 +3083,9 @@
|
|
|
3064
3083
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3065
3084
|
"confidence": "low",
|
|
3066
3085
|
"narrative": "Race Condition (TOCTOU) on `incremental.js:223` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3067
|
-
}
|
|
3086
|
+
},
|
|
3087
|
+
"parser": "LOGIC",
|
|
3088
|
+
"family": null
|
|
3068
3089
|
},
|
|
3069
3090
|
{
|
|
3070
3091
|
"id": "logic:incremental.js:50:TOCTOU:_existsSync_followed_by_file_op",
|
|
@@ -3145,7 +3166,9 @@
|
|
|
3145
3166
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3146
3167
|
"confidence": "low",
|
|
3147
3168
|
"narrative": "TOCTOU: existsSync followed by file op on `incremental.js:50` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3148
|
-
}
|
|
3169
|
+
},
|
|
3170
|
+
"parser": "LOGIC",
|
|
3171
|
+
"family": null
|
|
3149
3172
|
},
|
|
3150
3173
|
{
|
|
3151
3174
|
"id": "logic:incremental.js:68:TOCTOU:_existsSync_followed_by_file_op",
|
|
@@ -3226,7 +3249,9 @@
|
|
|
3226
3249
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3227
3250
|
"confidence": "low",
|
|
3228
3251
|
"narrative": "TOCTOU: existsSync followed by file op on `incremental.js:68` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3229
|
-
}
|
|
3252
|
+
},
|
|
3253
|
+
"parser": "LOGIC",
|
|
3254
|
+
"family": null
|
|
3230
3255
|
},
|
|
3231
3256
|
{
|
|
3232
3257
|
"id": "logic:incremental.js:223:TOCTOU:_existsSync_followed_by_file_op",
|
|
@@ -3307,7 +3332,9 @@
|
|
|
3307
3332
|
"comparable": "Generic finding — likely cost driven by user count + jurisdiction stack",
|
|
3308
3333
|
"confidence": "low",
|
|
3309
3334
|
"narrative": "TOCTOU: existsSync followed by file op on `incremental.js:223` could expose configuration / internal data. Context: general SaaS / no specific regulatory exposure. Estimated cost: best $23k · likely $136k · worst $775k. Dominant driver: legal counsel. Comparable: Generic finding — likely cost driven by user count + jurisdiction stack."
|
|
3310
|
-
}
|
|
3335
|
+
},
|
|
3336
|
+
"parser": "LOGIC",
|
|
3337
|
+
"family": null
|
|
3311
3338
|
}
|
|
3312
3339
|
],
|
|
3313
3340
|
"bundles": [],
|
|
@@ -3331,7 +3358,7 @@
|
|
|
3331
3358
|
"_v3": {
|
|
3332
3359
|
"counterfactual": {
|
|
3333
3360
|
"spofControls": [],
|
|
3334
|
-
"controlsDetected":
|
|
3361
|
+
"controlsDetected": 219
|
|
3335
3362
|
},
|
|
3336
3363
|
"threatModel": {
|
|
3337
3364
|
"summary": {
|
|
@@ -3367,7 +3394,7 @@
|
|
|
3367
3394
|
{
|
|
3368
3395
|
"vuln": "SSRF: explicit reference to cloud instance-metadata endpoint",
|
|
3369
3396
|
"file": "catalog.js",
|
|
3370
|
-
"line":
|
|
3397
|
+
"line": 538,
|
|
3371
3398
|
"severity": "medium"
|
|
3372
3399
|
},
|
|
3373
3400
|
{
|
|
@@ -3483,5 +3510,6 @@
|
|
|
3483
3510
|
"alarms": [],
|
|
3484
3511
|
"note": "no-feedback-data"
|
|
3485
3512
|
}
|
|
3486
|
-
}
|
|
3513
|
+
},
|
|
3514
|
+
"annotatorErrors": []
|
|
3487
3515
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
15284d745cace7e5e74c8a8a9817f9b55d27f5fb3eb433baea772008b6419a1f
|