supply-chain-guard 4.0.0 → 4.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.
- package/dist/cli.js +49 -1
- package/dist/cli.js.map +1 -1
- package/dist/correlation-engine.d.ts +21 -0
- package/dist/correlation-engine.d.ts.map +1 -0
- package/dist/correlation-engine.js +178 -0
- package/dist/correlation-engine.js.map +1 -0
- package/dist/dependency-risk-analyzer.d.ts +16 -0
- package/dist/dependency-risk-analyzer.d.ts.map +1 -0
- package/dist/dependency-risk-analyzer.js +130 -0
- package/dist/dependency-risk-analyzer.js.map +1 -0
- package/dist/github-trust-scanner.d.ts +24 -0
- package/dist/github-trust-scanner.d.ts.map +1 -0
- package/dist/github-trust-scanner.js +314 -0
- package/dist/github-trust-scanner.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +21 -1
- package/dist/index.js.map +1 -1
- package/dist/install-hook-scanner.d.ts +26 -0
- package/dist/install-hook-scanner.d.ts.map +1 -0
- package/dist/install-hook-scanner.js +157 -0
- package/dist/install-hook-scanner.js.map +1 -0
- package/dist/ioc-blocklist.d.ts +29 -0
- package/dist/ioc-blocklist.d.ts.map +1 -0
- package/dist/ioc-blocklist.js +193 -0
- package/dist/ioc-blocklist.js.map +1 -0
- package/dist/patterns.d.ts +4 -0
- package/dist/patterns.d.ts.map +1 -1
- package/dist/patterns.js +212 -1
- package/dist/patterns.js.map +1 -1
- package/dist/publishing-anomaly-detector.d.ts +27 -0
- package/dist/publishing-anomaly-detector.d.ts.map +1 -0
- package/dist/publishing-anomaly-detector.js +102 -0
- package/dist/publishing-anomaly-detector.js.map +1 -0
- package/dist/release-scanner.d.ts +33 -0
- package/dist/release-scanner.d.ts.map +1 -0
- package/dist/release-scanner.js +99 -0
- package/dist/release-scanner.js.map +1 -0
- package/dist/reporter.js +33 -3
- package/dist/reporter.js.map +1 -1
- package/dist/scanner.d.ts.map +1 -1
- package/dist/scanner.js +198 -3
- package/dist/scanner.js.map +1 -1
- package/dist/trust-breakdown.d.ts +12 -0
- package/dist/trust-breakdown.d.ts.map +1 -0
- package/dist/trust-breakdown.js +137 -0
- package/dist/trust-breakdown.js.map +1 -0
- package/dist/types.d.ts +50 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* GitHub repository trust signal scanner.
|
|
4
|
+
*
|
|
5
|
+
* Analyzes GitHub repo metadata for indicators of fake/malicious repos:
|
|
6
|
+
* star-farming, new accounts, suspicious releases, lure READMEs, etc.
|
|
7
|
+
* Uses `gh` CLI for API access (no token configuration needed).
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
43
|
+
exports.parseGitHubUrl = parseGitHubUrl;
|
|
44
|
+
exports.analyzeGitHubTrust = analyzeGitHubTrust;
|
|
45
|
+
exports.scanReadmeLures = scanReadmeLures;
|
|
46
|
+
const node_child_process_1 = require("node:child_process");
|
|
47
|
+
const path = __importStar(require("node:path"));
|
|
48
|
+
const patterns_js_1 = require("./patterns.js");
|
|
49
|
+
const ioc_blocklist_js_1 = require("./ioc-blocklist.js");
|
|
50
|
+
/**
|
|
51
|
+
* Check if `gh` CLI is available.
|
|
52
|
+
*/
|
|
53
|
+
function hasGhCli() {
|
|
54
|
+
try {
|
|
55
|
+
(0, node_child_process_1.execSync)("gh --version", { stdio: "pipe" });
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Fetch repo metadata via `gh api`.
|
|
64
|
+
*/
|
|
65
|
+
function fetchRepoMetadata(owner, repo) {
|
|
66
|
+
try {
|
|
67
|
+
const json = (0, node_child_process_1.execSync)(`gh api repos/${owner}/${repo} --jq '{stars: .stargazers_count, forks: .forks_count, openIssues: .open_issues_count, hasIssues: .has_issues, createdAt: .created_at, pushedAt: .pushed_at, isOrg: (.owner.type == "Organization"), ownerLogin: .owner.login, defaultBranch: .default_branch}'`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
68
|
+
const data = JSON.parse(json);
|
|
69
|
+
// Fetch owner account age
|
|
70
|
+
let ownerCreatedAt;
|
|
71
|
+
try {
|
|
72
|
+
const ownerJson = (0, node_child_process_1.execSync)(`gh api users/${owner} --jq '.created_at'`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
73
|
+
ownerCreatedAt = ownerJson.trim();
|
|
74
|
+
}
|
|
75
|
+
catch { /* skip */ }
|
|
76
|
+
// Fetch commit count
|
|
77
|
+
let commitCount;
|
|
78
|
+
try {
|
|
79
|
+
const commitJson = (0, node_child_process_1.execSync)(`gh api repos/${owner}/${repo}/commits?per_page=1 --jq 'length'`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
80
|
+
commitCount = parseInt(commitJson.trim(), 10);
|
|
81
|
+
}
|
|
82
|
+
catch { /* skip */ }
|
|
83
|
+
// Fetch contributor count
|
|
84
|
+
let contributorCount;
|
|
85
|
+
try {
|
|
86
|
+
const contribJson = (0, node_child_process_1.execSync)(`gh api repos/${owner}/${repo}/contributors?per_page=5 --jq 'length'`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
87
|
+
contributorCount = parseInt(contribJson.trim(), 10);
|
|
88
|
+
}
|
|
89
|
+
catch { /* skip */ }
|
|
90
|
+
return {
|
|
91
|
+
owner,
|
|
92
|
+
name: repo,
|
|
93
|
+
stars: data.stars ?? 0,
|
|
94
|
+
forks: data.forks ?? 0,
|
|
95
|
+
openIssues: data.openIssues ?? 0,
|
|
96
|
+
hasIssues: data.hasIssues ?? true,
|
|
97
|
+
createdAt: data.createdAt ?? "",
|
|
98
|
+
pushedAt: data.pushedAt ?? "",
|
|
99
|
+
isOrg: data.isOrg ?? false,
|
|
100
|
+
ownerCreatedAt,
|
|
101
|
+
defaultBranch: data.defaultBranch ?? "main",
|
|
102
|
+
commitCount,
|
|
103
|
+
contributorCount,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Fetch release info via `gh api`.
|
|
112
|
+
*/
|
|
113
|
+
function fetchReleases(owner, repo) {
|
|
114
|
+
try {
|
|
115
|
+
const json = (0, node_child_process_1.execSync)(`gh api repos/${owner}/${repo}/releases?per_page=5 --jq '[.[] | {tagName: .tag_name, name: .name, createdAt: .created_at, assets: [.assets[] | {name: .name, size: .size, downloadCount: .download_count}]}]'`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] });
|
|
116
|
+
return JSON.parse(json);
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
return [];
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Parse a GitHub URL into owner/repo.
|
|
124
|
+
*/
|
|
125
|
+
function parseGitHubUrl(url) {
|
|
126
|
+
const match = url.match(/github\.com\/([a-zA-Z0-9_.-]+)\/([a-zA-Z0-9_.-]+)/);
|
|
127
|
+
if (!match)
|
|
128
|
+
return null;
|
|
129
|
+
return { owner: match[1], repo: match[2].replace(/\.git$/, "") };
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Analyze a GitHub repo for trust signals.
|
|
133
|
+
*/
|
|
134
|
+
function analyzeGitHubTrust(owner, repo) {
|
|
135
|
+
if (!hasGhCli())
|
|
136
|
+
return [];
|
|
137
|
+
const findings = [];
|
|
138
|
+
// Check known malicious accounts
|
|
139
|
+
if (ioc_blocklist_js_1.KNOWN_MALICIOUS_GITHUB_ACCOUNTS.includes(owner.toLowerCase())) {
|
|
140
|
+
findings.push({
|
|
141
|
+
rule: "REPO_KNOWN_MALICIOUS_ACCOUNT",
|
|
142
|
+
description: `Repository owner "${owner}" is a known malicious GitHub account.`,
|
|
143
|
+
severity: "critical",
|
|
144
|
+
recommendation: "Do not use code from this repository. This account has been identified as distributing malware.",
|
|
145
|
+
});
|
|
146
|
+
return findings; // No need to check further
|
|
147
|
+
}
|
|
148
|
+
// Fetch metadata
|
|
149
|
+
const meta = fetchRepoMetadata(owner, repo);
|
|
150
|
+
if (!meta)
|
|
151
|
+
return findings;
|
|
152
|
+
const now = Date.now();
|
|
153
|
+
const repoAge = now - new Date(meta.createdAt).getTime();
|
|
154
|
+
const daysSinceCreation = repoAge / (1000 * 60 * 60 * 24);
|
|
155
|
+
// Account age check
|
|
156
|
+
if (meta.ownerCreatedAt) {
|
|
157
|
+
const accountAge = now - new Date(meta.ownerCreatedAt).getTime();
|
|
158
|
+
const accountDays = accountAge / (1000 * 60 * 60 * 24);
|
|
159
|
+
if (accountDays < 90) {
|
|
160
|
+
findings.push({
|
|
161
|
+
rule: "REPO_NEW_ACCOUNT",
|
|
162
|
+
description: `Repository owner account is ${Math.round(accountDays)} days old (< 90 days). New accounts are higher risk.`,
|
|
163
|
+
severity: "high",
|
|
164
|
+
recommendation: "Exercise caution with code from newly created accounts. Verify the maintainer's identity.",
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
// Repo recently created with many stars
|
|
169
|
+
if (daysSinceCreation < 30 && meta.stars > 50) {
|
|
170
|
+
findings.push({
|
|
171
|
+
rule: "REPO_RECENT_CREATION",
|
|
172
|
+
description: `Repository is ${Math.round(daysSinceCreation)} days old with ${meta.stars} stars. Rapid star growth on a new repo is a star-farming indicator.`,
|
|
173
|
+
severity: "high",
|
|
174
|
+
recommendation: "Star-farming bots inflate stars on malicious repos. Verify the repo's legitimacy through code review.",
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
// Star/fork ratio check (forks > stars is unusual for organic repos)
|
|
178
|
+
if (meta.stars > 20 && meta.forks > meta.stars * 1.5) {
|
|
179
|
+
findings.push({
|
|
180
|
+
rule: "REPO_STAR_FORK_RATIO",
|
|
181
|
+
description: `Unusual star/fork ratio: ${meta.stars} stars vs ${meta.forks} forks. More forks than stars can indicate bot activity.`,
|
|
182
|
+
severity: "high",
|
|
183
|
+
recommendation: "Check if forks are from real, active accounts or star-farming bots.",
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
// Few contributors on popular repo
|
|
187
|
+
if (meta.contributorCount !== undefined &&
|
|
188
|
+
meta.contributorCount < 2 &&
|
|
189
|
+
meta.stars > 100) {
|
|
190
|
+
findings.push({
|
|
191
|
+
rule: "REPO_FEW_CONTRIBUTORS",
|
|
192
|
+
description: `Only ${meta.contributorCount} contributor(s) on a repo with ${meta.stars} stars. Legitimate popular projects typically have multiple contributors.`,
|
|
193
|
+
severity: "medium",
|
|
194
|
+
recommendation: "Single-contributor repos with high stars may be fake. Check contributor history.",
|
|
195
|
+
});
|
|
196
|
+
}
|
|
197
|
+
// No issues on popular repo
|
|
198
|
+
if (!meta.hasIssues || (meta.openIssues === 0 && meta.stars > 50)) {
|
|
199
|
+
findings.push({
|
|
200
|
+
rule: "REPO_NO_ISSUES",
|
|
201
|
+
description: `Issues ${meta.hasIssues ? "have 0 open items" : "are disabled"} on a repo with ${meta.stars} stars. Malicious repos often disable issues to avoid reports.`,
|
|
202
|
+
severity: "medium",
|
|
203
|
+
recommendation: "Legitimate projects encourage issue reporting. Disabled issues is a red flag.",
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
// Single commit repos
|
|
207
|
+
if (meta.commitCount !== undefined && meta.commitCount <= 2 && meta.stars > 10) {
|
|
208
|
+
findings.push({
|
|
209
|
+
rule: "REPO_SINGLE_COMMIT",
|
|
210
|
+
description: `Only ${meta.commitCount} commit(s) in a repo with ${meta.stars} stars. Malware repos are typically single-commit drops.`,
|
|
211
|
+
severity: "high",
|
|
212
|
+
recommendation: "Single-commit repos with stars are a strong malware indicator. Review the commit content.",
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
// Check releases for suspicious artifacts
|
|
216
|
+
const releases = fetchReleases(owner, repo);
|
|
217
|
+
for (const release of releases) {
|
|
218
|
+
// Executable artifacts
|
|
219
|
+
const suspiciousExts = [".exe", ".msi", ".bat", ".cmd", ".ps1", ".scr", ".com"];
|
|
220
|
+
const archiveExts = [".7z", ".rar"];
|
|
221
|
+
for (const asset of release.assets) {
|
|
222
|
+
const lowerName = asset.name.toLowerCase();
|
|
223
|
+
const ext = path.extname(lowerName);
|
|
224
|
+
if (suspiciousExts.includes(ext)) {
|
|
225
|
+
findings.push({
|
|
226
|
+
rule: "RELEASE_EXE_ARTIFACT",
|
|
227
|
+
description: `Executable file "${asset.name}" (${formatSize(asset.size)}) in release "${release.tagName}". GitHub releases should not contain executables.`,
|
|
228
|
+
severity: "critical",
|
|
229
|
+
recommendation: "Do NOT download this file. Executables in GitHub releases are a primary malware distribution vector.",
|
|
230
|
+
});
|
|
231
|
+
}
|
|
232
|
+
if (archiveExts.includes(ext)) {
|
|
233
|
+
findings.push({
|
|
234
|
+
rule: "RELEASE_7Z_ARCHIVE",
|
|
235
|
+
description: `Compressed archive "${asset.name}" (${formatSize(asset.size)}) in release "${release.tagName}". .7z/.rar archives are used to evade antivirus scanning.`,
|
|
236
|
+
severity: "high",
|
|
237
|
+
recommendation: "Password-protected and compressed archives bypass AV detection. Inspect contents before extracting.",
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
// Size anomaly (> 50MB)
|
|
241
|
+
if (asset.size > 50 * 1024 * 1024) {
|
|
242
|
+
findings.push({
|
|
243
|
+
rule: "RELEASE_SIZE_ANOMALY",
|
|
244
|
+
description: `Large release artifact "${asset.name}" (${formatSize(asset.size)}). Unusually large files may contain bundled malware.`,
|
|
245
|
+
severity: "high",
|
|
246
|
+
recommendation: "Verify this file size is expected for the project.",
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
// Lure release names
|
|
251
|
+
const lowerReleaseName = (release.name || release.tagName).toLowerCase();
|
|
252
|
+
const lureKeywords = ["leaked", "cracked", "free", "unlocked", "keygen", "bypass", "premium", "enterprise"];
|
|
253
|
+
for (const keyword of lureKeywords) {
|
|
254
|
+
if (lowerReleaseName.includes(keyword)) {
|
|
255
|
+
findings.push({
|
|
256
|
+
rule: "RELEASE_NAME_LURE",
|
|
257
|
+
description: `Release "${release.name || release.tagName}" contains lure keyword "${keyword}". This is a social engineering tactic for malware distribution.`,
|
|
258
|
+
severity: "high",
|
|
259
|
+
recommendation: "Releases with piracy/crack language are almost always malware. Do not download.",
|
|
260
|
+
});
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
return findings;
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Scan README content for lure patterns.
|
|
269
|
+
*/
|
|
270
|
+
function scanReadmeLures(readmeContent, relativePath) {
|
|
271
|
+
const findings = [];
|
|
272
|
+
const lines = readmeContent.split("\n");
|
|
273
|
+
for (const pattern of patterns_js_1.LURE_PATTERNS) {
|
|
274
|
+
const regex = new RegExp(pattern.pattern, "i");
|
|
275
|
+
for (let i = 0; i < lines.length; i++) {
|
|
276
|
+
const line = lines[i] ?? "";
|
|
277
|
+
const match = regex.exec(line);
|
|
278
|
+
if (match) {
|
|
279
|
+
findings.push({
|
|
280
|
+
rule: pattern.rule,
|
|
281
|
+
description: pattern.description,
|
|
282
|
+
severity: pattern.severity,
|
|
283
|
+
file: relativePath,
|
|
284
|
+
line: i + 1,
|
|
285
|
+
match: match[0].length > 120
|
|
286
|
+
? match[0].substring(0, 120) + "..."
|
|
287
|
+
: match[0],
|
|
288
|
+
recommendation: getLureRecommendation(pattern.rule),
|
|
289
|
+
});
|
|
290
|
+
break; // One match per pattern per file
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
return findings;
|
|
295
|
+
}
|
|
296
|
+
function formatSize(bytes) {
|
|
297
|
+
if (bytes < 1024)
|
|
298
|
+
return `${bytes} B`;
|
|
299
|
+
if (bytes < 1024 * 1024)
|
|
300
|
+
return `${(bytes / 1024).toFixed(1)} KB`;
|
|
301
|
+
return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
|
|
302
|
+
}
|
|
303
|
+
function getLureRecommendation(rule) {
|
|
304
|
+
const map = {
|
|
305
|
+
README_LURE_LEAKED: "This README uses 'leaked' language to lure downloads. Verify the project's legitimacy before using.",
|
|
306
|
+
README_LURE_CRACK: "This README promises cracked/unlocked software. This is almost certainly malware. Do NOT download.",
|
|
307
|
+
README_LURE_URGENCY: "Urgency language in README is a social engineering tactic. Legitimate projects don't pressure downloads.",
|
|
308
|
+
CAMPAIGN_CLAUDE_LURE: "CRITICAL: This matches the April 2026 Claude Code malware campaign (Vidar/GhostSocks). Quarantine immediately.",
|
|
309
|
+
CAMPAIGN_AI_TOOL_LURE: "CRITICAL: This matches the 2026 fake AI tool campaign targeting developers. Do not use this code.",
|
|
310
|
+
FAKE_AI_TOOL_LURE: "Suspicious executable naming pattern matching malware campaigns. Verify file integrity.",
|
|
311
|
+
};
|
|
312
|
+
return map[rule] ?? "Review this content for social engineering tactics.";
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=github-trust-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"github-trust-scanner.js","sourceRoot":"","sources":["../src/github-trust-scanner.ts"],"names":[],"mappings":";AAAA;;;;;;GAMG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiIH,wCAQC;AAKD,gDAoKC;AAKD,0CAgCC;AArVD,2DAA8C;AAE9C,gDAAkC;AAElC,+CAA8C;AAC9C,yDAAqE;AA+BrE;;GAEG;AACH,SAAS,QAAQ;IACf,IAAI,CAAC;QACH,IAAA,6BAAQ,EAAC,cAAc,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;QAC5C,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,KAAa,EAAE,IAAY;IACpD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,6BAAQ,EACnB,gBAAgB,KAAK,IAAI,IAAI,iQAAiQ,EAC9R,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;QACF,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAE9B,0BAA0B;QAC1B,IAAI,cAAkC,CAAC;QACvC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,IAAA,6BAAQ,EACxB,gBAAgB,KAAK,qBAAqB,EAC1C,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;YACF,cAAc,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC;QACpC,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAEtB,qBAAqB;QACrB,IAAI,WAA+B,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,IAAA,6BAAQ,EACzB,gBAAgB,KAAK,IAAI,IAAI,mCAAmC,EAChE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;YACF,WAAW,GAAG,QAAQ,CAAC,UAAU,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAEtB,0BAA0B;QAC1B,IAAI,gBAAoC,CAAC;QACzC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAA,6BAAQ,EAC1B,gBAAgB,KAAK,IAAI,IAAI,wCAAwC,EACrE,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;YACF,gBAAgB,GAAG,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC,CAAC,UAAU,CAAC,CAAC;QAEtB,OAAO;YACL,KAAK;YACL,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;YACtB,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,CAAC;YACtB,UAAU,EAAE,IAAI,CAAC,UAAU,IAAI,CAAC;YAChC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,IAAI;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS,IAAI,EAAE;YAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;YAC7B,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,KAAK;YAC1B,cAAc;YACd,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,MAAM;YAC3C,WAAW;YACX,gBAAgB;SACjB,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa,EAAE,IAAY;IAChD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAA,6BAAQ,EACnB,gBAAgB,KAAK,IAAI,IAAI,iLAAiL,EAC9M,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CACvD,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAc,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAgB,cAAc,CAC5B,GAAW;IAEX,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CACrB,mDAAmD,CACpD,CAAC;IACF,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IACxB,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,EAAE,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,SAAgB,kBAAkB,CAChC,KAAa,EACb,IAAY;IAEZ,IAAI,CAAC,QAAQ,EAAE;QAAE,OAAO,EAAE,CAAC;IAE3B,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,iCAAiC;IACjC,IAAI,kDAA+B,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,8BAA8B;YACpC,WAAW,EAAE,qBAAqB,KAAK,wCAAwC;YAC/E,QAAQ,EAAE,UAAU;YACpB,cAAc,EACZ,iGAAiG;SACpG,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC,CAAC,2BAA2B;IAC9C,CAAC;IAED,iBAAiB;IACjB,MAAM,IAAI,GAAG,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,IAAI,CAAC,IAAI;QAAE,OAAO,QAAQ,CAAC;IAE3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvB,MAAM,OAAO,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;IACzD,MAAM,iBAAiB,GAAG,OAAO,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAE1D,oBAAoB;IACpB,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;QACxB,MAAM,UAAU,GACd,GAAG,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,OAAO,EAAE,CAAC;QAChD,MAAM,WAAW,GAAG,UAAU,GAAG,CAAC,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;QACvD,IAAI,WAAW,GAAG,EAAE,EAAE,CAAC;YACrB,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,kBAAkB;gBACxB,WAAW,EAAE,+BAA+B,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,sDAAsD;gBACzH,QAAQ,EAAE,MAAM;gBAChB,cAAc,EACZ,2FAA2F;aAC9F,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,wCAAwC;IACxC,IAAI,iBAAiB,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QAC9C,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,iBAAiB,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,kBAAkB,IAAI,CAAC,KAAK,sEAAsE;YAC7J,QAAQ,EAAE,MAAM;YAChB,cAAc,EACZ,uGAAuG;SAC1G,CAAC,CAAC;IACL,CAAC;IAED,qEAAqE;IACrE,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;QACrD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,sBAAsB;YAC5B,WAAW,EAAE,4BAA4B,IAAI,CAAC,KAAK,aAAa,IAAI,CAAC,KAAK,0DAA0D;YACpI,QAAQ,EAAE,MAAM;YAChB,cAAc,EACZ,qEAAqE;SACxE,CAAC,CAAC;IACL,CAAC;IAED,mCAAmC;IACnC,IACE,IAAI,CAAC,gBAAgB,KAAK,SAAS;QACnC,IAAI,CAAC,gBAAgB,GAAG,CAAC;QACzB,IAAI,CAAC,KAAK,GAAG,GAAG,EAChB,CAAC;QACD,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,uBAAuB;YAC7B,WAAW,EAAE,QAAQ,IAAI,CAAC,gBAAgB,kCAAkC,IAAI,CAAC,KAAK,2EAA2E;YACjK,QAAQ,EAAE,QAAQ;YAClB,cAAc,EACZ,kFAAkF;SACrF,CAAC,CAAC;IACL,CAAC;IAED,4BAA4B;IAC5B,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,IAAI,CAAC,UAAU,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC;QAClE,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,gBAAgB;YACtB,WAAW,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,mBAAmB,IAAI,CAAC,KAAK,gEAAgE;YACzK,QAAQ,EAAE,QAAQ;YAClB,cAAc,EACZ,+EAA+E;SAClF,CAAC,CAAC;IACL,CAAC;IAED,sBAAsB;IACtB,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,GAAG,EAAE,EAAE,CAAC;QAC/E,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,QAAQ,IAAI,CAAC,WAAW,6BAA6B,IAAI,CAAC,KAAK,0DAA0D;YACtI,QAAQ,EAAE,MAAM;YAChB,cAAc,EACZ,2FAA2F;SAC9F,CAAC,CAAC;IACL,CAAC;IAED,0CAA0C;IAC1C,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,uBAAuB;QACvB,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;QAChF,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAEpC,KAAK,MAAM,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnC,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAEpC,IAAI,cAAc,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,sBAAsB;oBAC5B,WAAW,EAAE,oBAAoB,KAAK,CAAC,IAAI,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,OAAO,oDAAoD;oBAC3J,QAAQ,EAAE,UAAU;oBACpB,cAAc,EACZ,sGAAsG;iBACzG,CAAC,CAAC;YACL,CAAC;YAED,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC9B,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,oBAAoB;oBAC1B,WAAW,EAAE,uBAAuB,KAAK,CAAC,IAAI,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,OAAO,4DAA4D;oBACtK,QAAQ,EAAE,MAAM;oBAChB,cAAc,EACZ,qGAAqG;iBACxG,CAAC,CAAC;YACL,CAAC;YAED,wBAAwB;YACxB,IAAI,KAAK,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,sBAAsB;oBAC5B,WAAW,EAAE,2BAA2B,KAAK,CAAC,IAAI,MAAM,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,uDAAuD;oBACrI,QAAQ,EAAE,MAAM;oBAChB,cAAc,EACZ,oDAAoD;iBACvD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,gBAAgB,GAAG,CAAC,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,WAAW,EAAE,CAAC;QACzE,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAC5G,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;YACnC,IAAI,gBAAgB,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvC,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,mBAAmB;oBACzB,WAAW,EAAE,YAAY,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,4BAA4B,OAAO,kEAAkE;oBAC7J,QAAQ,EAAE,MAAM;oBAChB,cAAc,EACZ,iFAAiF;iBACpF,CAAC,CAAC;gBACH,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAgB,eAAe,CAC7B,aAAqB,EACrB,YAAoB;IAEpB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAExC,KAAK,MAAM,OAAO,IAAI,2BAAa,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAE/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/B,IAAI,KAAK,EAAE,CAAC;gBACV,QAAQ,CAAC,IAAI,CAAC;oBACZ,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,OAAO,CAAC,WAAW;oBAChC,QAAQ,EAAE,OAAO,CAAC,QAAQ;oBAC1B,IAAI,EAAE,YAAY;oBAClB,IAAI,EAAE,CAAC,GAAG,CAAC;oBACX,KAAK,EACH,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG;wBACnB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK;wBACpC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;oBACd,cAAc,EAAE,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC;iBACpD,CAAC,CAAC;gBACH,MAAM,CAAC,iCAAiC;YAC1C,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,KAAK,GAAG,IAAI;QAAE,OAAO,GAAG,KAAK,IAAI,CAAC;IACtC,IAAI,KAAK,GAAG,IAAI,GAAG,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,GAAG,CAAC,KAAK,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC;AACpD,CAAC;AAED,SAAS,qBAAqB,CAAC,IAAY;IACzC,MAAM,GAAG,GAA2B;QAClC,kBAAkB,EAChB,qGAAqG;QACvG,iBAAiB,EACf,oGAAoG;QACtG,mBAAmB,EACjB,0GAA0G;QAC5G,oBAAoB,EAClB,gHAAgH;QAClH,qBAAqB,EACnB,mGAAmG;QACrG,iBAAiB,EACf,yFAAyF;KAC5F,CAAC;IACF,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,qDAAqD,CAAC;AAC5E,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,5 +19,13 @@ export { scanGitSecurity } from "./git-scanner.js";
|
|
|
19
19
|
export { analyzeEntropy, shannonEntropy } from "./entropy.js";
|
|
20
20
|
export { scanCargoFiles } from "./cargo-scanner.js";
|
|
21
21
|
export { scanGoFiles } from "./go-scanner.js";
|
|
22
|
+
export { checkIOCBlocklist, checkBadVersion } from "./ioc-blocklist.js";
|
|
23
|
+
export { analyzeGitHubTrust, parseGitHubUrl, scanReadmeLures } from "./github-trust-scanner.js";
|
|
24
|
+
export { analyzeInstallHooks } from "./install-hook-scanner.js";
|
|
25
|
+
export { analyzeDependencyRisks, levenshtein } from "./dependency-risk-analyzer.js";
|
|
26
|
+
export { analyzePublishingAnomalies } from "./publishing-anomaly-detector.js";
|
|
27
|
+
export { scanReleaseArtifacts } from "./release-scanner.js";
|
|
28
|
+
export { correlateFindings } from "./correlation-engine.js";
|
|
29
|
+
export { calculateTrustBreakdown } from "./trust-breakdown.js";
|
|
22
30
|
export type { Finding, ScanReport, ScanOptions, ScanSummary, Severity, NpmPackageInfo, SolanaMonitorOptions, SolanaTransaction, PatternEntry, WatchlistEntry, WatchlistConfig, WatchlistAlert, } from "./types.js";
|
|
23
31
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,YAAY,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACpC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EACL,aAAa,EACb,WAAW,EACX,WAAW,EACX,aAAa,EACb,aAAa,EACb,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,gBAAgB,GACjB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,0BAA0B,EAAE,MAAM,6BAA6B,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACpF,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AAC/D,YAAY,EACV,OAAO,EACP,UAAU,EACV,WAAW,EACX,WAAW,EACX,QAAQ,EACR,cAAc,EACd,oBAAoB,EACpB,iBAAiB,EACjB,YAAY,EACZ,cAAc,EACd,eAAe,EACf,cAAc,GACf,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
* Detects GlassWorm and similar malware campaigns.
|
|
7
7
|
*/
|
|
8
8
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.scanGoFiles = exports.scanCargoFiles = exports.shannonEntropy = exports.analyzeEntropy = exports.scanGitSecurity = exports.scanConfigFile = exports.scanConfigFiles = exports.scanDockerFile = exports.scanDockerFiles = exports.scanGitHubActionsWorkflows = exports.checkLockfile = exports.formatReport = exports.monitorWatchlist = exports.listWatchlist = exports.removeFromWatchlist = exports.addToWatchlist = exports.saveWatchlist = exports.loadWatchlist = exports.formatAlert = exports.checkWallet = exports.monitorWallet = exports.scanDependencyConfusion = exports.scanVscodeExtension = exports.scanPypiPackage = exports.scanNpmPackage = exports.scan = void 0;
|
|
9
|
+
exports.calculateTrustBreakdown = exports.correlateFindings = exports.scanReleaseArtifacts = exports.analyzePublishingAnomalies = exports.levenshtein = exports.analyzeDependencyRisks = exports.analyzeInstallHooks = exports.scanReadmeLures = exports.parseGitHubUrl = exports.analyzeGitHubTrust = exports.checkBadVersion = exports.checkIOCBlocklist = exports.scanGoFiles = exports.scanCargoFiles = exports.shannonEntropy = exports.analyzeEntropy = exports.scanGitSecurity = exports.scanConfigFile = exports.scanConfigFiles = exports.scanDockerFile = exports.scanDockerFiles = exports.scanGitHubActionsWorkflows = exports.checkLockfile = exports.formatReport = exports.monitorWatchlist = exports.listWatchlist = exports.removeFromWatchlist = exports.addToWatchlist = exports.saveWatchlist = exports.loadWatchlist = exports.formatAlert = exports.checkWallet = exports.monitorWallet = exports.scanDependencyConfusion = exports.scanVscodeExtension = exports.scanPypiPackage = exports.scanNpmPackage = exports.scan = void 0;
|
|
10
10
|
var scanner_js_1 = require("./scanner.js");
|
|
11
11
|
Object.defineProperty(exports, "scan", { enumerable: true, get: function () { return scanner_js_1.scan; } });
|
|
12
12
|
var npm_scanner_js_1 = require("./npm-scanner.js");
|
|
@@ -48,4 +48,24 @@ var cargo_scanner_js_1 = require("./cargo-scanner.js");
|
|
|
48
48
|
Object.defineProperty(exports, "scanCargoFiles", { enumerable: true, get: function () { return cargo_scanner_js_1.scanCargoFiles; } });
|
|
49
49
|
var go_scanner_js_1 = require("./go-scanner.js");
|
|
50
50
|
Object.defineProperty(exports, "scanGoFiles", { enumerable: true, get: function () { return go_scanner_js_1.scanGoFiles; } });
|
|
51
|
+
var ioc_blocklist_js_1 = require("./ioc-blocklist.js");
|
|
52
|
+
Object.defineProperty(exports, "checkIOCBlocklist", { enumerable: true, get: function () { return ioc_blocklist_js_1.checkIOCBlocklist; } });
|
|
53
|
+
Object.defineProperty(exports, "checkBadVersion", { enumerable: true, get: function () { return ioc_blocklist_js_1.checkBadVersion; } });
|
|
54
|
+
var github_trust_scanner_js_1 = require("./github-trust-scanner.js");
|
|
55
|
+
Object.defineProperty(exports, "analyzeGitHubTrust", { enumerable: true, get: function () { return github_trust_scanner_js_1.analyzeGitHubTrust; } });
|
|
56
|
+
Object.defineProperty(exports, "parseGitHubUrl", { enumerable: true, get: function () { return github_trust_scanner_js_1.parseGitHubUrl; } });
|
|
57
|
+
Object.defineProperty(exports, "scanReadmeLures", { enumerable: true, get: function () { return github_trust_scanner_js_1.scanReadmeLures; } });
|
|
58
|
+
var install_hook_scanner_js_1 = require("./install-hook-scanner.js");
|
|
59
|
+
Object.defineProperty(exports, "analyzeInstallHooks", { enumerable: true, get: function () { return install_hook_scanner_js_1.analyzeInstallHooks; } });
|
|
60
|
+
var dependency_risk_analyzer_js_1 = require("./dependency-risk-analyzer.js");
|
|
61
|
+
Object.defineProperty(exports, "analyzeDependencyRisks", { enumerable: true, get: function () { return dependency_risk_analyzer_js_1.analyzeDependencyRisks; } });
|
|
62
|
+
Object.defineProperty(exports, "levenshtein", { enumerable: true, get: function () { return dependency_risk_analyzer_js_1.levenshtein; } });
|
|
63
|
+
var publishing_anomaly_detector_js_1 = require("./publishing-anomaly-detector.js");
|
|
64
|
+
Object.defineProperty(exports, "analyzePublishingAnomalies", { enumerable: true, get: function () { return publishing_anomaly_detector_js_1.analyzePublishingAnomalies; } });
|
|
65
|
+
var release_scanner_js_1 = require("./release-scanner.js");
|
|
66
|
+
Object.defineProperty(exports, "scanReleaseArtifacts", { enumerable: true, get: function () { return release_scanner_js_1.scanReleaseArtifacts; } });
|
|
67
|
+
var correlation_engine_js_1 = require("./correlation-engine.js");
|
|
68
|
+
Object.defineProperty(exports, "correlateFindings", { enumerable: true, get: function () { return correlation_engine_js_1.correlateFindings; } });
|
|
69
|
+
var trust_breakdown_js_1 = require("./trust-breakdown.js");
|
|
70
|
+
Object.defineProperty(exports, "calculateTrustBreakdown", { enumerable: true, get: function () { return trust_breakdown_js_1.calculateTrustBreakdown; } });
|
|
51
71
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,2CAAoC;AAA3B,kGAAA,IAAI,OAAA;AACb,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,yDAA0D;AAAjD,wHAAA,mBAAmB,OAAA;AAC5B,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAChC,yDAU6B;AAT3B,kHAAA,aAAa,OAAA;AACb,gHAAA,WAAW,OAAA;AACX,gHAAA,WAAW,OAAA;AACX,kHAAA,aAAa,OAAA;AACb,kHAAA,aAAa,OAAA;AACb,mHAAA,cAAc,OAAA;AACd,wHAAA,mBAAmB,OAAA;AACnB,kHAAA,aAAa,OAAA;AACb,qHAAA,gBAAgB,OAAA;AAElB,6CAA6C;AAApC,2GAAA,YAAY,OAAA;AACrB,6DAAsD;AAA7C,oHAAA,aAAa,OAAA;AACtB,yEAAyE;AAAhE,uIAAA,0BAA0B,OAAA;AACnC,iEAA0E;AAAjE,wHAAA,eAAe,OAAA;AAAE,uHAAA,cAAc,OAAA;AACxC,yDAAsE;AAA7D,oHAAA,eAAe,OAAA;AAAE,mHAAA,cAAc,OAAA;AACxC,mDAAmD;AAA1C,iHAAA,eAAe,OAAA;AACxB,2CAA8D;AAArD,4GAAA,cAAc,OAAA;AAAE,4GAAA,cAAc,OAAA;AACvC,uDAAoD;AAA3C,kHAAA,cAAc,OAAA;AACvB,iDAA8C;AAArC,4GAAA,WAAW,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;;AAEH,2CAAoC;AAA3B,kGAAA,IAAI,OAAA;AACb,mDAAkD;AAAzC,gHAAA,cAAc,OAAA;AACvB,qDAAoD;AAA3C,kHAAA,eAAe,OAAA;AACxB,yDAA0D;AAAjD,wHAAA,mBAAmB,OAAA;AAC5B,qEAAoE;AAA3D,kIAAA,uBAAuB,OAAA;AAChC,yDAU6B;AAT3B,kHAAA,aAAa,OAAA;AACb,gHAAA,WAAW,OAAA;AACX,gHAAA,WAAW,OAAA;AACX,kHAAA,aAAa,OAAA;AACb,kHAAA,aAAa,OAAA;AACb,mHAAA,cAAc,OAAA;AACd,wHAAA,mBAAmB,OAAA;AACnB,kHAAA,aAAa,OAAA;AACb,qHAAA,gBAAgB,OAAA;AAElB,6CAA6C;AAApC,2GAAA,YAAY,OAAA;AACrB,6DAAsD;AAA7C,oHAAA,aAAa,OAAA;AACtB,yEAAyE;AAAhE,uIAAA,0BAA0B,OAAA;AACnC,iEAA0E;AAAjE,wHAAA,eAAe,OAAA;AAAE,uHAAA,cAAc,OAAA;AACxC,yDAAsE;AAA7D,oHAAA,eAAe,OAAA;AAAE,mHAAA,cAAc,OAAA;AACxC,mDAAmD;AAA1C,iHAAA,eAAe,OAAA;AACxB,2CAA8D;AAArD,4GAAA,cAAc,OAAA;AAAE,4GAAA,cAAc,OAAA;AACvC,uDAAoD;AAA3C,kHAAA,cAAc,OAAA;AACvB,iDAA8C;AAArC,4GAAA,WAAW,OAAA;AACpB,uDAAwE;AAA/D,qHAAA,iBAAiB,OAAA;AAAE,mHAAA,eAAe,OAAA;AAC3C,qEAAgG;AAAvF,6HAAA,kBAAkB,OAAA;AAAE,yHAAA,cAAc,OAAA;AAAE,0HAAA,eAAe,OAAA;AAC5D,qEAAgE;AAAvD,8HAAA,mBAAmB,OAAA;AAC5B,6EAAoF;AAA3E,qIAAA,sBAAsB,OAAA;AAAE,0HAAA,WAAW,OAAA;AAC5C,mFAA8E;AAArE,4IAAA,0BAA0B,OAAA;AACnC,2DAA4D;AAAnD,0HAAA,oBAAoB,OAAA;AAC7B,iEAA4D;AAAnD,0HAAA,iBAAiB,OAAA;AAC1B,2DAA+D;AAAtD,6HAAA,uBAAuB,OAAA"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Install hook deep analysis scanner (v4.2).
|
|
3
|
+
*
|
|
4
|
+
* Goes beyond basic SUSPICIOUS_SCRIPTS patterns to detect sophisticated
|
|
5
|
+
* install-time attacks: secret harvesting, download-exec chains,
|
|
6
|
+
* obfuscated one-liners, and embedded binary blobs.
|
|
7
|
+
*/
|
|
8
|
+
import type { Finding } from "./types.js";
|
|
9
|
+
interface InstallScripts {
|
|
10
|
+
preinstall?: string;
|
|
11
|
+
postinstall?: string;
|
|
12
|
+
install?: string;
|
|
13
|
+
preuninstall?: string;
|
|
14
|
+
postuninstall?: string;
|
|
15
|
+
prepare?: string;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Deep-analyze install hook scripts from package.json.
|
|
19
|
+
*/
|
|
20
|
+
export declare function analyzeInstallHooks(scripts: InstallScripts, relativePath: string): Finding[];
|
|
21
|
+
/**
|
|
22
|
+
* Extract install scripts from parsed package.json content.
|
|
23
|
+
*/
|
|
24
|
+
export declare function extractInstallScripts(content: string): InstallScripts | null;
|
|
25
|
+
export {};
|
|
26
|
+
//# sourceMappingURL=install-hook-scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hook-scanner.d.ts","sourceRoot":"","sources":["../src/install-hook-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C,UAAU,cAAc;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,cAAc,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,EAAE,CA8HX;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,MAAM,GACd,cAAc,GAAG,IAAI,CAevB"}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Install hook deep analysis scanner (v4.2).
|
|
4
|
+
*
|
|
5
|
+
* Goes beyond basic SUSPICIOUS_SCRIPTS patterns to detect sophisticated
|
|
6
|
+
* install-time attacks: secret harvesting, download-exec chains,
|
|
7
|
+
* obfuscated one-liners, and embedded binary blobs.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.analyzeInstallHooks = analyzeInstallHooks;
|
|
11
|
+
exports.extractInstallScripts = extractInstallScripts;
|
|
12
|
+
/**
|
|
13
|
+
* Deep-analyze install hook scripts from package.json.
|
|
14
|
+
*/
|
|
15
|
+
function analyzeInstallHooks(scripts, relativePath) {
|
|
16
|
+
const findings = [];
|
|
17
|
+
const hookNames = [
|
|
18
|
+
"preinstall", "postinstall", "install", "preuninstall", "postuninstall", "prepare",
|
|
19
|
+
];
|
|
20
|
+
for (const hook of hookNames) {
|
|
21
|
+
const script = scripts[hook];
|
|
22
|
+
if (!script)
|
|
23
|
+
continue;
|
|
24
|
+
// Network access in install scripts
|
|
25
|
+
if (/(?:fetch|https?\.(?:get|request|post)|axios|got|node-fetch|urllib|curl|wget)\b/i.test(script)) {
|
|
26
|
+
findings.push({
|
|
27
|
+
rule: "INSTALL_HOOK_NETWORK",
|
|
28
|
+
description: `${hook} script makes network requests. Install scripts should not access the network.`,
|
|
29
|
+
severity: "critical",
|
|
30
|
+
file: relativePath,
|
|
31
|
+
match: truncate(`${hook}: ${script}`),
|
|
32
|
+
confidence: 0.9,
|
|
33
|
+
category: "supply-chain",
|
|
34
|
+
recommendation: "Remove network calls from install scripts. Use explicit build steps instead.",
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
// Download + execute chain
|
|
38
|
+
if (/(?:curl|wget|fetch).*(?:chmod\s+\+x|exec|spawn|child_process|\.\/|bash|sh\s|node\s)/i.test(script) ||
|
|
39
|
+
/(?:exec|spawn).*(?:curl|wget|fetch)/i.test(script)) {
|
|
40
|
+
findings.push({
|
|
41
|
+
rule: "INSTALL_HOOK_DOWNLOAD_EXEC",
|
|
42
|
+
description: `${hook} script downloads and executes code. This is the #1 supply-chain attack vector.`,
|
|
43
|
+
severity: "critical",
|
|
44
|
+
file: relativePath,
|
|
45
|
+
match: truncate(`${hook}: ${script}`),
|
|
46
|
+
confidence: 0.95,
|
|
47
|
+
category: "malware",
|
|
48
|
+
recommendation: "Never download and execute code during npm install. This is almost certainly malicious.",
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
// Environment variable harvesting (secrets)
|
|
52
|
+
if (/process\.env\.(?:AWS|GITHUB|NPM|GH_|AZURE|GCP|DOCKER|CI|TRAVIS|CIRCLE|JENKINS|SECRET|TOKEN|KEY|PASSWORD|CREDENTIAL)/i.test(script)) {
|
|
53
|
+
findings.push({
|
|
54
|
+
rule: "INSTALL_HOOK_ENV_HARVEST",
|
|
55
|
+
description: `${hook} script accesses sensitive environment variables (secrets, tokens, keys).`,
|
|
56
|
+
severity: "critical",
|
|
57
|
+
file: relativePath,
|
|
58
|
+
match: truncate(`${hook}: ${script}`),
|
|
59
|
+
confidence: 0.85,
|
|
60
|
+
category: "supply-chain",
|
|
61
|
+
recommendation: "Install scripts should never read CI/CD secrets or API tokens.",
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
// .npmrc / credential file access
|
|
65
|
+
if (/\.npmrc|npm_config_|_authToken|\.ssh[/\\]|id_rsa|id_ed25519|\.gnupg|\.aws\/credentials/i.test(script)) {
|
|
66
|
+
findings.push({
|
|
67
|
+
rule: "INSTALL_HOOK_NPMRC_READ",
|
|
68
|
+
description: `${hook} script accesses credential files (.npmrc, SSH keys, AWS credentials).`,
|
|
69
|
+
severity: "critical",
|
|
70
|
+
file: relativePath,
|
|
71
|
+
match: truncate(`${hook}: ${script}`),
|
|
72
|
+
confidence: 0.9,
|
|
73
|
+
category: "malware",
|
|
74
|
+
recommendation: "Install scripts must not read credential files. This is credential theft.",
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
// .env file access
|
|
78
|
+
if (/\.env\b|dotenv|require\s*\(\s*['"]dotenv/i.test(script)) {
|
|
79
|
+
findings.push({
|
|
80
|
+
rule: "INSTALL_HOOK_DOTENV_READ",
|
|
81
|
+
description: `${hook} script reads .env files. Environment files contain secrets.`,
|
|
82
|
+
severity: "high",
|
|
83
|
+
file: relativePath,
|
|
84
|
+
match: truncate(`${hook}: ${script}`),
|
|
85
|
+
confidence: 0.7,
|
|
86
|
+
category: "supply-chain",
|
|
87
|
+
recommendation: "Install scripts should not load .env files.",
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// Obfuscated script content
|
|
91
|
+
if (/(?:atob|btoa|Buffer\.from|decodeURIComponent|unescape|String\.fromCharCode)\s*\(/i.test(script)) {
|
|
92
|
+
findings.push({
|
|
93
|
+
rule: "INSTALL_HOOK_OBFUSCATED",
|
|
94
|
+
description: `${hook} script contains encoding/decoding operations. Obfuscated install scripts are a strong malware indicator.`,
|
|
95
|
+
severity: "high",
|
|
96
|
+
file: relativePath,
|
|
97
|
+
match: truncate(`${hook}: ${script}`),
|
|
98
|
+
confidence: 0.8,
|
|
99
|
+
category: "malware",
|
|
100
|
+
recommendation: "Decode the obfuscated content and inspect it before running npm install.",
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
// Long one-liner (> 500 chars)
|
|
104
|
+
if (script.length > 500 && !script.includes("\n")) {
|
|
105
|
+
findings.push({
|
|
106
|
+
rule: "INSTALL_HOOK_LONG_ONELINER",
|
|
107
|
+
description: `${hook} script is a ${script.length}-character one-liner. Long single-line scripts are often obfuscated malware.`,
|
|
108
|
+
severity: "medium",
|
|
109
|
+
file: relativePath,
|
|
110
|
+
match: truncate(`${hook}: ${script}`),
|
|
111
|
+
confidence: 0.6,
|
|
112
|
+
category: "supply-chain",
|
|
113
|
+
recommendation: "Review this script carefully. Legitimate build scripts are rarely this long on one line.",
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
// Embedded binary blob (base64 > 1KB)
|
|
117
|
+
const b64Match = script.match(/[A-Za-z0-9+/=]{1000,}/);
|
|
118
|
+
if (b64Match) {
|
|
119
|
+
findings.push({
|
|
120
|
+
rule: "INSTALL_HOOK_BINARY_BLOB",
|
|
121
|
+
description: `${hook} script contains an embedded binary blob (${b64Match[0].length} chars). Likely an encoded executable payload.`,
|
|
122
|
+
severity: "high",
|
|
123
|
+
file: relativePath,
|
|
124
|
+
match: truncate(`${hook}: ${b64Match[0].substring(0, 60)}...`),
|
|
125
|
+
confidence: 0.85,
|
|
126
|
+
category: "malware",
|
|
127
|
+
recommendation: "Decode this base64 blob and inspect it. Embedded payloads in install scripts are malware.",
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return findings;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Extract install scripts from parsed package.json content.
|
|
135
|
+
*/
|
|
136
|
+
function extractInstallScripts(content) {
|
|
137
|
+
try {
|
|
138
|
+
const pkg = JSON.parse(content);
|
|
139
|
+
if (!pkg.scripts)
|
|
140
|
+
return null;
|
|
141
|
+
return {
|
|
142
|
+
preinstall: pkg.scripts.preinstall,
|
|
143
|
+
postinstall: pkg.scripts.postinstall,
|
|
144
|
+
install: pkg.scripts.install,
|
|
145
|
+
preuninstall: pkg.scripts.preuninstall,
|
|
146
|
+
postuninstall: pkg.scripts.postuninstall,
|
|
147
|
+
prepare: pkg.scripts.prepare,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
function truncate(s, max = 120) {
|
|
155
|
+
return s.length > max ? s.substring(0, max) + "..." : s;
|
|
156
|
+
}
|
|
157
|
+
//# sourceMappingURL=install-hook-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install-hook-scanner.js","sourceRoot":"","sources":["../src/install-hook-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Known Indicators of Compromise (IOC) blocklist.
|
|
3
|
+
*
|
|
4
|
+
* Contains known malicious domains, IPs, hashes, GitHub accounts,
|
|
5
|
+
* and compromised package versions. Updated as new threats emerge.
|
|
6
|
+
*/
|
|
7
|
+
export declare const KNOWN_C2_DOMAINS: string[];
|
|
8
|
+
export declare const KNOWN_C2_IPS: string[];
|
|
9
|
+
export declare const KNOWN_DEAD_DROPS: string[];
|
|
10
|
+
export declare const KNOWN_MALICIOUS_HASHES: Record<string, string>;
|
|
11
|
+
export declare const KNOWN_MALICIOUS_GITHUB_ACCOUNTS: string[];
|
|
12
|
+
export declare const KNOWN_BAD_NPM_VERSIONS: Record<string, {
|
|
13
|
+
versions: string[];
|
|
14
|
+
description: string;
|
|
15
|
+
}>;
|
|
16
|
+
export declare const KNOWN_BAD_PYPI_VERSIONS: Record<string, {
|
|
17
|
+
versions: string[];
|
|
18
|
+
description: string;
|
|
19
|
+
}>;
|
|
20
|
+
import type { Finding } from "./types.js";
|
|
21
|
+
/**
|
|
22
|
+
* Check content against known IOC blocklists.
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkIOCBlocklist(content: string, relativePath: string): Finding[];
|
|
25
|
+
/**
|
|
26
|
+
* Check a package name + version against the known-bad blocklist.
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkBadVersion(name: string, version: string, ecosystem: "npm" | "pypi"): Finding | null;
|
|
29
|
+
//# sourceMappingURL=ioc-blocklist.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ioc-blocklist.d.ts","sourceRoot":"","sources":["../src/ioc-blocklist.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAMpC,CAAC;AAMF,eAAO,MAAM,YAAY,EAAE,MAAM,EAIhC,CAAC;AAMF,eAAO,MAAM,gBAAgB,EAAE,MAAM,EAKpC,CAAC;AAMF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAQzD,CAAC;AAMF,eAAO,MAAM,+BAA+B,EAAE,MAAM,EAInD,CAAC;AAMF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAiC9F,CAAC;AAMF,eAAO,MAAM,uBAAuB,EAAE,MAAM,CAAC,MAAM,EAAE;IAAE,QAAQ,EAAE,MAAM,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,CAK/F,CAAC;AAMF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAE1C;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,GACnB,OAAO,EAAE,CA8EX;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,KAAK,GAAG,MAAM,GACxB,OAAO,GAAG,IAAI,CAiBhB"}
|