vaspera 2.14.0 → 2.15.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 (257) hide show
  1. package/CHANGELOG.md +45 -0
  2. package/README.md +15 -2
  3. package/dist/__tests__/certification/agent-certificate-e2e.test.d.ts +2 -0
  4. package/dist/__tests__/certification/agent-certificate-e2e.test.d.ts.map +1 -0
  5. package/dist/__tests__/certification/agent-certificate-e2e.test.js +90 -0
  6. package/dist/__tests__/certification/agent-certificate-e2e.test.js.map +1 -0
  7. package/dist/__tests__/certification/agent-certificate-map.test.d.ts +2 -0
  8. package/dist/__tests__/certification/agent-certificate-map.test.d.ts.map +1 -0
  9. package/dist/__tests__/certification/agent-certificate-map.test.js +107 -0
  10. package/dist/__tests__/certification/agent-certificate-map.test.js.map +1 -0
  11. package/dist/__tests__/certification/agent-certificate.test.d.ts +2 -0
  12. package/dist/__tests__/certification/agent-certificate.test.d.ts.map +1 -0
  13. package/dist/__tests__/certification/agent-certificate.test.js +78 -0
  14. package/dist/__tests__/certification/agent-certificate.test.js.map +1 -0
  15. package/dist/__tests__/certification/verify-endpoint.test.d.ts +2 -0
  16. package/dist/__tests__/certification/verify-endpoint.test.d.ts.map +1 -0
  17. package/dist/__tests__/certification/verify-endpoint.test.js +81 -0
  18. package/dist/__tests__/certification/verify-endpoint.test.js.map +1 -0
  19. package/dist/__tests__/compliance/ai-frameworks.test.d.ts +2 -0
  20. package/dist/__tests__/compliance/ai-frameworks.test.d.ts.map +1 -0
  21. package/dist/__tests__/compliance/ai-frameworks.test.js +87 -0
  22. package/dist/__tests__/compliance/ai-frameworks.test.js.map +1 -0
  23. package/dist/__tests__/eval/llm-analyzer.test.d.ts +2 -0
  24. package/dist/__tests__/eval/llm-analyzer.test.d.ts.map +1 -0
  25. package/dist/__tests__/eval/llm-analyzer.test.js +93 -0
  26. package/dist/__tests__/eval/llm-analyzer.test.js.map +1 -0
  27. package/dist/__tests__/eval/redteam-harness.test.d.ts +2 -0
  28. package/dist/__tests__/eval/redteam-harness.test.d.ts.map +1 -0
  29. package/dist/__tests__/eval/redteam-harness.test.js +136 -0
  30. package/dist/__tests__/eval/redteam-harness.test.js.map +1 -0
  31. package/dist/__tests__/evidence/evidence.test.d.ts +2 -0
  32. package/dist/__tests__/evidence/evidence.test.d.ts.map +1 -0
  33. package/dist/__tests__/evidence/evidence.test.js +240 -0
  34. package/dist/__tests__/evidence/evidence.test.js.map +1 -0
  35. package/dist/__tests__/history/decisions.test.d.ts +2 -0
  36. package/dist/__tests__/history/decisions.test.d.ts.map +1 -0
  37. package/dist/__tests__/history/decisions.test.js +54 -0
  38. package/dist/__tests__/history/decisions.test.js.map +1 -0
  39. package/dist/__tests__/http-auth.test.d.ts +2 -0
  40. package/dist/__tests__/http-auth.test.d.ts.map +1 -0
  41. package/dist/__tests__/http-auth.test.js +55 -0
  42. package/dist/__tests__/http-auth.test.js.map +1 -0
  43. package/dist/__tests__/http-policy.test.d.ts +2 -0
  44. package/dist/__tests__/http-policy.test.d.ts.map +1 -0
  45. package/dist/__tests__/http-policy.test.js +69 -0
  46. package/dist/__tests__/http-policy.test.js.map +1 -0
  47. package/dist/__tests__/http-server-transport.test.d.ts +2 -0
  48. package/dist/__tests__/http-server-transport.test.d.ts.map +1 -0
  49. package/dist/__tests__/http-server-transport.test.js +132 -0
  50. package/dist/__tests__/http-server-transport.test.js.map +1 -0
  51. package/dist/__tests__/integration/destructive-guards.test.d.ts +2 -0
  52. package/dist/__tests__/integration/destructive-guards.test.d.ts.map +1 -0
  53. package/dist/__tests__/integration/destructive-guards.test.js +49 -0
  54. package/dist/__tests__/integration/destructive-guards.test.js.map +1 -0
  55. package/dist/__tests__/logger-redaction.test.d.ts +2 -0
  56. package/dist/__tests__/logger-redaction.test.d.ts.map +1 -0
  57. package/dist/__tests__/logger-redaction.test.js +74 -0
  58. package/dist/__tests__/logger-redaction.test.js.map +1 -0
  59. package/dist/__tests__/manifest-schema.test.d.ts +2 -0
  60. package/dist/__tests__/manifest-schema.test.d.ts.map +1 -0
  61. package/dist/__tests__/manifest-schema.test.js +43 -0
  62. package/dist/__tests__/manifest-schema.test.js.map +1 -0
  63. package/dist/__tests__/scanners/builtin-rules.test.d.ts +2 -0
  64. package/dist/__tests__/scanners/builtin-rules.test.d.ts.map +1 -0
  65. package/dist/__tests__/scanners/builtin-rules.test.js +51 -0
  66. package/dist/__tests__/scanners/builtin-rules.test.js.map +1 -0
  67. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js +13 -1
  68. package/dist/__tests__/scanners/runtime/golden-path-runner.test.js.map +1 -1
  69. package/dist/__tests__/tool-guard.test.d.ts +2 -0
  70. package/dist/__tests__/tool-guard.test.d.ts.map +1 -0
  71. package/dist/__tests__/tool-guard.test.js +97 -0
  72. package/dist/__tests__/tool-guard.test.js.map +1 -0
  73. package/dist/__tests__/util/contained-file.test.d.ts +2 -0
  74. package/dist/__tests__/util/contained-file.test.d.ts.map +1 -0
  75. package/dist/__tests__/util/contained-file.test.js +78 -0
  76. package/dist/__tests__/util/contained-file.test.js.map +1 -0
  77. package/dist/__tests__/util/subprocess.test.d.ts +2 -0
  78. package/dist/__tests__/util/subprocess.test.d.ts.map +1 -0
  79. package/dist/__tests__/util/subprocess.test.js +48 -0
  80. package/dist/__tests__/util/subprocess.test.js.map +1 -0
  81. package/dist/action/diff-mode.d.ts.map +1 -1
  82. package/dist/action/diff-mode.js +31 -12
  83. package/dist/action/diff-mode.js.map +1 -1
  84. package/dist/certification/agent-certificate-map.d.ts +51 -0
  85. package/dist/certification/agent-certificate-map.d.ts.map +1 -0
  86. package/dist/certification/agent-certificate-map.js +265 -0
  87. package/dist/certification/agent-certificate-map.js.map +1 -0
  88. package/dist/certification/agent-certificate-sample.d.ts +25 -0
  89. package/dist/certification/agent-certificate-sample.d.ts.map +1 -0
  90. package/dist/certification/agent-certificate-sample.js +207 -0
  91. package/dist/certification/agent-certificate-sample.js.map +1 -0
  92. package/dist/certification/agent-certificate.d.ts +1981 -0
  93. package/dist/certification/agent-certificate.d.ts.map +1 -0
  94. package/dist/certification/agent-certificate.js +309 -0
  95. package/dist/certification/agent-certificate.js.map +1 -0
  96. package/dist/certification/autofix.d.ts.map +1 -1
  97. package/dist/certification/autofix.js +5 -3
  98. package/dist/certification/autofix.js.map +1 -1
  99. package/dist/certification/store.d.ts.map +1 -1
  100. package/dist/certification/store.js +5 -2
  101. package/dist/certification/store.js.map +1 -1
  102. package/dist/certification/verify-endpoint.d.ts +48 -0
  103. package/dist/certification/verify-endpoint.d.ts.map +1 -0
  104. package/dist/certification/verify-endpoint.js +79 -0
  105. package/dist/certification/verify-endpoint.js.map +1 -0
  106. package/dist/compliance/index.d.ts +2 -0
  107. package/dist/compliance/index.d.ts.map +1 -1
  108. package/dist/compliance/index.js +4 -0
  109. package/dist/compliance/index.js.map +1 -1
  110. package/dist/compliance/iso42001.d.ts +21 -0
  111. package/dist/compliance/iso42001.d.ts.map +1 -0
  112. package/dist/compliance/iso42001.js +160 -0
  113. package/dist/compliance/iso42001.js.map +1 -0
  114. package/dist/compliance/mapper.d.ts.map +1 -1
  115. package/dist/compliance/mapper.js +12 -0
  116. package/dist/compliance/mapper.js.map +1 -1
  117. package/dist/compliance/nist-ai-rmf.d.ts +20 -0
  118. package/dist/compliance/nist-ai-rmf.d.ts.map +1 -0
  119. package/dist/compliance/nist-ai-rmf.js +140 -0
  120. package/dist/compliance/nist-ai-rmf.js.map +1 -0
  121. package/dist/config/flags.d.ts +4 -4
  122. package/dist/eval/fixtures.d.ts.map +1 -1
  123. package/dist/eval/fixtures.js +161 -119
  124. package/dist/eval/fixtures.js.map +1 -1
  125. package/dist/eval/fixtures.test.js +4 -2
  126. package/dist/eval/fixtures.test.js.map +1 -1
  127. package/dist/eval/llm-analyzer.d.ts +40 -0
  128. package/dist/eval/llm-analyzer.d.ts.map +1 -0
  129. package/dist/eval/llm-analyzer.js +154 -0
  130. package/dist/eval/llm-analyzer.js.map +1 -0
  131. package/dist/eval/redteam-harness.d.ts +95 -0
  132. package/dist/eval/redteam-harness.d.ts.map +1 -0
  133. package/dist/eval/redteam-harness.js +137 -0
  134. package/dist/eval/redteam-harness.js.map +1 -0
  135. package/dist/evidence/collector.d.ts.map +1 -1
  136. package/dist/evidence/collector.js +21 -1
  137. package/dist/evidence/collector.js.map +1 -1
  138. package/dist/evidence/store.d.ts.map +1 -1
  139. package/dist/evidence/store.js +29 -5
  140. package/dist/evidence/store.js.map +1 -1
  141. package/dist/evidence/types.d.ts +16 -9
  142. package/dist/evidence/types.d.ts.map +1 -1
  143. package/dist/history/decisions.d.ts +63 -0
  144. package/dist/history/decisions.d.ts.map +1 -0
  145. package/dist/history/decisions.js +60 -0
  146. package/dist/history/decisions.js.map +1 -0
  147. package/dist/history/index.d.ts +2 -0
  148. package/dist/history/index.d.ts.map +1 -1
  149. package/dist/history/index.js +2 -0
  150. package/dist/history/index.js.map +1 -1
  151. package/dist/history/types.d.ts +34 -5
  152. package/dist/history/types.d.ts.map +1 -1
  153. package/dist/history/types.js +2 -0
  154. package/dist/history/types.js.map +1 -1
  155. package/dist/http-auth.d.ts +22 -0
  156. package/dist/http-auth.d.ts.map +1 -0
  157. package/dist/http-auth.js +58 -0
  158. package/dist/http-auth.js.map +1 -0
  159. package/dist/http-policy.d.ts +30 -0
  160. package/dist/http-policy.d.ts.map +1 -0
  161. package/dist/http-policy.js +54 -0
  162. package/dist/http-policy.js.map +1 -0
  163. package/dist/http-server.js +195 -12
  164. package/dist/http-server.js.map +1 -1
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +247 -15
  167. package/dist/index.js.map +1 -1
  168. package/dist/logger.d.ts.map +1 -1
  169. package/dist/logger.js +56 -2
  170. package/dist/logger.js.map +1 -1
  171. package/dist/plugins/types.d.ts +2 -2
  172. package/dist/scanners/agent/prompt-injection-fuzzer.d.ts.map +1 -1
  173. package/dist/scanners/agent/prompt-injection-fuzzer.js +26 -0
  174. package/dist/scanners/agent/prompt-injection-fuzzer.js.map +1 -1
  175. package/dist/scanners/agent/types.d.ts +10 -10
  176. package/dist/scanners/bandit.d.ts.map +1 -1
  177. package/dist/scanners/bandit.js +35 -29
  178. package/dist/scanners/bandit.js.map +1 -1
  179. package/dist/scanners/binary-analysis.d.ts.map +1 -1
  180. package/dist/scanners/binary-analysis.js +24 -49
  181. package/dist/scanners/binary-analysis.js.map +1 -1
  182. package/dist/scanners/brakeman.d.ts.map +1 -1
  183. package/dist/scanners/brakeman.js +19 -33
  184. package/dist/scanners/brakeman.js.map +1 -1
  185. package/dist/scanners/builtin-rules.d.ts +24 -0
  186. package/dist/scanners/builtin-rules.d.ts.map +1 -0
  187. package/dist/scanners/builtin-rules.js +175 -0
  188. package/dist/scanners/builtin-rules.js.map +1 -0
  189. package/dist/scanners/dast.d.ts.map +1 -1
  190. package/dist/scanners/dast.js +24 -34
  191. package/dist/scanners/dast.js.map +1 -1
  192. package/dist/scanners/deploy/types.d.ts +6 -6
  193. package/dist/scanners/eslint.d.ts.map +1 -1
  194. package/dist/scanners/eslint.js +15 -24
  195. package/dist/scanners/eslint.js.map +1 -1
  196. package/dist/scanners/gosec.d.ts.map +1 -1
  197. package/dist/scanners/gosec.js +14 -62
  198. package/dist/scanners/gosec.js.map +1 -1
  199. package/dist/scanners/index.d.ts.map +1 -1
  200. package/dist/scanners/index.js +38 -7
  201. package/dist/scanners/index.js.map +1 -1
  202. package/dist/scanners/memory-safety.d.ts.map +1 -1
  203. package/dist/scanners/memory-safety.js +27 -28
  204. package/dist/scanners/memory-safety.js.map +1 -1
  205. package/dist/scanners/openapi.d.ts.map +1 -1
  206. package/dist/scanners/openapi.js +14 -22
  207. package/dist/scanners/openapi.js.map +1 -1
  208. package/dist/scanners/race-condition.d.ts.map +1 -1
  209. package/dist/scanners/race-condition.js +17 -16
  210. package/dist/scanners/race-condition.js.map +1 -1
  211. package/dist/scanners/runtime/types.d.ts +4 -4
  212. package/dist/scanners/rust.d.ts.map +1 -1
  213. package/dist/scanners/rust.js +38 -37
  214. package/dist/scanners/rust.js.map +1 -1
  215. package/dist/scanners/scale/types.d.ts +16 -16
  216. package/dist/scanners/secrets.d.ts.map +1 -1
  217. package/dist/scanners/secrets.js +66 -78
  218. package/dist/scanners/secrets.js.map +1 -1
  219. package/dist/scanners/semgrep.d.ts +2 -0
  220. package/dist/scanners/semgrep.d.ts.map +1 -1
  221. package/dist/scanners/semgrep.js +12 -0
  222. package/dist/scanners/semgrep.js.map +1 -1
  223. package/dist/scanners/terraform.d.ts.map +1 -1
  224. package/dist/scanners/terraform.js +47 -40
  225. package/dist/scanners/terraform.js.map +1 -1
  226. package/dist/scanners/trivy.d.ts.map +1 -1
  227. package/dist/scanners/trivy.js +38 -30
  228. package/dist/scanners/trivy.js.map +1 -1
  229. package/dist/tool-guard.d.ts +40 -0
  230. package/dist/tool-guard.d.ts.map +1 -0
  231. package/dist/tool-guard.js +55 -0
  232. package/dist/tool-guard.js.map +1 -0
  233. package/dist/util/index.d.ts +2 -1
  234. package/dist/util/index.d.ts.map +1 -1
  235. package/dist/util/index.js +2 -1
  236. package/dist/util/index.js.map +1 -1
  237. package/dist/util/paths.d.ts +20 -3
  238. package/dist/util/paths.d.ts.map +1 -1
  239. package/dist/util/paths.js +84 -4
  240. package/dist/util/paths.js.map +1 -1
  241. package/dist/util/subprocess.d.ts +51 -0
  242. package/dist/util/subprocess.d.ts.map +1 -0
  243. package/dist/util/subprocess.js +77 -0
  244. package/dist/util/subprocess.js.map +1 -0
  245. package/package.json +12 -2
  246. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts +0 -28
  247. package/dist/eval/fixtures/healthcare/audit-gaps.d.ts.map +0 -1
  248. package/dist/eval/fixtures/healthcare/audit-gaps.js +0 -90
  249. package/dist/eval/fixtures/healthcare/audit-gaps.js.map +0 -1
  250. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts +0 -31
  251. package/dist/eval/fixtures/healthcare/consent-bypass.d.ts.map +0 -1
  252. package/dist/eval/fixtures/healthcare/consent-bypass.js +0 -61
  253. package/dist/eval/fixtures/healthcare/consent-bypass.js.map +0 -1
  254. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts +0 -24
  255. package/dist/eval/fixtures/healthcare/phi-in-logs.d.ts.map +0 -1
  256. package/dist/eval/fixtures/healthcare/phi-in-logs.js +0 -41
  257. package/dist/eval/fixtures/healthcare/phi-in-logs.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/scanners/terraform.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terraform.js","sourceRoot":"","sources":["../../src/scanners/terraform.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"trivy.d.ts","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAwB,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA6F3F;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAkBxE;AASD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACA,OAAO,CAAC,aAAa,CAAC,CA8IxB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAUrE"}
