openpitstop 1.5.0 → 1.5.1

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 (33) hide show
  1. package/README.md +25 -0
  2. package/demo/web-app-broken/.pitstop/cache/jest/haste-map-09bbba084113da9182b28b169fd19719-a1b56e2f04426a89a1864d67162ba1a1-48d4752caf3bc581fc945eb44175e230 +0 -0
  3. package/demo/web-app-broken/.pitstop/cache/jest/jest-transform-cache-09bbba084113da9182b28b169fd19719-79ef2876fae7ca75eedb2aa53dc48338/5e/config_5ea59c6b3000eadfbaecbc2e78a03802 +113 -0
  4. package/demo/web-app-broken/.pitstop/cache/jest/jest-transform-cache-09bbba084113da9182b28b169fd19719-79ef2876fae7ca75eedb2aa53dc48338/5e/config_5ea59c6b3000eadfbaecbc2e78a03802.map +1 -0
  5. package/demo/web-app-broken/.pitstop/cache/jest/perf-cache-09bbba084113da9182b28b169fd19719-da39a3ee5e6b4b0d3255bfef95601890 +1 -1
  6. package/demo/web-app-broken/.pitstop/pen/run-2026-08-18T06-12-11-576Z/app.out.log +22 -0
  7. package/demo/web-app-broken/.pitstop/pen-2026-08-18T06-12-11-787Z.json +162 -0
  8. package/demo/web-app-broken/.pitstop/pen-latest.json +162 -0
  9. package/demo/web-app-broken/.pitstop/verify-2026-08-18T06-11-59-327Z.json +73 -0
  10. package/demo/web-app-broken/PITSTOP_BADGE.svg +12 -0
  11. package/dist/commands/report.js +17 -1
  12. package/dist/commands/report.js.map +1 -1
  13. package/dist/commands/verify.d.ts +3 -0
  14. package/dist/commands/verify.js +53 -21
  15. package/dist/commands/verify.js.map +1 -1
  16. package/dist/pen/dynamic.js +130 -3
  17. package/dist/pen/dynamic.js.map +1 -1
  18. package/dist/pen/proof.js +6 -0
  19. package/dist/pen/proof.js.map +1 -1
  20. package/dist/pen/static.js +120 -0
  21. package/dist/pen/static.js.map +1 -1
  22. package/dist/report/format.d.ts +16 -0
  23. package/dist/report/format.js +62 -9
  24. package/dist/report/format.js.map +1 -1
  25. package/dist/report/sarif.d.ts +29 -0
  26. package/dist/report/sarif.js +161 -0
  27. package/dist/report/sarif.js.map +1 -0
  28. package/dist/repro/pen.js +19 -0
  29. package/dist/repro/pen.js.map +1 -1
  30. package/dist/verify/honesty.d.ts +21 -0
  31. package/dist/verify/honesty.js +40 -0
  32. package/dist/verify/honesty.js.map +1 -0
  33. package/package.json +1 -1
