openpitstop 1.0.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 (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +512 -0
  3. package/demo-repo/README.md +24 -0
  4. package/demo-repo/package-lock.json +4483 -0
  5. package/demo-repo/package.json +17 -0
  6. package/demo-repo/src/config.js +5 -0
  7. package/demo-repo/src/db.js +31 -0
  8. package/demo-repo/src/server.js +13 -0
  9. package/demo-repo/src/userController.js +22 -0
  10. package/demo-repo/src/userRepo.js +18 -0
  11. package/demo-repo/src/userService.js +59 -0
  12. package/demo-repo/test/user.test.js +12 -0
  13. package/demo-repo-fintech/README.md +27 -0
  14. package/demo-repo-fintech/package-lock.json +1023 -0
  15. package/demo-repo-fintech/package.json +14 -0
  16. package/demo-repo-fintech/pitstop-repro-ledger-order-ord-conc-1-charged-2.test.mjs +175 -0
  17. package/demo-repo-fintech/pitstop-repro-ledger-order-ord-retry-2-charged-2.test.mjs +175 -0
  18. package/demo-repo-fintech/pitstop-repro-ledger-order-ord-webhook-3-charged-2.test.mjs +175 -0
  19. package/demo-repo-fintech/src/gateway.js +26 -0
  20. package/demo-repo-fintech/src/server.js +61 -0
  21. package/demo-repo-generators/package-lock.json +1508 -0
  22. package/demo-repo-generators/package.json +17 -0
  23. package/demo-repo-generators/public/index.html +10 -0
  24. package/demo-repo-generators/scripts/build.js +17 -0
  25. package/demo-repo-generators/src/counter.js +16 -0
  26. package/demo-repo-integrity/README.md +49 -0
  27. package/demo-repo-integrity/package.json +12 -0
  28. package/demo-repo-integrity/src/money.js +19 -0
  29. package/demo-repo-integrity/test/money.test.js +17 -0
  30. package/dist/analyzers/accessibility.d.ts +18 -0
  31. package/dist/analyzers/accessibility.js +248 -0
  32. package/dist/analyzers/accessibility.js.map +1 -0
  33. package/dist/analyzers/dependencyGraph.d.ts +14 -0
  34. package/dist/analyzers/dependencyGraph.js +206 -0
  35. package/dist/analyzers/dependencyGraph.js.map +1 -0
  36. package/dist/analyzers/devex.d.ts +19 -0
  37. package/dist/analyzers/devex.js +301 -0
  38. package/dist/analyzers/devex.js.map +1 -0
  39. package/dist/analyzers/duplication.d.ts +2 -0
  40. package/dist/analyzers/duplication.js +47 -0
  41. package/dist/analyzers/duplication.js.map +1 -0
  42. package/dist/analyzers/index.d.ts +12 -0
  43. package/dist/analyzers/index.js +38 -0
  44. package/dist/analyzers/index.js.map +1 -0
  45. package/dist/analyzers/integrity/assertionLiteralTamper.d.ts +2 -0
  46. package/dist/analyzers/integrity/assertionLiteralTamper.js +164 -0
  47. package/dist/analyzers/integrity/assertionLiteralTamper.js.map +1 -0
  48. package/dist/analyzers/integrity/exceptionSwallow.d.ts +2 -0
  49. package/dist/analyzers/integrity/exceptionSwallow.js +198 -0
  50. package/dist/analyzers/integrity/exceptionSwallow.js.map +1 -0
  51. package/dist/analyzers/integrity/exitCheat.d.ts +2 -0
  52. package/dist/analyzers/integrity/exitCheat.js +31 -0
  53. package/dist/analyzers/integrity/exitCheat.js.map +1 -0
  54. package/dist/analyzers/integrity/git.d.ts +10 -0
  55. package/dist/analyzers/integrity/git.js +181 -0
  56. package/dist/analyzers/integrity/git.js.map +1 -0
  57. package/dist/analyzers/integrity/hardcodedMatch.d.ts +2 -0
  58. package/dist/analyzers/integrity/hardcodedMatch.js +93 -0
  59. package/dist/analyzers/integrity/hardcodedMatch.js.map +1 -0
  60. package/dist/analyzers/integrity/helpers.d.ts +21 -0
  61. package/dist/analyzers/integrity/helpers.js +66 -0
  62. package/dist/analyzers/integrity/helpers.js.map +1 -0
  63. package/dist/analyzers/integrity/index.d.ts +10 -0
  64. package/dist/analyzers/integrity/index.js +27 -0
  65. package/dist/analyzers/integrity/index.js.map +1 -0
  66. package/dist/analyzers/integrity/mockOverreach.d.ts +2 -0
  67. package/dist/analyzers/integrity/mockOverreach.js +72 -0
  68. package/dist/analyzers/integrity/mockOverreach.js.map +1 -0
  69. package/dist/analyzers/integrity/suppressionCreep.d.ts +2 -0
  70. package/dist/analyzers/integrity/suppressionCreep.js +27 -0
  71. package/dist/analyzers/integrity/suppressionCreep.js.map +1 -0
  72. package/dist/analyzers/integrity/testTamper.d.ts +2 -0
  73. package/dist/analyzers/integrity/testTamper.js +153 -0
  74. package/dist/analyzers/integrity/testTamper.js.map +1 -0
  75. package/dist/analyzers/integrity/types.d.ts +63 -0
  76. package/dist/analyzers/integrity/types.js +13 -0
  77. package/dist/analyzers/integrity/types.js.map +1 -0
  78. package/dist/analyzers/ledger/attacks.d.ts +17 -0
  79. package/dist/analyzers/ledger/attacks.js +135 -0
  80. package/dist/analyzers/ledger/attacks.js.map +1 -0
  81. package/dist/analyzers/ledger/discover.d.ts +15 -0
  82. package/dist/analyzers/ledger/discover.js +122 -0
  83. package/dist/analyzers/ledger/discover.js.map +1 -0
  84. package/dist/analyzers/ledger/evidence.d.ts +22 -0
  85. package/dist/analyzers/ledger/evidence.js +127 -0
  86. package/dist/analyzers/ledger/evidence.js.map +1 -0
  87. package/dist/analyzers/ledger/harness.d.ts +4 -0
  88. package/dist/analyzers/ledger/harness.js +270 -0
  89. package/dist/analyzers/ledger/harness.js.map +1 -0
  90. package/dist/analyzers/ledger/index.d.ts +14 -0
  91. package/dist/analyzers/ledger/index.js +116 -0
  92. package/dist/analyzers/ledger/index.js.map +1 -0
  93. package/dist/analyzers/ledger/types.d.ts +31 -0
  94. package/dist/analyzers/ledger/types.js +2 -0
  95. package/dist/analyzers/ledger/types.js.map +1 -0
  96. package/dist/analyzers/perf.d.ts +2 -0
  97. package/dist/analyzers/perf.js +106 -0
  98. package/dist/analyzers/perf.js.map +1 -0
  99. package/dist/analyzers/reliability.d.ts +22 -0
  100. package/dist/analyzers/reliability.js +339 -0
  101. package/dist/analyzers/reliability.js.map +1 -0
  102. package/dist/analyzers/routes.d.ts +17 -0
  103. package/dist/analyzers/routes.js +115 -0
  104. package/dist/analyzers/routes.js.map +1 -0
  105. package/dist/analyzers/security.d.ts +2 -0
  106. package/dist/analyzers/security.js +302 -0
  107. package/dist/analyzers/security.js.map +1 -0
  108. package/dist/analyzers/suiteRunner.d.ts +64 -0
  109. package/dist/analyzers/suiteRunner.js +381 -0
  110. package/dist/analyzers/suiteRunner.js.map +1 -0
  111. package/dist/analyzers/tests.d.ts +2 -0
  112. package/dist/analyzers/tests.js +215 -0
  113. package/dist/analyzers/tests.js.map +1 -0
  114. package/dist/analyzers/types.d.ts +203 -0
  115. package/dist/analyzers/types.js +2 -0
  116. package/dist/analyzers/types.js.map +1 -0
  117. package/dist/analyzers/util.d.ts +35 -0
  118. package/dist/analyzers/util.js +209 -0
  119. package/dist/analyzers/util.js.map +1 -0
  120. package/dist/ciCheckA.d.ts +2 -0
  121. package/dist/ciCheckA.js +5 -0
  122. package/dist/ciCheckA.js.map +1 -0
  123. package/dist/ciCheckB.d.ts +2 -0
  124. package/dist/ciCheckB.js +6 -0
  125. package/dist/ciCheckB.js.map +1 -0
  126. package/dist/cli.d.ts +2 -0
  127. package/dist/cli.js +65 -0
  128. package/dist/cli.js.map +1 -0
  129. package/dist/commands/budget.d.ts +33 -0
  130. package/dist/commands/budget.js +108 -0
  131. package/dist/commands/budget.js.map +1 -0
  132. package/dist/commands/ci.d.ts +14 -0
  133. package/dist/commands/ci.js +157 -0
  134. package/dist/commands/ci.js.map +1 -0
  135. package/dist/commands/demo.d.ts +2 -0
  136. package/dist/commands/demo.js +163 -0
  137. package/dist/commands/demo.js.map +1 -0
  138. package/dist/commands/digest.d.ts +8 -0
  139. package/dist/commands/digest.js +189 -0
  140. package/dist/commands/digest.js.map +1 -0
  141. package/dist/commands/doctor.d.ts +2 -0
  142. package/dist/commands/doctor.js +98 -0
  143. package/dist/commands/doctor.js.map +1 -0
  144. package/dist/commands/drive.d.ts +3 -0
  145. package/dist/commands/drive.js +170 -0
  146. package/dist/commands/drive.js.map +1 -0
  147. package/dist/commands/gate.d.ts +2 -0
  148. package/dist/commands/gate.js +136 -0
  149. package/dist/commands/gate.js.map +1 -0
  150. package/dist/commands/honesty.d.ts +2 -0
  151. package/dist/commands/honesty.js +182 -0
  152. package/dist/commands/honesty.js.map +1 -0
  153. package/dist/commands/inspect.d.ts +2 -0
  154. package/dist/commands/inspect.js +244 -0
  155. package/dist/commands/inspect.js.map +1 -0
  156. package/dist/commands/install.d.ts +2 -0
  157. package/dist/commands/install.js +81 -0
  158. package/dist/commands/install.js.map +1 -0
  159. package/dist/commands/integrity.d.ts +2 -0
  160. package/dist/commands/integrity.js +74 -0
  161. package/dist/commands/integrity.js.map +1 -0
  162. package/dist/commands/memory.d.ts +6 -0
  163. package/dist/commands/memory.js +90 -0
  164. package/dist/commands/memory.js.map +1 -0
  165. package/dist/commands/pen.d.ts +17 -0
  166. package/dist/commands/pen.js +158 -0
  167. package/dist/commands/pen.js.map +1 -0
  168. package/dist/commands/prompt.d.ts +2 -0
  169. package/dist/commands/prompt.js +37 -0
  170. package/dist/commands/prompt.js.map +1 -0
  171. package/dist/commands/readyCheck.d.ts +21 -0
  172. package/dist/commands/readyCheck.js +68 -0
  173. package/dist/commands/readyCheck.js.map +1 -0
  174. package/dist/commands/report.d.ts +2 -0
  175. package/dist/commands/report.js +48 -0
  176. package/dist/commands/report.js.map +1 -0
  177. package/dist/commands/repro.d.ts +3 -0
  178. package/dist/commands/repro.js +61 -0
  179. package/dist/commands/repro.js.map +1 -0
  180. package/dist/commands/scan.d.ts +27 -0
  181. package/dist/commands/scan.js +348 -0
  182. package/dist/commands/scan.js.map +1 -0
  183. package/dist/commands/share.d.ts +2 -0
  184. package/dist/commands/share.js +163 -0
  185. package/dist/commands/share.js.map +1 -0
  186. package/dist/commands/trends.d.ts +2 -0
  187. package/dist/commands/trends.js +103 -0
  188. package/dist/commands/trends.js.map +1 -0
  189. package/dist/commands/try.d.ts +12 -0
  190. package/dist/commands/try.js +208 -0
  191. package/dist/commands/try.js.map +1 -0
  192. package/dist/commands/verify.d.ts +44 -0
  193. package/dist/commands/verify.js +381 -0
  194. package/dist/commands/verify.js.map +1 -0
  195. package/dist/commands/watch.d.ts +10 -0
  196. package/dist/commands/watch.js +70 -0
  197. package/dist/commands/watch.js.map +1 -0
  198. package/dist/evidence.d.ts +37 -0
  199. package/dist/evidence.js +61 -0
  200. package/dist/evidence.js.map +1 -0
  201. package/dist/graph/correlate.d.ts +7 -0
  202. package/dist/graph/correlate.js +246 -0
  203. package/dist/graph/correlate.js.map +1 -0
  204. package/dist/graph/integrity.d.ts +22 -0
  205. package/dist/graph/integrity.js +39 -0
  206. package/dist/graph/integrity.js.map +1 -0
  207. package/dist/installer/targets.d.ts +23 -0
  208. package/dist/installer/targets.js +162 -0
  209. package/dist/installer/targets.js.map +1 -0
  210. package/dist/memory/store.d.ts +33 -0
  211. package/dist/memory/store.js +131 -0
  212. package/dist/memory/store.js.map +1 -0
  213. package/dist/pen/dynamic.d.ts +36 -0
  214. package/dist/pen/dynamic.js +622 -0
  215. package/dist/pen/dynamic.js.map +1 -0
  216. package/dist/pen/fix.d.ts +35 -0
  217. package/dist/pen/fix.js +239 -0
  218. package/dist/pen/fix.js.map +1 -0
  219. package/dist/pen/proof.d.ts +46 -0
  220. package/dist/pen/proof.js +112 -0
  221. package/dist/pen/proof.js.map +1 -0
  222. package/dist/pen/report.d.ts +11 -0
  223. package/dist/pen/report.js +258 -0
  224. package/dist/pen/report.js.map +1 -0
  225. package/dist/pen/static.d.ts +17 -0
  226. package/dist/pen/static.js +565 -0
  227. package/dist/pen/static.js.map +1 -0
  228. package/dist/pen/store.d.ts +11 -0
  229. package/dist/pen/store.js +36 -0
  230. package/dist/pen/store.js.map +1 -0
  231. package/dist/pen/types.d.ts +112 -0
  232. package/dist/pen/types.js +53 -0
  233. package/dist/pen/types.js.map +1 -0
  234. package/dist/report/format.d.ts +126 -0
  235. package/dist/report/format.js +706 -0
  236. package/dist/report/format.js.map +1 -0
  237. package/dist/report/score.d.ts +47 -0
  238. package/dist/report/score.js +164 -0
  239. package/dist/report/score.js.map +1 -0
  240. package/dist/repro/framework.d.ts +26 -0
  241. package/dist/repro/framework.js +224 -0
  242. package/dist/repro/framework.js.map +1 -0
  243. package/dist/repro/generate.d.ts +14 -0
  244. package/dist/repro/generate.js +669 -0
  245. package/dist/repro/generate.js.map +1 -0
  246. package/dist/repro/ids.d.ts +32 -0
  247. package/dist/repro/ids.js +175 -0
  248. package/dist/repro/ids.js.map +1 -0
  249. package/dist/repro/index.d.ts +24 -0
  250. package/dist/repro/index.js +69 -0
  251. package/dist/repro/index.js.map +1 -0
  252. package/dist/repro/pen.d.ts +26 -0
  253. package/dist/repro/pen.js +321 -0
  254. package/dist/repro/pen.js.map +1 -0
  255. package/dist/repro/run.d.ts +18 -0
  256. package/dist/repro/run.js +36 -0
  257. package/dist/repro/run.js.map +1 -0
  258. package/dist/sandbox/proxy.d.ts +41 -0
  259. package/dist/sandbox/proxy.js +231 -0
  260. package/dist/sandbox/proxy.js.map +1 -0
  261. package/dist/sandbox/startCmd.d.ts +24 -0
  262. package/dist/sandbox/startCmd.js +71 -0
  263. package/dist/sandbox/startCmd.js.map +1 -0
  264. package/dist/ui/spinner.d.ts +18 -0
  265. package/dist/ui/spinner.js +26 -0
  266. package/dist/ui/spinner.js.map +1 -0
  267. package/dist/verify/metrics.d.ts +13 -0
  268. package/dist/verify/metrics.js +72 -0
  269. package/dist/verify/metrics.js.map +1 -0
  270. package/package.json +68 -0
  271. package/scripts/cheat-demo.cjs +102 -0
  272. package/templates/ledger/preload.cjs +331 -0
  273. package/templates/pen/preload.cjs +196 -0
  274. package/templates/pitstop.prompt.md +371 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dynamic.js","sourceRoot":"","sources":["../../src/pen/dynamic.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * pen/fix.ts — `pitstop pen --fix`.
3
+ *
4
+ * What --fix actually does (and what it refuses to do):
5
+ * 1. Writes a permanent repro test for every finding that has a replayable
6
+ * attack (dynamic) or a stable credential fragment (secrets). The test
7
+ * FAILS while the bug exists — that is the fail-first contract.
8
+ * 2. Generates deterministic patches for the small set of fixes that are
9
+ * provably safe to suggest as `git apply`-able diffs:
10
+ * - `app.disable("x-powered-by")` (no behavior change)
11
+ * - `helmet()` middleware, only when helmet is already installed
12
+ * Everything else gets a precise manual fix note in PITSTOP_PEN_FIXES.md.
13
+ * 3. NEVER modifies the user's source. Patches are written to
14
+ * .pitstop/pen-patches/ and the user (or their agent) applies them.
15
+ */
16
+ import type { PenResult } from "./types.js";
17
+ export interface PenFixOutcome {
18
+ repros: {
19
+ findingId: string;
20
+ file: string;
21
+ }[];
22
+ patches: {
23
+ findingId: string;
24
+ file: string;
25
+ diffPath: string;
26
+ note: string;
27
+ findingIds: string[];
28
+ }[];
29
+ fixesMd: string;
30
+ }
31
+ export declare function insertionPatch(rel: string, oldLines: string[], inserts: {
32
+ after: number;
33
+ lines: string[];
34
+ }[]): string;
35
+ export declare function runFixes(repo: string, result: PenResult, packages: string[]): PenFixOutcome;
@@ -0,0 +1,239 @@
1
+ /**
2
+ * pen/fix.ts — `pitstop pen --fix`.
3
+ *
4
+ * What --fix actually does (and what it refuses to do):
5
+ * 1. Writes a permanent repro test for every finding that has a replayable
6
+ * attack (dynamic) or a stable credential fragment (secrets). The test
7
+ * FAILS while the bug exists — that is the fail-first contract.
8
+ * 2. Generates deterministic patches for the small set of fixes that are
9
+ * provably safe to suggest as `git apply`-able diffs:
10
+ * - `app.disable("x-powered-by")` (no behavior change)
11
+ * - `helmet()` middleware, only when helmet is already installed
12
+ * Everything else gets a precise manual fix note in PITSTOP_PEN_FIXES.md.
13
+ * 3. NEVER modifies the user's source. Patches are written to
14
+ * .pitstop/pen-patches/ and the user (or their agent) applies them.
15
+ */
16
+ import fs from "node:fs";
17
+ import path from "node:path";
18
+ import { generatePenRepro } from "../repro/pen.js";
19
+ /* ------------------------------------------------------------------ */
20
+ /* unified-diff builder: pure-insertion hunks in git's canonical form. */
21
+ /* OpenPitStop's deterministic fixes NEVER delete user lines — they only */
22
+ /* insert. In the hunk, every ` ` (context) line counts toward BOTH */
23
+ /* sides and appears ONCE, with `+` lines interleaved at their */
24
+ /* positions — exactly the shape `git diff` emits, which `git apply` */
25
+ /* parses unambiguously (including UTF-8 BOM'd first lines). */
26
+ /* ------------------------------------------------------------------ */
27
+ export function insertionPatch(rel, oldLines, inserts) {
28
+ if (inserts.length === 0)
29
+ return "";
30
+ const oldLen = oldLines.length;
31
+ const sorted = [...inserts].sort((a, b) => a.after - b.after);
32
+ const first = sorted[0].after;
33
+ const last = sorted[sorted.length - 1].after;
34
+ const ctx = 3;
35
+ const start = Math.max(0, first - ctx);
36
+ const end = Math.min(oldLen, last + ctx);
37
+ const ctxCount = end - start;
38
+ const plusCount = sorted.reduce((n, ins) => n + ins.lines.length, 0);
39
+ const body = [];
40
+ let cursor = start;
41
+ for (const ins of sorted) {
42
+ while (cursor < ins.after && cursor < oldLen) {
43
+ body.push(" " + oldLines[cursor]);
44
+ cursor++;
45
+ }
46
+ for (const l of ins.lines)
47
+ body.push("+" + l);
48
+ }
49
+ while (cursor < end) {
50
+ body.push(" " + oldLines[cursor]);
51
+ cursor++;
52
+ }
53
+ return [
54
+ `--- a/${rel}`,
55
+ `+++ b/${rel}`,
56
+ `@@ -${start + 1},${ctxCount} +${start + 1},${ctxCount + plusCount} @@`,
57
+ ...body,
58
+ ].join("\n") + "\n";
59
+ }
60
+ /* ------------------------------------------------------------------ */
61
+ function findExpressAppFile(repo) {
62
+ const stack = [repo];
63
+ while (stack.length) {
64
+ const dir = stack.pop();
65
+ let entries;
66
+ try {
67
+ entries = fs.readdirSync(dir, { withFileTypes: true });
68
+ }
69
+ catch {
70
+ continue;
71
+ }
72
+ for (const e of entries) {
73
+ const p = path.join(dir, e.name);
74
+ if (e.isDirectory()) {
75
+ if (e.name === "node_modules" || e.name === ".git" || e.name === ".pitstop" || e.name === "dist" || e.name === "build")
76
+ continue;
77
+ stack.push(p);
78
+ }
79
+ else if (e.isFile() && /\.(js|mjs|cjs|ts)$/i.test(e.name)) {
80
+ try {
81
+ const lines = readLines(p);
82
+ for (let i = 0; i < lines.length; i++) {
83
+ if (/const\s+app\s*=\s*express\s*\(/.test(lines[i])) {
84
+ return { file: p, line: i + 1, lineText: lines[i] };
85
+ }
86
+ }
87
+ }
88
+ catch {
89
+ /* skip */
90
+ }
91
+ }
92
+ }
93
+ }
94
+ return null;
95
+ }
96
+ function readLines(file) {
97
+ try {
98
+ return fs.readFileSync(file, "utf8").split(/\r?\n/);
99
+ }
100
+ catch {
101
+ return [];
102
+ }
103
+ }
104
+ /** Content of a line with a leading UTF-8 BOM (common after Windows tools) stripped. */
105
+ const noBom = (l) => l.replace(/^\uFEFF/, "");
106
+ export function runFixes(repo, result, packages) {
107
+ const repros = [];
108
+ const patches = [];
109
+ const patchDir = path.join(repo, ".pitstop", "pen-patches");
110
+ fs.mkdirSync(patchDir, { recursive: true });
111
+ for (const f of result.findings) {
112
+ const outcome = generatePenRepro(repo, f);
113
+ if (outcome.ok && outcome.file)
114
+ repros.push({ findingId: f.id, file: outcome.file });
115
+ }
116
+ const expressApp = findExpressAppFile(repo);
117
+ const helmetInstalled = packages.includes("helmet");
118
+ const byFile = new Map();
119
+ for (const f of result.findings) {
120
+ // x-powered-by: disable it right after app creation. Behavior-neutral.
121
+ if (f.type === "info-leak-header" && expressApp) {
122
+ const rel = path.relative(repo, expressApp.file).replace(/\\/g, "/");
123
+ const lines = readLines(expressApp.file);
124
+ const already = lines.some((l) => /disable\s*\(\s*["']x-powered-by["']/.test(l));
125
+ if (!already) {
126
+ const fp = byFile.get(rel) ?? {
127
+ rel,
128
+ file: expressApp.file,
129
+ anchor: expressApp.line,
130
+ importLine: null,
131
+ after: [],
132
+ findingIds: [],
133
+ };
134
+ if (!fp.after.includes(`app.disable("x-powered-by");`))
135
+ fp.after.push(`app.disable("x-powered-by");`);
136
+ fp.findingIds.push(f.id);
137
+ byFile.set(rel, fp);
138
+ }
139
+ }
140
+ // helmet: only patch when the dependency is already installed.
141
+ if (f.type === "missing-security-headers" && expressApp && helmetInstalled) {
142
+ const rel = path.relative(repo, expressApp.file).replace(/\\/g, "/");
143
+ const lines = readLines(expressApp.file);
144
+ const already = lines.some((l) => /\bhelmet\s*\(/.test(l));
145
+ if (!already) {
146
+ const isEsm = lines.some((l) => /^import\b/.test(noBom(l))) || /^\s*import\s+express\b/.test(noBom(lines[0] ?? ""));
147
+ const importLine = isEsm ? `import helmet from "helmet";` : `const helmet = require("helmet");`;
148
+ const fp = byFile.get(rel) ?? {
149
+ rel,
150
+ file: expressApp.file,
151
+ anchor: expressApp.line,
152
+ importLine: null,
153
+ after: [],
154
+ findingIds: [],
155
+ };
156
+ fp.importLine ??= importLine;
157
+ if (!fp.after.includes(`app.use(helmet());`))
158
+ fp.after.push(`app.use(helmet());`);
159
+ fp.findingIds.push(f.id);
160
+ byFile.set(rel, fp);
161
+ }
162
+ }
163
+ }
164
+ for (const fp of byFile.values()) {
165
+ const lines = readLines(fp.file);
166
+ const inserts = [];
167
+ if (fp.importLine)
168
+ inserts.push({ after: 0, lines: [fp.importLine] });
169
+ if (fp.after.length)
170
+ inserts.push({ after: fp.anchor, lines: fp.after });
171
+ const diff = insertionPatch(fp.rel, lines, inserts);
172
+ if (!diff)
173
+ continue;
174
+ const diffPath = path.join(patchDir, `${fp.findingIds[0]}-fix.diff`);
175
+ fs.writeFileSync(diffPath, diff, "utf8");
176
+ patches.push({
177
+ findingId: fp.findingIds[0],
178
+ file: fp.rel,
179
+ diffPath: path.relative(repo, diffPath).replace(/\\/g, "/"),
180
+ findingIds: fp.findingIds,
181
+ note: fp.after.join(", ") +
182
+ (fp.importLine ? " (plus the helmet import)" : "") +
183
+ " inserted after the Express app creation line — one cumulative patch for this file, applies cleanly on its own",
184
+ });
185
+ }
186
+ const fixesMd = buildFixesMd(repo, result, repros, patches);
187
+ return { repros, patches, fixesMd };
188
+ }
189
+ function buildFixesMd(repo, result, repros, patches) {
190
+ const reproBy = new Map(repros.map((r) => [r.findingId, r.file]));
191
+ const patchBy = new Map();
192
+ for (const p of patches)
193
+ for (const id of p.findingIds)
194
+ patchBy.set(id, p);
195
+ const L = [];
196
+ L.push(`# OpenPitStop Pen Test — Fix Plan`);
197
+ L.push("");
198
+ L.push(`_${result.timestamp}_ — ${result.repo}`);
199
+ L.push("");
200
+ L.push(`How to use this file:`);
201
+ L.push(`1. Every replayable finding now has a **repro test** that FAILS while the bug is live.`);
202
+ L.push(`2. Apply deterministic patches with \`git apply\`, or hand the finding id to your agent:`);
203
+ L.push(` \`pitstop drive <id>\` or tell your agent \`pitstop repro <id>\` → fix → \`pitstop verify\`.`);
204
+ L.push(`3. When the repro test PASSES and \`pitstop pen\` reports the finding gone, it is fixed — not vibes.`);
205
+ L.push("");
206
+ for (const f of result.findings) {
207
+ L.push(`## ${f.severity.toUpperCase()} — ${f.title} \`${f.id}\``);
208
+ L.push("");
209
+ L.push(`- **Confidence**: ${f.confidence} · **Type**: ${f.type}`);
210
+ const where = f.file
211
+ ? path.relative(repo, f.file).replace(/\\/g, "/") + (f.line ? `:${f.line}` : "")
212
+ : f.route
213
+ ? `${f.route} (${f.method})`
214
+ : "—";
215
+ L.push(`- **Where**: \`${where}\``);
216
+ L.push("");
217
+ L.push(f.description);
218
+ L.push("");
219
+ const reproFile = reproBy.get(f.id);
220
+ if (reproFile) {
221
+ L.push(`- **Repro test**: \`${reproFile}\` — run with \`npx openpitstop repro ${f.id}\`. It FAILS now; make it PASS.`);
222
+ }
223
+ const patch = patchBy.get(f.id);
224
+ if (patch) {
225
+ L.push(`- **Deterministic patch**: \`git apply ${patch.diffPath}\` — ${patch.note}.`);
226
+ L.push(` Verify with \`npx openpitstop repro ${f.id}\` + \`npx openpitstop verify\`.`);
227
+ }
228
+ if (f.fix) {
229
+ L.push(`- **Fix guidance**: ${f.fix}`);
230
+ }
231
+ L.push("");
232
+ }
233
+ L.push(`---`);
234
+ L.push(`OpenPitStop can't promise "never hacked" — it CAN promise this: every demonstrable attack here`);
235
+ L.push(`has a regression test that fails on the bug and passes on the fix. Ship with those tests green.`);
236
+ L.push("");
237
+ return L.join("\n");
238
+ }
239
+ //# sourceMappingURL=fix.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fix.js","sourceRoot":"","sources":["../../src/pen/fix.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * pen/proof.ts — the runtime-proof pass: every STATIC finding gets a live
3
+ * verdict from the dynamic phase.
4
+ *
5
+ * The dynamic phase boots the app under the sandbox and fires the full attack
6
+ * battery (command injection, SSRF, XSS, path traversal, SQL/NOSQL, header
7
+ * and rate-limit checks) at every discovered route. That run is the ground
8
+ * truth for the whole app. This pass attaches it to the static findings:
9
+ *
10
+ * proven — the dynamic phase recorded a CANARY for this attack class
11
+ * (a spawn containing the marker, an outbound call to the
12
+ * canary host, the marker reflected unescaped, a host file
13
+ * leaked). The static pattern is now backed by a live attack.
14
+ * indicated — live probing produced class-level signals (a DB error
15
+ * surface, a crash on the class payload) but no canary.
16
+ * unproven — the class was probed on every route and produced no
17
+ * signal at all: the pattern may be a false positive or the
18
+ * sink unreachable. Honest label, not a downgrade.
19
+ * not-tested — no live probe exists for this class (secrets, config
20
+ * hygiene) or the app did not boot (dynamic aborted).
21
+ *
22
+ * This is the answer to "static scanners are noisy": every pattern finding
23
+ * now either carries live proof or an honest "could not be reproduced".
24
+ */
25
+ import type { PenFinding } from "./types.js";
26
+ export type StaticProofVerdict = "proven" | "indicated" | "unproven" | "not-tested";
27
+ export interface StaticProofSummary {
28
+ proven: number;
29
+ indicated: number;
30
+ unproven: number;
31
+ notTested: number;
32
+ }
33
+ interface ProofInput {
34
+ status: "ok" | "aborted";
35
+ note?: string;
36
+ findings: PenFinding[];
37
+ }
38
+ /**
39
+ * Attach a live verdict to every static finding based on the dynamic phase's
40
+ * evidence. Returns new finding objects (never mutates inputs) plus a summary.
41
+ */
42
+ export declare function applyStaticProof(staticFindings: PenFinding[], dynamic: ProofInput): {
43
+ findings: PenFinding[];
44
+ summary: StaticProofSummary;
45
+ };
46
+ export {};
@@ -0,0 +1,112 @@
1
+ /**
2
+ * pen/proof.ts — the runtime-proof pass: every STATIC finding gets a live
3
+ * verdict from the dynamic phase.
4
+ *
5
+ * The dynamic phase boots the app under the sandbox and fires the full attack
6
+ * battery (command injection, SSRF, XSS, path traversal, SQL/NOSQL, header
7
+ * and rate-limit checks) at every discovered route. That run is the ground
8
+ * truth for the whole app. This pass attaches it to the static findings:
9
+ *
10
+ * proven — the dynamic phase recorded a CANARY for this attack class
11
+ * (a spawn containing the marker, an outbound call to the
12
+ * canary host, the marker reflected unescaped, a host file
13
+ * leaked). The static pattern is now backed by a live attack.
14
+ * indicated — live probing produced class-level signals (a DB error
15
+ * surface, a crash on the class payload) but no canary.
16
+ * unproven — the class was probed on every route and produced no
17
+ * signal at all: the pattern may be a false positive or the
18
+ * sink unreachable. Honest label, not a downgrade.
19
+ * not-tested — no live probe exists for this class (secrets, config
20
+ * hygiene) or the app did not boot (dynamic aborted).
21
+ *
22
+ * This is the answer to "static scanners are noisy": every pattern finding
23
+ * now either carries live proof or an honest "could not be reproduced".
24
+ */
25
+ /** static finding type -> the dynamic finding types that can confirm it live. */
26
+ const CLASS_TO_DYNAMIC = {
27
+ "command-injection": ["command-injection"],
28
+ "arbitrary-code-execution": ["command-injection"],
29
+ ssrf: ["ssrf"],
30
+ "xss-sink": ["reflected-xss"],
31
+ "path-traversal": ["path-traversal"],
32
+ "sql-injection": ["sql-injection", "crash-on-input"],
33
+ "nosql-injection": ["sql-injection", "crash-on-input"],
34
+ "prototype-pollution": ["crash-on-input"],
35
+ "missing-security-headers": ["missing-security-headers"],
36
+ "info-leak-header": ["info-leak-header"],
37
+ "no-rate-limit": ["no-rate-limit"],
38
+ };
39
+ /**
40
+ * Attach a live verdict to every static finding based on the dynamic phase's
41
+ * evidence. Returns new finding objects (never mutates inputs) plus a summary.
42
+ */
43
+ export function applyStaticProof(staticFindings, dynamic) {
44
+ const summary = { proven: 0, indicated: 0, unproven: 0, notTested: 0 };
45
+ const findings = staticFindings.map((f) => {
46
+ if (dynamic.status !== "ok") {
47
+ summary.notTested++;
48
+ return {
49
+ ...f,
50
+ runtimeProof: "not-tested",
51
+ runtimeNote: `no runtime verification: the dynamic phase did not run (${dynamic.note ?? "app did not respond"})`,
52
+ };
53
+ }
54
+ const mapped = CLASS_TO_DYNAMIC[f.type];
55
+ if (!mapped) {
56
+ summary.notTested++;
57
+ return {
58
+ ...f,
59
+ runtimeProof: "not-tested",
60
+ runtimeNote: "this finding class is a static/config observation (secret, cookie, CORS policy) — there is no live probe for it",
61
+ };
62
+ }
63
+ const dynOfClass = dynamic.findings.filter((d) => mapped.includes(d.type));
64
+ const provenDyn = dynOfClass.find((d) => d.confidence === "proven");
65
+ if (provenDyn) {
66
+ summary.proven++;
67
+ const evidence = provenDyn.outbound?.length
68
+ ? ` sandbox evidence: ${provenDyn.outbound.join(" · ")}`
69
+ : "";
70
+ return {
71
+ ...f,
72
+ confidence: "proven",
73
+ runtimeProof: "proven",
74
+ proofType: provenDyn.type,
75
+ runtimeNote: `PROVEN live: a ${f.type} attack on route ${provenDyn.route ?? provenDyn.attack?.path ?? "?"} ` +
76
+ `(${provenDyn.method ?? "?"}) recorded a canary.${evidence} See dynamic finding ${provenDyn.id}.`,
77
+ attack: provenDyn.attack ?? f.attack,
78
+ response: provenDyn.response ?? f.response,
79
+ outbound: provenDyn.outbound ?? f.outbound,
80
+ route: provenDyn.route ?? f.route,
81
+ method: provenDyn.method ?? f.method,
82
+ repro: provenDyn.repro ?? f.repro,
83
+ };
84
+ }
85
+ const indicatedDyn = dynOfClass.find((d) => d.confidence === "indicated");
86
+ if (indicatedDyn) {
87
+ summary.indicated++;
88
+ return {
89
+ ...f,
90
+ confidence: "indicated",
91
+ runtimeProof: "indicated",
92
+ runtimeNote: `Live probing for this class produced class-level signals without a canary ` +
93
+ `(dynamic finding ${indicatedDyn.id}: ${indicatedDyn.title.toLowerCase()}). ` +
94
+ `Evidence points but is not conclusive — treat as indicated, not proven.`,
95
+ attack: indicatedDyn.attack ?? f.attack,
96
+ response: indicatedDyn.response ?? f.response,
97
+ route: indicatedDyn.route ?? f.route,
98
+ method: indicatedDyn.method ?? f.method,
99
+ repro: indicatedDyn.repro ?? f.repro,
100
+ };
101
+ }
102
+ summary.unproven++;
103
+ return {
104
+ ...f,
105
+ runtimeProof: "unproven",
106
+ runtimeNote: `The app's routes were probed live with ${f.type} payloads and produced no signal — ` +
107
+ "this static pattern could not be reproduced. It may be a false positive or an unreachable sink.",
108
+ };
109
+ });
110
+ return { findings, summary };
111
+ }
112
+ //# sourceMappingURL=proof.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proof.js","sourceRoot":"","sources":["../../src/pen/proof.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAaH,iFAAiF;AACjF,MAAM,gBAAgB,GAA6B;IACjD,mBAAmB,EAAE,CAAC,mBAAmB,CAAC;IAC1C,0BAA0B,EAAE,CAAC,mBAAmB,CAAC;IACjD,IAAI,EAAE,CAAC,MAAM,CAAC;IACd,UAAU,EAAE,CAAC,eAAe,CAAC;IAC7B,gBAAgB,EAAE,CAAC,gBAAgB,CAAC;IACpC,eAAe,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACpD,iBAAiB,EAAE,CAAC,eAAe,EAAE,gBAAgB,CAAC;IACtD,qBAAqB,EAAE,CAAC,gBAAgB,CAAC;IACzC,0BAA0B,EAAE,CAAC,0BAA0B,CAAC;IACxD,kBAAkB,EAAE,CAAC,kBAAkB,CAAC;IACxC,eAAe,EAAE,CAAC,eAAe,CAAC;CACnC,CAAC;AAQF;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,cAA4B,EAC5B,OAAmB;IAEnB,MAAM,OAAO,GAAuB,EAAE,MAAM,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAE3F,MAAM,QAAQ,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACxC,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5B,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;gBACL,GAAG,CAAC;gBACJ,YAAY,EAAE,YAAqB;gBACnC,WAAW,EAAE,2DAA2D,OAAO,CAAC,IAAI,IAAI,qBAAqB,GAAG;aACjH,CAAC;QACJ,CAAC;QAED,MAAM,MAAM,GAAG,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;gBACL,GAAG,CAAC;gBACJ,YAAY,EAAE,YAAqB;gBACnC,WAAW,EACT,iHAAiH;aACpH,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,QAAQ,CAAC,CAAC;QACpE,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,EAAE,MAAM;gBACzC,CAAC,CAAC,sBAAsB,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBACxD,CAAC,CAAC,EAAE,CAAC;YACP,OAAO;gBACL,GAAG,CAAC;gBACJ,UAAU,EAAE,QAAiB;gBAC7B,YAAY,EAAE,QAAiB;gBAC/B,SAAS,EAAE,SAAS,CAAC,IAAI;gBACzB,WAAW,EACT,kBAAkB,CAAC,CAAC,IAAI,oBAAoB,SAAS,CAAC,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,GAAG,GAAG;oBAC/F,IAAI,SAAS,CAAC,MAAM,IAAI,GAAG,uBAAuB,QAAQ,wBAAwB,SAAS,CAAC,EAAE,GAAG;gBACnG,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;gBACpC,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;gBAC1C,QAAQ,EAAE,SAAS,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;gBAC1C,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;gBACjC,MAAM,EAAE,SAAS,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;gBACpC,KAAK,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;aAClC,CAAC;QACJ,CAAC;QAED,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,KAAK,WAAW,CAAC,CAAC;QAC1E,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO;gBACL,GAAG,CAAC;gBACJ,UAAU,EAAE,WAAoB;gBAChC,YAAY,EAAE,WAAoB;gBAClC,WAAW,EACT,4EAA4E;oBAC5E,oBAAoB,YAAY,CAAC,EAAE,KAAK,YAAY,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK;oBAC7E,yEAAyE;gBAC3E,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;gBACvC,QAAQ,EAAE,YAAY,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;gBAC7C,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;gBACpC,MAAM,EAAE,YAAY,CAAC,MAAM,IAAI,CAAC,CAAC,MAAM;gBACvC,KAAK,EAAE,YAAY,CAAC,KAAK,IAAI,CAAC,CAAC,KAAK;aACrC,CAAC;QACJ,CAAC;QAED,OAAO,CAAC,QAAQ,EAAE,CAAC;QACnB,OAAO;YACL,GAAG,CAAC;YACJ,YAAY,EAAE,UAAmB;YACjC,WAAW,EACT,0CAA0C,CAAC,CAAC,IAAI,qCAAqC;gBACrF,iGAAiG;SACpG,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * pen/report.ts — rendering for `pitstop pen`: terminal box, markdown, and a
3
+ * self-contained sealed HTML report (zero external assets, like the rest of
4
+ * OpenPitStop's reports).
5
+ */
6
+ import { type PenResult } from "./types.js";
7
+ export declare function renderPenBox(result: PenResult): string;
8
+ /** Self-contained Markdown report (also the basis for the HTML one). */
9
+ export declare function renderPenMarkdown(result: PenResult): string;
10
+ /** Self-contained HTML report (no external assets), mirroring other guard deeds. */
11
+ export declare function renderPenHtml(result: PenResult): string;