@sikkuumiii/defuse 0.0.0-stage → 0.5.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.
Files changed (236) hide show
  1. package/LICENSE +235 -0
  2. package/README.md +561 -2
  3. package/dist/src/cli.d.ts +20 -0
  4. package/dist/src/cli.js +619 -0
  5. package/dist/src/cli.js.map +1 -0
  6. package/dist/src/core/analyze.d.ts +178 -0
  7. package/dist/src/core/analyze.js +834 -0
  8. package/dist/src/core/analyze.js.map +1 -0
  9. package/dist/src/core/coverage.d.ts +87 -0
  10. package/dist/src/core/coverage.js +181 -0
  11. package/dist/src/core/coverage.js.map +1 -0
  12. package/dist/src/core/finding.d.ts +196 -0
  13. package/dist/src/core/finding.js +178 -0
  14. package/dist/src/core/finding.js.map +1 -0
  15. package/dist/src/core/licence.d.ts +50 -0
  16. package/dist/src/core/licence.js +56 -0
  17. package/dist/src/core/licence.js.map +1 -0
  18. package/dist/src/core/paths.d.ts +21 -0
  19. package/dist/src/core/paths.js +58 -0
  20. package/dist/src/core/paths.js.map +1 -0
  21. package/dist/src/core/score.d.ts +137 -0
  22. package/dist/src/core/score.js +232 -0
  23. package/dist/src/core/score.js.map +1 -0
  24. package/dist/src/dast/targets.d.ts +30 -0
  25. package/dist/src/dast/targets.js +79 -0
  26. package/dist/src/dast/targets.js.map +1 -0
  27. package/dist/src/dast/zap.d.ts +42 -0
  28. package/dist/src/dast/zap.js +184 -0
  29. package/dist/src/dast/zap.js.map +1 -0
  30. package/dist/src/engine/scan.d.ts +80 -0
  31. package/dist/src/engine/scan.js +129 -0
  32. package/dist/src/engine/scan.js.map +1 -0
  33. package/dist/src/engine/shapes.d.ts +47 -0
  34. package/dist/src/engine/shapes.js +328 -0
  35. package/dist/src/engine/shapes.js.map +1 -0
  36. package/dist/src/engine/walk.d.ts +60 -0
  37. package/dist/src/engine/walk.js +156 -0
  38. package/dist/src/engine/walk.js.map +1 -0
  39. package/dist/src/parse/astDump.d.ts +31 -0
  40. package/dist/src/parse/astDump.js +66 -0
  41. package/dist/src/parse/astDump.js.map +1 -0
  42. package/dist/src/parse/languages.d.ts +70 -0
  43. package/dist/src/parse/languages.js +174 -0
  44. package/dist/src/parse/languages.js.map +1 -0
  45. package/dist/src/parse/location.d.ts +17 -0
  46. package/dist/src/parse/location.js +38 -0
  47. package/dist/src/parse/location.js.map +1 -0
  48. package/dist/src/parse/node-grammars.d.ts +12 -0
  49. package/dist/src/parse/node-grammars.js +35 -0
  50. package/dist/src/parse/node-grammars.js.map +1 -0
  51. package/dist/src/parse/parser.d.ts +126 -0
  52. package/dist/src/parse/parser.js +202 -0
  53. package/dist/src/parse/parser.js.map +1 -0
  54. package/dist/src/parse/tree-store.d.ts +139 -0
  55. package/dist/src/parse/tree-store.js +236 -0
  56. package/dist/src/parse/tree-store.js.map +1 -0
  57. package/dist/src/platform/dependency-rule.d.ts +27 -0
  58. package/dist/src/platform/dependency-rule.js +21 -0
  59. package/dist/src/platform/dependency-rule.js.map +1 -0
  60. package/dist/src/platform/deps.d.ts +86 -0
  61. package/dist/src/platform/deps.js +304 -0
  62. package/dist/src/platform/deps.js.map +1 -0
  63. package/dist/src/platform/php-facts.d.ts +49 -0
  64. package/dist/src/platform/php-facts.js +67 -0
  65. package/dist/src/platform/php-facts.js.map +1 -0
  66. package/dist/src/platform/runtime-version.d.ts +78 -0
  67. package/dist/src/platform/runtime-version.js +573 -0
  68. package/dist/src/platform/runtime-version.js.map +1 -0
  69. package/dist/src/report/colors.d.ts +50 -0
  70. package/dist/src/report/colors.js +97 -0
  71. package/dist/src/report/colors.js.map +1 -0
  72. package/dist/src/report/coverage-table.d.ts +90 -0
  73. package/dist/src/report/coverage-table.js +291 -0
  74. package/dist/src/report/coverage-table.js.map +1 -0
  75. package/dist/src/report/html-report.d.ts +66 -0
  76. package/dist/src/report/html-report.js +489 -0
  77. package/dist/src/report/html-report.js.map +1 -0
  78. package/dist/src/report/human.d.ts +44 -0
  79. package/dist/src/report/human.js +575 -0
  80. package/dist/src/report/human.js.map +1 -0
  81. package/dist/src/report/json.d.ts +24 -0
  82. package/dist/src/report/json.js +178 -0
  83. package/dist/src/report/json.js.map +1 -0
  84. package/dist/src/report/mark.d.ts +17 -0
  85. package/dist/src/report/mark.js +39 -0
  86. package/dist/src/report/mark.js.map +1 -0
  87. package/dist/src/report/pricing.d.ts +33 -0
  88. package/dist/src/report/pricing.js +343 -0
  89. package/dist/src/report/pricing.js.map +1 -0
  90. package/dist/src/report/sarif.d.ts +39 -0
  91. package/dist/src/report/sarif.js +219 -0
  92. package/dist/src/report/sarif.js.map +1 -0
  93. package/dist/src/report/site.d.ts +87 -0
  94. package/dist/src/report/site.js +742 -0
  95. package/dist/src/report/site.js.map +1 -0
  96. package/dist/src/rules/code-injection.d.ts +47 -0
  97. package/dist/src/rules/code-injection.js +326 -0
  98. package/dist/src/rules/code-injection.js.map +1 -0
  99. package/dist/src/rules/command-injection.d.ts +30 -0
  100. package/dist/src/rules/command-injection.js +286 -0
  101. package/dist/src/rules/command-injection.js.map +1 -0
  102. package/dist/src/rules/contract.d.ts +198 -0
  103. package/dist/src/rules/contract.js +39 -0
  104. package/dist/src/rules/contract.js.map +1 -0
  105. package/dist/src/rules/format-string.d.ts +46 -0
  106. package/dist/src/rules/format-string.js +146 -0
  107. package/dist/src/rules/format-string.js.map +1 -0
  108. package/dist/src/rules/hardcoded-secret.d.ts +38 -0
  109. package/dist/src/rules/hardcoded-secret.js +440 -0
  110. package/dist/src/rules/hardcoded-secret.js.map +1 -0
  111. package/dist/src/rules/lib/guards.d.ts +168 -0
  112. package/dist/src/rules/lib/guards.js +1179 -0
  113. package/dist/src/rules/lib/guards.js.map +1 -0
  114. package/dist/src/rules/lib/html-safety.d.ts +75 -0
  115. package/dist/src/rules/lib/html-safety.js +755 -0
  116. package/dist/src/rules/lib/html-safety.js.map +1 -0
  117. package/dist/src/rules/lib/local-build.d.ts +59 -0
  118. package/dist/src/rules/lib/local-build.js +320 -0
  119. package/dist/src/rules/lib/local-build.js.map +1 -0
  120. package/dist/src/rules/lib/strings.d.ts +208 -0
  121. package/dist/src/rules/lib/strings.js +1970 -0
  122. package/dist/src/rules/lib/strings.js.map +1 -0
  123. package/dist/src/rules/path-traversal.d.ts +33 -0
  124. package/dist/src/rules/path-traversal.js +96 -0
  125. package/dist/src/rules/path-traversal.js.map +1 -0
  126. package/dist/src/rules/registry.d.ts +19 -0
  127. package/dist/src/rules/registry.js +77 -0
  128. package/dist/src/rules/registry.js.map +1 -0
  129. package/dist/src/rules/sql-injection.d.ts +36 -0
  130. package/dist/src/rules/sql-injection.js +299 -0
  131. package/dist/src/rules/sql-injection.js.map +1 -0
  132. package/dist/src/rules/ssrf.d.ts +39 -0
  133. package/dist/src/rules/ssrf.js +111 -0
  134. package/dist/src/rules/ssrf.js.map +1 -0
  135. package/dist/src/rules/unbounded-copy.d.ts +37 -0
  136. package/dist/src/rules/unbounded-copy.js +147 -0
  137. package/dist/src/rules/unbounded-copy.js.map +1 -0
  138. package/dist/src/rules/unsafe-deserialization.d.ts +43 -0
  139. package/dist/src/rules/unsafe-deserialization.js +276 -0
  140. package/dist/src/rules/unsafe-deserialization.js.map +1 -0
  141. package/dist/src/rules/weak-hash.d.ts +37 -0
  142. package/dist/src/rules/weak-hash.js +197 -0
  143. package/dist/src/rules/weak-hash.js.map +1 -0
  144. package/dist/src/rules/xss.d.ts +38 -0
  145. package/dist/src/rules/xss.js +527 -0
  146. package/dist/src/rules/xss.js.map +1 -0
  147. package/dist/src/taint/content-type.d.ts +19 -0
  148. package/dist/src/taint/content-type.js +20 -0
  149. package/dist/src/taint/content-type.js.map +1 -0
  150. package/dist/src/taint/dictionaries.d.ts +23 -0
  151. package/dist/src/taint/dictionaries.js +1778 -0
  152. package/dist/src/taint/dictionaries.js.map +1 -0
  153. package/dist/src/taint/fold.d.ts +59 -0
  154. package/dist/src/taint/fold.js +1177 -0
  155. package/dist/src/taint/fold.js.map +1 -0
  156. package/dist/src/taint/java-scope.d.ts +61 -0
  157. package/dist/src/taint/java-scope.js +212 -0
  158. package/dist/src/taint/java-scope.js.map +1 -0
  159. package/dist/src/taint/local-map.d.ts +79 -0
  160. package/dist/src/taint/local-map.js +603 -0
  161. package/dist/src/taint/local-map.js.map +1 -0
  162. package/dist/src/taint/project.d.ts +172 -0
  163. package/dist/src/taint/project.js +617 -0
  164. package/dist/src/taint/project.js.map +1 -0
  165. package/dist/src/taint/tracer.d.ts +265 -0
  166. package/dist/src/taint/tracer.js +3817 -0
  167. package/dist/src/taint/tracer.js.map +1 -0
  168. package/dist/src/taint/types.d.ts +484 -0
  169. package/dist/src/taint/types.js +47 -0
  170. package/dist/src/taint/types.js.map +1 -0
  171. package/dist/src/taint/visibility.d.ts +25 -0
  172. package/dist/src/taint/visibility.js +96 -0
  173. package/dist/src/taint/visibility.js.map +1 -0
  174. package/docs/examples/defuse.json +20 -0
  175. package/docs/examples/dvwa-urls.json +14 -0
  176. package/docs/examples/github-code-scanning.yml +54 -0
  177. package/docs/examples/tiny.js +4 -0
  178. package/package.json +73 -4
  179. package/src/cli.ts +747 -0
  180. package/src/core/analyze.ts +1072 -0
  181. package/src/core/coverage.ts +269 -0
  182. package/src/core/finding.ts +311 -0
  183. package/src/core/licence.ts +61 -0
  184. package/src/core/paths.ts +59 -0
  185. package/src/core/score.ts +353 -0
  186. package/src/dast/targets.ts +121 -0
  187. package/src/dast/zap.ts +246 -0
  188. package/src/engine/scan.ts +200 -0
  189. package/src/engine/shapes.ts +348 -0
  190. package/src/engine/walk.ts +196 -0
  191. package/src/parse/astDump.ts +85 -0
  192. package/src/parse/languages.ts +232 -0
  193. package/src/parse/location.ts +44 -0
  194. package/src/parse/node-grammars.ts +41 -0
  195. package/src/parse/parser.ts +262 -0
  196. package/src/parse/tree-store.ts +301 -0
  197. package/src/platform/dependency-rule.ts +33 -0
  198. package/src/platform/deps.ts +374 -0
  199. package/src/platform/php-facts.ts +85 -0
  200. package/src/platform/runtime-version.ts +710 -0
  201. package/src/report/colors.ts +107 -0
  202. package/src/report/coverage-table.ts +359 -0
  203. package/src/report/html-report.ts +601 -0
  204. package/src/report/human.ts +811 -0
  205. package/src/report/json.ts +189 -0
  206. package/src/report/mark.ts +47 -0
  207. package/src/report/pricing.ts +374 -0
  208. package/src/report/sarif.ts +235 -0
  209. package/src/report/site.ts +760 -0
  210. package/src/rules/code-injection.ts +346 -0
  211. package/src/rules/command-injection.ts +296 -0
  212. package/src/rules/contract.ts +220 -0
  213. package/src/rules/format-string.ts +158 -0
  214. package/src/rules/hardcoded-secret.ts +485 -0
  215. package/src/rules/lib/guards.ts +1235 -0
  216. package/src/rules/lib/html-safety.ts +793 -0
  217. package/src/rules/lib/local-build.ts +329 -0
  218. package/src/rules/lib/strings.ts +2034 -0
  219. package/src/rules/path-traversal.ts +101 -0
  220. package/src/rules/registry.ts +90 -0
  221. package/src/rules/sql-injection.ts +311 -0
  222. package/src/rules/ssrf.ts +118 -0
  223. package/src/rules/unbounded-copy.ts +162 -0
  224. package/src/rules/unsafe-deserialization.ts +291 -0
  225. package/src/rules/weak-hash.ts +226 -0
  226. package/src/rules/xss.ts +572 -0
  227. package/src/taint/content-type.ts +20 -0
  228. package/src/taint/dictionaries.ts +1855 -0
  229. package/src/taint/fold.ts +1206 -0
  230. package/src/taint/java-scope.ts +200 -0
  231. package/src/taint/local-map.ts +594 -0
  232. package/src/taint/project.ts +774 -0
  233. package/src/taint/tracer.ts +4298 -0
  234. package/src/taint/types.ts +511 -0
  235. package/src/taint/visibility.ts +100 -0
  236. package/tsconfig.json +61 -0
