circle-ir 3.2.0 → 3.3.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 +2 -2
- package/dist/analysis/index.d.ts +2 -5
- package/dist/analysis/index.js +2 -6
- package/dist/analysis/index.js.map +1 -1
- package/dist/analysis/taint-matcher.js +1 -1
- package/dist/analysis/taint-matcher.js.map +1 -1
- package/dist/browser/circle-ir.js +38 -95
- package/dist/core/circle-ir-core.cjs +1 -1
- package/dist/core/circle-ir-core.js +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/logger.d.ts +28 -40
- package/dist/utils/logger.js +64 -137
- package/dist/utils/logger.js.map +1 -1
- package/package.json +3 -5
- package/dist/analysis/advisory-db.d.ts +0 -86
- package/dist/analysis/advisory-db.js +0 -104
- package/dist/analysis/advisory-db.js.map +0 -1
- package/dist/analysis/cargo-parser.d.ts +0 -42
- package/dist/analysis/cargo-parser.js +0 -102
- package/dist/analysis/cargo-parser.js.map +0 -1
- package/dist/analysis/dependency-scanner.d.ts +0 -79
- package/dist/analysis/dependency-scanner.js +0 -122
- package/dist/analysis/dependency-scanner.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cargo-parser.js","sourceRoot":"","sources":["../../src/analysis/cargo-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency vulnerability scanner for Rust projects
|
|
3
|
-
*
|
|
4
|
-
* Scans Cargo.lock files for known vulnerable crate versions
|
|
5
|
-
* using the RustSec Advisory Database.
|
|
6
|
-
*/
|
|
7
|
-
import type { Severity } from '../types/index.js';
|
|
8
|
-
import type { AdvisoryVulnerability, AdvisoryDatabase } from './advisory-db.js';
|
|
9
|
-
/**
|
|
10
|
-
* A finding for a vulnerable dependency
|
|
11
|
-
*/
|
|
12
|
-
export interface DependencyFinding {
|
|
13
|
-
type: 'vulnerable_dependency';
|
|
14
|
-
/** Crate name */
|
|
15
|
-
crate: string;
|
|
16
|
-
/** Installed version */
|
|
17
|
-
version: string;
|
|
18
|
-
/** Matching advisories */
|
|
19
|
-
vulnerabilities: AdvisoryVulnerability[];
|
|
20
|
-
/** Source file (Cargo.lock) */
|
|
21
|
-
source: string;
|
|
22
|
-
/** Location information */
|
|
23
|
-
location: {
|
|
24
|
-
file: string;
|
|
25
|
-
line?: number;
|
|
26
|
-
};
|
|
27
|
-
/** Severity level */
|
|
28
|
-
severity: Severity;
|
|
29
|
-
/** CWE IDs from advisories */
|
|
30
|
-
cwes: string[];
|
|
31
|
-
/** CVE IDs from advisories */
|
|
32
|
-
cves: string[];
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Options for dependency scanning
|
|
36
|
-
*/
|
|
37
|
-
export interface ScanOptions {
|
|
38
|
-
/** Path to Cargo.lock file */
|
|
39
|
-
cargoLockPath?: string;
|
|
40
|
-
/** Cargo.lock content (if already loaded) */
|
|
41
|
-
cargoLockContent?: string;
|
|
42
|
-
/** Custom advisory database (defaults to bundled) */
|
|
43
|
-
advisoryDb?: AdvisoryDatabase;
|
|
44
|
-
/** Include dev dependencies */
|
|
45
|
-
includeDevDeps?: boolean;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Scan result
|
|
49
|
-
*/
|
|
50
|
-
export interface ScanResult {
|
|
51
|
-
/** List of vulnerable dependencies */
|
|
52
|
-
findings: DependencyFinding[];
|
|
53
|
-
/** Total dependencies scanned */
|
|
54
|
-
totalDependencies: number;
|
|
55
|
-
/** Number of vulnerable dependencies */
|
|
56
|
-
vulnerableCount: number;
|
|
57
|
-
/** Advisory database info */
|
|
58
|
-
advisoryDbInfo: {
|
|
59
|
-
source: string;
|
|
60
|
-
lastUpdated: string;
|
|
61
|
-
totalAdvisories: number;
|
|
62
|
-
};
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Check if a specific crate version is vulnerable
|
|
66
|
-
*/
|
|
67
|
-
export declare function checkCrateVulnerability(crateName: string, version: string, db: AdvisoryDatabase): AdvisoryVulnerability[];
|
|
68
|
-
/**
|
|
69
|
-
* Scan Cargo.lock content for vulnerable dependencies
|
|
70
|
-
*/
|
|
71
|
-
export declare function scanCargoLock(content: string, options?: ScanOptions): ScanResult;
|
|
72
|
-
/**
|
|
73
|
-
* Format a dependency finding as a human-readable string
|
|
74
|
-
*/
|
|
75
|
-
export declare function formatFinding(finding: DependencyFinding): string;
|
|
76
|
-
/**
|
|
77
|
-
* Format scan result as a human-readable report
|
|
78
|
-
*/
|
|
79
|
-
export declare function formatScanReport(result: ScanResult): string;
|
|
@@ -1,122 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Dependency vulnerability scanner for Rust projects
|
|
3
|
-
*
|
|
4
|
-
* Scans Cargo.lock files for known vulnerable crate versions
|
|
5
|
-
* using the RustSec Advisory Database.
|
|
6
|
-
*/
|
|
7
|
-
import { loadBundledAdvisories, getAdvisoriesForCrate, categoryToSeverity, } from './advisory-db.js';
|
|
8
|
-
import { parseCargoLock, filterRegistryDeps } from './cargo-parser.js';
|
|
9
|
-
import { isVersionVulnerable } from './semver.js';
|
|
10
|
-
/**
|
|
11
|
-
* Check if a specific crate version is vulnerable
|
|
12
|
-
*/
|
|
13
|
-
export function checkCrateVulnerability(crateName, version, db) {
|
|
14
|
-
const advisories = getAdvisoriesForCrate(db, crateName);
|
|
15
|
-
return advisories.filter((advisory) => {
|
|
16
|
-
return isVersionVulnerable(version, advisory.versions.patched, advisory.versions.unaffected);
|
|
17
|
-
});
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* Scan Cargo.lock content for vulnerable dependencies
|
|
21
|
-
*/
|
|
22
|
-
export function scanCargoLock(content, options = {}) {
|
|
23
|
-
const db = options.advisoryDb || loadBundledAdvisories();
|
|
24
|
-
const cargoLock = parseCargoLock(content);
|
|
25
|
-
const deps = filterRegistryDeps(cargoLock.dependencies);
|
|
26
|
-
const findings = [];
|
|
27
|
-
for (const dep of deps) {
|
|
28
|
-
const vulnerableAdvisories = checkCrateVulnerability(dep.name, dep.version, db);
|
|
29
|
-
if (vulnerableAdvisories.length > 0) {
|
|
30
|
-
// Extract CWEs and CVEs from advisories
|
|
31
|
-
const cwes = [];
|
|
32
|
-
const cves = [];
|
|
33
|
-
for (const advisory of vulnerableAdvisories) {
|
|
34
|
-
for (const alias of advisory.aliases) {
|
|
35
|
-
if (alias.startsWith('CVE-')) {
|
|
36
|
-
cves.push(alias);
|
|
37
|
-
}
|
|
38
|
-
else if (alias.startsWith('CWE-')) {
|
|
39
|
-
cwes.push(alias);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Calculate severity from all advisories
|
|
44
|
-
const allCategories = vulnerableAdvisories.flatMap((a) => a.categories);
|
|
45
|
-
const severity = categoryToSeverity(allCategories);
|
|
46
|
-
findings.push({
|
|
47
|
-
type: 'vulnerable_dependency',
|
|
48
|
-
crate: dep.name,
|
|
49
|
-
version: dep.version,
|
|
50
|
-
vulnerabilities: vulnerableAdvisories,
|
|
51
|
-
source: 'Cargo.lock',
|
|
52
|
-
location: {
|
|
53
|
-
file: options.cargoLockPath || 'Cargo.lock',
|
|
54
|
-
},
|
|
55
|
-
severity,
|
|
56
|
-
cwes: [...new Set(cwes)],
|
|
57
|
-
cves: [...new Set(cves)],
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
// Sort findings by severity
|
|
62
|
-
const severityOrder = {
|
|
63
|
-
critical: 0,
|
|
64
|
-
high: 1,
|
|
65
|
-
medium: 2,
|
|
66
|
-
low: 3,
|
|
67
|
-
};
|
|
68
|
-
findings.sort((a, b) => severityOrder[a.severity] - severityOrder[b.severity]);
|
|
69
|
-
return {
|
|
70
|
-
findings,
|
|
71
|
-
totalDependencies: deps.length,
|
|
72
|
-
vulnerableCount: findings.length,
|
|
73
|
-
advisoryDbInfo: {
|
|
74
|
-
source: db.source,
|
|
75
|
-
lastUpdated: db.lastUpdated,
|
|
76
|
-
totalAdvisories: db.stats?.totalAdvisories || 0,
|
|
77
|
-
},
|
|
78
|
-
};
|
|
79
|
-
}
|
|
80
|
-
/**
|
|
81
|
-
* Format a dependency finding as a human-readable string
|
|
82
|
-
*/
|
|
83
|
-
export function formatFinding(finding) {
|
|
84
|
-
const lines = [];
|
|
85
|
-
lines.push(`${finding.crate}@${finding.version} [${finding.severity.toUpperCase()}]`);
|
|
86
|
-
for (const vuln of finding.vulnerabilities) {
|
|
87
|
-
lines.push(` ${vuln.id}: ${vuln.title || vuln.description.slice(0, 80)}`);
|
|
88
|
-
if (vuln.aliases.length > 0) {
|
|
89
|
-
lines.push(` Aliases: ${vuln.aliases.join(', ')}`);
|
|
90
|
-
}
|
|
91
|
-
if (vuln.versions.patched && vuln.versions.patched.length > 0) {
|
|
92
|
-
lines.push(` Patched: ${vuln.versions.patched.join(', ')}`);
|
|
93
|
-
}
|
|
94
|
-
lines.push(` URL: ${vuln.url}`);
|
|
95
|
-
}
|
|
96
|
-
return lines.join('\n');
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Format scan result as a human-readable report
|
|
100
|
-
*/
|
|
101
|
-
export function formatScanReport(result) {
|
|
102
|
-
const lines = [];
|
|
103
|
-
lines.push('=== RUST DEPENDENCY VULNERABILITY SCAN ===');
|
|
104
|
-
lines.push('');
|
|
105
|
-
lines.push(`Dependencies scanned: ${result.totalDependencies}`);
|
|
106
|
-
lines.push(`Vulnerable packages: ${result.vulnerableCount}`);
|
|
107
|
-
lines.push(`Advisory DB: ${result.advisoryDbInfo.source} (${result.advisoryDbInfo.lastUpdated})`);
|
|
108
|
-
lines.push('');
|
|
109
|
-
if (result.findings.length === 0) {
|
|
110
|
-
lines.push('No known vulnerabilities found.');
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
lines.push('VULNERABLE DEPENDENCIES:');
|
|
114
|
-
lines.push('');
|
|
115
|
-
for (const finding of result.findings) {
|
|
116
|
-
lines.push(formatFinding(finding));
|
|
117
|
-
lines.push('');
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
return lines.join('\n');
|
|
121
|
-
}
|
|
122
|
-
//# sourceMappingURL=dependency-scanner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-scanner.js","sourceRoot":"","sources":["../../src/analysis/dependency-scanner.ts"],"names":[],"mappings":"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"}
|