renma 0.1.0 → 0.2.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.
@@ -0,0 +1,403 @@
1
+ const constraints = [
2
+ "Do not remove legitimate setup steps solely because this finding exists.",
3
+ "Preserve required platform-specific setup instructions.",
4
+ "Prefer pinning, scoping, confirmation, and recovery guidance over deleting operational detail.",
5
+ ];
6
+ const verificationSteps = [
7
+ "Review the reported command or instruction.",
8
+ "Add version pinning, checksum verification, confirmation, scoping, or recovery steps as appropriate.",
9
+ "Run `renma scan` again.",
10
+ ];
11
+ const remoteScriptMetadata = {
12
+ id: "SEC-UNPINNED-REMOTE-SCRIPT",
13
+ title: "Remote script execution without pinning or inspection",
14
+ whyItMatters: "Agent-facing instructions that pipe remote code directly into a shell can cause unreviewed code execution.",
15
+ remediation: "Download the script first, inspect it, pin the source/version/checksum, and run it only after human approval.",
16
+ llmHint: "Replace one-line remote shell execution with download, checksum/version pinning, inspection, and explicit human approval steps.",
17
+ };
18
+ const unpinnedDependencyMetadata = {
19
+ id: "SEC-UNPINNED-DEPENDENCY-INSTALL",
20
+ title: "Dependency install without a version pin",
21
+ whyItMatters: "Agent-facing install instructions that resolve the latest package can change behavior between runs and pull unreviewed code.",
22
+ remediation: "Pin package versions or document why the latest version is intentionally required.",
23
+ llmHint: "Prefer explicit package versions, image tags, or a written reason why latest is required.",
24
+ };
25
+ const privilegedCommandMetadata = {
26
+ id: "SEC-PRIVILEGED-COMMAND-WITHOUT-GUARD",
27
+ title: "Privileged command without nearby guardrails",
28
+ whyItMatters: "Privileged commands in reusable instructions can alter system state broadly when copied by an agent without confirmation or rollback guidance.",
29
+ remediation: "Add explicit scope, confirmation, and rollback/verification instructions before privileged commands.",
30
+ llmHint: "Keep the setup step if it is required, but add confirmation, path scope, backup or rollback, and verification language nearby.",
31
+ };
32
+ const predictableTempMetadata = {
33
+ id: "SEC-PREDICTABLE-TEMP-PATH",
34
+ title: "Predictable temporary path in operational instructions",
35
+ whyItMatters: "Predictable temporary paths can expose sensitive files or collide with existing files when reused by agents or scripts.",
36
+ remediation: "Use `mktemp` or a workspace-scoped temporary directory, and avoid predictable paths for sensitive data.",
37
+ llmHint: "Use mktemp or a repository-scoped temporary path, especially for tokens, credentials, signing material, or auth files.",
38
+ };
39
+ const credentialArgMetadata = {
40
+ id: "SEC-CREDENTIAL-IN-COMMAND-ARG",
41
+ title: "Credential-like value embedded in a command argument",
42
+ whyItMatters: "Credentials in command arguments or reusable headers can leak through shell history, process listings, logs, or copied instructions.",
43
+ remediation: "Use environment variables, secret managers, or interactive prompts. Avoid putting credentials directly in command arguments or reusable instructions.",
44
+ llmHint: "Move literal secrets out of command arguments and into environment variables, secret managers, or interactive prompts.",
45
+ };
46
+ const guardWords = [
47
+ "confirm",
48
+ "ask the user",
49
+ "approval",
50
+ "dry run",
51
+ "backup",
52
+ "restore",
53
+ "rollback",
54
+ "revert",
55
+ "scope",
56
+ "only this path",
57
+ "verify",
58
+ ];
59
+ const sensitiveTempWords = [
60
+ "token",
61
+ "secret",
62
+ "password",
63
+ "credential",
64
+ "key",
65
+ "cert",
66
+ "certificate",
67
+ "profile",
68
+ "provisioning",
69
+ "signing",
70
+ "auth",
71
+ ];
72
+ const commandStarters = [
73
+ "bash",
74
+ "brew",
75
+ "chmod",
76
+ "chown",
77
+ "curl",
78
+ "docker",
79
+ "npm",
80
+ "pip",
81
+ "pip3",
82
+ "sh",
83
+ "sudo",
84
+ "wget",
85
+ ];
86
+ export function securityDiagnosticFindings(artifacts) {
87
+ return artifacts
88
+ .flatMap((artifact) => securityFindingsForArtifact(artifact))
89
+ .sort(compareDiagnostics);
90
+ }
91
+ function securityFindingsForArtifact(artifact) {
92
+ const lines = artifact.content.split(/\r?\n/);
93
+ const findings = [];
94
+ let inFence = false;
95
+ for (let index = 0; index < lines.length; index += 1) {
96
+ const line = lines[index] ?? "";
97
+ const trimmed = line.trim();
98
+ if (trimmed.startsWith("```")) {
99
+ inFence = !inFence;
100
+ continue;
101
+ }
102
+ if (isCommentOnlyShellLine(trimmed))
103
+ continue;
104
+ const context = nearbyContext(lines, index);
105
+ const operational = inFence || looksOperational(trimmed);
106
+ const detections = [
107
+ ...detectRemoteScript(trimmed, operational),
108
+ ...detectUnpinnedDependency(trimmed, operational),
109
+ ...detectPrivilegedCommand(trimmed, context, operational),
110
+ ...detectPredictableTempPath(trimmed, context, operational),
111
+ ...detectCredentialArgument(trimmed, operational),
112
+ ];
113
+ for (const detection of detections) {
114
+ findings.push(toFinding(artifact.path, { ...detection, line: index + 1 }));
115
+ }
116
+ }
117
+ return collapsePredictableTempPathFindings(findings);
118
+ }
119
+ function detectRemoteScript(line, operational) {
120
+ if (!operational)
121
+ return [];
122
+ const directPipe = /\b(curl|wget)\b[^\n|]*(https?:\/\/\S+)[^\n|]*\|\s*(sudo\s+)?(ba)?sh\b/i.test(line);
123
+ const processSubstitution = /\b(ba)?sh\s*<\(\s*(curl|wget)\b[^\n)]*https?:\/\/\S+/i.test(line);
124
+ if (!directPipe && !processSubstitution)
125
+ return [];
126
+ return [
127
+ {
128
+ metadata: remoteScriptMetadata,
129
+ severity: directPipe ? "high" : "medium",
130
+ confidence: "high",
131
+ line: 0,
132
+ snippet: line,
133
+ },
134
+ ];
135
+ }
136
+ function detectUnpinnedDependency(line, operational) {
137
+ if (!operational)
138
+ return [];
139
+ const detections = [];
140
+ const npm = line.match(/\bnpm\s+(?:install|i)\s+([^\n#]+)/i);
141
+ if (npm) {
142
+ const args = splitCommandArgs(npm[1] ?? "");
143
+ const globalInstall = args.includes("-g") || args.includes("--global");
144
+ const packages = args.filter((arg) => isPackageToken(arg) && arg !== "-g");
145
+ const unpinned = packages.find((arg) => !isPinnedNpmPackage(arg));
146
+ if (unpinned) {
147
+ detections.push({
148
+ metadata: unpinnedDependencyMetadata,
149
+ severity: globalInstall ? "medium" : "low",
150
+ confidence: "medium",
151
+ line: 0,
152
+ snippet: line,
153
+ });
154
+ }
155
+ }
156
+ const pip = line.match(/\bpip3?\s+install\s+([^\n#]+)/i);
157
+ if (pip) {
158
+ const packages = splitCommandArgs(pip[1] ?? "").filter(isPackageToken);
159
+ const unpinned = packages.find((arg) => !/[<>=~!]=/.test(arg));
160
+ if (unpinned) {
161
+ detections.push({
162
+ metadata: unpinnedDependencyMetadata,
163
+ severity: "low",
164
+ confidence: "medium",
165
+ line: 0,
166
+ snippet: line,
167
+ });
168
+ }
169
+ }
170
+ const brew = line.match(/\bbrew\s+install\s+([^\n#]+)/i);
171
+ if (brew) {
172
+ const packages = splitCommandArgs(brew[1] ?? "").filter(isPackageToken);
173
+ if (packages.length > 0) {
174
+ detections.push({
175
+ metadata: unpinnedDependencyMetadata,
176
+ severity: "low",
177
+ confidence: "medium",
178
+ line: 0,
179
+ snippet: line,
180
+ });
181
+ }
182
+ }
183
+ if (/\bdocker\s+(pull|run)\b[^\n#]*\S+:latest\b/i.test(line)) {
184
+ detections.push({
185
+ metadata: unpinnedDependencyMetadata,
186
+ severity: "medium",
187
+ confidence: "high",
188
+ line: 0,
189
+ snippet: line,
190
+ });
191
+ }
192
+ if (/\bcurl\b[^\n#]*https?:\/\/\S*\/latest(?:\/|\b|\S*)/i.test(line)) {
193
+ detections.push({
194
+ metadata: unpinnedDependencyMetadata,
195
+ severity: "low",
196
+ confidence: "medium",
197
+ line: 0,
198
+ snippet: line,
199
+ });
200
+ }
201
+ return detections;
202
+ }
203
+ function detectPrivilegedCommand(line, context, operational) {
204
+ if (!operational)
205
+ return [];
206
+ const hasPrivilegedCommand = /\bsudo\s+(npm|rm|chmod|chown|sh|bash|curl|wget)\b/i.test(line) ||
207
+ /\bchmod\s+-R\s+777\b/i.test(line) ||
208
+ /\bchown\s+-R\b/i.test(line);
209
+ if (!hasPrivilegedCommand || hasGuardrail(context))
210
+ return [];
211
+ return [
212
+ {
213
+ metadata: privilegedCommandMetadata,
214
+ severity: "medium",
215
+ confidence: "medium",
216
+ line: 0,
217
+ snippet: line,
218
+ },
219
+ ];
220
+ }
221
+ function detectPredictableTempPath(line, context, operational) {
222
+ if (!operational || !/\/tmp\/[A-Za-z0-9._/-]+/.test(line))
223
+ return [];
224
+ const sensitive = sensitiveTempWords.some((word) => new RegExp(`\\b${word}\\b`, "i").test(context));
225
+ return [
226
+ {
227
+ metadata: predictableTempMetadata,
228
+ severity: sensitive ? "medium" : "low",
229
+ confidence: sensitive ? "high" : "medium",
230
+ line: 0,
231
+ snippet: line,
232
+ },
233
+ ];
234
+ }
235
+ function detectCredentialArgument(line, operational) {
236
+ if (!operational)
237
+ return [];
238
+ const detections = [];
239
+ const optionMatch = line.match(/\B--(?:password|token)\s+(?:"([^"]+)"|'([^']+)'|(\S+))/i);
240
+ const optionValue = optionMatch?.[1] ?? optionMatch?.[2] ?? optionMatch?.[3];
241
+ if (optionValue && !isSafePlaceholder(optionValue)) {
242
+ detections.push({
243
+ metadata: credentialArgMetadata,
244
+ severity: "high",
245
+ confidence: "high",
246
+ line: 0,
247
+ snippet: line,
248
+ });
249
+ }
250
+ else if (optionValue) {
251
+ detections.push({
252
+ metadata: credentialArgMetadata,
253
+ severity: "medium",
254
+ confidence: "medium",
255
+ line: 0,
256
+ snippet: line,
257
+ });
258
+ }
259
+ const basicAuthMatch = line.match(/\s-u\s+(?:"([^"]+)"|'([^']+)'|(\S+:\S+))/i);
260
+ const basicAuthValue = basicAuthMatch?.[1] ?? basicAuthMatch?.[2] ?? basicAuthMatch?.[3];
261
+ if (basicAuthValue && basicAuthValue.includes(":")) {
262
+ detections.push({
263
+ metadata: credentialArgMetadata,
264
+ severity: isSafePlaceholder(basicAuthValue) ? "medium" : "high",
265
+ confidence: isSafePlaceholder(basicAuthValue) ? "medium" : "high",
266
+ line: 0,
267
+ snippet: line,
268
+ });
269
+ }
270
+ const bearerMatch = line.match(/Authorization:\s*Bearer\s+(?:"([^"]+)"|'([^']+)'|(\S+))/i);
271
+ const bearerValue = bearerMatch?.[1] ?? bearerMatch?.[2] ?? bearerMatch?.[3];
272
+ if (bearerValue && !isSafePlaceholder(bearerValue)) {
273
+ detections.push({
274
+ metadata: credentialArgMetadata,
275
+ severity: bearerValue === "..." ? "medium" : "high",
276
+ confidence: bearerValue === "..." ? "medium" : "high",
277
+ line: 0,
278
+ snippet: line,
279
+ });
280
+ }
281
+ else if (bearerValue) {
282
+ detections.push({
283
+ metadata: credentialArgMetadata,
284
+ severity: "medium",
285
+ confidence: "medium",
286
+ line: 0,
287
+ snippet: line,
288
+ });
289
+ }
290
+ return dedupeDetections(detections);
291
+ }
292
+ function toFinding(path, detection) {
293
+ return {
294
+ ...detection.metadata,
295
+ category: "safety",
296
+ severity: detection.severity,
297
+ confidence: detection.confidence,
298
+ evidence: {
299
+ path,
300
+ startLine: detection.line,
301
+ endLine: detection.line,
302
+ snippet: detection.snippet,
303
+ },
304
+ constraints,
305
+ verificationSteps,
306
+ llmHint: detection.metadata.llmHint,
307
+ };
308
+ }
309
+ function nearbyContext(lines, index) {
310
+ const start = Math.max(0, index - 3);
311
+ const end = Math.min(lines.length, index + 4);
312
+ return lines.slice(start, end).join("\n").toLowerCase();
313
+ }
314
+ function looksOperational(line) {
315
+ if (line.length === 0)
316
+ return false;
317
+ if (line.startsWith("$ "))
318
+ return true;
319
+ if (/[|<>]/.test(line) &&
320
+ /\b(curl|wget|bash|sh|tmp|Authorization)\b/i.test(line)) {
321
+ return true;
322
+ }
323
+ return commandStarters.some((command) => new RegExp(`^(?:[-*]\\s+)?${command}\\b`, "i").test(line));
324
+ }
325
+ function isCommentOnlyShellLine(line) {
326
+ return line.startsWith("#");
327
+ }
328
+ function collapsePredictableTempPathFindings(findings) {
329
+ const collapsed = [];
330
+ const lastByPath = new Map();
331
+ for (const finding of findings) {
332
+ if (finding.id !== "SEC-PREDICTABLE-TEMP-PATH") {
333
+ collapsed.push(finding);
334
+ continue;
335
+ }
336
+ const tempPath = extractTempPath(finding.evidence.snippet);
337
+ if (!tempPath) {
338
+ collapsed.push(finding);
339
+ continue;
340
+ }
341
+ const key = `${finding.evidence.path}:${tempPath}`;
342
+ const previous = lastByPath.get(key);
343
+ if (previous &&
344
+ finding.evidence.startLine - previous.evidence.startLine <= 10) {
345
+ continue;
346
+ }
347
+ lastByPath.set(key, finding);
348
+ collapsed.push(finding);
349
+ }
350
+ return collapsed;
351
+ }
352
+ function extractTempPath(value) {
353
+ return value.match(/\/tmp\/[A-Za-z0-9._/-]+/)?.[0];
354
+ }
355
+ function splitCommandArgs(value) {
356
+ return value
357
+ .split(/\s+/)
358
+ .map((arg) => arg.replace(/^["']|["']$/g, ""))
359
+ .filter(Boolean);
360
+ }
361
+ function isPackageToken(arg) {
362
+ return (!arg.startsWith("-") && !arg.includes("/") && arg !== "." && arg !== "..");
363
+ }
364
+ function isPinnedNpmPackage(arg) {
365
+ if (arg.startsWith("@")) {
366
+ const lastAt = arg.lastIndexOf("@");
367
+ return lastAt > 0 && lastAt < arg.length - 1;
368
+ }
369
+ return /@\d/.test(arg);
370
+ }
371
+ function hasGuardrail(context) {
372
+ return guardWords.some((word) => context.includes(word));
373
+ }
374
+ function isSafePlaceholder(value) {
375
+ const normalized = value.trim().replace(/[",]$/g, "");
376
+ return (normalized.startsWith("$") ||
377
+ /^<[^>]+>$/.test(normalized) ||
378
+ /^YOUR_[A-Z0-9_]+$/.test(normalized) ||
379
+ /^REDACTED$/i.test(normalized) ||
380
+ /^\*+$/.test(normalized));
381
+ }
382
+ function dedupeDetections(detections) {
383
+ const seen = new Set();
384
+ return detections.filter((detection) => {
385
+ const key = `${detection.metadata.id}:${detection.snippet}`;
386
+ if (seen.has(key))
387
+ return false;
388
+ seen.add(key);
389
+ return true;
390
+ });
391
+ }
392
+ function compareDiagnostics(a, b) {
393
+ const aPath = a.evidence.path;
394
+ const bPath = b.evidence.path;
395
+ if (aPath !== bPath)
396
+ return aPath.localeCompare(bPath);
397
+ const aLine = a.evidence.startLine;
398
+ const bLine = b.evidence.startLine;
399
+ if (aLine !== bLine)
400
+ return aLine - bLine;
401
+ return a.id.localeCompare(b.id);
402
+ }
403
+ //# sourceMappingURL=security-diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security-diagnostics.js","sourceRoot":"","sources":["../src/security-diagnostics.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "renma",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Git-native governance and quality CLI for LLM-ready skills and shared context assets.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -20,7 +20,7 @@
20
20
  "codex",
21
21
  "skills"
22
22
  ],
23
- "type": "module",
23
+ "type": "module",
24
24
  "bin": {
25
25
  "renma": "./dist/index.js"
26
26
  },