@@ -0,0 +1,161 @@
1
+ /**
2
+ * report/sarif.ts — GitHub code-scanning export.
3
+ *
4
+ * `pitstop report --sarif` writes a SARIF 2.1.0 log so every OpenPitStop
5
+ * security/pen finding shows up natively in the GitHub Security tab — the one
6
+ * place Strix's OSS CLI does not land. Each result is keyed by CWE/OWASP and
7
+ * carries a `security-severity` so code-scanning can filter and gate on it.
8
+ *
9
+ * This is the "we prove, and we plug into DevSecOps" half of the Strix wedge:
10
+ * Strix reports to its own platform; OpenPitStop speaks the format GitHub
11
+ * already understands, for free, with no Docker and no LLM bill.
12
+ */
13
+ import path from "node:path";
14
+ import { loadPenLatest } from "../pen/store.js";
15
+ const VERSION = "1.5.0";
16
+ const INFO_URI = "https://github.com/Krish-1507/OpenPitStop";
17
+ /** Type -> CWE / OWASP Top 10 (2021) mapping for the common pen/scan classes. */
18
+ const CWE = {
19
+ "sql-injection": { id: "CWE-89", name: "SQL Injection", owasp: "A03:2021" },
20
+ "nosql-injection": { id: "CWE-89", name: "NoSQL Injection", owasp: "A03:2021" },
21
+ "command-injection": { id: "CWE-78", name: "OS Command Injection", owasp: "A03:2021" },
22
+ "arbitrary-code-execution": { id: "CWE-94", name: "Code Injection", owasp: "A03:2021" },
23
+ "path-traversal": { id: "CWE-22", name: "Path Traversal", owasp: "A01:2021" },
24
+ ssrf: { id: "CWE-918", name: "Server-Side Request Forgery", owasp: "A10:2021" },
25
+ xss: { id: "CWE-79", name: "Cross-Site Scripting", owasp: "A03:2021" },
26
+ "xss-sink": { id: "CWE-79", name: "Cross-Site Scripting", owasp: "A03:2021" },
27
+ "reflected-xss": { id: "CWE-79", name: "Reflected XSS", owasp: "A03:2021" },
28
+ secret: { id: "CWE-798", name: "Use of Hard-coded Credentials", owasp: "A02:2021" },
29
+ authentication: { id: "CWE-287", name: "Improper Authentication", owasp: "A07:2021" },
30
+ authorization: { id: "CWE-285", name: "Improper Authorization", owasp: "A01:2021" },
31
+ "missing-auth": { id: "CWE-306", name: "Missing Authentication for Critical Function", owasp: "A01:2021" },
32
+ csrf: { id: "CWE-352", name: "Cross-Site Request Forgery", owasp: "A01:2021" },
33
+ "prototype-pollution": { id: "CWE-1321", name: "Prototype Pollution", owasp: "A03:2021" },
34
+ cors: { id: "CWE-942", name: "Permissive CORS", owasp: "A05:2021" },
35
+ transport: { id: "CWE-319", name: "Cleartext Transmission", owasp: "A02:2021" },
36
+ "missing-security-headers": { id: "CWE-693", name: "Protection Mechanism Failure", owasp: "A05:2021" },
37
+ "info-leak-header": { id: "CWE-200", name: "Information Exposure", owasp: "A01:2021" },
38
+ "no-rate-limit": { id: "CWE-307", name: "Improper Restriction of Excessive Auth Attempts", owasp: "A07:2021" },
39
+ "rate-limiting": { id: "CWE-307", name: "Improper Restriction of Excessive Auth Attempts", owasp: "A07:2021" },
40
+ database: { id: "CWE-250", name: "Execution with Unnecessary Privileges", owasp: "A04:2021" },
41
+ "data-exposure": { id: "CWE-200", name: "Information Exposure", owasp: "A01:2021" },
42
+ "hidden-vulnerabilities": { id: "CWE-655", name: "Insufficient Psychological Acceptability", owasp: "A04:2021" },
43
+ jwt: { id: "CWE-347", name: "Improper Verification of Cryptographic Signature", owasp: "A02:2021" },
44
+ "jwt-attack": { id: "CWE-347", name: "Improper Verification of Cryptographic Signature", owasp: "A02:2021" },
45
+ xxe: { id: "CWE-611", name: "XML External Entity", owasp: "A05:2021" },
46
+ code: { id: "CWE-94", name: "Code Injection", owasp: "A03:2021" },
47
+ eval: { id: "CWE-94", name: "Code Injection", owasp: "A03:2021" },
48
+ "insecure-cors": { id: "CWE-942", name: "Permissive CORS", owasp: "A05:2021" },
49
+ "cookie-without-httponly": { id: "CWE-614", name: "Sensitive Cookie Without HttpOnly", owasp: "A05:2021" },
50
+ "broken-access-control": { id: "CWE-285", name: "Improper Authorization", owasp: "A01:2021" },
51
+ idor: { id: "CWE-639", name: "Authorization Bypass Through User-Controllable Key", owasp: "A01:2021" },
52
+ "privilege-escalation": { id: "CWE-269", name: "Improper Privilege Management", owasp: "A01:2021" },
53
+ };
54
+ const SEV_NUM = {
55
+ critical: 9.8,
56
+ high: 8.0,
57
+ medium: 5.0,
58
+ low: 3.0,
59
+ info: 0.0,
60
+ };
61
+ function level(sev) {
62
+ if (sev === "critical" || sev === "high")
63
+ return "error";
64
+ if (sev === "medium")
65
+ return "warning";
66
+ if (sev === "low")
67
+ return "note";
68
+ return "none";
69
+ }
70
+ function prettify(type) {
71
+ return type
72
+ .split(/[-_]/)
73
+ .map((w) => w.charAt(0).toUpperCase() + w.slice(1))
74
+ .join(" ");
75
+ }
76
+ function collect(repo, model) {
77
+ const out = [];
78
+ const scan = model.latestScan;
79
+ if (scan && scan.security.status === "ok") {
80
+ for (const i of scan.security.issues) {
81
+ out.push({
82
+ type: i.type,
83
+ severity: i.severity,
84
+ description: i.description,
85
+ file: i.file,
86
+ line: i.line,
87
+ });
88
+ }
89
+ }
90
+ const pen = loadPenLatest(repo);
91
+ if (pen) {
92
+ for (const f of pen.findings) {
93
+ out.push({
94
+ type: f.type,
95
+ severity: f.severity,
96
+ description: f.description,
97
+ file: f.file,
98
+ line: f.line,
99
+ confidence: f.confidence,
100
+ });
101
+ }
102
+ }
103
+ return out;
104
+ }
105
+ export function buildSarif(repo, model) {
106
+ const findings = collect(repo, model);
107
+ const ruleMap = new Map();
108
+ const results = [];
109
+ for (const f of findings) {
110
+ const cwe = CWE[f.type] ?? { id: "CWE-other", name: prettify(f.type) };
111
+ const ruleId = `openpitstop/${f.type}`;
112
+ if (!ruleMap.has(ruleId)) {
113
+ ruleMap.set(ruleId, {
114
+ id: ruleId,
115
+ name: cwe.name,
116
+ shortDescription: { text: cwe.name },
117
+ helpUri: "https://github.com/Krish-1507/OpenPitStop#the-pen-test",
118
+ properties: { category: f.type, cwe: cwe.id, owasp: cwe.owasp },
119
+ });
120
+ }
121
+ const uri = f.file ? path.relative(repo, f.file).replace(/\\/g, "/") : ".";
122
+ results.push({
123
+ ruleId,
124
+ level: level(f.severity),
125
+ message: { text: f.description },
126
+ locations: [
127
+ {
128
+ physicalLocation: {
129
+ artifactLocation: { uri },
130
+ region: { startLine: f.line ?? 1 },
131
+ },
132
+ },
133
+ ],
134
+ properties: {
135
+ severity: f.severity,
136
+ confidence: f.confidence ?? "proven",
137
+ "security-severity": SEV_NUM[f.severity] ?? 0,
138
+ cwe: cwe.id,
139
+ owasp: cwe.owasp,
140
+ },
141
+ });
142
+ }
143
+ return {
144
+ $schema: "https://json.schemastore.org/sarif-2.1.0.json",
145
+ version: "2.1.0",
146
+ runs: [
147
+ {
148
+ tool: {
149
+ driver: {
150
+ name: "OpenPitStop",
151
+ version: VERSION,
152
+ informationUri: INFO_URI,
153
+ rules: [...ruleMap.values()],
154
+ },
155
+ },
156
+ results,
157
+ },
158
+ ],
159
+ };
160
+ }
161
+ //# sourceMappingURL=sarif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../src/report/sarif.ts"],"names":[],"mappings":"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"}
package/dist/repro/pen.js CHANGED
@@ -94,6 +94,16 @@ function assertionBody(f, marker) {
94
94
  `const missing = want.filter((h) => !res.headers[h]);`,
95
95
  `assert.ok(missing.length < 2, "security headers missing: " + missing.join(", "));`,
96
96
  ];
