prae-cli 0.7.1 → 0.9.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.
- package/lib/bin.js +3 -3
- package/lib/checkpoint-BWSuhZ5h.js +99 -0
- package/lib/{cli-mahLCjoD.js → cli-7yLG89gV.js} +210 -28
- package/lib/index.js +3 -3
- package/lib/{instructions-C104EUaE.js → instructions-Bg5puOen.js} +1 -1
- package/lib/{mcp-DDcejhwQ.js → mcp-doNYU-1C.js} +1 -1
- package/lib/ocsf-DhVGbBUw.js +211 -0
- package/lib/playground.js +92 -44
- package/lib/prae-baseline.prae.json +17 -9
- package/lib/{receipt-check-DrDE3Wwi.js → receipt-check-CD-W1wXs.js} +1 -1
- package/lib/secret-catcher.prae.json +7 -4
- package/lib/{src-Vnr0fcpK.js → src-CwBEFhww.js} +1 -1
- package/lib/src-D7g4lvaY.js +392 -0
- package/lib/src-d82lSKVQ.js +3 -0
- package/lib/{views-UODslKwu.js → views-CIg2ZNG0.js} +327 -63
- package/package.json +2 -2
- package/lib/src-C9L6NBvu.js +0 -3
- package/lib/src-Ciggx9ja.js +0 -242
- /package/lib/{src-Br1tGPtS.js → src-B25SHWcz.js} +0 -0
- /package/lib/{src-CQ0UmFUK.js → src-CBGZVvt7.js} +0 -0
- /package/lib/{src-CraUX64d.js → src-d4c_n6wd.js} +0 -0
- /package/lib/{test-run-DOaCKD1t.js → test-run-XNIRHKOu.js} +0 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
import { basename } from "node:path";
|
|
2
|
+
|
|
3
|
+
//#region src/ocsf.ts
|
|
4
|
+
const OCSF_VERSION = "1.5.0";
|
|
5
|
+
const DETECTION_FINDING = 2004;
|
|
6
|
+
const API_ACTIVITY = 6003;
|
|
7
|
+
/** OCSF `severity_id`. */
|
|
8
|
+
const SEVERITY = {
|
|
9
|
+
informational: 1,
|
|
10
|
+
low: 2,
|
|
11
|
+
medium: 3,
|
|
12
|
+
high: 4
|
|
13
|
+
};
|
|
14
|
+
/** OCSF `action_id`: what was done about it, in the schema's four words. */
|
|
15
|
+
const ACTION = {
|
|
16
|
+
allowed: 1,
|
|
17
|
+
denied: 2,
|
|
18
|
+
observed: 3
|
|
19
|
+
};
|
|
20
|
+
/** OCSF API Activity `activity_id`. */
|
|
21
|
+
const API_ACTIVITY_OF = {
|
|
22
|
+
read: 2,
|
|
23
|
+
list_dir: 2,
|
|
24
|
+
read_file: 2,
|
|
25
|
+
web_fetch: 2,
|
|
26
|
+
write: 3,
|
|
27
|
+
edit: 3,
|
|
28
|
+
str_replace_editor: 3
|
|
29
|
+
};
|
|
30
|
+
function isEvent(row) {
|
|
31
|
+
return row.tool.startsWith("prae:");
|
|
32
|
+
}
|
|
33
|
+
const isUrl = (subject) => /^https?:\/\//.test(subject);
|
|
34
|
+
/** The file or URL the call was aimed at, as an OCSF evidence artifact. */
|
|
35
|
+
function evidences(row) {
|
|
36
|
+
const subject = row.subject;
|
|
37
|
+
if (subject === void 0 || subject === "" || isEvent(row)) return [];
|
|
38
|
+
if (isUrl(subject)) return [{ url: {
|
|
39
|
+
url_string: subject,
|
|
40
|
+
hostname: subject.replace(/^https?:\/\//, "").split("/")[0] ?? ""
|
|
41
|
+
} }];
|
|
42
|
+
if (row.command !== void 0) return [];
|
|
43
|
+
return [{ file: {
|
|
44
|
+
name: basename(subject),
|
|
45
|
+
path: subject,
|
|
46
|
+
type_id: 1
|
|
47
|
+
} }];
|
|
48
|
+
}
|
|
49
|
+
/** The same target, as the resource an API Activity touched. */
|
|
50
|
+
function resources(row) {
|
|
51
|
+
const subject = row.subject;
|
|
52
|
+
if (subject === void 0 || subject === "") return [];
|
|
53
|
+
if (row.command !== void 0) return [{
|
|
54
|
+
name: row.command.program,
|
|
55
|
+
type: "program"
|
|
56
|
+
}];
|
|
57
|
+
return [{
|
|
58
|
+
name: subject,
|
|
59
|
+
type: isUrl(subject) ? "url" : "file"
|
|
60
|
+
}];
|
|
61
|
+
}
|
|
62
|
+
/** Everything the SIEM has no field for, kept verbatim. The seal lives here. */
|
|
63
|
+
function unmapped(row, disposition) {
|
|
64
|
+
return {
|
|
65
|
+
seq: row.seq,
|
|
66
|
+
disposition,
|
|
67
|
+
seal: row.hash,
|
|
68
|
+
prev: row.prev,
|
|
69
|
+
...row.sig === void 0 ? {} : { sig: row.sig },
|
|
70
|
+
verdict: row.verdict,
|
|
71
|
+
...row.rule === void 0 ? {} : { rule: row.rule },
|
|
72
|
+
...row.capability === void 0 ? {} : { capability: row.capability },
|
|
73
|
+
...row.phase === void 0 ? {} : { phase: row.phase },
|
|
74
|
+
...row.shadow === void 0 ? {} : { shadow: row.shadow },
|
|
75
|
+
...row.subject === void 0 ? {} : { subject: row.subject },
|
|
76
|
+
...row.command === void 0 ? {} : { command: row.command },
|
|
77
|
+
...row.secrets === void 0 ? {} : { secrets: row.secrets.map((s) => ({
|
|
78
|
+
type: s.type,
|
|
79
|
+
rule: s.rule
|
|
80
|
+
})) },
|
|
81
|
+
...row.micros === void 0 ? {} : { micros: row.micros },
|
|
82
|
+
pack: row.pack,
|
|
83
|
+
trace: row.trace,
|
|
84
|
+
evidence: "PRAE ledger row. The seal and signature cover the original row, not this event; verify with `prae verify` or a receipt."
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
function metadata(row, options) {
|
|
88
|
+
const log = options.ledger === void 0 ? void 0 : basename(options.ledger);
|
|
89
|
+
return {
|
|
90
|
+
product: {
|
|
91
|
+
name: options.product.name,
|
|
92
|
+
vendor_name: "PRAE",
|
|
93
|
+
version: options.product.version
|
|
94
|
+
},
|
|
95
|
+
version: OCSF_VERSION,
|
|
96
|
+
profiles: ["security_control"],
|
|
97
|
+
uid: `${row.session ?? log ?? "ledger"}#${row.seq}`,
|
|
98
|
+
...row.session === void 0 ? {} : { correlation_uid: row.session },
|
|
99
|
+
...log === void 0 ? {} : { log_name: log },
|
|
100
|
+
logged_time: Date.parse(row.at)
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
/** What happened, in one line a SOC analyst reads first. */
|
|
104
|
+
function message(row) {
|
|
105
|
+
const what = row.command?.program ?? row.subject ?? row.tool;
|
|
106
|
+
if (isEvent(row)) return `${row.rule ?? row.tool}: ${row.reason ?? what}`;
|
|
107
|
+
const verb = row.verdict === "deny" ? row.phase === "output" ? "ran; output withheld from the model" : "refused before execution" : row.verdict === "ask" ? "held for approval" : row.rule === void 0 ? "allowed" : "allowed and recorded";
|
|
108
|
+
const shadow = row.shadow ? " (shadow mode)" : "";
|
|
109
|
+
const rule = row.rule === void 0 ? "" : ` · ${row.rule}`;
|
|
110
|
+
return `${row.tool} ${what}: ${verb}${shadow}${rule}`;
|
|
111
|
+
}
|
|
112
|
+
function finding(row, options) {
|
|
113
|
+
const event = isEvent(row);
|
|
114
|
+
const severity = event ? SEVERITY.informational : row.verdict === "deny" ? SEVERITY.high : row.verdict === "ask" || row.verdict === "correct" ? SEVERITY.medium : SEVERITY.low;
|
|
115
|
+
const disposition = event ? "logged" : row.shadow ? "logged" : row.verdict === "deny" ? row.phase === "output" ? "withheld" : "blocked" : row.verdict === "ask" ? "held" : "logged";
|
|
116
|
+
const action = disposition === "blocked" || disposition === "withheld" ? ACTION.denied : ACTION.observed;
|
|
117
|
+
const activity = 1;
|
|
118
|
+
return {
|
|
119
|
+
class_uid: DETECTION_FINDING,
|
|
120
|
+
category_uid: 2,
|
|
121
|
+
activity_id: activity,
|
|
122
|
+
type_uid: DETECTION_FINDING * 100 + activity,
|
|
123
|
+
time: Date.parse(row.at),
|
|
124
|
+
severity_id: severity,
|
|
125
|
+
status_id: 1,
|
|
126
|
+
action_id: action,
|
|
127
|
+
is_alert: !event && row.verdict === "deny" && row.shadow !== true,
|
|
128
|
+
message: message(row),
|
|
129
|
+
metadata: metadata(row, options),
|
|
130
|
+
finding_info: {
|
|
131
|
+
uid: `${row.session ?? "ledger"}#${row.seq}`,
|
|
132
|
+
title: event ? `PRAE ${row.rule ?? row.tool}` : `PRAE ${row.verdict}${row.phase === "output" ? " (output)" : ""}${row.rule === void 0 ? "" : ` · ${row.rule}`}`,
|
|
133
|
+
...row.reason === void 0 ? {} : { desc: row.reason },
|
|
134
|
+
analytic: {
|
|
135
|
+
name: row.rule ?? "baseline",
|
|
136
|
+
type_id: 1,
|
|
137
|
+
...row.pack === void 0 ? {} : { version: `${row.pack.name} ${row.pack.version}` }
|
|
138
|
+
},
|
|
139
|
+
...row.capability === void 0 ? {} : { types: [row.capability] }
|
|
140
|
+
},
|
|
141
|
+
evidences: evidences(row),
|
|
142
|
+
unmapped: unmapped(row, disposition)
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function apiActivity(row, options) {
|
|
146
|
+
const activity = API_ACTIVITY_OF[row.tool] ?? 99;
|
|
147
|
+
return {
|
|
148
|
+
class_uid: API_ACTIVITY,
|
|
149
|
+
category_uid: 6,
|
|
150
|
+
activity_id: activity,
|
|
151
|
+
type_uid: API_ACTIVITY * 100 + activity,
|
|
152
|
+
time: Date.parse(row.at),
|
|
153
|
+
severity_id: SEVERITY.informational,
|
|
154
|
+
status_id: 1,
|
|
155
|
+
action_id: ACTION.allowed,
|
|
156
|
+
message: message(row),
|
|
157
|
+
metadata: metadata(row, options),
|
|
158
|
+
actor: {
|
|
159
|
+
app_name: "dsh",
|
|
160
|
+
...row.session === void 0 ? {} : { session: { uid: row.session } }
|
|
161
|
+
},
|
|
162
|
+
api: {
|
|
163
|
+
operation: row.tool,
|
|
164
|
+
request: { uid: `${row.seq}` },
|
|
165
|
+
response: {
|
|
166
|
+
code: 0,
|
|
167
|
+
message: "allowed"
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
src_endpoint: { name: "agent harness" },
|
|
171
|
+
resources: resources(row),
|
|
172
|
+
unmapped: unmapped(row, "allowed")
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/** One OCSF event per ledger row, in file order. */
|
|
176
|
+
function toOcsf(rows, options) {
|
|
177
|
+
return rows.map((row) => isEvent(row) || row.verdict !== "allow" || row.rule !== void 0 ? finding(row, options) : apiActivity(row, options));
|
|
178
|
+
}
|
|
179
|
+
/** Newline-delimited JSON, the form every collector takes. */
|
|
180
|
+
function ndjson(events) {
|
|
181
|
+
return `${events.map((event) => JSON.stringify(event)).join("\n")}\n`;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Splunk HTTP Event Collector: one request, one JSON object per line, each
|
|
185
|
+
* wrapping the event with its time. Sentinel and Security Lake take the
|
|
186
|
+
* NDJSON file through their own ingestion; only HEC has a wire this simple.
|
|
187
|
+
*/
|
|
188
|
+
async function sendToHec(events, url, token, fetchImpl = fetch) {
|
|
189
|
+
const endpoint = `${url.replace(/\/$/, "")}/services/collector/event`;
|
|
190
|
+
const body = events.map((event) => JSON.stringify({
|
|
191
|
+
time: Number(event.time) / 1e3,
|
|
192
|
+
sourcetype: "ocsf:prae",
|
|
193
|
+
event
|
|
194
|
+
})).join("\n");
|
|
195
|
+
const response = await fetchImpl(endpoint, {
|
|
196
|
+
method: "POST",
|
|
197
|
+
headers: {
|
|
198
|
+
authorization: `Splunk ${token}`,
|
|
199
|
+
"content-type": "application/json"
|
|
200
|
+
},
|
|
201
|
+
body
|
|
202
|
+
});
|
|
203
|
+
return {
|
|
204
|
+
sent: events.length,
|
|
205
|
+
status: response.status,
|
|
206
|
+
body: await response.text()
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
//#endregion
|
|
211
|
+
export { OCSF_VERSION, ndjson, sendToHec, toOcsf };
|
package/lib/playground.js
CHANGED
|
@@ -491,52 +491,100 @@
|
|
|
491
491
|
|
|
492
492
|
//#endregion
|
|
493
493
|
//#region ../kernel/src/frameworks.ts
|
|
494
|
-
const FRAMEWORKS = {
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
494
|
+
const FRAMEWORKS = {
|
|
495
|
+
"owasp-llm-top-10-2026": {
|
|
496
|
+
name: "OWASP Top 10 for LLM Applications — 2026",
|
|
497
|
+
short: "OWASP LLM 2026",
|
|
498
|
+
controls: {
|
|
499
|
+
LLM01: {
|
|
500
|
+
name: "Prompt Injection",
|
|
501
|
+
summary: "Instructions in a prompt or in retrieved content alter what the model does."
|
|
502
|
+
},
|
|
503
|
+
LLM02: {
|
|
504
|
+
name: "Sensitive Information Disclosure",
|
|
505
|
+
summary: "Credentials, personal data or proprietary content reach the model or its output."
|
|
506
|
+
},
|
|
507
|
+
LLM03: {
|
|
508
|
+
name: "Excessive Agency",
|
|
509
|
+
summary: "The model can take actions, or holds permissions, beyond what its task needs."
|
|
510
|
+
},
|
|
511
|
+
LLM04: {
|
|
512
|
+
name: "Supply Chain",
|
|
513
|
+
summary: "A compromised model, dataset, plugin or dependency enters the application."
|
|
514
|
+
},
|
|
515
|
+
LLM05: {
|
|
516
|
+
name: "Data and Model Poisoning",
|
|
517
|
+
summary: "Training, fine-tuning or embedding data is manipulated to change behaviour."
|
|
518
|
+
},
|
|
519
|
+
LLM06: {
|
|
520
|
+
name: "Unbounded Consumption",
|
|
521
|
+
summary: "The application permits resource use without a limit, exhausting budget or service."
|
|
522
|
+
},
|
|
523
|
+
LLM07: {
|
|
524
|
+
name: "Misinformation",
|
|
525
|
+
summary: "The model produces false or misleading content that is acted on as if true."
|
|
526
|
+
},
|
|
527
|
+
LLM08: {
|
|
528
|
+
name: "Hidden Context Exposure",
|
|
529
|
+
summary: "System prompts, hidden instructions or internal context are revealed."
|
|
530
|
+
},
|
|
531
|
+
LLM09: {
|
|
532
|
+
name: "Vector and Embedding Weaknesses",
|
|
533
|
+
summary: "Retrieval stores are manipulated or leak across tenants and permissions."
|
|
534
|
+
},
|
|
535
|
+
LLM10: {
|
|
536
|
+
name: "Improper Output Handling",
|
|
537
|
+
summary: "Model output is passed to downstream systems without validation."
|
|
538
|
+
}
|
|
539
|
+
}
|
|
540
|
+
},
|
|
541
|
+
"owasp-agentic-top-10-2026": {
|
|
542
|
+
name: "OWASP Top 10 for Agentic Applications — 2026",
|
|
543
|
+
short: "OWASP Agentic 2026",
|
|
544
|
+
controls: {
|
|
545
|
+
ASI01: {
|
|
546
|
+
name: "Agent Goal Hijack",
|
|
547
|
+
summary: "Untrusted input redirects what the agent is trying to do, turning its objectives against its owner."
|
|
548
|
+
},
|
|
549
|
+
ASI02: {
|
|
550
|
+
name: "Tool Misuse and Exploitation",
|
|
551
|
+
summary: "A legitimate tool the agent already holds is turned to an attacker's ends."
|
|
552
|
+
},
|
|
553
|
+
ASI03: {
|
|
554
|
+
name: "Identity and Privilege Abuse",
|
|
555
|
+
summary: "The agent's own authority, credentials or delegated access is inherited or escalated."
|
|
556
|
+
},
|
|
557
|
+
ASI04: {
|
|
558
|
+
name: "Agentic Supply Chain",
|
|
559
|
+
summary: "A poisoned tool, model, plugin, skill or dependency is trusted before the agent runs."
|
|
560
|
+
},
|
|
561
|
+
ASI05: {
|
|
562
|
+
name: "Unexpected Code Execution",
|
|
563
|
+
summary: "The agent's output reaches something that runs it: a shell, an interpreter, a parser."
|
|
564
|
+
},
|
|
565
|
+
ASI06: {
|
|
566
|
+
name: "Memory and Context Poisoning",
|
|
567
|
+
summary: "Corrupted memory or retrieved context persists across sessions and steers future reasoning."
|
|
568
|
+
},
|
|
569
|
+
ASI07: {
|
|
570
|
+
name: "Insecure Inter-Agent Communication",
|
|
571
|
+
summary: "One agent trusts another's messages by default, so a compromised agent can steer its peers."
|
|
572
|
+
},
|
|
573
|
+
ASI08: {
|
|
574
|
+
name: "Cascading Failures",
|
|
575
|
+
summary: "A single fault propagates across agents, tools and workflows into system-wide impact."
|
|
576
|
+
},
|
|
577
|
+
ASI09: {
|
|
578
|
+
name: "Human-Agent Trust Exploitation",
|
|
579
|
+
summary: "Persuasive or misleading agent output moves a person to an unsafe action or approval."
|
|
580
|
+
},
|
|
581
|
+
ASI10: {
|
|
582
|
+
name: "Rogue Agents",
|
|
583
|
+
summary: "A compromised, misaligned or drifting agent keeps operating in unintended ways."
|
|
584
|
+
}
|
|
537
585
|
}
|
|
538
586
|
}
|
|
539
|
-
}
|
|
587
|
+
};
|
|
540
588
|
|
|
541
589
|
//#endregion
|
|
542
590
|
//#region ../kernel/src/pack.ts
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"prae": "0.1",
|
|
3
3
|
"pack": "prae-baseline",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.2.0",
|
|
5
5
|
"rules": [
|
|
6
6
|
{
|
|
7
7
|
"id": "BASE-001",
|
|
@@ -17,7 +17,8 @@
|
|
|
17
17
|
"because": "piping a download into an interpreter runs code nobody has read"
|
|
18
18
|
},
|
|
19
19
|
"frameworks": {
|
|
20
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
20
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
21
|
+
"owasp-agentic-top-10-2026": ["ASI05", "ASI02"]
|
|
21
22
|
}
|
|
22
23
|
},
|
|
23
24
|
{
|
|
@@ -35,7 +36,8 @@
|
|
|
35
36
|
"because": "a recursive force-delete is not reversible and needs a human"
|
|
36
37
|
},
|
|
37
38
|
"frameworks": {
|
|
38
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
39
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
40
|
+
"owasp-agentic-top-10-2026": ["ASI02"]
|
|
39
41
|
}
|
|
40
42
|
},
|
|
41
43
|
{
|
|
@@ -51,7 +53,8 @@
|
|
|
51
53
|
"because": "escalating privileges needs a human"
|
|
52
54
|
},
|
|
53
55
|
"frameworks": {
|
|
54
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
56
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
57
|
+
"owasp-agentic-top-10-2026": ["ASI03"]
|
|
55
58
|
}
|
|
56
59
|
},
|
|
57
60
|
{
|
|
@@ -73,7 +76,8 @@
|
|
|
73
76
|
"because": "block-device and filesystem tools are not granted to agents"
|
|
74
77
|
},
|
|
75
78
|
"frameworks": {
|
|
76
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
79
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
80
|
+
"owasp-agentic-top-10-2026": ["ASI02"]
|
|
77
81
|
}
|
|
78
82
|
},
|
|
79
83
|
{
|
|
@@ -98,7 +102,8 @@
|
|
|
98
102
|
"because": "secrets and credential stores are out of scope for agents"
|
|
99
103
|
},
|
|
100
104
|
"frameworks": {
|
|
101
|
-
"owasp-llm-top-10-2026": ["LLM02"]
|
|
105
|
+
"owasp-llm-top-10-2026": ["LLM02"],
|
|
106
|
+
"owasp-agentic-top-10-2026": ["ASI03"]
|
|
102
107
|
}
|
|
103
108
|
},
|
|
104
109
|
{
|
|
@@ -115,7 +120,8 @@
|
|
|
115
120
|
"because": "writing outside the working tree needs a human"
|
|
116
121
|
},
|
|
117
122
|
"frameworks": {
|
|
118
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
123
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
124
|
+
"owasp-agentic-top-10-2026": ["ASI02"]
|
|
119
125
|
}
|
|
120
126
|
},
|
|
121
127
|
{
|
|
@@ -132,7 +138,8 @@
|
|
|
132
138
|
"because": "rewriting shared history needs a human"
|
|
133
139
|
},
|
|
134
140
|
"frameworks": {
|
|
135
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
141
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
142
|
+
"owasp-agentic-top-10-2026": ["ASI02"]
|
|
136
143
|
}
|
|
137
144
|
},
|
|
138
145
|
{
|
|
@@ -149,7 +156,8 @@
|
|
|
149
156
|
"because": "publishing is outward-facing and needs a human"
|
|
150
157
|
},
|
|
151
158
|
"frameworks": {
|
|
152
|
-
"owasp-llm-top-10-2026": ["LLM03"]
|
|
159
|
+
"owasp-llm-top-10-2026": ["LLM03"],
|
|
160
|
+
"owasp-agentic-top-10-2026": ["ASI02"]
|
|
153
161
|
}
|
|
154
162
|
}
|
|
155
163
|
]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"prae": "0.1",
|
|
3
3
|
"pack": "secret-catcher",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.1.0",
|
|
5
5
|
"rules": [
|
|
6
6
|
{
|
|
7
7
|
"id": "SEC-001",
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
"because": "the requested file contains a protected credential; the contents were not returned"
|
|
27
27
|
},
|
|
28
28
|
"frameworks": {
|
|
29
|
-
"owasp-llm-top-10-2026": ["LLM02"]
|
|
29
|
+
"owasp-llm-top-10-2026": ["LLM02"],
|
|
30
|
+
"owasp-agentic-top-10-2026": ["ASI03"]
|
|
30
31
|
}
|
|
31
32
|
},
|
|
32
33
|
{
|
|
@@ -43,7 +44,8 @@
|
|
|
43
44
|
"because": "the requested file contains a private key; the contents were not returned"
|
|
44
45
|
},
|
|
45
46
|
"frameworks": {
|
|
46
|
-
"owasp-llm-top-10-2026": ["LLM02"]
|
|
47
|
+
"owasp-llm-top-10-2026": ["LLM02"],
|
|
48
|
+
"owasp-agentic-top-10-2026": ["ASI03"]
|
|
47
49
|
}
|
|
48
50
|
},
|
|
49
51
|
{
|
|
@@ -74,7 +76,8 @@
|
|
|
74
76
|
"because": "the command ran and its output contained a protected credential; the output was withheld from the model"
|
|
75
77
|
},
|
|
76
78
|
"frameworks": {
|
|
77
|
-
"owasp-llm-top-10-2026": ["LLM02"]
|
|
79
|
+
"owasp-llm-top-10-2026": ["LLM02"],
|
|
80
|
+
"owasp-agentic-top-10-2026": ["ASI03"]
|
|
78
81
|
}
|
|
79
82
|
}
|
|
80
83
|
]
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import { a as scan, i as looksBinary, n as MAX_SCAN_BYTES, r as entropy, t as DETECTORS } from "./src-
|
|
1
|
+
import { a as scan, i as looksBinary, n as MAX_SCAN_BYTES, r as entropy, t as DETECTORS } from "./src-B25SHWcz.js";
|
|
2
2
|
|
|
3
3
|
export { DETECTORS, MAX_SCAN_BYTES, entropy, looksBinary, scan };
|