supply-chain-guard 3.0.0 → 4.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.
- package/README.md +30 -1
- package/dist/cargo-scanner.d.ts +21 -0
- package/dist/cargo-scanner.d.ts.map +1 -0
- package/dist/cargo-scanner.js +241 -0
- package/dist/cargo-scanner.js.map +1 -0
- package/dist/cli.js +20 -7
- package/dist/cli.js.map +1 -1
- package/dist/config-scanner.d.ts +21 -0
- package/dist/config-scanner.d.ts.map +1 -0
- package/dist/config-scanner.js +186 -0
- package/dist/config-scanner.js.map +1 -0
- package/dist/dependency-confusion.d.ts +1 -1
- package/dist/dependency-confusion.d.ts.map +1 -1
- package/dist/dockerfile-scanner.d.ts +21 -0
- package/dist/dockerfile-scanner.d.ts.map +1 -0
- package/dist/dockerfile-scanner.js +198 -0
- package/dist/dockerfile-scanner.js.map +1 -0
- package/dist/entropy.d.ts +17 -0
- package/dist/entropy.d.ts.map +1 -0
- package/dist/entropy.js +105 -0
- package/dist/entropy.js.map +1 -0
- package/dist/git-scanner.d.ts +14 -0
- package/dist/git-scanner.d.ts.map +1 -0
- package/dist/git-scanner.js +227 -0
- package/dist/git-scanner.js.map +1 -0
- package/dist/go-scanner.d.ts +21 -0
- package/dist/go-scanner.d.ts.map +1 -0
- package/dist/go-scanner.js +220 -0
- package/dist/go-scanner.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -1
- package/dist/index.js.map +1 -1
- package/dist/patterns.d.ts +7 -0
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +194 -1
- package/dist/patterns.js.map +1 -1
- package/dist/reporter.d.ts +1 -1
- package/dist/reporter.d.ts.map +1 -1
- package/dist/reporter.js +209 -1
- package/dist/reporter.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +186 -2
- package/dist/scanner.js.map +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/vscode-scanner.d.ts +1 -1
- package/dist/vscode-scanner.d.ts.map +1 -1
- package/package.json +11 -3
package/README.md
CHANGED
|
@@ -4,7 +4,7 @@ Open-source supply-chain security scanner for npm, PyPI, VS Code extensions, Git
|
|
|
4
4
|
|
|
5
5
|
[](https://opensource.org/licenses/Apache-2.0)
|
|
6
6
|
[](https://nodejs.org)
|
|
7
|
-
[](https://www.npmjs.com/package/supply-chain-guard)
|
|
8
8
|
|
|
9
9
|
## Background
|
|
10
10
|
|
|
@@ -124,8 +124,31 @@ supply-chain-guard scan ./project --format json
|
|
|
124
124
|
|
|
125
125
|
# Markdown (for PR comments)
|
|
126
126
|
supply-chain-guard scan ./project --format markdown
|
|
127
|
+
|
|
128
|
+
# SARIF 2.1.0 (for GitHub Code Scanning)
|
|
129
|
+
supply-chain-guard scan ./project --format sarif
|
|
130
|
+
|
|
131
|
+
# CycloneDX 1.5 SBOM (for compliance: NIS2, SSDF, SBOM mandates)
|
|
132
|
+
supply-chain-guard scan ./project --format sbom
|
|
127
133
|
```
|
|
128
134
|
|
|
135
|
+
### CI Exit Code Control
|
|
136
|
+
|
|
137
|
+
By default, the scanner exits 2 on critical findings and 1 on high findings. Use `--fail-on` to set a custom threshold:
|
|
138
|
+
|
|
139
|
+
```bash
|
|
140
|
+
# Fail only on critical (ignore high/medium/low)
|
|
141
|
+
supply-chain-guard scan ./project --fail-on critical
|
|
142
|
+
|
|
143
|
+
# Fail on high or above (critical + high)
|
|
144
|
+
supply-chain-guard scan ./project --fail-on high
|
|
145
|
+
|
|
146
|
+
# Fail on any finding
|
|
147
|
+
supply-chain-guard scan ./project --fail-on info
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
This is useful for tiered CI pipelines: block deploys on critical, warn on medium.
|
|
151
|
+
|
|
129
152
|
### Filtering
|
|
130
153
|
|
|
131
154
|
```bash
|
|
@@ -296,6 +319,12 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines. The most impactful contri
|
|
|
296
319
|
|
|
297
320
|
## Changelog
|
|
298
321
|
|
|
322
|
+
### v3.1.0 (2026-03-26)
|
|
323
|
+
- **New:** SBOM export in CycloneDX 1.5 JSON format (`--format sbom`) for compliance (NIS2, SSDF)
|
|
324
|
+
- **New:** `--fail-on <severity>` flag for tiered CI pipelines (fail only at specified severity threshold)
|
|
325
|
+
- **Tests:** Full unit test coverage for solana-monitor (23 tests), reporter (39 tests), CLI integration (22 tests)
|
|
326
|
+
- **Total:** 269 tests, all passing
|
|
327
|
+
|
|
299
328
|
### v3.0.0 (2026-03-26)
|
|
300
329
|
- **New:** PyPI scanner detects malicious `setup.py` install hooks (subprocess, base64 exec, cmdclass downloads)
|
|
301
330
|
- **New:** GitHub Actions workflow scanner detects CI/CD pipeline attacks (unpinned actions, secrets exfiltration, encoded payloads)
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo/Rust supply-chain scanner.
|
|
3
|
+
*
|
|
4
|
+
* Detects supply-chain risks in Cargo.toml, build.rs, and
|
|
5
|
+
* Rust procedural macros.
|
|
6
|
+
*/
|
|
7
|
+
import type { Finding, PatternEntry } from "./types.js";
|
|
8
|
+
export declare const CARGO_PATTERNS: PatternEntry[];
|
|
9
|
+
/**
|
|
10
|
+
* Check if a file is a Cargo-related file.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isCargoFile(filename: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Scan Cargo-related files in a directory.
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanCargoFiles(dir: string): Finding[];
|
|
17
|
+
/**
|
|
18
|
+
* Scan content of a Cargo-related file.
|
|
19
|
+
*/
|
|
20
|
+
export declare function scanCargoContent(content: string, relativePath: string, fileType: "toml" | "build" | "proc-macro"): Finding[];
|
|
21
|
+
//# sourceMappingURL=cargo-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo-scanner.d.ts","sourceRoot":"","sources":["../src/cargo-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAMxD,eAAO,MAAM,cAAc,EAAE,YAAY,EAuFxC,CAAC;AAMF;;GAEG;AACH,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAErD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAyBrD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GAAG,OAAO,GAAG,YAAY,GACxC,OAAO,EAAE,CAuCX"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Cargo/Rust supply-chain scanner.
|
|
4
|
+
*
|
|
5
|
+
* Detects supply-chain risks in Cargo.toml, build.rs, and
|
|
6
|
+
* Rust procedural macros.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.CARGO_PATTERNS = void 0;
|
|
43
|
+
exports.isCargoFile = isCargoFile;
|
|
44
|
+
exports.scanCargoFiles = scanCargoFiles;
|
|
45
|
+
exports.scanCargoContent = scanCargoContent;
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Cargo/Rust patterns
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
exports.CARGO_PATTERNS = [
|
|
52
|
+
// build.rs risks
|
|
53
|
+
{
|
|
54
|
+
name: "cargo-build-rs-exec",
|
|
55
|
+
pattern: "Command::new\\s*\\(|std::process::Command|process::Command",
|
|
56
|
+
description: "build.rs executes system commands. Build scripts run during `cargo build` with full privileges.",
|
|
57
|
+
severity: "critical",
|
|
58
|
+
rule: "CARGO_BUILD_RS_EXEC",
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
name: "cargo-build-rs-network",
|
|
62
|
+
pattern: "(?:reqwest|hyper|curl|ureq|attohttpc|minreq)\\b.*(?:get|post|request|fetch)|TcpStream::connect",
|
|
63
|
+
description: "build.rs performs network requests. Build scripts should not access the network.",
|
|
64
|
+
severity: "high",
|
|
65
|
+
rule: "CARGO_BUILD_RS_NETWORK",
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
name: "cargo-build-rs-env-exfil",
|
|
69
|
+
pattern: "env::var\\b.*(?:reqwest|hyper|TcpStream|UdpSocket)|(?:reqwest|hyper|TcpStream|UdpSocket).*env::var",
|
|
70
|
+
description: "build.rs reads environment variables near network code (potential data exfiltration).",
|
|
71
|
+
severity: "critical",
|
|
72
|
+
rule: "CARGO_BUILD_RS_ENV_EXFIL",
|
|
73
|
+
},
|
|
74
|
+
{
|
|
75
|
+
name: "cargo-build-rs-download",
|
|
76
|
+
pattern: "(?:curl|wget|fetch|download).*(?:write_all|copy|save|File::create)",
|
|
77
|
+
description: "build.rs downloads and writes files to disk.",
|
|
78
|
+
severity: "high",
|
|
79
|
+
rule: "CARGO_BUILD_RS_DOWNLOAD",
|
|
80
|
+
},
|
|
81
|
+
// Cargo.toml risks
|
|
82
|
+
{
|
|
83
|
+
name: "cargo-git-dependency",
|
|
84
|
+
pattern: "git\\s*=\\s*[\"']https?://(?!github\\.com/rust-lang|github\\.com/tokio-rs|github\\.com/serde-rs)",
|
|
85
|
+
description: "Cargo dependency from a git URL instead of crates.io. Git sources bypass crates.io integrity checks.",
|
|
86
|
+
severity: "medium",
|
|
87
|
+
rule: "CARGO_GIT_DEPENDENCY",
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
name: "cargo-patch-section",
|
|
91
|
+
pattern: "\\[patch\\.",
|
|
92
|
+
description: "Cargo.toml [patch] section detected. Patches override crate sources and can redirect dependencies.",
|
|
93
|
+
severity: "high",
|
|
94
|
+
rule: "CARGO_PATCH_SECTION",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
name: "cargo-replace-section",
|
|
98
|
+
pattern: "\\[replace\\]",
|
|
99
|
+
description: "Cargo.toml [replace] section detected (deprecated). Replaces override dependency resolution.",
|
|
100
|
+
severity: "high",
|
|
101
|
+
rule: "CARGO_REPLACE_SECTION",
|
|
102
|
+
},
|
|
103
|
+
// Proc macro risks
|
|
104
|
+
{
|
|
105
|
+
name: "cargo-proc-macro-fs",
|
|
106
|
+
pattern: "std::fs::|fs::(?:read|write|remove|create)",
|
|
107
|
+
description: "Procedural macro performs file system operations. Proc macros run at compile time with full access.",
|
|
108
|
+
severity: "high",
|
|
109
|
+
rule: "CARGO_PROC_MACRO_FS",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
name: "cargo-proc-macro-network",
|
|
113
|
+
pattern: "std::net::|TcpStream|UdpSocket|reqwest|hyper",
|
|
114
|
+
description: "Procedural macro performs network operations. Proc macros should not access the network.",
|
|
115
|
+
severity: "critical",
|
|
116
|
+
rule: "CARGO_PROC_MACRO_NETWORK",
|
|
117
|
+
},
|
|
118
|
+
];
|
|
119
|
+
/** Cargo-related file names */
|
|
120
|
+
const CARGO_FILES = new Set(["Cargo.toml", "Cargo.lock"]);
|
|
121
|
+
const BUILD_RS = "build.rs";
|
|
122
|
+
/**
|
|
123
|
+
* Check if a file is a Cargo-related file.
|
|
124
|
+
*/
|
|
125
|
+
function isCargoFile(filename) {
|
|
126
|
+
return CARGO_FILES.has(filename) || filename === BUILD_RS;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Scan Cargo-related files in a directory.
|
|
130
|
+
*/
|
|
131
|
+
function scanCargoFiles(dir) {
|
|
132
|
+
const findings = [];
|
|
133
|
+
// Scan Cargo.toml
|
|
134
|
+
const cargoToml = path.join(dir, "Cargo.toml");
|
|
135
|
+
if (fs.existsSync(cargoToml)) {
|
|
136
|
+
try {
|
|
137
|
+
const content = fs.readFileSync(cargoToml, "utf-8");
|
|
138
|
+
findings.push(...scanCargoContent(content, "Cargo.toml", "toml"));
|
|
139
|
+
}
|
|
140
|
+
catch { /* skip */ }
|
|
141
|
+
}
|
|
142
|
+
// Scan build.rs
|
|
143
|
+
const buildRs = path.join(dir, BUILD_RS);
|
|
144
|
+
if (fs.existsSync(buildRs)) {
|
|
145
|
+
try {
|
|
146
|
+
const content = fs.readFileSync(buildRs, "utf-8");
|
|
147
|
+
findings.push(...scanCargoContent(content, BUILD_RS, "build"));
|
|
148
|
+
}
|
|
149
|
+
catch { /* skip */ }
|
|
150
|
+
}
|
|
151
|
+
// Scan proc-macro crates (look in src/ for files with proc_macro attribute)
|
|
152
|
+
scanProcMacros(dir, findings);
|
|
153
|
+
return findings;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Scan content of a Cargo-related file.
|
|
157
|
+
*/
|
|
158
|
+
function scanCargoContent(content, relativePath, fileType) {
|
|
159
|
+
const findings = [];
|
|
160
|
+
const lines = content.split("\n");
|
|
161
|
+
const patterns = fileType === "toml"
|
|
162
|
+
? exports.CARGO_PATTERNS.filter((p) => p.rule.startsWith("CARGO_GIT") ||
|
|
163
|
+
p.rule.startsWith("CARGO_PATCH") ||
|
|
164
|
+
p.rule.startsWith("CARGO_REPLACE"))
|
|
165
|
+
: fileType === "build"
|
|
166
|
+
? exports.CARGO_PATTERNS.filter((p) => p.rule.startsWith("CARGO_BUILD_RS"))
|
|
167
|
+
: exports.CARGO_PATTERNS.filter((p) => p.rule.startsWith("CARGO_PROC_MACRO"));
|
|
168
|
+
for (const pattern of patterns) {
|
|
169
|
+
const regex = new RegExp(pattern.pattern, "i");
|
|
170
|
+
for (let i = 0; i < lines.length; i++) {
|
|
171
|
+
const line = lines[i] ?? "";
|
|
172
|
+
const match = regex.exec(line);
|
|
173
|
+
if (match) {
|
|
174
|
+
findings.push({
|
|
175
|
+
rule: pattern.rule,
|
|
176
|
+
description: pattern.description,
|
|
177
|
+
severity: pattern.severity,
|
|
178
|
+
file: relativePath,
|
|
179
|
+
line: i + 1,
|
|
180
|
+
match: match[0].length > 120
|
|
181
|
+
? match[0].substring(0, 120) + "..."
|
|
182
|
+
: match[0],
|
|
183
|
+
recommendation: getCargoRecommendation(pattern.rule),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
return findings;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Look for proc-macro source files and scan them.
|
|
192
|
+
*/
|
|
193
|
+
function scanProcMacros(dir, findings) {
|
|
194
|
+
// Check if Cargo.toml declares proc-macro = true
|
|
195
|
+
const cargoToml = path.join(dir, "Cargo.toml");
|
|
196
|
+
if (!fs.existsSync(cargoToml))
|
|
197
|
+
return;
|
|
198
|
+
let tomlContent;
|
|
199
|
+
try {
|
|
200
|
+
tomlContent = fs.readFileSync(cargoToml, "utf-8");
|
|
201
|
+
}
|
|
202
|
+
catch {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
if (!tomlContent.includes("proc-macro") && !tomlContent.includes("proc_macro"))
|
|
206
|
+
return;
|
|
207
|
+
// Scan .rs files in src/
|
|
208
|
+
const srcDir = path.join(dir, "src");
|
|
209
|
+
if (!fs.existsSync(srcDir))
|
|
210
|
+
return;
|
|
211
|
+
try {
|
|
212
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
213
|
+
for (const entry of entries) {
|
|
214
|
+
if (!entry.isFile() || !entry.name.endsWith(".rs"))
|
|
215
|
+
continue;
|
|
216
|
+
const fullPath = path.join(srcDir, entry.name);
|
|
217
|
+
try {
|
|
218
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
219
|
+
const relPath = `src/${entry.name}`;
|
|
220
|
+
findings.push(...scanCargoContent(content, relPath, "proc-macro"));
|
|
221
|
+
}
|
|
222
|
+
catch { /* skip */ }
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
catch { /* skip */ }
|
|
226
|
+
}
|
|
227
|
+
function getCargoRecommendation(rule) {
|
|
228
|
+
const map = {
|
|
229
|
+
CARGO_BUILD_RS_EXEC: "Audit build.rs command execution. Build scripts run with full access during `cargo build`.",
|
|
230
|
+
CARGO_BUILD_RS_NETWORK: "Build scripts should not make network requests. Use vendored dependencies or cargo's built-in mechanisms.",
|
|
231
|
+
CARGO_BUILD_RS_ENV_EXFIL: "Environment variable access combined with network code in build.rs is a data exfiltration risk.",
|
|
232
|
+
CARGO_BUILD_RS_DOWNLOAD: "Build script downloads files. Verify the source is trusted and integrity is checked.",
|
|
233
|
+
CARGO_GIT_DEPENDENCY: "Use crates.io dependencies when possible. Git dependencies bypass registry integrity checks.",
|
|
234
|
+
CARGO_PATCH_SECTION: "Verify [patch] entries are intentional. Patches override dependency resolution.",
|
|
235
|
+
CARGO_REPLACE_SECTION: "The [replace] section is deprecated. Migrate to [patch] and audit the override.",
|
|
236
|
+
CARGO_PROC_MACRO_FS: "Proc macros should not perform file I/O. They run at compile time with full file system access.",
|
|
237
|
+
CARGO_PROC_MACRO_NETWORK: "Proc macros must not access the network. This is a strong indicator of a compromised crate.",
|
|
238
|
+
};
|
|
239
|
+
return map[rule] ?? "Review this Cargo configuration manually.";
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=cargo-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo-scanner.js","sourceRoot":"","sources":["../src/cargo-scanner.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -19,16 +19,17 @@ const program = new commander_1.Command();
|
|
|
19
19
|
program
|
|
20
20
|
.name("supply-chain-guard")
|
|
21
21
|
.description("Open-source supply-chain security scanner. Detects GlassWorm and similar malware campaigns in npm packages, PyPI packages, code repos, VS Code extensions, and project dependencies.")
|
|
22
|
-
.version("
|
|
22
|
+
.version("4.0.0");
|
|
23
23
|
// ── scan command ────────────────────────────────────────────────────
|
|
24
24
|
program
|
|
25
25
|
.command("scan")
|
|
26
26
|
.description("Scan a local directory or GitHub repo for malware indicators")
|
|
27
27
|
.argument("<target>", "Local directory path or GitHub repo URL")
|
|
28
|
-
.option("-f, --format <format>", "Output format: text, json, markdown, sarif", "text")
|
|
28
|
+
.option("-f, --format <format>", "Output format: text, json, markdown, sarif, sbom, html", "text")
|
|
29
29
|
.option("-s, --min-severity <severity>", "Minimum severity to report: critical, high, medium, low, info")
|
|
30
30
|
.option("-e, --exclude <rules>", "Comma-separated list of rule IDs to exclude")
|
|
31
31
|
.option("-d, --depth <depth>", "Maximum directory depth", "20")
|
|
32
|
+
.option("--fail-on <severity>", "Exit non-zero only if findings at or above this severity: critical, high, medium, low, info")
|
|
32
33
|
.action(async (target, opts) => {
|
|
33
34
|
try {
|
|
34
35
|
const options = {
|
|
@@ -40,12 +41,24 @@ program
|
|
|
40
41
|
};
|
|
41
42
|
const report = await (0, scanner_js_1.scan)(options);
|
|
42
43
|
console.log((0, reporter_js_1.formatReport)(report, options.format));
|
|
43
|
-
// Exit
|
|
44
|
-
if (
|
|
45
|
-
|
|
44
|
+
// Exit code logic
|
|
45
|
+
if (opts.failOn) {
|
|
46
|
+
const severityOrder = {
|
|
47
|
+
critical: 4, high: 3, medium: 2, low: 1, info: 0,
|
|
48
|
+
};
|
|
49
|
+
const threshold = severityOrder[opts.failOn] ?? 0;
|
|
50
|
+
const hasFindings = report.findings.some((f) => (severityOrder[f.severity] ?? 0) >= threshold);
|
|
51
|
+
if (hasFindings) {
|
|
52
|
+
process.exit(1);
|
|
53
|
+
}
|
|
46
54
|
}
|
|
47
|
-
|
|
48
|
-
|
|
55
|
+
else {
|
|
56
|
+
if (report.summary.critical > 0) {
|
|
57
|
+
process.exit(2);
|
|
58
|
+
}
|
|
59
|
+
if (report.summary.high > 0) {
|
|
60
|
+
process.exit(1);
|
|
61
|
+
}
|
|
49
62
|
}
|
|
50
63
|
}
|
|
51
64
|
catch (err) {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Package manager configuration file scanner.
|
|
3
|
+
*
|
|
4
|
+
* Detects supply-chain risks in .npmrc, .yarnrc, .pnpmrc,
|
|
5
|
+
* pip.conf, .pypirc, and pyproject.toml config files.
|
|
6
|
+
*/
|
|
7
|
+
import type { Finding, PatternEntry } from "./types.js";
|
|
8
|
+
export declare const CONFIG_PATTERNS: PatternEntry[];
|
|
9
|
+
/**
|
|
10
|
+
* Check whether a filename is a package manager config file.
|
|
11
|
+
*/
|
|
12
|
+
export declare function isConfigFile(filename: string): boolean;
|
|
13
|
+
/**
|
|
14
|
+
* Scan a single config file for supply-chain risks.
|
|
15
|
+
*/
|
|
16
|
+
export declare function scanConfigFile(content: string, relativePath: string): Finding[];
|
|
17
|
+
/**
|
|
18
|
+
* Scan a directory for package manager config files.
|
|
19
|
+
*/
|
|
20
|
+
export declare function scanConfigFiles(dir: string): Finding[];
|
|
21
|
+
//# sourceMappingURL=config-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-scanner.d.ts","sourceRoot":"","sources":["../src/config-scanner.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAMxD,eAAO,MAAM,eAAe,EAAE,YAAY,EA4DzC,CAAC;AAYF;;GAEG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAEtD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,EAAE,CA8BX;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,CAsBtD"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Package manager configuration file scanner.
|
|
4
|
+
*
|
|
5
|
+
* Detects supply-chain risks in .npmrc, .yarnrc, .pnpmrc,
|
|
6
|
+
* pip.conf, .pypirc, and pyproject.toml config files.
|
|
7
|
+
*/
|
|
8
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
9
|
+
if (k2 === undefined) k2 = k;
|
|
10
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
11
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
12
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
13
|
+
}
|
|
14
|
+
Object.defineProperty(o, k2, desc);
|
|
15
|
+
}) : (function(o, m, k, k2) {
|
|
16
|
+
if (k2 === undefined) k2 = k;
|
|
17
|
+
o[k2] = m[k];
|
|
18
|
+
}));
|
|
19
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
20
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
21
|
+
}) : function(o, v) {
|
|
22
|
+
o["default"] = v;
|
|
23
|
+
});
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.CONFIG_PATTERNS = void 0;
|
|
43
|
+
exports.isConfigFile = isConfigFile;
|
|
44
|
+
exports.scanConfigFile = scanConfigFile;
|
|
45
|
+
exports.scanConfigFiles = scanConfigFiles;
|
|
46
|
+
const fs = __importStar(require("node:fs"));
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
// ---------------------------------------------------------------------------
|
|
49
|
+
// Config patterns
|
|
50
|
+
// ---------------------------------------------------------------------------
|
|
51
|
+
exports.CONFIG_PATTERNS = [
|
|
52
|
+
{
|
|
53
|
+
name: "config-http-registry",
|
|
54
|
+
pattern: "registry\\s*=\\s*http://(?!localhost|127\\.0\\.0\\.1)",
|
|
55
|
+
description: "Package manager configured to use plain HTTP registry. Packages can be intercepted via MITM.",
|
|
56
|
+
severity: "critical",
|
|
57
|
+
rule: "CONFIG_HTTP_REGISTRY",
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
name: "config-custom-registry",
|
|
61
|
+
pattern: "registry\\s*=\\s*https?://(?!registry\\.npmjs\\.org|registry\\.yarnpkg\\.com|pypi\\.org|files\\.pythonhosted\\.org)",
|
|
62
|
+
description: "Package manager points to a non-default registry. Verify this is intentional.",
|
|
63
|
+
severity: "high",
|
|
64
|
+
rule: "CONFIG_CUSTOM_REGISTRY",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "config-auth-token",
|
|
68
|
+
pattern: "(?:_authToken|_auth|_password|token|npm_token)\\s*=\\s*[A-Za-z0-9+/=_-]{8,}",
|
|
69
|
+
description: "Authentication token found in config file. Tokens committed to version control can be stolen.",
|
|
70
|
+
severity: "critical",
|
|
71
|
+
rule: "CONFIG_AUTH_TOKEN_EXPOSED",
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
name: "config-unsafe-perm",
|
|
75
|
+
pattern: "unsafe-perm\\s*=\\s*true",
|
|
76
|
+
description: "unsafe-perm=true allows install scripts to run as root, increasing attack surface.",
|
|
77
|
+
severity: "medium",
|
|
78
|
+
rule: "CONFIG_UNSAFE_PERM",
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
name: "config-ignore-scripts-false",
|
|
82
|
+
pattern: "ignore-scripts\\s*=\\s*false",
|
|
83
|
+
description: "ignore-scripts explicitly set to false. Install scripts will execute on npm install.",
|
|
84
|
+
severity: "low",
|
|
85
|
+
rule: "CONFIG_IGNORE_SCRIPTS_OFF",
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: "config-extra-index-url",
|
|
89
|
+
pattern: "extra-index-url\\s*=\\s*https?://(?!pypi\\.org|files\\.pythonhosted\\.org)",
|
|
90
|
+
description: "pip configured with extra-index-url pointing to a non-PyPI source. Dependency confusion risk.",
|
|
91
|
+
severity: "high",
|
|
92
|
+
rule: "CONFIG_EXTRA_INDEX",
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
name: "config-pip-trusted-host",
|
|
96
|
+
pattern: "trusted-host\\s*=",
|
|
97
|
+
description: "pip trusted-host disables SSL verification for a host. Packages can be intercepted.",
|
|
98
|
+
severity: "high",
|
|
99
|
+
rule: "CONFIG_TRUSTED_HOST",
|
|
100
|
+
},
|
|
101
|
+
];
|
|
102
|
+
/** Config file names to scan */
|
|
103
|
+
const CONFIG_FILES = new Set([
|
|
104
|
+
".npmrc",
|
|
105
|
+
".yarnrc",
|
|
106
|
+
".yarnrc.yml",
|
|
107
|
+
".pnpmrc",
|
|
108
|
+
"pip.conf",
|
|
109
|
+
".pypirc",
|
|
110
|
+
]);
|
|
111
|
+
/**
|
|
112
|
+
* Check whether a filename is a package manager config file.
|
|
113
|
+
*/
|
|
114
|
+
function isConfigFile(filename) {
|
|
115
|
+
return CONFIG_FILES.has(filename);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Scan a single config file for supply-chain risks.
|
|
119
|
+
*/
|
|
120
|
+
function scanConfigFile(content, relativePath) {
|
|
121
|
+
const findings = [];
|
|
122
|
+
const lines = content.split("\n");
|
|
123
|
+
for (const pattern of exports.CONFIG_PATTERNS) {
|
|
124
|
+
const regex = new RegExp(pattern.pattern, "i");
|
|
125
|
+
for (let i = 0; i < lines.length; i++) {
|
|
126
|
+
const line = lines[i] ?? "";
|
|
127
|
+
if (line.trimStart().startsWith("#") || line.trimStart().startsWith(";"))
|
|
128
|
+
continue; // skip comments
|
|
129
|
+
const match = regex.exec(line);
|
|
130
|
+
if (match) {
|
|
131
|
+
findings.push({
|
|
132
|
+
rule: pattern.rule,
|
|
133
|
+
description: pattern.description,
|
|
134
|
+
severity: pattern.severity,
|
|
135
|
+
file: relativePath,
|
|
136
|
+
line: i + 1,
|
|
137
|
+
match: match[0].length > 120
|
|
138
|
+
? match[0].substring(0, 120) + "..."
|
|
139
|
+
: match[0],
|
|
140
|
+
recommendation: getConfigRecommendation(pattern.rule),
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
return findings;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Scan a directory for package manager config files.
|
|
149
|
+
*/
|
|
150
|
+
function scanConfigFiles(dir) {
|
|
151
|
+
const findings = [];
|
|
152
|
+
try {
|
|
153
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
154
|
+
for (const entry of entries) {
|
|
155
|
+
if (!entry.isFile())
|
|
156
|
+
continue;
|
|
157
|
+
if (!isConfigFile(entry.name))
|
|
158
|
+
continue;
|
|
159
|
+
const fullPath = path.join(dir, entry.name);
|
|
160
|
+
try {
|
|
161
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
162
|
+
findings.push(...scanConfigFile(content, entry.name));
|
|
163
|
+
}
|
|
164
|
+
catch {
|
|
165
|
+
// skip
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
catch {
|
|
170
|
+
// directory not readable
|
|
171
|
+
}
|
|
172
|
+
return findings;
|
|
173
|
+
}
|
|
174
|
+
function getConfigRecommendation(rule) {
|
|
175
|
+
const map = {
|
|
176
|
+
CONFIG_HTTP_REGISTRY: "Switch to HTTPS registry URL. HTTP registries allow man-in-the-middle attacks on packages.",
|
|
177
|
+
CONFIG_CUSTOM_REGISTRY: "Verify this registry is trusted. Custom registries can serve tampered packages.",
|
|
178
|
+
CONFIG_AUTH_TOKEN_EXPOSED: "Remove tokens from config files. Use environment variables (NPM_TOKEN) or credential managers.",
|
|
179
|
+
CONFIG_UNSAFE_PERM: "Remove unsafe-perm=true. Running install scripts as root increases attack impact.",
|
|
180
|
+
CONFIG_IGNORE_SCRIPTS_OFF: "Consider setting ignore-scripts=true and running build steps explicitly.",
|
|
181
|
+
CONFIG_EXTRA_INDEX: "Verify the extra-index-url is trusted. Extra indexes enable dependency confusion attacks.",
|
|
182
|
+
CONFIG_TRUSTED_HOST: "Remove trusted-host entries. Fix SSL certificate issues instead of bypassing verification.",
|
|
183
|
+
};
|
|
184
|
+
return map[rule] ?? "Review this configuration setting manually.";
|
|
185
|
+
}
|
|
186
|
+
//# sourceMappingURL=config-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config-scanner.js","sourceRoot":"","sources":["../src/config-scanner.ts"],"names":[],"mappings":"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"}
|