97
+ case "price-tampering":
98
+ return [
99
+ `assert.ok(!/"(?:amount|total|price)"\\s*:\\s*("?0\\.01"?)/.test(res.body), "the server reflected the tampered 0.01 total — client-supplied price is trusted: " + res.body.slice(0, 200));`,
100
+ ];
101
+ case "insecure-deserialization":
102
+ return [
103
+ `await sleep(400);`,
104
+ `const spawns = readOutbound(outboundPath).filter((e) => e.kind === "spawn" && e.cmd && e.cmd.includes(${J(marker)}));`,
105
+ `assert.equal(spawns.length, 0, "the sandbox recorded a spawn from a deserialization gadget: insecure deserialization is live: " + JSON.stringify(spawns.map((e) => e.cmd)));`,
106
+ ];
97
107
  default:
98
108
  return [];
99
109
  }
@@ -115,6 +125,15 @@ function secretGuardBody(f, fileRel) {
115
125
  export function generatePenRepro(repo, f) {
116
126
  const isDynamic = f.source === "pen-dynamic" || (f.runtimeProof === "proven" && !!f.attack);
117
127
  const isStaticSecret = f.type === "hardcoded-secret" && f.file;
128
+ // These live findings need a request shape the generic node:test harness
129
+ // can't express (an XML body for XXE, an Authorization header for JWT). The
130
+ // pen phase verifies them live; re-run `pitstop pen` to re-check.
131
+ if (f.type === "xxe" || f.type === "jwt-weak-secret") {
132
+ return {
133
+ ok: false,
134
+ reason: "this live finding needs a request shape the generic repro harness can't build (XML body / Authorization header) — re-run `pitstop pen` to re-verify it after a change.",
135
+ };
136
+ }
118
137
  if (!isDynamic && !isStaticSecret) {
119
138
  return {
120
139
  ok: false,
@@ -1 +1 @@
1
- {"version":3,"file":"pen.js","sourceRoot":"","sources":["../../src/repro/pen.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pen.js","sourceRoot":"","sources":["../../src/repro/pen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * verify/honesty.ts — the Honesty Score.
3
+ *
4
+ * OpenPitStop's whole reason to exist: it can tell when an AI coding agent
5
+ * (or an auto-fix PR) faked the result. The integrity gate already catches the
6
+ * cheating; this compresses that into one number a human can scan in a PR:
7
+ *
8
+ * 100 = every fix is backed by sealed evidence, no cheating detected
9
+ * <90 = something reduced trust — read the reasons
10
+ *
11
+ * It is intentionally conservative: a clean, signed run is 100; any tampered
12
+ * baseline, confirmed cheat, suspicious change, or stale baseline subtracts.
13
+ */
14
+ import type { VerifyOutcome } from "../commands/verify.js";
15
+ export type HonestyRating = "TRUSTWORTHY" | "QUESTIONABLE" | "UNTRUSTWORTHY";
16
+ export interface HonestyScore {
17
+ score: number;
18
+ rating: HonestyRating;
19
+ reasons: string[];
20
+ }
21
+ export declare function computeHonesty(o: VerifyOutcome): HonestyScore;
@@ -0,0 +1,40 @@
1
+ /**
2
+ * verify/honesty.ts — the Honesty Score.
3
+ *
4
+ * OpenPitStop's whole reason to exist: it can tell when an AI coding agent
5
+ * (or an auto-fix PR) faked the result. The integrity gate already catches the
6
+ * cheating; this compresses that into one number a human can scan in a PR:
7
+ *
8
+ * 100 = every fix is backed by sealed evidence, no cheating detected
9
+ * <90 = something reduced trust — read the reasons
10
+ *
11
+ * It is intentionally conservative: a clean, signed run is 100; any tampered
12
+ * baseline, confirmed cheat, suspicious change, or stale baseline subtracts.
13
+ */
14
+ export function computeHonesty(o) {
15
+ let score = 100;
16
+ const reasons = [];
17
+ if (o.evidence && o.evidence.status === "tampered") {
18
+ score -= 25;
19
+ reasons.push("baseline evidence was edited after OpenPitStop signed it — score delta is untrustworthy");
20
+ }
21
+ if (o.integrity.verdict === "CONFIRMED_CHEAT") {
22
+ score -= 60;
23
+ reasons.push("integrity gate CONFIRMED a cheat (deleted test / hardcoded pass / reverted baseline)");
24
+ }
25
+ else if (o.integrity.verdict === "SUSPICIOUS") {
26
+ score -= 35;
27
+ reasons.push("integrity gate flagged a suspicious change that needs review");
28
+ }
29
+ if (o.stale) {
30
+ score -= 10;
31
+ reasons.push("baseline is stale — the score delta is approximate, not exact");
32
+ }
33
+ score = Math.max(0, Math.min(100, score));
34
+ const rating = score >= 90 ? "TRUSTWORTHY" : score >= 60 ? "QUESTIONABLE" : "UNTRUSTWORTHY";
35
+ if (reasons.length === 0) {
36
+ reasons.push("no cheating detected — this fix is backed by sealed, signed evidence");
37
+ }
38
+ return { score, rating, reasons };
39
+ }
40
+ //# sourceMappingURL=honesty.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"honesty.js","sourceRoot":"","sources":["../../src/verify/honesty.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAYH,MAAM,UAAU,cAAc,CAAC,CAAgB;IAC7C,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QACnD,KAAK,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,yFAAyF,CAAC,CAAC;IAC1G,CAAC;IAED,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,iBAAiB,EAAE,CAAC;QAC9C,KAAK,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,sFAAsF,CAAC,CAAC;IACvG,CAAC;SAAM,IAAI,CAAC,CAAC,SAAS,CAAC,OAAO,KAAK,YAAY,EAAE,CAAC;QAChD,KAAK,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,8DAA8D,CAAC,CAAC;IAC/E,CAAC;IAED,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACZ,KAAK,IAAI,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;IAChF,CAAC;IAED,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAkB,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,eAAe,CAAC;IAE3G,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;IACvF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openpitstop",
3
- "version": "1.5.0",
3
+ "version": "1.5.1",
4
4
  "description": "Deterministic scans + your coding agent's own reasoning, in one autonomous quality loop. Adds a /pitstop slash-command to any AI coding tool.",
5
5
  "license": "MIT",
6
6
  "author": "Krish-1507",