1
+ {"version":3,"file":"trivy.d.ts","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAwB,aAAa,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AA2F3F;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,mBAAmB,CAAC,CAexE;AASD;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,WAAW,EAAE,MAAM,EACnB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,IAAI,GAAG,QAAQ,GAAG,MAAM,CAAC;IACpC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB,GACA,OAAO,CAAC,aAAa,CAAC,CAsIxB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA+BrE"}
@@ -5,31 +5,27 @@
5
5
  *
6
6
  * @module scanners/trivy
7
7
  */
8
- import { exec } from "child_process";
9
- import { promisify } from "util";
8
+ import { runCommand, probeBinary } from "../util/subprocess.js";
9
+ import { parseJson } from "../util/json.js";
10
10
  import { SEVERITY_MAPPINGS } from "./types.js";
11
- const execAsync = promisify(exec);
12
11
  /**
13
12
  * Check if Trivy is available
14
13
  */
15
14
  export async function checkTrivyAvailable() {
16
- try {
17
- const { stdout } = await execAsync("trivy --version", { timeout: 5000 });
18
- const match = stdout.match(/Version: ([\d.]+)/);
19
- const version = match ? match[1] : stdout.trim().split("\n")[0];
15
+ const firstLine = await probeBinary("trivy");
16
+ if (firstLine !== null) {
17
+ const match = firstLine.match(/Version: ([\d.]+)/);
20
18
  return {
21
19
  scanner: "trivy",
22
20
  available: true,
23
- version,
24
- };
25
- }
26
- catch (error) {
27
- return {
28
- scanner: "trivy",
29
- available: false,
30
- error: error instanceof Error ? error.message : "Trivy not found",
21
+ version: match ? match[1] : firstLine,
31
22
  };
32
23
  }
24
+ return {
25
+ scanner: "trivy",
26
+ available: false,
27
+ error: "Trivy not found",
28
+ };
33
29
  }
34
30
  /**
35
31
  * Convert Trivy severity to vaspera severity
@@ -54,28 +50,20 @@ export async function runTrivy(projectPath, options) {
54
50
  error: "Trivy is not installed. Install from: https://aquasecurity.github.io/trivy/",
55
51
  };
56
52
  }
57
- // Build command
58
53
  const scanType = options?.scanType || "fs";
59
- let command = `trivy ${scanType} --format json`;
54
+ const args = [scanType, "--format", "json"];
60
55
  if (options?.ignoreUnfixed) {
61
- command += " --ignore-unfixed";
56
+ args.push("--ignore-unfixed");
62
57
  }
63
58
  if (options?.severity && options.severity.length > 0) {
64
- command += ` --severity ${options.severity.join(",")}`;
59
+ args.push("--severity", options.severity.join(","));
65
60
  }
66
- command += ` "${projectPath}"`;
67
- // Run Trivy
68
- const { stdout, stderr } = await execAsync(command, {
61
+ args.push(projectPath);
62
+ const { stdout } = await runCommand("trivy", args, {
69
63
  timeout: options?.timeout || 300000, // 5 minutes for Trivy
70
64
  maxBuffer: 50 * 1024 * 1024, // 50MB
71
- }).catch((error) => {
72
- if (error.stdout) {
73
- return { stdout: error.stdout, stderr: error.stderr || "" };
74
- }
75
- throw error;
76
65
  });
77
- // Parse JSON output
78
- const output = JSON.parse(stdout);
66
+ const output = parseJson(stdout, "trivy output");
79
67
  // Convert to DeterministicFindings
80
68
  const findings = [];
81
69
  for (const result of output.Results) {
@@ -177,7 +165,27 @@ export async function runTrivy(projectPath, options) {
177
165
  */
178
166
  export async function detectIaC(projectPath) {
179
167
  try {
180
- const { stdout } = await execAsync(`find "${projectPath}" -maxdepth 3 \\( -name "Dockerfile*" -o -name "*.tf" -o -name "*.yaml" -name "*compose*.yml" -o -name "kubernetes*.yaml" \\) | head -1`, { timeout: 5000 });
168
+ const { stdout } = await runCommand("find", [
169
+ projectPath,
170
+ "-maxdepth",
171
+ "3",
172
+ "(",
173
+ "-name",
174
+ "Dockerfile*",
175
+ "-o",
176
+ "-name",
177
+ "*.tf",
178
+ "-o",
179
+ "-name",
180
+ "*.yaml",
181
+ "-name",
182
+ "*compose*.yml",
183
+ "-o",
184
+ "-name",
185
+ "kubernetes*.yaml",
186
+ ")",
187
+ "-print",
188
+ ], { timeout: 5000 });
181
189
  return stdout.trim().length > 0;
182
190
  }
183
191
  catch {
@@ -1 +1 @@
1
- {"version":3,"file":"trivy.js","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"trivy.js","sourceRoot":"","sources":["../../src/scanners/trivy.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Tool registration guard.
3
+ *
4
+ * Enforces CONSTITUTION rule 3 — "every project_path input goes through
5
+ * validateProjectPath()" — by construction rather than by convention:
6
+ * once applied, ANY registered tool whose arguments include a string
7
+ * `project_path` has it validated and canonicalised before the handler
8
+ * runs, so individual handlers cannot forget the check. Handlers always
9
+ * receive a resolved, existing directory path.
10
+ *
11
+ * @module tool-guard
12
+ */
13
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
14
+ export interface ProjectPathGuardOptions {
15
+ /**
16
+ * When set, every project_path must resolve inside this directory
17
+ * (symlinks included). Wire to VASPERA_PATH_BOUNDARY for deployments
18
+ * that should never scan outside a workspace root.
19
+ */
20
+ basePath?: string;
21
+ }
22
+ type ToolHandler = (...handlerArgs: unknown[]) => unknown;
23
+ export interface ToolAnnotationsSummary {
24
+ readOnlyHint?: boolean;
25
+ destructiveHint?: boolean;
26
+ }
27
+ /**
28
+ * Registry of every registered tool's annotations, populated as tools
29
+ * are registered. The HTTP transport uses it to decide which tools may
30
+ * be invoked remotely (read-only by default).
31
+ */
32
+ export declare const toolAnnotations: Map<string, ToolAnnotationsSummary>;
33
+ /** Minimal structural view of McpServer used by the guard (method syntax
34
+ * keeps it bivariant so both real and fake servers are accepted). */
35
+ export interface ToolRegistrar {
36
+ registerTool(name: string, config: unknown, handler: ToolHandler): unknown;
37
+ }
38
+ export declare function applyProjectPathGuard(server: McpServer | ToolRegistrar, options?: ProjectPathGuardOptions): void;
39
+ export {};
40
+ //# sourceMappingURL=tool-guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-guard.d.ts","sourceRoot":"","sources":["../src/tool-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAGzE,MAAM,WAAW,uBAAuB;IACtC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,KAAK,WAAW,GAAG,CAAC,GAAG,WAAW,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAE1D,MAAM,WAAW,sBAAsB;IACrC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED;;;;GAIG;AACH,eAAO,MAAM,eAAe,qCAA4C,CAAC;AAEzE;qEACqE;AACrE,MAAM,WAAW,aAAa;IAC5B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC;CAC5E;AAED,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,SAAS,GAAG,aAAa,EACjC,OAAO,GAAE,uBAA4B,GACpC,IAAI,CAwCN"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Tool registration guard.
3
+ *
4
+ * Enforces CONSTITUTION rule 3 — "every project_path input goes through
5
+ * validateProjectPath()" — by construction rather than by convention:
6
+ * once applied, ANY registered tool whose arguments include a string
7
+ * `project_path` has it validated and canonicalised before the handler
8
+ * runs, so individual handlers cannot forget the check. Handlers always
9
+ * receive a resolved, existing directory path.
10
+ *
11
+ * @module tool-guard
12
+ */
13
+ import { validateProjectPath, PathValidationError } from "./util/paths.js";
14
+ /**
15
+ * Registry of every registered tool's annotations, populated as tools
16
+ * are registered. The HTTP transport uses it to decide which tools may
17
+ * be invoked remotely (read-only by default).
18
+ */
19
+ export const toolAnnotations = new Map();
20
+ export function applyProjectPathGuard(server, options = {}) {
21
+ const registrar = server;
22
+ const original = registrar.registerTool.bind(registrar);
23
+ const patched = (name, config, handler) => {
24
+ const annotations = config
25
+ ?.annotations;
26
+ toolAnnotations.set(name, {
27
+ readOnlyHint: annotations?.readOnlyHint,
28
+ destructiveHint: annotations?.destructiveHint,
29
+ });
30
+ const guarded = async (first, ...rest) => {
31
+ if (first &&
32
+ typeof first === "object" &&
33
+ typeof first.project_path === "string") {
34
+ const args = first;
35
+ try {
36
+ const validated = await validateProjectPath(args.project_path, options.basePath ? { basePath: options.basePath } : {});
37
+ first = { ...args, project_path: validated };
38
+ }
39
+ catch (error) {
40
+ if (error instanceof PathValidationError) {
41
+ return {
42
+ content: [{ type: "text", text: `Error: ${error.message}` }],
43
+ isError: true,
44
+ };
45
+ }
46
+ throw error;
47
+ }
48
+ }
49
+ return handler(first, ...rest);
50
+ };
51
+ return original(name, config, guarded);
52
+ };
53
+ registrar.registerTool = patched;
54
+ }
55
+ //# sourceMappingURL=tool-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-guard.js","sourceRoot":"","sources":["../src/tool-guard.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAGH,OAAO,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAkB3E;;;;GAIG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkC,CAAC;AAQzE,MAAM,UAAU,qBAAqB,CACnC,MAAiC,EACjC,UAAmC,EAAE;IAErC,MAAM,SAAS,GAAG,MAAuB,CAAC;IAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAExD,MAAM,OAAO,GAAG,CAAC,IAAY,EAAE,MAAe,EAAE,OAAoB,EAAE,EAAE;QACtE,MAAM,WAAW,GAAI,MAA0D;YAC7E,EAAE,WAAW,CAAC;QAChB,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE;YACxB,YAAY,EAAE,WAAW,EAAE,YAAY;YACvC,eAAe,EAAE,WAAW,EAAE,eAAe;SAC9C,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,KAAK,EAAE,KAAc,EAAE,GAAG,IAAe,EAAE,EAAE;YAC3D,IACE,KAAK;gBACL,OAAO,KAAK,KAAK,QAAQ;gBACzB,OAAQ,KAAiC,CAAC,YAAY,KAAK,QAAQ,EACnE,CAAC;gBACD,MAAM,IAAI,GAAG,KAAgC,CAAC;gBAC9C,IAAI,CAAC;oBACH,MAAM,SAAS,GAAG,MAAM,mBAAmB,CACzC,IAAI,CAAC,YAAsB,EAC3B,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CACvD,CAAC;oBACF,KAAK,GAAG,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,SAAS,EAAE,CAAC;gBAC/C,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;wBACzC,OAAO;4BACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,UAAU,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;4BACrE,OAAO,EAAE,IAAI;yBACd,CAAC;oBACJ,CAAC;oBACD,MAAM,KAAK,CAAC;gBACd,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC,CAAC;QACF,OAAO,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,OAAsB,CAAC,CAAC;IACxD,CAAC,CAAC;IAED,SAAuC,CAAC,YAAY,GAAG,OAAO,CAAC;AAClE,CAAC"}
@@ -5,8 +5,9 @@
5
5
  *
6
6
  * @module util
7
7
  */
8
- export { validateProjectPath, validateFilePath, isPathSafe, sanitizePathForLogging, PathValidationError, type ValidatePathOptions, } from "./paths.js";
8
+ export { validateProjectPath, validateFilePath, isPathSafe, resolveContainedFile, sanitizePathForLogging, PathValidationError, type ValidatePathOptions, } from "./paths.js";
9
9
  export { parseJson, tryParseJson, parseJsonOrDefault, isValidJson, safeStringify, JsonParseError, type ParseJsonOptions, } from "./json.js";
10
10
  export { withRetry, withRetryAndCircuitBreaker, createRetryWrapper, classifyError, CircuitBreaker, RetryError, CircuitOpenError, type RetryOptions, type CircuitBreakerOptions, type ErrorType, type CircuitState, } from "./retry.js";
11
+ export { runCommand, probeBinary, CommandError, type RunCommandOptions, type RunCommandResult, } from "./subprocess.js";
11
12
  export { PromiseQueue, runConcurrent, runConcurrentValues, mapConcurrent, throttle, batchConcurrent, getConcurrencyLevel, DEFAULT_CONCURRENCY, type QueueOptions, type QueueTask, type TaskResult, type QueueStats, } from "./concurrency.js";
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,mBAAmB,GACzB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,EACd,KAAK,gBAAgB,GACtB,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,EAChB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAC1B,KAAK,SAAS,EACd,KAAK,YAAY,GAClB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,EACZ,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,EACnB,KAAK,YAAY,EACjB,KAAK,SAAS,EACd,KAAK,UAAU,EACf,KAAK,UAAU,GAChB,MAAM,kBAAkB,CAAC"}
@@ -5,8 +5,9 @@
5
5
  *
6
6
  * @module util
7
7
  */
8
- export { validateProjectPath, validateFilePath, isPathSafe, sanitizePathForLogging, PathValidationError, } from "./paths.js";
8
+ export { validateProjectPath, validateFilePath, isPathSafe, resolveContainedFile, sanitizePathForLogging, PathValidationError, } from "./paths.js";
9
9
  export { parseJson, tryParseJson, parseJsonOrDefault, isValidJson, safeStringify, JsonParseError, } from "./json.js";
10
10
  export { withRetry, withRetryAndCircuitBreaker, createRetryWrapper, classifyError, CircuitBreaker, RetryError, CircuitOpenError, } from "./retry.js";
11
+ export { runCommand, probeBinary, CommandError, } from "./subprocess.js";
11
12
  export { PromiseQueue, runConcurrent, runConcurrentValues, mapConcurrent, throttle, batchConcurrent, getConcurrencyLevel, DEFAULT_CONCURRENCY, } from "./concurrency.js";
12
13
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GAEf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GAKpB,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/util/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,SAAS,EACT,YAAY,EACZ,kBAAkB,EAClB,WAAW,EACX,aAAa,EACb,cAAc,GAEf,MAAM,WAAW,CAAC;AAEnB,OAAO,EACL,SAAS,EACT,0BAA0B,EAC1B,kBAAkB,EAClB,aAAa,EACb,cAAc,EACd,UAAU,EACV,gBAAgB,GAKjB,MAAM,YAAY,CAAC;AAEpB,OAAO,EACL,UAAU,EACV,WAAW,EACX,YAAY,GAGb,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EACL,YAAY,EACZ,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,mBAAmB,GAKpB,MAAM,kBAAkB,CAAC"}
@@ -14,9 +14,6 @@ export declare class PathValidationError extends Error {
14
14
  readonly reason: "not_found" | "not_directory" | "symlink_escape" | "path_traversal" | "invalid_path";
15
15
  constructor(message: string, path: string, reason: "not_found" | "not_directory" | "symlink_escape" | "path_traversal" | "invalid_path");
16
16
  }
17
- /**
18
- * Options for path validation
19
- */
20
17
  export interface ValidatePathOptions {
21
18
  /** Require the path to be a directory (default: true) */
22
19
  requireDirectory?: boolean;
@@ -49,6 +46,26 @@ export declare function validateFilePath(filePath: string, options?: Omit<Valida
49
46
  * Check if a path is safe (doesn't throw, returns boolean)
50
47
  */
51
48
  export declare function isPathSafe(projectPath: string, options?: ValidatePathOptions): Promise<boolean>;
49
+ /**
50
+ * Resolve a relative file path inside a project tree, rejecting escapes.
51
+ * For paths that originate from untrusted sources (scanner output, agent
52
+ * findings): `../` sequences, absolute paths, and in-tree symlinks
53
+ * pointing outside the project are all refused.
54
+ *
55
+ * @returns The real (symlink-resolved) absolute path of the file
56
+ * @throws PathValidationError if the path escapes the project tree
57
+ */
58
+ export declare function resolveContainedFile(projectPath: string, relFile: string): Promise<string>;
59
+ /**
60
+ * Resolve a relative *write* target inside a project tree, rejecting
61
+ * escapes — like resolveContainedFile but for a file that may not exist
62
+ * yet (the parent directory must exist and is symlink-resolved).
63
+ * For untrusted output paths (e.g. an `output_file` tool argument).
64
+ *
65
+ * @returns The absolute path to write to, contained within the tree
66
+ * @throws PathValidationError if the path escapes the project tree
67
+ */
68
+ export declare function resolveContainedWritePath(projectPath: string, relFile: string): Promise<string>;
52
69
  /**
53
70
  * Sanitize a path for use in error messages (remove sensitive info)
54
71
  */
@@ -1 +1 @@
1
- {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,MAAM;aACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;gBAPlB,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;CAKrB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAiGjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAM,GAC1D,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOhE"}
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAKH;;GAEG;AACH,qBAAa,mBAAoB,SAAQ,KAAK;aAG1B,IAAI,EAAE,MAAM;aACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;gBAPlB,OAAO,EAAE,MAAM,EACC,IAAI,EAAE,MAAM,EACZ,MAAM,EAClB,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,gBAAgB,GAChB,cAAc;CAKrB;AAUD,MAAM,WAAW,mBAAmB;IAClC,yDAAyD;IACzD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,MAAM,CAAC,CAoGjB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,IAAI,CAAC,mBAAmB,EAAE,kBAAkB,CAAM,GAC1D,OAAO,CAAC,MAAM,CAAC,CAEjB;AAED;;GAEG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,OAAO,CAAC,CAOlB;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACxC,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAqBjB;AAED;;;;;;;;GAQG;AACH,wBAAsB,yBAAyB,CAC7C,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAoDjB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAOhE"}
@@ -21,6 +21,13 @@ export class PathValidationError extends Error {
21
21
  this.name = "PathValidationError";
22
22
  }
23
23
  }
24
+ /**
25
+ * Options for path validation
26
+ */
27
+ /** Segment-aware containment: "/base" must not match "/base-evil". */
28
+ function isWithin(target, base) {
29
+ return target === base || target.startsWith(base + path.sep);
30
+ }
24
31
  /**
25
32
  * Validate a project path for security
26
33
  *
@@ -59,7 +66,7 @@ export async function validateProjectPath(projectPath, options = {}) {
59
66
  // If basePath is specified, ensure symlink target is within it
60
67
  if (basePath) {
61
68
  const resolvedBase = path.resolve(basePath);
62
- if (!realPath.startsWith(resolvedBase)) {
69
+ if (!isWithin(realPath, resolvedBase)) {
63
70
  throw new PathValidationError(`Symlink escapes base directory: ${projectPath} -> ${realPath}`, projectPath, "symlink_escape");
64
71
  }
65
72
  }
@@ -75,10 +82,13 @@ export async function validateProjectPath(projectPath, options = {}) {
75
82
  if (requireDirectory && !lstats.isDirectory()) {
76
83
  throw new PathValidationError(`Path is not a directory: ${projectPath}`, projectPath, "not_directory");
77
84
  }
78
- // If basePath is specified, ensure the path is within it
85
+ // If basePath is specified, ensure the path is within it. Compare
86
+ // *real* paths so a symlinked ancestor (e.g. /base/link/sub where
87
+ // /base/link -> /etc) cannot escape via a lexical-only check.
79
88
  if (basePath) {
80
- const resolvedBase = path.resolve(basePath);
81
- if (!resolvedPath.startsWith(resolvedBase)) {
89
+ const realBase = await realpath(path.resolve(basePath));
90
+ const realTarget = await realpath(resolvedPath);
91
+ if (!isWithin(realTarget, realBase)) {
82
92
  throw new PathValidationError(`Path is outside base directory: ${projectPath}`, projectPath, "path_traversal");
83
93
  }
84
94
  }
@@ -114,6 +124,76 @@ export async function isPathSafe(projectPath, options = {}) {
114
124
  return false;
115
125
  }
116
126
  }
127
+ /**
128
+ * Resolve a relative file path inside a project tree, rejecting escapes.
129
+ * For paths that originate from untrusted sources (scanner output, agent
130
+ * findings): `../` sequences, absolute paths, and in-tree symlinks
131
+ * pointing outside the project are all refused.
132
+ *
133
+ * @returns The real (symlink-resolved) absolute path of the file
134
+ * @throws PathValidationError if the path escapes the project tree
135
+ */
136
+ export async function resolveContainedFile(projectPath, relFile) {
137
+ const root = await realpath(projectPath);
138
+ const contained = (p) => p === root || p.startsWith(root + path.sep);
139
+ const target = path.resolve(root, relFile);
140
+ if (!contained(target)) {
141
+ throw new PathValidationError(`File path escapes project tree: ${relFile}`, relFile, "path_traversal");
142
+ }
143
+ const real = await realpath(target);
144
+ if (!contained(real)) {
145
+ throw new PathValidationError(`Symlinked file escapes project tree: ${relFile}`, relFile, "symlink_escape");
146
+ }
147
+ return real;
148
+ }
149
+ /**
150
+ * Resolve a relative *write* target inside a project tree, rejecting
151
+ * escapes — like resolveContainedFile but for a file that may not exist
152
+ * yet (the parent directory must exist and is symlink-resolved).
153
+ * For untrusted output paths (e.g. an `output_file` tool argument).
154
+ *
155
+ * @returns The absolute path to write to, contained within the tree
156
+ * @throws PathValidationError if the path escapes the project tree
157
+ */
158
+ export async function resolveContainedWritePath(projectPath, relFile) {
159
+ const root = await realpath(projectPath);
160
+ const contained = (p) => p === root || p.startsWith(root + path.sep);
161
+ const target = path.resolve(root, relFile);
162
+ if (!contained(target)) {
163
+ throw new PathValidationError(`File path escapes project tree: ${relFile}`, relFile, "path_traversal");
164
+ }
165
+ // The leaf (and possibly intermediate dirs) may not exist yet. Resolve
166
+ // the nearest existing ancestor through symlinks so a symlinked
167
+ // directory inside the tree cannot redirect the write outside it, then
168
+ // re-attach the not-yet-existing remainder.
169
+ let ancestor = path.dirname(target);
170
+ while (true) {
171
+ try {
172
+ const realAncestor = await realpath(ancestor);
173
+ if (!contained(realAncestor)) {
174
+ throw new PathValidationError(`Symlinked directory escapes project tree: ${relFile}`, relFile, "symlink_escape");
175
+ }
176
+ const remainder = path.relative(ancestor, target);
177
+ const finalPath = path.join(realAncestor, remainder);
178
+ if (!contained(finalPath)) {
179
+ throw new PathValidationError(`File path escapes project tree: ${relFile}`, relFile, "path_traversal");
180
+ }
181
+ return finalPath;
182
+ }
183
+ catch (error) {
184
+ if (error instanceof PathValidationError)
185
+ throw error;
186
+ if (error.code !== "ENOENT")
187
+ throw error;
188
+ const parent = path.dirname(ancestor);
189
+ if (parent === ancestor) {
190
+ // Reached the filesystem root without an existing ancestor.
191
+ throw new PathValidationError(`Cannot resolve write path: ${relFile}`, relFile, "invalid_path");
192
+ }
193
+ ancestor = parent;
194
+ }
195
+ }
196
+ }
117
197
  /**
118
198
  * Sanitize a path for use in error messages (remove sensitive info)
119
199
  */
@@ -1 +1 @@
1
- {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../../src/util/paths.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Safe subprocess execution for scanner adapters.
3
+ *
4
+ * Wraps execFile (never a shell) so argument values — project paths,
5
+ * target URLs, config file paths — can never be interpreted as shell
6
+ * syntax. This is the only sanctioned way to invoke external scanner
7
+ * binaries (CONSTITUTION: "No string-concat shell commands").
8
+ *
9
+ * @module util/subprocess
10
+ */
11
+ export declare class CommandError extends Error {
12
+ readonly binary: string;
13
+ readonly args: string[];
14
+ readonly exitCode: number | null;
15
+ readonly stdout: string;
16
+ readonly stderr: string;
17
+ readonly cause?: Error | undefined;
18
+ constructor(message: string, binary: string, args: string[], exitCode: number | null, stdout: string, stderr: string, cause?: Error | undefined);
19
+ }
20
+ export interface RunCommandOptions {
21
+ /** Milliseconds before the process is killed. Default 120000. */
22
+ timeout?: number;
23
+ /** Max bytes captured per stream. Default 10MB. */
24
+ maxBuffer?: number;
25
+ cwd?: string;
26
+ env?: NodeJS.ProcessEnv;
27
+ /**
28
+ * Scanners conventionally exit non-zero when findings exist (e.g.
29
+ * bandit/semgrep exit 1). When true (default), a non-zero exit that
30
+ * still produced stdout resolves normally instead of throwing —
31
+ * matching the historical execAsync `.catch(e => e.stdout)` pattern.
32
+ */
33
+ tolerateExitWithOutput?: boolean;
34
+ }
35
+ export interface RunCommandResult {
36
+ stdout: string;
37
+ stderr: string;
38
+ exitCode: number;
39
+ }
40
+ /**
41
+ * Run a binary with discrete argv entries. No shell is ever invoked,
42
+ * so callers MUST NOT pre-quote values or pass shell syntax
43
+ * (pipes, redirects, `&&`) — restructure such logic in JS instead.
44
+ */
45
+ export declare function runCommand(binary: string, args: string[], options?: RunCommandOptions): Promise<RunCommandResult>;
46
+ /**
47
+ * Probe for a scanner binary by running it with a version-style flag.
48
+ * Returns the first line of stdout (trimmed) or null when unavailable.
49
+ */
50
+ export declare function probeBinary(binary: string, args?: string[], timeout?: number): Promise<string | null>;
51
+ //# sourceMappingURL=subprocess.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"subprocess.d.ts","sourceRoot":"","sources":["../../src/util/subprocess.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,qBAAa,YAAa,SAAQ,KAAK;aAGnB,MAAM,EAAE,MAAM;aACd,IAAI,EAAE,MAAM,EAAE;aACd,QAAQ,EAAE,MAAM,GAAG,IAAI;aACvB,MAAM,EAAE,MAAM;aACd,MAAM,EAAE,MAAM;aACd,KAAK,CAAC,EAAE,KAAK;gBAN7B,OAAO,EAAE,MAAM,EACC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,KAAK,CAAC,EAAE,KAAK,YAAA;CAKhC;AAED,MAAM,WAAW,iBAAiB;IAChC,iEAAiE;IACjE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mDAAmD;IACnD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;;OAKG;IACH,sBAAsB,CAAC,EAAE,OAAO,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAC9B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EAAE,EACd,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC,gBAAgB,CAAC,CAqD3B;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,MAAM,EAAkB,EAC9B,OAAO,SAAO,GACb,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAUxB"}