circle-ir 3.1.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/LICENSE +15 -0
- package/README.md +200 -0
- package/configs/sinks/code_injection.yaml +672 -0
- package/configs/sinks/command.yaml +917 -0
- package/configs/sinks/deserialization.yaml +105 -0
- package/configs/sinks/ldap.yaml +136 -0
- package/configs/sinks/nodejs.json +629 -0
- package/configs/sinks/path.yaml +715 -0
- package/configs/sinks/python.json +501 -0
- package/configs/sinks/rust.json +339 -0
- package/configs/sinks/sql.yaml +233 -0
- package/configs/sinks/ssrf.yaml +160 -0
- package/configs/sinks/xpath.yaml +121 -0
- package/configs/sinks/xss.yaml +727 -0
- package/configs/sources/db_sources.yaml +90 -0
- package/configs/sources/env_sources.yaml +94 -0
- package/configs/sources/express.json +197 -0
- package/configs/sources/file_sources.yaml +164 -0
- package/configs/sources/http_sources.yaml +379 -0
- package/configs/sources/io_sources.yaml +519 -0
- package/configs/sources/network_sources.yaml +99 -0
- package/configs/sources/python.json +230 -0
- package/configs/sources/rust.json +286 -0
- package/configs/sources/spring.yaml +70 -0
- package/dist/analysis/advisory-db.d.ts +86 -0
- package/dist/analysis/advisory-db.js +104 -0
- package/dist/analysis/advisory-db.js.map +1 -0
- package/dist/analysis/cargo-parser.d.ts +42 -0
- package/dist/analysis/cargo-parser.js +102 -0
- package/dist/analysis/cargo-parser.js.map +1 -0
- package/dist/analysis/config-loader.d.ts +37 -0
- package/dist/analysis/config-loader.js +1561 -0
- package/dist/analysis/config-loader.js.map +1 -0
- package/dist/analysis/constant-propagation/ast-utils.d.ts +25 -0
- package/dist/analysis/constant-propagation/ast-utils.js +34 -0
- package/dist/analysis/constant-propagation/ast-utils.js.map +1 -0
- package/dist/analysis/constant-propagation/evaluator.d.ts +32 -0
- package/dist/analysis/constant-propagation/evaluator.js +296 -0
- package/dist/analysis/constant-propagation/evaluator.js.map +1 -0
- package/dist/analysis/constant-propagation/index.d.ts +62 -0
- package/dist/analysis/constant-propagation/index.js +152 -0
- package/dist/analysis/constant-propagation/index.js.map +1 -0
- package/dist/analysis/constant-propagation/patterns.d.ts +8 -0
- package/dist/analysis/constant-propagation/patterns.js +126 -0
- package/dist/analysis/constant-propagation/patterns.js.map +1 -0
- package/dist/analysis/constant-propagation/propagator.d.ts +180 -0
- package/dist/analysis/constant-propagation/propagator.js +1985 -0
- package/dist/analysis/constant-propagation/propagator.js.map +1 -0
- package/dist/analysis/constant-propagation/types.d.ts +63 -0
- package/dist/analysis/constant-propagation/types.js +5 -0
- package/dist/analysis/constant-propagation/types.js.map +1 -0
- package/dist/analysis/constant-propagation.d.ts +9 -0
- package/dist/analysis/constant-propagation.js +18 -0
- package/dist/analysis/constant-propagation.js.map +1 -0
- package/dist/analysis/dependency-scanner.d.ts +79 -0
- package/dist/analysis/dependency-scanner.js +122 -0
- package/dist/analysis/dependency-scanner.js.map +1 -0
- package/dist/analysis/dfg-verifier.d.ts +116 -0
- package/dist/analysis/dfg-verifier.js +399 -0
- package/dist/analysis/dfg-verifier.js.map +1 -0
- package/dist/analysis/findings.d.ts +11 -0
- package/dist/analysis/findings.js +228 -0
- package/dist/analysis/findings.js.map +1 -0
- package/dist/analysis/index.d.ts +16 -0
- package/dist/analysis/index.js +18 -0
- package/dist/analysis/index.js.map +1 -0
- package/dist/analysis/interprocedural.d.ts +99 -0
- package/dist/analysis/interprocedural.js +526 -0
- package/dist/analysis/interprocedural.js.map +1 -0
- package/dist/analysis/path-finder.d.ts +133 -0
- package/dist/analysis/path-finder.js +354 -0
- package/dist/analysis/path-finder.js.map +1 -0
- package/dist/analysis/rules.d.ts +75 -0
- package/dist/analysis/rules.js +332 -0
- package/dist/analysis/rules.js.map +1 -0
- package/dist/analysis/semver.d.ts +27 -0
- package/dist/analysis/semver.js +127 -0
- package/dist/analysis/semver.js.map +1 -0
- package/dist/analysis/taint-matcher.d.ts +15 -0
- package/dist/analysis/taint-matcher.js +634 -0
- package/dist/analysis/taint-matcher.js.map +1 -0
- package/dist/analysis/taint-propagation.d.ts +67 -0
- package/dist/analysis/taint-propagation.js +298 -0
- package/dist/analysis/taint-propagation.js.map +1 -0
- package/dist/analysis/unresolved.d.ts +14 -0
- package/dist/analysis/unresolved.js +202 -0
- package/dist/analysis/unresolved.js.map +1 -0
- package/dist/analyzer.d.ts +43 -0
- package/dist/analyzer.js +1010 -0
- package/dist/analyzer.js.map +1 -0
- package/dist/browser/circle-ir.js +16576 -0
- package/dist/browser.d.ts +38 -0
- package/dist/browser.js +38 -0
- package/dist/browser.js.map +1 -0
- package/dist/core/circle-ir-core.cjs +13626 -0
- package/dist/core/circle-ir-core.d.ts +59 -0
- package/dist/core/circle-ir-core.js +13591 -0
- package/dist/core/extractors/calls.d.ts +13 -0
- package/dist/core/extractors/calls.js +1429 -0
- package/dist/core/extractors/calls.js.map +1 -0
- package/dist/core/extractors/cfg.d.ts +9 -0
- package/dist/core/extractors/cfg.js +519 -0
- package/dist/core/extractors/cfg.js.map +1 -0
- package/dist/core/extractors/dfg.d.ts +12 -0
- package/dist/core/extractors/dfg.js +1081 -0
- package/dist/core/extractors/dfg.js.map +1 -0
- package/dist/core/extractors/exports.d.ts +14 -0
- package/dist/core/extractors/exports.js +80 -0
- package/dist/core/extractors/exports.js.map +1 -0
- package/dist/core/extractors/imports.d.ts +9 -0
- package/dist/core/extractors/imports.js +739 -0
- package/dist/core/extractors/imports.js.map +1 -0
- package/dist/core/extractors/index.d.ts +10 -0
- package/dist/core/extractors/index.js +11 -0
- package/dist/core/extractors/index.js.map +1 -0
- package/dist/core/extractors/meta.d.ts +10 -0
- package/dist/core/extractors/meta.js +109 -0
- package/dist/core/extractors/meta.js.map +1 -0
- package/dist/core/extractors/types.d.ts +10 -0
- package/dist/core/extractors/types.js +1479 -0
- package/dist/core/extractors/types.js.map +1 -0
- package/dist/core/index.d.ts +5 -0
- package/dist/core/index.js +8 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/parser.d.ts +84 -0
- package/dist/core/parser.js +250 -0
- package/dist/core/parser.js.map +1 -0
- package/dist/core-lib.d.ts +59 -0
- package/dist/core-lib.js +62 -0
- package/dist/core-lib.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -0
- package/dist/languages/index.d.ts +11 -0
- package/dist/languages/index.js +14 -0
- package/dist/languages/index.js.map +1 -0
- package/dist/languages/plugins/base.d.ts +44 -0
- package/dist/languages/plugins/base.js +82 -0
- package/dist/languages/plugins/base.js.map +1 -0
- package/dist/languages/plugins/index.d.ts +14 -0
- package/dist/languages/plugins/index.js +25 -0
- package/dist/languages/plugins/index.js.map +1 -0
- package/dist/languages/plugins/java.d.ts +49 -0
- package/dist/languages/plugins/java.js +402 -0
- package/dist/languages/plugins/java.js.map +1 -0
- package/dist/languages/plugins/javascript.d.ts +48 -0
- package/dist/languages/plugins/javascript.js +445 -0
- package/dist/languages/plugins/javascript.js.map +1 -0
- package/dist/languages/plugins/python.d.ts +47 -0
- package/dist/languages/plugins/python.js +480 -0
- package/dist/languages/plugins/python.js.map +1 -0
- package/dist/languages/plugins/rust.d.ts +47 -0
- package/dist/languages/plugins/rust.js +405 -0
- package/dist/languages/plugins/rust.js.map +1 -0
- package/dist/languages/registry.d.ts +30 -0
- package/dist/languages/registry.js +80 -0
- package/dist/languages/registry.js.map +1 -0
- package/dist/languages/types.d.ts +184 -0
- package/dist/languages/types.js +8 -0
- package/dist/languages/types.js.map +1 -0
- package/dist/resolution/cross-file.d.ts +146 -0
- package/dist/resolution/cross-file.js +439 -0
- package/dist/resolution/cross-file.js.map +1 -0
- package/dist/resolution/index.d.ts +12 -0
- package/dist/resolution/index.js +10 -0
- package/dist/resolution/index.js.map +1 -0
- package/dist/resolution/symbol-table.d.ts +136 -0
- package/dist/resolution/symbol-table.js +336 -0
- package/dist/resolution/symbol-table.js.map +1 -0
- package/dist/resolution/type-hierarchy.d.ts +124 -0
- package/dist/resolution/type-hierarchy.js +515 -0
- package/dist/resolution/type-hierarchy.js.map +1 -0
- package/dist/types/config.d.ts +45 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +392 -0
- package/dist/types/index.js +7 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/logger.d.ts +85 -0
- package/dist/utils/logger.js +198 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wasm/tree-sitter-java.wasm +0 -0
- package/dist/wasm/tree-sitter-javascript.wasm +0 -0
- package/dist/wasm/tree-sitter-python.wasm +0 -0
- package/dist/wasm/tree-sitter-rust.wasm +0 -0
- package/dist/wasm/web-tree-sitter.wasm +0 -0
- package/docs/SPEC.md +1021 -0
- package/examples/browser-example.html +610 -0
- package/examples/node-example.ts +215 -0
- package/package.json +107 -0
- package/wasm/tree-sitter-java.wasm +0 -0
- package/wasm/tree-sitter-javascript.wasm +0 -0
- package/wasm/tree-sitter-python.wasm +0 -0
- package/wasm/tree-sitter-rust.wasm +0 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RustSec Advisory Database Integration
|
|
3
|
+
*
|
|
4
|
+
* Provides vulnerability data from the RustSec advisory database.
|
|
5
|
+
* Advisory data is bundled at build time for offline/deterministic usage.
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Bundled advisory database (loaded lazily)
|
|
9
|
+
*/
|
|
10
|
+
let bundledDb = null;
|
|
11
|
+
/**
|
|
12
|
+
* Load the bundled advisory database
|
|
13
|
+
*/
|
|
14
|
+
export function loadBundledAdvisories() {
|
|
15
|
+
if (bundledDb) {
|
|
16
|
+
return bundledDb;
|
|
17
|
+
}
|
|
18
|
+
// Try to load bundled advisories
|
|
19
|
+
try {
|
|
20
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
21
|
+
const json = require('../../advisory-db.json');
|
|
22
|
+
bundledDb = parseAdvisoryJson(json);
|
|
23
|
+
return bundledDb;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// Return empty database if bundled data not available
|
|
27
|
+
return {
|
|
28
|
+
advisories: new Map(),
|
|
29
|
+
lastUpdated: new Date().toISOString(),
|
|
30
|
+
source: 'bundled',
|
|
31
|
+
version: '1.0',
|
|
32
|
+
stats: { totalAdvisories: 0, uniqueCrates: 0 },
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Parse advisory JSON into database structure
|
|
38
|
+
*/
|
|
39
|
+
export function parseAdvisoryJson(json) {
|
|
40
|
+
const advisories = new Map();
|
|
41
|
+
for (const advisory of json.advisories) {
|
|
42
|
+
const existing = advisories.get(advisory.package) || [];
|
|
43
|
+
existing.push(advisory);
|
|
44
|
+
advisories.set(advisory.package, existing);
|
|
45
|
+
}
|
|
46
|
+
return {
|
|
47
|
+
advisories,
|
|
48
|
+
lastUpdated: json.lastUpdated,
|
|
49
|
+
source: 'bundled',
|
|
50
|
+
version: json.version,
|
|
51
|
+
stats: {
|
|
52
|
+
totalAdvisories: json.advisories.length,
|
|
53
|
+
uniqueCrates: advisories.size,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Map RustSec categories to severity levels
|
|
59
|
+
*/
|
|
60
|
+
export function categoryToSeverity(categories) {
|
|
61
|
+
const categorySet = new Set(categories);
|
|
62
|
+
// Critical: code execution, privilege escalation
|
|
63
|
+
if (categorySet.has('code-execution') ||
|
|
64
|
+
categorySet.has('privilege-escalation')) {
|
|
65
|
+
return 'critical';
|
|
66
|
+
}
|
|
67
|
+
// High: memory safety, denial of service
|
|
68
|
+
if (categorySet.has('memory-safety') || categorySet.has('denial-of-service')) {
|
|
69
|
+
return 'high';
|
|
70
|
+
}
|
|
71
|
+
// Medium: crypto issues, information disclosure
|
|
72
|
+
if (categorySet.has('crypto-failure') ||
|
|
73
|
+
categorySet.has('information-disclosure')) {
|
|
74
|
+
return 'medium';
|
|
75
|
+
}
|
|
76
|
+
// Default to medium for unknown categories
|
|
77
|
+
return 'medium';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Get advisories for a specific crate
|
|
81
|
+
*/
|
|
82
|
+
export function getAdvisoriesForCrate(db, crateName) {
|
|
83
|
+
return db.advisories.get(crateName) || [];
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Search advisories by CVE ID
|
|
87
|
+
*/
|
|
88
|
+
export function findAdvisoryByCve(db, cveId) {
|
|
89
|
+
for (const advisories of db.advisories.values()) {
|
|
90
|
+
for (const advisory of advisories) {
|
|
91
|
+
if (advisory.aliases.includes(cveId)) {
|
|
92
|
+
return advisory;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return undefined;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Get all unique crate names with advisories
|
|
100
|
+
*/
|
|
101
|
+
export function getVulnerableCrates(db) {
|
|
102
|
+
return Array.from(db.advisories.keys());
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=advisory-db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"advisory-db.js","sourceRoot":"","sources":["../../src/analysis/advisory-db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo.lock parser for extracting crate dependencies and versions
|
|
3
|
+
*/
|
|
4
|
+
export interface CargoLockDependency {
|
|
5
|
+
name: string;
|
|
6
|
+
version: string;
|
|
7
|
+
source?: string;
|
|
8
|
+
checksum?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface CargoLock {
|
|
11
|
+
version: number;
|
|
12
|
+
dependencies: CargoLockDependency[];
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Parse Cargo.lock TOML file content
|
|
16
|
+
*/
|
|
17
|
+
export declare function parseCargoLock(content: string): CargoLock;
|
|
18
|
+
/**
|
|
19
|
+
* Parse Cargo.toml to extract direct dependencies
|
|
20
|
+
*/
|
|
21
|
+
export interface CargoTomlDependency {
|
|
22
|
+
name: string;
|
|
23
|
+
version?: string;
|
|
24
|
+
path?: string;
|
|
25
|
+
git?: string;
|
|
26
|
+
features?: string[];
|
|
27
|
+
}
|
|
28
|
+
export interface CargoToml {
|
|
29
|
+
name?: string;
|
|
30
|
+
version?: string;
|
|
31
|
+
dependencies: CargoTomlDependency[];
|
|
32
|
+
devDependencies: CargoTomlDependency[];
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Parse Cargo.toml file content
|
|
36
|
+
*/
|
|
37
|
+
export declare function parseCargoToml(content: string): CargoToml;
|
|
38
|
+
/**
|
|
39
|
+
* Filter dependencies to only include registry-sourced crates
|
|
40
|
+
* (excludes path and git dependencies which can't be vulnerability-checked)
|
|
41
|
+
*/
|
|
42
|
+
export declare function filterRegistryDeps(deps: CargoLockDependency[]): CargoLockDependency[];
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cargo.lock parser for extracting crate dependencies and versions
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Parse Cargo.lock TOML file content
|
|
6
|
+
*/
|
|
7
|
+
export function parseCargoLock(content) {
|
|
8
|
+
const dependencies = [];
|
|
9
|
+
// Extract version from the file
|
|
10
|
+
const versionMatch = content.match(/^version\s*=\s*(\d+)/m);
|
|
11
|
+
const version = versionMatch ? parseInt(versionMatch[1], 10) : 3;
|
|
12
|
+
// Parse [[package]] sections
|
|
13
|
+
// Format:
|
|
14
|
+
// [[package]]
|
|
15
|
+
// name = "crate-name"
|
|
16
|
+
// version = "1.0.0"
|
|
17
|
+
// source = "registry+..."
|
|
18
|
+
// checksum = "abc123..."
|
|
19
|
+
const packagePattern = /\[\[package\]\]\s*\n((?:(?!^\[\[|\[package\]).*\n?)*)/gm;
|
|
20
|
+
let match;
|
|
21
|
+
while ((match = packagePattern.exec(content)) !== null) {
|
|
22
|
+
const block = match[1];
|
|
23
|
+
const nameMatch = block.match(/^name\s*=\s*"([^"]+)"/m);
|
|
24
|
+
const versionMatch = block.match(/^version\s*=\s*"([^"]+)"/m);
|
|
25
|
+
const sourceMatch = block.match(/^source\s*=\s*"([^"]+)"/m);
|
|
26
|
+
const checksumMatch = block.match(/^checksum\s*=\s*"([^"]+)"/m);
|
|
27
|
+
if (nameMatch && versionMatch) {
|
|
28
|
+
dependencies.push({
|
|
29
|
+
name: nameMatch[1],
|
|
30
|
+
version: versionMatch[1],
|
|
31
|
+
source: sourceMatch?.[1],
|
|
32
|
+
checksum: checksumMatch?.[1],
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
return { version, dependencies };
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Parse Cargo.toml file content
|
|
40
|
+
*/
|
|
41
|
+
export function parseCargoToml(content) {
|
|
42
|
+
const dependencies = [];
|
|
43
|
+
const devDependencies = [];
|
|
44
|
+
// Extract package name and version
|
|
45
|
+
const nameMatch = content.match(/^\[package\][^[]*name\s*=\s*"([^"]+)"/ms);
|
|
46
|
+
const versionMatch = content.match(/^\[package\][^[]*version\s*=\s*"([^"]+)"/ms);
|
|
47
|
+
// Parse [dependencies] section
|
|
48
|
+
const depsMatch = content.match(/\[dependencies\]\s*\n((?:(?!\[(?!dependencies\.))[^\n]*\n?)*)/m);
|
|
49
|
+
if (depsMatch) {
|
|
50
|
+
parseDependencySection(depsMatch[1], dependencies);
|
|
51
|
+
}
|
|
52
|
+
// Parse [dev-dependencies] section
|
|
53
|
+
const devDepsMatch = content.match(/\[dev-dependencies\]\s*\n((?:(?!\[(?!dev-dependencies\.))[^\n]*\n?)*)/m);
|
|
54
|
+
if (devDepsMatch) {
|
|
55
|
+
parseDependencySection(devDepsMatch[1], devDependencies);
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
name: nameMatch?.[1],
|
|
59
|
+
version: versionMatch?.[1],
|
|
60
|
+
dependencies,
|
|
61
|
+
devDependencies,
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function parseDependencySection(section, deps) {
|
|
65
|
+
// Simple dependency: crate = "1.0"
|
|
66
|
+
const simplePattern = /^(\w[\w-]*)\s*=\s*"([^"]+)"/gm;
|
|
67
|
+
let match;
|
|
68
|
+
while ((match = simplePattern.exec(section)) !== null) {
|
|
69
|
+
deps.push({
|
|
70
|
+
name: match[1],
|
|
71
|
+
version: match[2],
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
// Complex dependency: crate = { version = "1.0", features = [...] }
|
|
75
|
+
const complexPattern = /^(\w[\w-]*)\s*=\s*\{([^}]+)\}/gm;
|
|
76
|
+
while ((match = complexPattern.exec(section)) !== null) {
|
|
77
|
+
const name = match[1];
|
|
78
|
+
const attrs = match[2];
|
|
79
|
+
const versionMatch = attrs.match(/version\s*=\s*"([^"]+)"/);
|
|
80
|
+
const pathMatch = attrs.match(/path\s*=\s*"([^"]+)"/);
|
|
81
|
+
const gitMatch = attrs.match(/git\s*=\s*"([^"]+)"/);
|
|
82
|
+
deps.push({
|
|
83
|
+
name,
|
|
84
|
+
version: versionMatch?.[1],
|
|
85
|
+
path: pathMatch?.[1],
|
|
86
|
+
git: gitMatch?.[1],
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Filter dependencies to only include registry-sourced crates
|
|
92
|
+
* (excludes path and git dependencies which can't be vulnerability-checked)
|
|
93
|
+
*/
|
|
94
|
+
export function filterRegistryDeps(deps) {
|
|
95
|
+
return deps.filter((dep) => {
|
|
96
|
+
// Include if no source (defaults to registry) or explicitly from registry
|
|
97
|
+
if (!dep.source)
|
|
98
|
+
return true;
|
|
99
|
+
return dep.source.startsWith('registry+');
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
//# sourceMappingURL=cargo-parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cargo-parser.js","sourceRoot":"","sources":["../../src/analysis/cargo-parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration loader for taint source/sink definitions
|
|
3
|
+
*
|
|
4
|
+
* Loads YAML configs from configs/sources/ and configs/sinks/
|
|
5
|
+
*/
|
|
6
|
+
import type { SourceConfig, SinkConfig, TaintConfig, SourcePattern, SinkPattern, SanitizerPattern } from '../types/config.js';
|
|
7
|
+
/**
|
|
8
|
+
* Parse YAML/JSON configuration content.
|
|
9
|
+
* Uses JSON since the config files are actually JSON despite .yaml extension.
|
|
10
|
+
*/
|
|
11
|
+
export declare function parseConfig<T>(content: string): T;
|
|
12
|
+
/**
|
|
13
|
+
* Load and merge multiple source configs.
|
|
14
|
+
*/
|
|
15
|
+
export declare function loadSourceConfigs(configs: SourceConfig[]): SourcePattern[];
|
|
16
|
+
/**
|
|
17
|
+
* Load and merge multiple sink configs.
|
|
18
|
+
*/
|
|
19
|
+
export declare function loadSinkConfigs(configs: SinkConfig[]): {
|
|
20
|
+
sinks: SinkPattern[];
|
|
21
|
+
sanitizers: SanitizerPattern[];
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Create a combined taint configuration from raw config contents.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createTaintConfig(sourceContents: string[], sinkContents: string[]): TaintConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Embedded default configurations (subset for standalone use).
|
|
29
|
+
* Full configs should be loaded from files when available.
|
|
30
|
+
*/
|
|
31
|
+
export declare const DEFAULT_SOURCES: SourcePattern[];
|
|
32
|
+
export declare const DEFAULT_SINKS: SinkPattern[];
|
|
33
|
+
export declare const DEFAULT_SANITIZERS: SanitizerPattern[];
|
|
34
|
+
/**
|
|
35
|
+
* Get the default taint configuration.
|
|
36
|
+
*/
|
|
37
|
+
export declare function getDefaultConfig(): TaintConfig;
|