@@ -0,0 +1,573 @@
1
+ /**
2
+ * THE RUNTIME VERSION CHECK: WHICH PHP DOES THIS PROJECT SAY IT RUNS ON?
3
+ * =====================================================================
4
+ *
5
+ * Every other check in Defuse reads the code a project contains. PHP2Shell
6
+ * (CVE-2026-109618 / CVE-2026-109619, October 2026) was a reminder that perfect
7
+ * code on PHP 8.2.20 is still a server an attacker can take over: the bug was
8
+ * in PHP itself. Reading code cannot find that. Reading the version the
9
+ * project declares can - Dockerfiles, compose files, composer.json and
10
+ * `.php-version` all say which PHP the project expects.
11
+ *
12
+ * WHAT IT CAN AND CANNOT CLAIM. A declaration is not the server. A Dockerfile
13
+ * that says 8.2.20 may have been replaced, and one that says `php:8.2-apache`
14
+ * gets whatever 8.2 release was current when the image was built. So every
15
+ * result here is signature-based - a match against a declaration, never a
16
+ * proof about what runs - and every message says which file it read and how
17
+ * old the facts behind it are (php-facts.ts).
18
+ *
19
+ * Platform-free like the rest of the analysis: it takes text and returns
20
+ * findings, and the walker in engine/ decides which files to hand it.
21
+ */
22
+ import { signatureFinding } from '../core/finding.js';
23
+ import { isTestPath } from '../rules/lib/strings.js';
24
+ import { PHP_ADVISORIES, PHP_END_OF_LIFE, PHP_FACTS_CHECKED, PHP_SECURITY_UNTIL, } from './php-facts.js';
25
+ export const RUNTIME_VERSION_RULE = {
26
+ id: 'runtime-version',
27
+ name: 'PHP version with a known critical flaw or no security support',
28
+ owasp: 'A03:2025 Software Supply Chain Failures',
29
+ summary: 'The project runs on a PHP version with a known serious flaw, or one that no longer gets security fixes.',
30
+ fix: 'Upgrade PHP to a supported release and update the version declared in the Dockerfile or composer.json.',
31
+ explanation: 'A program is only as safe as the language runtime under it. When the PHP version a project ' +
32
+ 'runs on has a known critical flaw, or no longer gets security fixes at all, an attacker can ' +
33
+ 'break in without any mistake in the project\'s own code. The fix is an upgrade, not a code change.',
34
+ limitations: 'Reads only: FROM lines that use the official `php` Docker image (Dockerfile, Dockerfile.*, *.dockerfile), ' +
35
+ '`image:` lines in docker-compose and compose files, composer.json (`require.php` and `config.platform.php`) ' +
36
+ 'and `.php-version`. NOT read: other images that contain PHP (bitnami, webdevops, a distribution image with ' +
37
+ 'PHP installed by apt or apk), CI matrices, php.ini settings, or the running server - a declaration is not ' +
38
+ 'the server, so confirm with `php -v` where the code runs. Linux distributions often backport security ' +
39
+ 'fixes without changing the version number, so an old number in a distribution package may be patched; ' +
40
+ 'this check knows the official numbers only. The advisory list holds critical, exploited issues only and ' +
41
+ 'is not a vulnerability database. Runs in the command line and the client report, not the browser page.',
42
+ };
43
+ const cmpVersion = (a, b) => a[0] - b[0] || a[1] - b[1] || a[2] - b[2];
44
+ const branchOf = (v) => `${v[0]}.${v[1]}`;
45
+ const branchVersion = (branch) => {
46
+ const [maj, min] = branch.split('.').map(Number);
47
+ return [maj ?? 0, min ?? 0, 0];
48
+ };
49
+ const cmpBranch = (a, b) => cmpVersion(branchVersion(a), branchVersion(b));
50
+ const MONTHS = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
51
+ /** `2026-12-31` -> `31 Dec 2026`. */
52
+ export function readableDate(iso) {
53
+ const [y, m, d] = iso.split('-').map(Number);
54
+ return `${d} ${MONTHS[(m ?? 1) - 1]} ${y}`;
55
+ }
56
+ const daysBetween = (from, to) => Math.round((Date.parse(`${to}T00:00:00Z`) - Date.parse(`${from}T00:00:00Z`)) / 86_400_000);
57
+ /** Every branch the table knows, oldest first. */
58
+ const KNOWN_BRANCHES = [...Object.keys(PHP_END_OF_LIFE), ...Object.keys(PHP_SECURITY_UNTIL)].sort(cmpBranch);
59
+ const NEWEST_KNOWN = KNOWN_BRANCHES[KNOWN_BRANCHES.length - 1] ?? '8.5';
60
+ const OLDEST_KNOWN = KNOWN_BRANCHES[0] ?? '5.0';
61
+ function branchStatus(branch, today) {
62
+ const until = PHP_SECURITY_UNTIL[branch];
63
+ if (until)
64
+ return today > until ? { kind: 'eol', since: until } : { kind: 'supported', until };
65
+ const since = PHP_END_OF_LIFE[branch];
66
+ if (since)
67
+ return { kind: 'eol', since };
68
+ if (cmpBranch(branch, OLDEST_KNOWN) < 0)
69
+ return { kind: 'eol', since: null };
70
+ return { kind: 'unknown' };
71
+ }
72
+ /** Branches still supported on the day of the scan, newest first. */
73
+ const supportedBranches = (today) => Object.keys(PHP_SECURITY_UNTIL)
74
+ .filter((b) => branchStatus(b, today).kind === 'supported')
75
+ .sort((a, b) => cmpBranch(b, a));
76
+ /** How an advisory bears on one branch: fixed from a release, never fixed, or not affected. */
77
+ function advisoryFor(adv, branch) {
78
+ const fixed = adv.fixedIn[branch];
79
+ if (fixed)
80
+ return { fixedIn: fixed };
81
+ const fixedBranches = Object.keys(adv.fixedIn).sort(cmpBranch);
82
+ const oldestFixed = fixedBranches[0];
83
+ if (oldestFixed && cmpBranch(branch, adv.oldestAffected) >= 0 && cmpBranch(branch, oldestFixed) < 0) {
84
+ return { noFix: true };
85
+ }
86
+ return null;
87
+ }
88
+ const parseExact = (s) => {
89
+ const m = /^(\d+)\.(\d+)\.(\d+)$/.exec(s);
90
+ return m ? [Number(m[1]), Number(m[2]), Number(m[3])] : null;
91
+ };
92
+ /** The tag of the official image: `8.2.20-apache`, `8.2-fpm`, `8-cli`, `apache`, none. */
93
+ function pinnedByTag(tag, today) {
94
+ if (tag === null || tag === '' || tag === 'latest' || /^[a-z]/i.test(tag)) {
95
+ const newest = supportedBranches(today)[0];
96
+ return newest
97
+ ? { kind: 'branch', branch: newest, how: `a tag with no version number, which follows the newest release (${newest} today)` }
98
+ : { kind: 'unknown', why: 'a tag with no version number, and no branch in the table is still supported' };
99
+ }
100
+ const m = /^(\d+)(?:\.(\d+))?(?:\.(\d+))?((?:rc|alpha|beta)\d*)?(?:-|$)/i.exec(tag);
101
+ if (!m)
102
+ return { kind: 'unknown', why: `a tag Defuse cannot read a version from (\`${tag}\`)` };
103
+ const [maj, min, patch, pre] = [m[1], m[2], m[3], m[4]];
104
+ if (min !== undefined && patch !== undefined) {
105
+ return { kind: 'exact', version: [Number(maj), Number(min), Number(patch)], prerelease: pre !== undefined };
106
+ }
107
+ if (min !== undefined) {
108
+ return { kind: 'branch', branch: `${maj}.${min}`, how: `a branch tag, which follows the newest ${maj}.${min} release` };
109
+ }
110
+ const newestOfMajor = supportedBranches(today).find((b) => b.startsWith(`${maj}.`));
111
+ return newestOfMajor
112
+ ? { kind: 'branch', branch: newestOfMajor, how: `a major-version tag, which follows the newest ${maj}.x release (${newestOfMajor} today)` }
113
+ : { kind: 'unknown', why: `a major-version tag (\`${tag}\`) with no supported branch in the table` };
114
+ }
115
+ /* ------------------------------------------------------------- readers -- */
116
+ const isOfficialPhpImage = (name) => name === 'php' || name === 'docker.io/php' || /(^|\/)library\/php$/.test(name);
117
+ /** `php:8.2-apache@sha256:...` -> name, tag and digest. */
118
+ function splitImage(ref) {
119
+ const at = ref.indexOf('@');
120
+ const digest = at >= 0 ? ref.slice(at + 1) : null;
121
+ const base = at >= 0 ? ref.slice(0, at) : ref;
122
+ const slash = base.lastIndexOf('/');
123
+ const colon = base.lastIndexOf(':');
124
+ if (colon > slash)
125
+ return { name: base.slice(0, colon).toLowerCase(), tag: base.slice(colon + 1), digest };
126
+ return { name: base.toLowerCase(), tag: null, digest };
127
+ }
128
+ function readImage(file, lineNo, column, lineText, ref, source, where, nodeType, today) {
129
+ if (/\$/.test(ref)) {
130
+ const { name } = splitImage(ref.replace(/\$\{?\w+(?::-[^}]*)?\}?/g, 'x'));
131
+ if (!isOfficialPhpImage(name))
132
+ return null;
133
+ return {
134
+ file, line: lineNo, column, text: ref, lineText, source, where, nodeType,
135
+ pinned: { kind: 'unknown', why: 'a version set by a build argument with no default value in the file' },
136
+ };
137
+ }
138
+ const { name, tag, digest } = splitImage(ref);
139
+ if (!isOfficialPhpImage(name))
140
+ return null;
141
+ const pinned = tag === null && digest !== null
142
+ ? { kind: 'unknown', why: 'an image pinned by digest only, which does not show the version' }
143
+ : pinnedByTag(tag, today);
144
+ return { file, line: lineNo, column, text: ref, lineText, source, where, nodeType, pinned };
145
+ }
146
+ function readDockerfile(file, today) {
147
+ const out = [];
148
+ const args = new Map();
149
+ const stages = new Set();
150
+ file.text.split(/\r?\n/).forEach((lineText, index) => {
151
+ const arg = /^\s*ARG\s+(\w+)=["']?([^"'\s]*)["']?\s*$/i.exec(lineText);
152
+ if (arg?.[1] && arg[2] !== undefined)
153
+ args.set(arg[1], arg[2]);
154
+ const from = /^(\s*FROM\s+(?:--\S+\s+)*)(\S+)(?:\s+AS\s+(\S+))?/i.exec(lineText);
155
+ if (!from?.[2])
156
+ return;
157
+ const raw = from[2];
158
+ const ref = raw.replace(/\$\{(\w+)(?::-([^}]*))?\}|\$(\w+)/g, (whole, a, dflt, b) => {
159
+ const value = args.get(a ?? b);
160
+ return value !== undefined && value !== '' ? value : dflt !== undefined ? dflt : whole;
161
+ });
162
+ if (stages.has(ref.toLowerCase()))
163
+ return; // an earlier build stage, not an image
164
+ if (from[3])
165
+ stages.add(from[3].toLowerCase());
166
+ const declaration = readImage(file.path, index + 1, (from[1]?.length ?? 0) + 1, lineText, ref, 'Dockerfile FROM', `${file.path} on line ${index + 1}`, 'dockerfile-from', today);
167
+ if (declaration)
168
+ out.push(declaration);
169
+ });
170
+ return out;
171
+ }
172
+ function readCompose(file, today) {
173
+ const out = [];
174
+ file.text.split(/\r?\n/).forEach((lineText, index) => {
175
+ const m = /^(\s*image:\s*)["']?([^"'\s#]+)["']?/.exec(lineText);
176
+ if (!m?.[2])
177
+ return;
178
+ const declaration = readImage(file.path, index + 1, (m[1]?.length ?? 0) + 1, lineText, m[2], 'compose image', `${file.path} on line ${index + 1}`, 'compose-image', today);
179
+ if (declaration)
180
+ out.push(declaration);
181
+ });
182
+ return out;
183
+ }
184
+ /** The 1-based line holding `"php": "<value>"`, searching from a given line. */
185
+ function lineOfPhpKey(lines, value, from = 0) {
186
+ const escaped = value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
187
+ const re = new RegExp(`"php"\\s*:\\s*"${escaped}"`);
188
+ for (let i = from; i < lines.length; i++)
189
+ if (re.test(lines[i] ?? ''))
190
+ return i + 1;
191
+ return 1;
192
+ }
193
+ function readComposerJson(file, notes) {
194
+ let json;
195
+ try {
196
+ json = JSON.parse(file.text);
197
+ }
198
+ catch {
199
+ notes.push(`${file.path} is not valid JSON, so the PHP version it declares could not be read.`);
200
+ return [];
201
+ }
202
+ const obj = (json ?? {});
203
+ const lines = file.text.split(/\r?\n/);
204
+ const out = [];
205
+ const required = obj.require?.['php'];
206
+ if (typeof required === 'string') {
207
+ const line = lineOfPhpKey(lines, required);
208
+ out.push({
209
+ file: file.path, line, column: 1, text: required, lineText: lines[line - 1] ?? '',
210
+ source: 'composer.json require', where: `${file.path} (\`require\`, line ${line})`,
211
+ nodeType: 'composer-require', pinned: null, range: required,
212
+ });
213
+ }
214
+ const platform = obj.config?.platform?.['php'];
215
+ if (typeof platform === 'string') {
216
+ const configLine = Math.max(0, lines.findIndex((l) => /"platform"\s*:/.test(l)));
217
+ const line = lineOfPhpKey(lines, platform, configLine);
218
+ const version = parseExact(platform.trim());
219
+ const branch = /^(\d+)\.(\d+)$/.exec(platform.trim());
220
+ out.push({
221
+ file: file.path, line, column: 1, text: platform, lineText: lines[line - 1] ?? '',
222
+ source: 'composer.json config.platform', where: `${file.path} (\`config.platform\`, line ${line})`,
223
+ nodeType: 'composer-platform',
224
+ pinned: version
225
+ ? { kind: 'exact', version, prerelease: false }
226
+ : branch
227
+ ? { kind: 'branch', branch: `${branch[1]}.${branch[2]}`, how: 'a branch number with no release number' }
228
+ : { kind: 'unknown', why: `a platform version Defuse cannot read (\`${platform}\`)` },
229
+ });
230
+ }
231
+ return out;
232
+ }
233
+ function readPhpVersionFile(file) {
234
+ const lines = file.text.split(/\r?\n/);
235
+ const index = lines.findIndex((l) => l.trim() !== '' && !l.trim().startsWith('#'));
236
+ if (index < 0)
237
+ return [];
238
+ const raw = (lines[index] ?? '').trim();
239
+ const value = raw.replace(/^php[-@]?/i, '');
240
+ const version = parseExact(value);
241
+ const branch = /^(\d+)\.(\d+)$/.exec(value);
242
+ return [{
243
+ file: file.path, line: index + 1, column: 1, text: raw, lineText: raw,
244
+ source: '.php-version', where: `${file.path}`, nodeType: 'php-version-file',
245
+ pinned: version
246
+ ? { kind: 'exact', version, prerelease: false }
247
+ : branch
248
+ ? { kind: 'branch', branch: `${branch[1]}.${branch[2]}`, how: 'a branch number with no release number' }
249
+ : { kind: 'unknown', why: `a value Defuse cannot read a version from (\`${raw}\`)` },
250
+ }];
251
+ }
252
+ /** Which reader a file needs, by its name alone. Exported for the walker. */
253
+ export function runtimeFileKind(fileName) {
254
+ const name = fileName.toLowerCase();
255
+ if (name === 'dockerfile' || name.startsWith('dockerfile.') || name.endsWith('.dockerfile'))
256
+ return 'dockerfile';
257
+ if (/^(docker-)?compose(\.[\w-]+)?\.ya?ml$/.test(name))
258
+ return 'compose';
259
+ if (name === 'composer.json')
260
+ return 'composer';
261
+ if (name === '.php-version')
262
+ return 'php-version';
263
+ return null;
264
+ }
265
+ /**
266
+ * A composer version constraint, as alternatives of conditions - `^7.4 || ^8.0`
267
+ * is two alternatives. Null when any part cannot be read: an unreadable range
268
+ * is reported as unreadable, never guessed at.
269
+ */
270
+ export function parseComposerRange(constraint) {
271
+ const alternatives = constraint.split(/\s*\|\|?\s*/).filter((a) => a.trim() !== '');
272
+ if (alternatives.length === 0)
273
+ return null;
274
+ const out = [];
275
+ for (const alternative of alternatives) {
276
+ const hyphen = /^\s*(\S+)\s+-\s+(\S+)\s*$/.exec(alternative);
277
+ if (hyphen?.[1] && hyphen[2]) {
278
+ const low = partial(hyphen[1]);
279
+ const high = partial(hyphen[2]);
280
+ if (!low || !high)
281
+ return null;
282
+ out.push([
283
+ { op: '>=', v: low.v },
284
+ high.parts === 3 ? { op: '<=', v: high.v } : { op: '<', v: bump(high.v, high.parts - 1) },
285
+ ]);
286
+ continue;
287
+ }
288
+ const conditions = [];
289
+ for (const token of alternative.trim().split(/[\s,]+/)) {
290
+ const parsed = condition(token);
291
+ if (!parsed)
292
+ return null;
293
+ conditions.push(...parsed);
294
+ }
295
+ out.push(conditions);
296
+ }
297
+ return out;
298
+ }
299
+ /** `8.2` -> [8,2,0] with 2 parts given. */
300
+ function partial(text) {
301
+ const m = /^v?(\d+)(?:\.(\d+))?(?:\.(\d+))?(?:\.\d+)?$/.exec(text.replace(/@\w+$/, '').replace(/-[\w.]+$/, ''));
302
+ if (!m)
303
+ return null;
304
+ const parts = m[3] !== undefined ? 3 : m[2] !== undefined ? 2 : 1;
305
+ return { v: [Number(m[1]), Number(m[2] ?? 0), Number(m[3] ?? 0)], parts };
306
+ }
307
+ /** The next version up at a given position: bump([8,2,0], 1) is 8.3.0. */
308
+ function bump(v, position) {
309
+ if (position <= 0)
310
+ return [v[0] + 1, 0, 0];
311
+ if (position === 1)
312
+ return [v[0], v[1] + 1, 0];
313
+ return [v[0], v[1], v[2] + 1];
314
+ }
315
+ function condition(token) {
316
+ if (token === '*' || token === '')
317
+ return [];
318
+ const wildcard = /^v?(\d+)(?:\.(\d+))?\.\*$/.exec(token);
319
+ if (wildcard) {
320
+ const v = [Number(wildcard[1]), Number(wildcard[2] ?? 0), 0];
321
+ return [{ op: '>=', v }, { op: '<', v: bump(v, wildcard[2] === undefined ? 0 : 1) }];
322
+ }
323
+ const m = /^(\^|~|>=|<=|>|<|==?|!=)?(.+)$/.exec(token);
324
+ if (!m?.[2])
325
+ return null;
326
+ const p = partial(m[2]);
327
+ if (!p)
328
+ return null;
329
+ switch (m[1]) {
330
+ case '^':
331
+ return [{ op: '>=', v: p.v }, { op: '<', v: bump(p.v, 0) }];
332
+ case '~':
333
+ return [{ op: '>=', v: p.v }, { op: '<', v: bump(p.v, p.parts >= 3 ? 1 : 0) }];
334
+ case '>=':
335
+ case '>':
336
+ case '<':
337
+ case '<=':
338
+ case '!=':
339
+ return [{ op: m[1], v: p.v }];
340
+ default:
341
+ // A bare `8.2` is read as the whole 8.2 branch, `8` as all of 8.x.
342
+ return p.parts === 3
343
+ ? [{ op: '=', v: p.v }]
344
+ : [{ op: '>=', v: p.v }, { op: '<', v: bump(p.v, p.parts - 1) }];
345
+ }
346
+ }
347
+ function satisfies(v, range) {
348
+ return range.some((conditions) => conditions.every(({ op, v: w }) => {
349
+ const c = cmpVersion(v, w);
350
+ return op === '>=' ? c >= 0 : op === '>' ? c > 0 : op === '<' ? c < 0 : op === '<=' ? c <= 0 : op === '=' ? c === 0 : c !== 0;
351
+ }));
352
+ }
353
+ /** Whether any release of a branch fits the range. Tried at both ends of the branch. */
354
+ const branchAllowed = (branch, range) => {
355
+ const [maj, min] = branchVersion(branch);
356
+ return satisfies([maj, min, 0], range) || satisfies([maj, min, 999], range);
357
+ };
358
+ const confirmHint = 'Defuse read the version this file declares; the server can run a different one, so confirm with `php -v` where the code runs.';
359
+ function exactVerdict(d, v, prerelease, today) {
360
+ const version = v.join('.') + (prerelease ? ' (a pre-release)' : '');
361
+ const branch = branchOf(v);
362
+ const status = branchStatus(branch, today);
363
+ if (status.kind === 'unknown') {
364
+ return {
365
+ severity: null, cwe: 'CWE-1395', message: '', reasoning: '',
366
+ status: `PHP ${version}: branch ${branch} is newer than Defuse's table (checked ${readableDate(PHP_FACTS_CHECKED)}), so nothing is known about it`,
367
+ };
368
+ }
369
+ const hits = PHP_ADVISORIES.map((adv) => ({ adv, bearing: advisoryFor(adv, branch) })).filter((h) => h.bearing !== null &&
370
+ ('noFix' in h.bearing || cmpVersion(v, parseExact(h.bearing.fixedIn) ?? [0, 0, 0]) < 0));
371
+ const lines = [];
372
+ for (const { adv, bearing } of hits) {
373
+ lines.push('fixedIn' in bearing
374
+ ? `PHP ${version} is older than ${bearing.fixedIn}, the release that fixes ${adv.cves.join(' and ')} ` +
375
+ `("${adv.name}", ${readableDate(adv.published)}): ${adv.impact}. Upgrade to ${bearing.fixedIn} or later.`
376
+ : `PHP ${version} is affected by ${adv.cves.join(' and ')} ("${adv.name}", ${readableDate(adv.published)}): ` +
377
+ `${adv.impact}. No official ${branch} release has the fix; some Linux distributions ship their own patched builds.`);
378
+ }
379
+ if (status.kind === 'eol') {
380
+ lines.push(status.since
381
+ ? `Branch ${branch} has had no security fixes since ${readableDate(status.since)}; move to a supported branch (${supportedBranches(today).slice().reverse().join(', ')}).`
382
+ : `Branch ${branch} went out of support long before any date in Defuse's table.`);
383
+ }
384
+ if (lines.length === 0) {
385
+ return {
386
+ severity: null, cwe: 'CWE-1395', message: '', reasoning: '',
387
+ status: `PHP ${version}: no critical advisory in Defuse's table` +
388
+ (status.kind === 'supported' ? `; security support until ${readableDate(status.until)}` : ''),
389
+ };
390
+ }
391
+ const first = hits[0];
392
+ const message = first
393
+ ? 'fixedIn' in first.bearing
394
+ ? `PHP ${version} (${d.source}) is missing the ${first.adv.name} fix - ${first.bearing.fixedIn} has it`
395
+ : `PHP ${version} (${d.source}) is out of support - no official release has the ${first.adv.name} fix`
396
+ : `PHP ${version} (${d.source}) gets no security fixes any more`;
397
+ return {
398
+ severity: hits.length > 0 ? 'critical' : 'high',
399
+ cwe: hits.length > 0 ? 'CWE-1395' : 'CWE-1104',
400
+ message,
401
+ reasoning: `${d.where} declares PHP ${version}. ${lines.join(' ')} ${confirmHint}`,
402
+ status: hits.length > 0 ? `PHP ${version}: ${hits.map((h) => h.adv.name).join(', ')} not fixed` : `PHP ${version}: out of support`,
403
+ };
404
+ }
405
+ function branchVerdict(d, branch, how, today) {
406
+ const status = branchStatus(branch, today);
407
+ if (status.kind === 'unknown') {
408
+ return {
409
+ severity: null, cwe: 'CWE-1395', message: '', reasoning: '',
410
+ status: `PHP ${branch}: newer than Defuse's table (checked ${readableDate(PHP_FACTS_CHECKED)}), so nothing is known about it`,
411
+ };
412
+ }
413
+ if (status.kind === 'eol') {
414
+ // Every build of an out-of-support branch is the same answer as a pinned one.
415
+ const noFix = PHP_ADVISORIES.filter((adv) => advisoryFor(adv, branch) !== null);
416
+ const since = status.since ? ` since ${readableDate(status.since)}` : '';
417
+ return {
418
+ severity: noFix.length > 0 ? 'critical' : 'high',
419
+ cwe: noFix.length > 0 ? 'CWE-1395' : 'CWE-1104',
420
+ message: `PHP ${branch} (${d.source}) is out of support${noFix.length > 0 ? ` - no official release has the ${noFix[0]?.name} fix` : ''}`,
421
+ reasoning: `${d.where} declares \`${d.text}\` - ${how}. Branch ${branch} has had no security fixes${since}` +
422
+ (noFix.length > 0
423
+ ? `, and no official ${branch} release will fix ${noFix.map((a) => `${a.cves.join(' and ')} ("${a.name}": ${a.impact})`).join('; ')}.`
424
+ : '.') +
425
+ ` Move to a supported branch (${supportedBranches(today).slice().reverse().join(', ')}). ${confirmHint}`,
426
+ status: `PHP ${branch}: out of support`,
427
+ };
428
+ }
429
+ const fixes = PHP_ADVISORIES.flatMap((adv) => {
430
+ const bearing = advisoryFor(adv, branch);
431
+ return bearing && 'fixedIn' in bearing ? [{ adv, fixedIn: bearing.fixedIn }] : [];
432
+ });
433
+ if (fixes.length === 0) {
434
+ return {
435
+ severity: null, cwe: 'CWE-1395', message: '', reasoning: '',
436
+ status: `PHP ${branch} (floating): security support until ${readableDate(status.until)}`,
437
+ };
438
+ }
439
+ const newest = fixes[0];
440
+ return {
441
+ severity: 'low',
442
+ cwe: 'CWE-1395',
443
+ message: `${d.text} (${d.source}) has the ${newest?.adv.name} fix only if built after ${readableDate(newest?.adv.published ?? '')}`,
444
+ reasoning: `${d.where} declares \`${d.text}\` - ${how}, so the exact release depends on when the image was built or ` +
445
+ `pulled, and Defuse cannot see that. ` +
446
+ fixes
447
+ .map(({ adv, fixedIn }) => `${adv.cves.join(' and ')} ("${adv.name}": ${adv.impact}) ${adv.cves.length > 1 ? 'are' : 'is'} fixed in ${fixedIn}, released ` +
448
+ `${readableDate(adv.published)}; an image built before then does not have it.`)
449
+ .join(' ') +
450
+ ` Rebuild with \`docker build --pull\` (or pin ${newest?.fixedIn} or later). ${confirmHint}`,
451
+ status: `PHP ${branch} (floating): has the ${newest?.adv.name} fix only if built after ${readableDate(newest?.adv.published ?? '')}`,
452
+ };
453
+ }
454
+ function rangeVerdict(d, range, today) {
455
+ const parsed = parseComposerRange(range);
456
+ if (!parsed) {
457
+ return { severity: null, cwe: 'CWE-1104', message: '', reasoning: '', status: `\`${range}\`: a range Defuse cannot read` };
458
+ }
459
+ const allowedKnown = KNOWN_BRANCHES.filter((b) => branchAllowed(b, parsed));
460
+ const allowedSupported = supportedBranches(today).filter((b) => branchAllowed(b, parsed));
461
+ const [nmaj, nmin] = branchVersion(NEWEST_KNOWN);
462
+ const allowsNewer = satisfies([nmaj, nmin + 1, 0], parsed) || satisfies([nmaj + 1, 0, 0], parsed);
463
+ if (allowedSupported.length > 0 || allowsNewer || allowedKnown.length === 0) {
464
+ return {
465
+ severity: null, cwe: 'CWE-1104', message: '', reasoning: '',
466
+ status: allowedSupported.length > 0
467
+ ? `\`${range}\`: allows supported branches (${allowedSupported.slice().reverse().join(', ')}); a range does not say which one runs`
468
+ : `\`${range}\`: allows only branches newer than Defuse's table`,
469
+ };
470
+ }
471
+ const newest = allowedKnown[allowedKnown.length - 1] ?? '';
472
+ const noFix = PHP_ADVISORIES.filter((adv) => allowedKnown.every((b) => advisoryFor(adv, b) !== null));
473
+ return {
474
+ severity: 'high',
475
+ cwe: 'CWE-1104',
476
+ message: `composer.json allows only PHP versions that are out of security support (\`${range}\`)`,
477
+ reasoning: `${d.where} requires PHP \`${range}\`, which fits no branch that still gets security fixes - the newest it ` +
478
+ `allows is ${newest}, out of support since ${readableDate(PHP_END_OF_LIFE[newest] ?? PHP_SECURITY_UNTIL[newest] ?? PHP_FACTS_CHECKED)}.` +
479
+ (noFix.length > 0
480
+ ? ` No official release in those branches fixes ${noFix.map((a) => `${a.cves.join(' and ')} ("${a.name}")`).join(', ')}.`
481
+ : '') +
482
+ ' This is the range the project says it runs on, not proof of what the server runs: confirm with `php -v` where the code runs.',
483
+ status: `\`${range}\`: out-of-support branches only`,
484
+ };
485
+ }
486
+ /* ------------------------------------------------------------------ main -- */
487
+ export function checkRuntimeVersions(files, options) {
488
+ const notes = [];
489
+ const declarations = [];
490
+ for (const file of files) {
491
+ const kind = runtimeFileKind(file.path.split(/[\\/]/).pop() ?? '');
492
+ if (kind === 'dockerfile')
493
+ declarations.push(...readDockerfile(file, options.today));
494
+ else if (kind === 'compose')
495
+ declarations.push(...readCompose(file, options.today));
496
+ else if (kind === 'composer')
497
+ declarations.push(...readComposerJson(file, notes));
498
+ else if (kind === 'php-version')
499
+ declarations.push(...readPhpVersionFile(file));
500
+ }
501
+ const findings = [];
502
+ const declared = [];
503
+ for (const d of declarations) {
504
+ const verdict = d.range !== undefined
505
+ ? rangeVerdict(d, d.range, options.today)
506
+ : d.pinned?.kind === 'exact'
507
+ ? exactVerdict(d, d.pinned.version, d.pinned.prerelease, options.today)
508
+ : d.pinned?.kind === 'branch'
509
+ ? branchVerdict(d, d.pinned.branch, d.pinned.how, options.today)
510
+ : null;
511
+ declared.push({
512
+ file: d.file,
513
+ line: d.line,
514
+ source: d.source,
515
+ declared: d.text,
516
+ status: verdict?.status ?? `version not visible: ${d.pinned?.kind === 'unknown' ? d.pinned.why : 'unreadable'}`,
517
+ });
518
+ if (!verdict?.severity)
519
+ continue;
520
+ const inTestFile = isTestPath(d.file);
521
+ const severity = !inTestFile
522
+ ? verdict.severity
523
+ : verdict.severity === 'critical' ? 'medium' : verdict.severity === 'high' ? 'low' : verdict.severity;
524
+ const snippet = d.lineText.trim();
525
+ findings.push(signatureFinding({
526
+ ruleId: RUNTIME_VERSION_RULE.id,
527
+ ruleName: RUNTIME_VERSION_RULE.name,
528
+ cwe: verdict.cwe,
529
+ owasp: RUNTIME_VERSION_RULE.owasp,
530
+ severity,
531
+ message: verdict.message,
532
+ location: {
533
+ file: d.file,
534
+ startLine: d.line,
535
+ startColumn: d.column,
536
+ endLine: d.line,
537
+ endColumn: d.column + d.text.length,
538
+ astNodeType: d.nodeType,
539
+ astNodePath: `${d.source}`,
540
+ snippet: snippet.length > 160 ? `${snippet.slice(0, 159)}…` : snippet,
541
+ },
542
+ reasoning: `${verdict.reasoning} Facts from php.net, checked ${readableDate(PHP_FACTS_CHECKED)}.` +
543
+ (inTestFile
544
+ ? ' NOTE: this file looks like a test, fixture or example. The finding is accurate about the ' +
545
+ 'file, but a test setup is not reachable by an attacker, so severity is lowered rather than ' +
546
+ 'the finding dropped.'
547
+ : ''),
548
+ limitations: RUNTIME_VERSION_RULE.limitations,
549
+ }));
550
+ }
551
+ /*
552
+ * THE SILENCE THIS CHECK MUST NOT LEAVE. A PHP project with no readable
553
+ * version declaration gets no finding - and "no finding" would read as "the
554
+ * PHP version is fine". Say what was not checked instead.
555
+ */
556
+ if (options.phpFilesScanned > 0) {
557
+ if (declarations.length === 0) {
558
+ notes.push('This project has PHP files but declares no PHP version Defuse can read (the official php image in a ' +
559
+ 'Dockerfile or compose file, composer.json, or .php-version), so the PHP version it runs on was not checked.');
560
+ }
561
+ else if (declarations.every((d) => d.range !== undefined)) {
562
+ notes.push('The only PHP version this project declares is a composer.json range, which does not say which release ' +
563
+ 'runs. Check the server with `php -v`.');
564
+ }
565
+ }
566
+ const age = daysBetween(PHP_FACTS_CHECKED, options.today);
567
+ if (declarations.length > 0 && age > 180) {
568
+ notes.push(`Defuse's PHP release table was checked ${age} days before this scan (${readableDate(PHP_FACTS_CHECKED)}). ` +
569
+ 'Releases and advisories since then are not known to it.');
570
+ }
571
+ return { findings, declared, notes, factsChecked: PHP_FACTS_CHECKED };
572
+ }
573
+ //# sourceMappingURL=runtime-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-version.js","sourceRoot":"","sources":["../../../src/platform/runtime-version.ts"],"names":[],"mappings":"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"}