guardrail-security 1.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/dist/attack-surface/analyzer.d.ts +50 -0
- package/dist/attack-surface/analyzer.d.ts.map +1 -0
- package/dist/attack-surface/analyzer.js +83 -0
- package/dist/attack-surface/index.d.ts +5 -0
- package/dist/attack-surface/index.d.ts.map +1 -0
- package/dist/attack-surface/index.js +20 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/languages/index.d.ts +21 -0
- package/dist/languages/index.d.ts.map +1 -0
- package/dist/languages/index.js +78 -0
- package/dist/languages/java-analyzer.d.ts +72 -0
- package/dist/languages/java-analyzer.d.ts.map +1 -0
- package/dist/languages/java-analyzer.js +417 -0
- package/dist/languages/python-analyzer.d.ts +70 -0
- package/dist/languages/python-analyzer.d.ts.map +1 -0
- package/dist/languages/python-analyzer.js +425 -0
- package/dist/license/compatibility-matrix.d.ts +28 -0
- package/dist/license/compatibility-matrix.d.ts.map +1 -0
- package/dist/license/compatibility-matrix.js +323 -0
- package/dist/license/engine.d.ts +77 -0
- package/dist/license/engine.d.ts.map +1 -0
- package/dist/license/engine.js +264 -0
- package/dist/license/index.d.ts +6 -0
- package/dist/license/index.d.ts.map +1 -0
- package/dist/license/index.js +21 -0
- package/dist/sbom/generator.d.ts +108 -0
- package/dist/sbom/generator.d.ts.map +1 -0
- package/dist/sbom/generator.js +271 -0
- package/dist/sbom/index.d.ts +5 -0
- package/dist/sbom/index.d.ts.map +1 -0
- package/dist/sbom/index.js +20 -0
- package/dist/secrets/guardian.d.ts +113 -0
- package/dist/secrets/guardian.d.ts.map +1 -0
- package/dist/secrets/guardian.js +334 -0
- package/dist/secrets/index.d.ts +10 -0
- package/dist/secrets/index.d.ts.map +1 -0
- package/dist/secrets/index.js +30 -0
- package/dist/secrets/patterns.d.ts +42 -0
- package/dist/secrets/patterns.d.ts.map +1 -0
- package/dist/secrets/patterns.js +165 -0
- package/dist/secrets/pre-commit.d.ts +39 -0
- package/dist/secrets/pre-commit.d.ts.map +1 -0
- package/dist/secrets/pre-commit.js +127 -0
- package/dist/secrets/vault-integration.d.ts +83 -0
- package/dist/secrets/vault-integration.d.ts.map +1 -0
- package/dist/secrets/vault-integration.js +295 -0
- package/dist/secrets/vault-providers.d.ts +110 -0
- package/dist/secrets/vault-providers.d.ts.map +1 -0
- package/dist/secrets/vault-providers.js +417 -0
- package/dist/supply-chain/detector.d.ts +80 -0
- package/dist/supply-chain/detector.d.ts.map +1 -0
- package/dist/supply-chain/detector.js +168 -0
- package/dist/supply-chain/index.d.ts +11 -0
- package/dist/supply-chain/index.d.ts.map +1 -0
- package/dist/supply-chain/index.js +26 -0
- package/dist/supply-chain/malicious-db.d.ts +41 -0
- package/dist/supply-chain/malicious-db.d.ts.map +1 -0
- package/dist/supply-chain/malicious-db.js +82 -0
- package/dist/supply-chain/script-analyzer.d.ts +54 -0
- package/dist/supply-chain/script-analyzer.d.ts.map +1 -0
- package/dist/supply-chain/script-analyzer.js +160 -0
- package/dist/supply-chain/typosquat.d.ts +58 -0
- package/dist/supply-chain/typosquat.d.ts.map +1 -0
- package/dist/supply-chain/typosquat.js +257 -0
- package/dist/supply-chain/vulnerability-db.d.ts +114 -0
- package/dist/supply-chain/vulnerability-db.d.ts.map +1 -0
- package/dist/supply-chain/vulnerability-db.js +310 -0
- package/package.json +34 -0
- package/src/__tests__/license/engine.test.ts +250 -0
- package/src/__tests__/supply-chain/typosquat.test.ts +191 -0
- package/src/attack-surface/analyzer.ts +152 -0
- package/src/attack-surface/index.ts +5 -0
- package/src/index.ts +21 -0
- package/src/languages/index.ts +91 -0
- package/src/languages/java-analyzer.ts +490 -0
- package/src/languages/python-analyzer.ts +498 -0
- package/src/license/compatibility-matrix.ts +366 -0
- package/src/license/engine.ts +345 -0
- package/src/license/index.ts +6 -0
- package/src/sbom/generator.ts +355 -0
- package/src/sbom/index.ts +5 -0
- package/src/secrets/guardian.ts +448 -0
- package/src/secrets/index.ts +10 -0
- package/src/secrets/patterns.ts +186 -0
- package/src/secrets/pre-commit.ts +158 -0
- package/src/secrets/vault-integration.ts +360 -0
- package/src/secrets/vault-providers.ts +446 -0
- package/src/supply-chain/detector.ts +252 -0
- package/src/supply-chain/index.ts +11 -0
- package/src/supply-chain/malicious-db.ts +103 -0
- package/src/supply-chain/script-analyzer.ts +194 -0
- package/src/supply-chain/typosquat.ts +302 -0
- package/src/supply-chain/vulnerability-db.ts +386 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Supply Chain Attack Detection
|
|
4
|
+
*
|
|
5
|
+
* Detects typosquatting, malicious packages, and generates SBOMs
|
|
6
|
+
*/
|
|
7
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
8
|
+
if (k2 === undefined) k2 = k;
|
|
9
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
10
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
11
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
12
|
+
}
|
|
13
|
+
Object.defineProperty(o, k2, desc);
|
|
14
|
+
}) : (function(o, m, k, k2) {
|
|
15
|
+
if (k2 === undefined) k2 = k;
|
|
16
|
+
o[k2] = m[k];
|
|
17
|
+
}));
|
|
18
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
19
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
__exportStar(require("./detector"), exports);
|
|
23
|
+
__exportStar(require("./typosquat"), exports);
|
|
24
|
+
__exportStar(require("./malicious-db"), exports);
|
|
25
|
+
__exportStar(require("./script-analyzer"), exports);
|
|
26
|
+
__exportStar(require("./vulnerability-db"), exports);
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Malicious Package Database
|
|
3
|
+
*
|
|
4
|
+
* Checks packages against known malicious packages
|
|
5
|
+
*/
|
|
6
|
+
export interface MaliciousPackageInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
version?: string;
|
|
9
|
+
reason: string;
|
|
10
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
11
|
+
cve?: string;
|
|
12
|
+
reported: Date;
|
|
13
|
+
}
|
|
14
|
+
export declare class MaliciousPackageDB {
|
|
15
|
+
private maliciousPackages;
|
|
16
|
+
constructor();
|
|
17
|
+
/**
|
|
18
|
+
* Check if package is known to be malicious
|
|
19
|
+
*/
|
|
20
|
+
checkPackage(name: string, version: string): Promise<{
|
|
21
|
+
isMalicious: boolean;
|
|
22
|
+
matches: MaliciousPackageInfo[];
|
|
23
|
+
}>;
|
|
24
|
+
/**
|
|
25
|
+
* Load malicious packages database
|
|
26
|
+
*/
|
|
27
|
+
private loadDatabase;
|
|
28
|
+
/**
|
|
29
|
+
* Update database from external sources
|
|
30
|
+
*/
|
|
31
|
+
updateDatabase(): Promise<{
|
|
32
|
+
added: number;
|
|
33
|
+
updated: number;
|
|
34
|
+
}>;
|
|
35
|
+
/**
|
|
36
|
+
* Add custom malicious package
|
|
37
|
+
*/
|
|
38
|
+
addMaliciousPackage(info: MaliciousPackageInfo): void;
|
|
39
|
+
}
|
|
40
|
+
export declare const maliciousPackageDB: MaliciousPackageDB;
|
|
41
|
+
//# sourceMappingURL=malicious-db.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"malicious-db.d.ts","sourceRoot":"","sources":["../../src/supply-chain/malicious-db.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,IAAI,CAAC;CAChB;AAaD,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,iBAAiB,CAAkD;;IAM3E;;OAEG;IACG,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC;QACzD,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,oBAAoB,EAAE,CAAC;KACjC,CAAC;IAyBF;;OAEG;IACH,OAAO,CAAC,YAAY;IASpB;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAWnE;;OAEG;IACH,mBAAmB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;CAMtD;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Malicious Package Database
|
|
4
|
+
*
|
|
5
|
+
* Checks packages against known malicious packages
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.maliciousPackageDB = exports.MaliciousPackageDB = void 0;
|
|
9
|
+
/**
|
|
10
|
+
* Known malicious packages (this would be updated regularly from external sources)
|
|
11
|
+
*/
|
|
12
|
+
const KNOWN_MALICIOUS = [
|
|
13
|
+
// Example entries - in production, this would be fetched from:
|
|
14
|
+
// - npm security advisories
|
|
15
|
+
// - Snyk vulnerability database
|
|
16
|
+
// - GitHub Advisory Database
|
|
17
|
+
// - Custom threat intelligence feeds
|
|
18
|
+
];
|
|
19
|
+
class MaliciousPackageDB {
|
|
20
|
+
maliciousPackages = new Map();
|
|
21
|
+
constructor() {
|
|
22
|
+
this.loadDatabase();
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Check if package is known to be malicious
|
|
26
|
+
*/
|
|
27
|
+
async checkPackage(name, version) {
|
|
28
|
+
const matches = [];
|
|
29
|
+
// Check exact name match
|
|
30
|
+
const nameMatches = this.maliciousPackages.get(name) || [];
|
|
31
|
+
for (const match of nameMatches) {
|
|
32
|
+
// If no version specified in DB, flag all versions
|
|
33
|
+
if (!match.version) {
|
|
34
|
+
matches.push(match);
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
// Check version match
|
|
38
|
+
if (match.version === version || match.version === '*') {
|
|
39
|
+
matches.push(match);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
isMalicious: matches.length > 0,
|
|
44
|
+
matches,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Load malicious packages database
|
|
49
|
+
*/
|
|
50
|
+
loadDatabase() {
|
|
51
|
+
for (const pkg of KNOWN_MALICIOUS) {
|
|
52
|
+
if (!this.maliciousPackages.has(pkg.name)) {
|
|
53
|
+
this.maliciousPackages.set(pkg.name, []);
|
|
54
|
+
}
|
|
55
|
+
this.maliciousPackages.get(pkg.name).push(pkg);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Update database from external sources
|
|
60
|
+
*/
|
|
61
|
+
async updateDatabase() {
|
|
62
|
+
// In production, this would:
|
|
63
|
+
// 1. Fetch from npm security advisories API
|
|
64
|
+
// 2. Fetch from Snyk API
|
|
65
|
+
// 3. Fetch from GitHub Advisory Database
|
|
66
|
+
// 4. Merge with existing database
|
|
67
|
+
// 5. Return statistics
|
|
68
|
+
return { added: 0, updated: 0 };
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Add custom malicious package
|
|
72
|
+
*/
|
|
73
|
+
addMaliciousPackage(info) {
|
|
74
|
+
if (!this.maliciousPackages.has(info.name)) {
|
|
75
|
+
this.maliciousPackages.set(info.name, []);
|
|
76
|
+
}
|
|
77
|
+
this.maliciousPackages.get(info.name).push(info);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
exports.MaliciousPackageDB = MaliciousPackageDB;
|
|
81
|
+
// Export singleton
|
|
82
|
+
exports.maliciousPackageDB = new MaliciousPackageDB();
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Script Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Analyzes package.json scripts for suspicious behavior
|
|
5
|
+
*/
|
|
6
|
+
export interface ScriptAnalysisResult {
|
|
7
|
+
scriptName: string;
|
|
8
|
+
scriptContent: string;
|
|
9
|
+
isSuspicious: boolean;
|
|
10
|
+
threats: ScriptThreat[];
|
|
11
|
+
riskScore: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ScriptThreat {
|
|
14
|
+
type: 'data_exfiltration' | 'crypto_mining' | 'backdoor' | 'malicious_download' | 'privilege_escalation';
|
|
15
|
+
pattern: string;
|
|
16
|
+
severity: 'low' | 'medium' | 'high' | 'critical';
|
|
17
|
+
description: string;
|
|
18
|
+
}
|
|
19
|
+
export declare class ScriptAnalyzer {
|
|
20
|
+
/**
|
|
21
|
+
* Analyze package.json scripts
|
|
22
|
+
*/
|
|
23
|
+
analyzeScripts(_packageName: string, _version: string): Promise<ScriptAnalysisResult[]>;
|
|
24
|
+
/**
|
|
25
|
+
* Analyze a single script
|
|
26
|
+
*/
|
|
27
|
+
analyzeScript(scriptName: string, scriptContent: string): ScriptAnalysisResult;
|
|
28
|
+
/**
|
|
29
|
+
* Detect data exfiltration patterns
|
|
30
|
+
*/
|
|
31
|
+
detectExfiltration(script: string): boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Detect crypto mining
|
|
34
|
+
*/
|
|
35
|
+
detectCryptoMining(script: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Detect backdoor patterns
|
|
38
|
+
*/
|
|
39
|
+
private detectBackdoor;
|
|
40
|
+
/**
|
|
41
|
+
* Detect malicious downloads
|
|
42
|
+
*/
|
|
43
|
+
private detectMaliciousDownload;
|
|
44
|
+
/**
|
|
45
|
+
* Detect privilege escalation
|
|
46
|
+
*/
|
|
47
|
+
private detectPrivilegeEscalation;
|
|
48
|
+
/**
|
|
49
|
+
* Calculate risk score
|
|
50
|
+
*/
|
|
51
|
+
private calculateRiskScore;
|
|
52
|
+
}
|
|
53
|
+
export declare const scriptAnalyzer: ScriptAnalyzer;
|
|
54
|
+
//# sourceMappingURL=script-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-analyzer.d.ts","sourceRoot":"","sources":["../../src/supply-chain/script-analyzer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,OAAO,CAAC;IACtB,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,mBAAmB,GAAG,eAAe,GAAG,UAAU,GAAG,oBAAoB,GAAG,sBAAsB,CAAC;IACzG,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,cAAc;IACzB;;OAEG;IACG,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,EAAE,CAAC;IAM7F;;OAEG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,oBAAoB;IAiE9E;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAa3C;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO;IAY3C;;OAEG;IACH,OAAO,CAAC,cAAc;IAWtB;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAU/B;;OAEG;IACH,OAAO,CAAC,yBAAyB;IAWjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;CAgB3B;AAGD,eAAO,MAAM,cAAc,gBAAuB,CAAC"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Script Analyzer
|
|
4
|
+
*
|
|
5
|
+
* Analyzes package.json scripts for suspicious behavior
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.scriptAnalyzer = exports.ScriptAnalyzer = void 0;
|
|
9
|
+
class ScriptAnalyzer {
|
|
10
|
+
/**
|
|
11
|
+
* Analyze package.json scripts
|
|
12
|
+
*/
|
|
13
|
+
async analyzeScripts(_packageName, _version) {
|
|
14
|
+
// In production, this would fetch package.json from npm registry
|
|
15
|
+
// For now, return empty array
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Analyze a single script
|
|
20
|
+
*/
|
|
21
|
+
analyzeScript(scriptName, scriptContent) {
|
|
22
|
+
const threats = [];
|
|
23
|
+
// Check for data exfiltration
|
|
24
|
+
if (this.detectExfiltration(scriptContent)) {
|
|
25
|
+
threats.push({
|
|
26
|
+
type: 'data_exfiltration',
|
|
27
|
+
pattern: 'network_request',
|
|
28
|
+
severity: 'high',
|
|
29
|
+
description: 'Script makes network requests that could exfiltrate data',
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
// Check for crypto mining
|
|
33
|
+
if (this.detectCryptoMining(scriptContent)) {
|
|
34
|
+
threats.push({
|
|
35
|
+
type: 'crypto_mining',
|
|
36
|
+
pattern: 'crypto_miner',
|
|
37
|
+
severity: 'high',
|
|
38
|
+
description: 'Script contains crypto mining code',
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
// Check for backdoors
|
|
42
|
+
if (this.detectBackdoor(scriptContent)) {
|
|
43
|
+
threats.push({
|
|
44
|
+
type: 'backdoor',
|
|
45
|
+
pattern: 'reverse_shell',
|
|
46
|
+
severity: 'critical',
|
|
47
|
+
description: 'Script opens a backdoor or reverse shell',
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
// Check for malicious downloads
|
|
51
|
+
if (this.detectMaliciousDownload(scriptContent)) {
|
|
52
|
+
threats.push({
|
|
53
|
+
type: 'malicious_download',
|
|
54
|
+
pattern: 'download_execute',
|
|
55
|
+
severity: 'critical',
|
|
56
|
+
description: 'Script downloads and executes code',
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
// Check for privilege escalation
|
|
60
|
+
if (this.detectPrivilegeEscalation(scriptContent)) {
|
|
61
|
+
threats.push({
|
|
62
|
+
type: 'privilege_escalation',
|
|
63
|
+
pattern: 'sudo_usage',
|
|
64
|
+
severity: 'high',
|
|
65
|
+
description: 'Script attempts privilege escalation',
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
// Calculate risk score
|
|
69
|
+
const riskScore = this.calculateRiskScore(threats);
|
|
70
|
+
return {
|
|
71
|
+
scriptName,
|
|
72
|
+
scriptContent,
|
|
73
|
+
isSuspicious: threats.length > 0,
|
|
74
|
+
threats,
|
|
75
|
+
riskScore,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Detect data exfiltration patterns
|
|
80
|
+
*/
|
|
81
|
+
detectExfiltration(script) {
|
|
82
|
+
const patterns = [
|
|
83
|
+
/curl\s+.*\|\s*bash/i, // Pipe to bash
|
|
84
|
+
/wget\s+.*\|\s*sh/i, // Pipe to sh
|
|
85
|
+
/fetch\(['"]http/i, // HTTP requests
|
|
86
|
+
/axios\./i, // Axios requests
|
|
87
|
+
/http\.request/i, // HTTP module
|
|
88
|
+
/child_process\.exec.*curl/i, // Execute curl
|
|
89
|
+
];
|
|
90
|
+
return patterns.some((p) => p.test(script));
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Detect crypto mining
|
|
94
|
+
*/
|
|
95
|
+
detectCryptoMining(script) {
|
|
96
|
+
const patterns = [
|
|
97
|
+
/coinhive/i,
|
|
98
|
+
/cryptonight/i,
|
|
99
|
+
/monero/i,
|
|
100
|
+
/xmrig/i,
|
|
101
|
+
/stratum\+tcp/i,
|
|
102
|
+
];
|
|
103
|
+
return patterns.some((p) => p.test(script));
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Detect backdoor patterns
|
|
107
|
+
*/
|
|
108
|
+
detectBackdoor(script) {
|
|
109
|
+
const patterns = [
|
|
110
|
+
/nc\s+-l/i, // Netcat listener
|
|
111
|
+
/\/bin\/sh\s+-i/i, // Interactive shell
|
|
112
|
+
/bash\s+-i/i, // Interactive bash
|
|
113
|
+
/python.*socket/i, // Python socket
|
|
114
|
+
];
|
|
115
|
+
return patterns.some((p) => p.test(script));
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Detect malicious downloads
|
|
119
|
+
*/
|
|
120
|
+
detectMaliciousDownload(script) {
|
|
121
|
+
const patterns = [
|
|
122
|
+
/curl.*\|\s*bash/i,
|
|
123
|
+
/wget.*&&.*chmod\s*\+x/i,
|
|
124
|
+
/download.*&&.*execute/i,
|
|
125
|
+
];
|
|
126
|
+
return patterns.some((p) => p.test(script));
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Detect privilege escalation
|
|
130
|
+
*/
|
|
131
|
+
detectPrivilegeEscalation(script) {
|
|
132
|
+
const patterns = [
|
|
133
|
+
/sudo\s+/i,
|
|
134
|
+
/su\s+-/i,
|
|
135
|
+
/chmod\s+777/i,
|
|
136
|
+
/chown\s+root/i,
|
|
137
|
+
];
|
|
138
|
+
return patterns.some((p) => p.test(script));
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Calculate risk score
|
|
142
|
+
*/
|
|
143
|
+
calculateRiskScore(threats) {
|
|
144
|
+
const severityScores = {
|
|
145
|
+
low: 25,
|
|
146
|
+
medium: 50,
|
|
147
|
+
high: 75,
|
|
148
|
+
critical: 100,
|
|
149
|
+
};
|
|
150
|
+
if (threats.length === 0)
|
|
151
|
+
return 0;
|
|
152
|
+
const totalScore = threats.reduce((sum, threat) => {
|
|
153
|
+
return sum + severityScores[threat.severity];
|
|
154
|
+
}, 0);
|
|
155
|
+
return Math.min(100, totalScore / threats.length);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
exports.ScriptAnalyzer = ScriptAnalyzer;
|
|
159
|
+
// Export singleton
|
|
160
|
+
exports.scriptAnalyzer = new ScriptAnalyzer();
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typosquatting Detection
|
|
3
|
+
*
|
|
4
|
+
* Detects potential typosquatting attacks against popular packages
|
|
5
|
+
*/
|
|
6
|
+
export interface TyposquatResult {
|
|
7
|
+
isTyposquat: boolean;
|
|
8
|
+
suspiciousPackage: string;
|
|
9
|
+
targetPackage?: string;
|
|
10
|
+
similarity: number;
|
|
11
|
+
patterns: string[];
|
|
12
|
+
}
|
|
13
|
+
export declare class TyposquatDetector {
|
|
14
|
+
private popularPackages;
|
|
15
|
+
constructor();
|
|
16
|
+
/**
|
|
17
|
+
* Detect typosquatting
|
|
18
|
+
*/
|
|
19
|
+
detectTyposquatting(packageName: string): Promise<TyposquatResult>;
|
|
20
|
+
/**
|
|
21
|
+
* Check for character swap (e.g., raect vs react)
|
|
22
|
+
*/
|
|
23
|
+
private checkCharacterSwap;
|
|
24
|
+
/**
|
|
25
|
+
* Check for missing character (e.g., reat vs react)
|
|
26
|
+
*/
|
|
27
|
+
private checkMissingCharacter;
|
|
28
|
+
/**
|
|
29
|
+
* Check for extra character (e.g., reactt vs react)
|
|
30
|
+
*/
|
|
31
|
+
private checkExtraCharacter;
|
|
32
|
+
/**
|
|
33
|
+
* Check for homoglyph substitution (e.g., react with Cyrillic 'а')
|
|
34
|
+
*/
|
|
35
|
+
private checkHomoglyph;
|
|
36
|
+
/**
|
|
37
|
+
* Check for combosquatting (e.g., react-native-safe vs react)
|
|
38
|
+
*/
|
|
39
|
+
private checkCombosquatting;
|
|
40
|
+
/**
|
|
41
|
+
* Check Levenshtein distance
|
|
42
|
+
*/
|
|
43
|
+
private checkLevenshtein;
|
|
44
|
+
/**
|
|
45
|
+
* Calculate Levenshtein distance
|
|
46
|
+
*/
|
|
47
|
+
levenshteinDistance(a: string, b: string): number;
|
|
48
|
+
/**
|
|
49
|
+
* Get popular packages list
|
|
50
|
+
*/
|
|
51
|
+
getPopularPackages(): Promise<string[]>;
|
|
52
|
+
/**
|
|
53
|
+
* Add custom popular package
|
|
54
|
+
*/
|
|
55
|
+
addPopularPackage(packageName: string): void;
|
|
56
|
+
}
|
|
57
|
+
export declare const typosquatDetector: TyposquatDetector;
|
|
58
|
+
//# sourceMappingURL=typosquat.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typosquat.d.ts","sourceRoot":"","sources":["../../src/supply-chain/typosquat.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAuBH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,OAAO,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,eAAe,CAAc;;IAMrC;;OAEG;IACG,mBAAmB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IA2CxE;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAwB1B;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqB3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAoCtB;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAmB3B;;OAEG;IACH,OAAO,CAAC,gBAAgB;IAiBxB;;OAEG;IACH,mBAAmB,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM;IAsCjD;;OAEG;IACG,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;IAI7C;;OAEG;IACH,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI;CAG7C;AAGD,eAAO,MAAM,iBAAiB,mBAA0B,CAAC"}
|