fivosense 0.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/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
- package/.github/PULL_REQUEST_TEMPLATE.md +22 -0
- package/.github/workflows/ci.yml +52 -0
- package/BLUEPRINT.md +215 -0
- package/BUILD_PLAN.md +175 -0
- package/CONTRIBUTING.md +80 -0
- package/DOCS_VERIFICATION.md +232 -0
- package/FINAL_CHECKLIST.md +263 -0
- package/FINAL_SUMMARY.md +238 -0
- package/GITHUB_PUSH.md +64 -0
- package/LICENSE +21 -0
- package/PROGRESS.md +153 -0
- package/README.md +443 -0
- package/RELEASE_READY.md +201 -0
- package/SECURITY.md +211 -0
- package/SECURITY_DEEP_AUDIT.md +331 -0
- package/TODO.md +52 -0
- package/dist/ai/judge.d.ts +36 -0
- package/dist/ai/judge.d.ts.map +1 -0
- package/dist/ai/judge.js +75 -0
- package/dist/ai/judge.js.map +1 -0
- package/dist/cli/index.d.ts +6 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +39 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/editors/vscode.d.ts +30 -0
- package/dist/editors/vscode.d.ts.map +1 -0
- package/dist/editors/vscode.js +103 -0
- package/dist/editors/vscode.js.map +1 -0
- package/dist/engine/adversary.d.ts +24 -0
- package/dist/engine/adversary.d.ts.map +1 -0
- package/dist/engine/adversary.js +83 -0
- package/dist/engine/adversary.js.map +1 -0
- package/dist/engine/graph.d.ts +38 -0
- package/dist/engine/graph.d.ts.map +1 -0
- package/dist/engine/graph.js +131 -0
- package/dist/engine/graph.js.map +1 -0
- package/dist/engine/reach.d.ts +22 -0
- package/dist/engine/reach.d.ts.map +1 -0
- package/dist/engine/reach.js +107 -0
- package/dist/engine/reach.js.map +1 -0
- package/dist/engine/sinks.d.ts +52 -0
- package/dist/engine/sinks.d.ts.map +1 -0
- package/dist/engine/sinks.js +96 -0
- package/dist/engine/sinks.js.map +1 -0
- package/dist/engine/sources.d.ts +35 -0
- package/dist/engine/sources.d.ts.map +1 -0
- package/dist/engine/sources.js +59 -0
- package/dist/engine/sources.js.map +1 -0
- package/dist/engine/taint.d.ts +37 -0
- package/dist/engine/taint.d.ts.map +1 -0
- package/dist/engine/taint.js +83 -0
- package/dist/engine/taint.js.map +1 -0
- package/dist/engine/verify.d.ts +20 -0
- package/dist/engine/verify.d.ts.map +1 -0
- package/dist/engine/verify.js +65 -0
- package/dist/engine/verify.js.map +1 -0
- package/dist/features/badge.d.ts +20 -0
- package/dist/features/badge.d.ts.map +1 -0
- package/dist/features/badge.js +86 -0
- package/dist/features/badge.js.map +1 -0
- package/dist/features/fix.d.ts +20 -0
- package/dist/features/fix.d.ts.map +1 -0
- package/dist/features/fix.js +115 -0
- package/dist/features/fix.js.map +1 -0
- package/dist/features/roast.d.ts +23 -0
- package/dist/features/roast.d.ts.map +1 -0
- package/dist/features/roast.js +96 -0
- package/dist/features/roast.js.map +1 -0
- package/dist/hooks/agent.d.ts +19 -0
- package/dist/hooks/agent.d.ts.map +1 -0
- package/dist/hooks/agent.js +69 -0
- package/dist/hooks/agent.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +116 -0
- package/dist/index.js.map +1 -0
- package/dist/rules/destructive.d.ts +35 -0
- package/dist/rules/destructive.d.ts.map +1 -0
- package/dist/rules/destructive.js +117 -0
- package/dist/rules/destructive.js.map +1 -0
- package/dist/rules/secrets.d.ts +29 -0
- package/dist/rules/secrets.d.ts.map +1 -0
- package/dist/rules/secrets.js +100 -0
- package/dist/rules/secrets.js.map +1 -0
- package/package.json +56 -0
- package/skill/SKILL.md +86 -0
- package/skill/prompts/path-judge.md +22 -0
- package/src/ai/judge.ts +100 -0
- package/src/cli/index.ts +46 -0
- package/src/editors/vscode.ts +125 -0
- package/src/engine/adversary.ts +100 -0
- package/src/engine/graph.ts +167 -0
- package/src/engine/reach.ts +141 -0
- package/src/engine/sinks.ts +113 -0
- package/src/engine/sources.ts +71 -0
- package/src/engine/taint.ts +117 -0
- package/src/engine/verify.ts +94 -0
- package/src/features/badge.ts +102 -0
- package/src/features/fix.ts +138 -0
- package/src/features/roast.ts +110 -0
- package/src/hooks/agent.ts +84 -0
- package/src/index.ts +147 -0
- package/src/rules/destructive.ts +131 -0
- package/src/rules/secrets.ts +120 -0
- package/test/engine.test.ts +110 -0
- package/test/features.test.ts +131 -0
- package/test/phase3.test.ts +129 -0
- package/tsconfig.json +20 -0
- package/vitest.config.ts +9 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog of dangerous sinks (vulnerability endpoints)
|
|
3
|
+
* These are operations that can cause security issues if fed untrusted data
|
|
4
|
+
*/
|
|
5
|
+
export interface SinkPattern {
|
|
6
|
+
pattern: string;
|
|
7
|
+
category: 'sql' | 'nosql' | 'command' | 'code' | 'xss' | 'path' | 'xxe';
|
|
8
|
+
description: string;
|
|
9
|
+
severity: 'critical' | 'high' | 'medium';
|
|
10
|
+
cwe?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* SQL injection sinks
|
|
14
|
+
*/
|
|
15
|
+
export declare const SQL_SINKS: SinkPattern[];
|
|
16
|
+
/**
|
|
17
|
+
* NoSQL injection sinks
|
|
18
|
+
*/
|
|
19
|
+
export declare const NOSQL_SINKS: SinkPattern[];
|
|
20
|
+
/**
|
|
21
|
+
* Command injection sinks
|
|
22
|
+
*/
|
|
23
|
+
export declare const COMMAND_SINKS: SinkPattern[];
|
|
24
|
+
/**
|
|
25
|
+
* Code injection sinks
|
|
26
|
+
*/
|
|
27
|
+
export declare const CODE_SINKS: SinkPattern[];
|
|
28
|
+
/**
|
|
29
|
+
* XSS sinks
|
|
30
|
+
*/
|
|
31
|
+
export declare const XSS_SINKS: SinkPattern[];
|
|
32
|
+
/**
|
|
33
|
+
* Path traversal sinks
|
|
34
|
+
*/
|
|
35
|
+
export declare const PATH_SINKS: SinkPattern[];
|
|
36
|
+
/**
|
|
37
|
+
* All sinks combined
|
|
38
|
+
*/
|
|
39
|
+
export declare const ALL_SINKS: SinkPattern[];
|
|
40
|
+
/**
|
|
41
|
+
* Check if a code string matches any sink pattern
|
|
42
|
+
*/
|
|
43
|
+
export declare function isSink(code: string): SinkPattern | null;
|
|
44
|
+
/**
|
|
45
|
+
* Get all sinks matching a category
|
|
46
|
+
*/
|
|
47
|
+
export declare function getSinksByCategory(category: SinkPattern['category']): SinkPattern[];
|
|
48
|
+
/**
|
|
49
|
+
* Get sinks by severity
|
|
50
|
+
*/
|
|
51
|
+
export declare function getSinksBySeverity(severity: SinkPattern['severity']): SinkPattern[];
|
|
52
|
+
//# sourceMappingURL=sinks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sinks.d.ts","sourceRoot":"","sources":["../../src/engine/sinks.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,KAAK,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,KAAK,CAAC;IACxE,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,EAMlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,WAAW,EAKpC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,EAAE,WAAW,EAMtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,EAKnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,EAAE,WAAW,EAMlC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,EAAE,WAAW,EAKnC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,eAOrB,CAAC;AAEF;;GAEG;AACH,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAOvD;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,EAAE,CAEnF;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,WAAW,CAAC,UAAU,CAAC,GAAG,WAAW,EAAE,CAEnF"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog of dangerous sinks (vulnerability endpoints)
|
|
3
|
+
* These are operations that can cause security issues if fed untrusted data
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* SQL injection sinks
|
|
7
|
+
*/
|
|
8
|
+
export const SQL_SINKS = [
|
|
9
|
+
{ pattern: 'db.execute', category: 'sql', description: 'SQL execution', severity: 'critical', cwe: 'CWE-89' },
|
|
10
|
+
{ pattern: 'db.query', category: 'sql', description: 'SQL query', severity: 'critical', cwe: 'CWE-89' },
|
|
11
|
+
{ pattern: 'connection.query', category: 'sql', description: 'MySQL query', severity: 'critical', cwe: 'CWE-89' },
|
|
12
|
+
{ pattern: 'pool.query', category: 'sql', description: 'Connection pool query', severity: 'critical', cwe: 'CWE-89' },
|
|
13
|
+
{ pattern: 'executeQuery', category: 'sql', description: 'Generic SQL exec', severity: 'critical', cwe: 'CWE-89' },
|
|
14
|
+
];
|
|
15
|
+
/**
|
|
16
|
+
* NoSQL injection sinks
|
|
17
|
+
*/
|
|
18
|
+
export const NOSQL_SINKS = [
|
|
19
|
+
{ pattern: 'find', category: 'nosql', description: 'MongoDB find', severity: 'high', cwe: 'CWE-943' },
|
|
20
|
+
{ pattern: 'findOne', category: 'nosql', description: 'MongoDB findOne', severity: 'high', cwe: 'CWE-943' },
|
|
21
|
+
{ pattern: 'updateOne', category: 'nosql', description: 'MongoDB update', severity: 'high', cwe: 'CWE-943' },
|
|
22
|
+
{ pattern: 'deleteOne', category: 'nosql', description: 'MongoDB delete', severity: 'high', cwe: 'CWE-943' },
|
|
23
|
+
];
|
|
24
|
+
/**
|
|
25
|
+
* Command injection sinks
|
|
26
|
+
*/
|
|
27
|
+
export const COMMAND_SINKS = [
|
|
28
|
+
{ pattern: 'exec', category: 'command', description: 'Command execution', severity: 'critical', cwe: 'CWE-78' },
|
|
29
|
+
{ pattern: 'execSync', category: 'command', description: 'Sync command exec', severity: 'critical', cwe: 'CWE-78' },
|
|
30
|
+
{ pattern: 'spawn', category: 'command', description: 'Process spawn', severity: 'critical', cwe: 'CWE-78' },
|
|
31
|
+
{ pattern: 'spawnSync', category: 'command', description: 'Sync process spawn', severity: 'critical', cwe: 'CWE-78' },
|
|
32
|
+
{ pattern: 'execFile', category: 'command', description: 'File execution', severity: 'critical', cwe: 'CWE-78' },
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* Code injection sinks
|
|
36
|
+
*/
|
|
37
|
+
export const CODE_SINKS = [
|
|
38
|
+
{ pattern: 'eval', category: 'code', description: 'Code evaluation', severity: 'critical', cwe: 'CWE-94' },
|
|
39
|
+
{ pattern: 'Function', category: 'code', description: 'Dynamic function creation', severity: 'critical', cwe: 'CWE-94' },
|
|
40
|
+
{ pattern: 'setTimeout', category: 'code', description: 'Delayed code exec', severity: 'high', cwe: 'CWE-94' },
|
|
41
|
+
{ pattern: 'setInterval', category: 'code', description: 'Repeated code exec', severity: 'high', cwe: 'CWE-94' },
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* XSS sinks
|
|
45
|
+
*/
|
|
46
|
+
export const XSS_SINKS = [
|
|
47
|
+
{ pattern: 'res.send', category: 'xss', description: 'HTTP response', severity: 'high', cwe: 'CWE-79' },
|
|
48
|
+
{ pattern: 'res.write', category: 'xss', description: 'HTTP write', severity: 'high', cwe: 'CWE-79' },
|
|
49
|
+
{ pattern: 'innerHTML', category: 'xss', description: 'DOM innerHTML', severity: 'critical', cwe: 'CWE-79' },
|
|
50
|
+
{ pattern: 'outerHTML', category: 'xss', description: 'DOM outerHTML', severity: 'critical', cwe: 'CWE-79' },
|
|
51
|
+
{ pattern: 'document.write', category: 'xss', description: 'Document write', severity: 'critical', cwe: 'CWE-79' },
|
|
52
|
+
];
|
|
53
|
+
/**
|
|
54
|
+
* Path traversal sinks
|
|
55
|
+
*/
|
|
56
|
+
export const PATH_SINKS = [
|
|
57
|
+
{ pattern: 'fs.readFile', category: 'path', description: 'File read', severity: 'high', cwe: 'CWE-22' },
|
|
58
|
+
{ pattern: 'fs.writeFile', category: 'path', description: 'File write', severity: 'critical', cwe: 'CWE-22' },
|
|
59
|
+
{ pattern: 'fs.unlink', category: 'path', description: 'File delete', severity: 'critical', cwe: 'CWE-22' },
|
|
60
|
+
{ pattern: 'fs.readFileSync', category: 'path', description: 'Sync file read', severity: 'high', cwe: 'CWE-22' },
|
|
61
|
+
];
|
|
62
|
+
/**
|
|
63
|
+
* All sinks combined
|
|
64
|
+
*/
|
|
65
|
+
export const ALL_SINKS = [
|
|
66
|
+
...SQL_SINKS,
|
|
67
|
+
...NOSQL_SINKS,
|
|
68
|
+
...COMMAND_SINKS,
|
|
69
|
+
...CODE_SINKS,
|
|
70
|
+
...XSS_SINKS,
|
|
71
|
+
...PATH_SINKS,
|
|
72
|
+
];
|
|
73
|
+
/**
|
|
74
|
+
* Check if a code string matches any sink pattern
|
|
75
|
+
*/
|
|
76
|
+
export function isSink(code) {
|
|
77
|
+
for (const sink of ALL_SINKS) {
|
|
78
|
+
if (code.includes(sink.pattern)) {
|
|
79
|
+
return sink;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Get all sinks matching a category
|
|
86
|
+
*/
|
|
87
|
+
export function getSinksByCategory(category) {
|
|
88
|
+
return ALL_SINKS.filter(s => s.category === category);
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Get sinks by severity
|
|
92
|
+
*/
|
|
93
|
+
export function getSinksBySeverity(severity) {
|
|
94
|
+
return ALL_SINKS.filter(s => s.severity === severity);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=sinks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sinks.js","sourceRoot":"","sources":["../../src/engine/sinks.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog of untrusted input sources (taint origins)
|
|
3
|
+
* These represent user-controlled data that could be malicious
|
|
4
|
+
*/
|
|
5
|
+
export interface SourcePattern {
|
|
6
|
+
pattern: string;
|
|
7
|
+
category: 'http' | 'file' | 'env' | 'cli' | 'external';
|
|
8
|
+
description: string;
|
|
9
|
+
severity: 'critical' | 'high' | 'medium';
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* HTTP/API sources - user input from web requests
|
|
13
|
+
*/
|
|
14
|
+
export declare const HTTP_SOURCES: SourcePattern[];
|
|
15
|
+
/**
|
|
16
|
+
* File system sources - external file content
|
|
17
|
+
*/
|
|
18
|
+
export declare const FILE_SOURCES: SourcePattern[];
|
|
19
|
+
/**
|
|
20
|
+
* Environment/config sources - potentially untrusted config
|
|
21
|
+
*/
|
|
22
|
+
export declare const ENV_SOURCES: SourcePattern[];
|
|
23
|
+
/**
|
|
24
|
+
* All sources combined
|
|
25
|
+
*/
|
|
26
|
+
export declare const ALL_SOURCES: SourcePattern[];
|
|
27
|
+
/**
|
|
28
|
+
* Check if a code string matches any source pattern
|
|
29
|
+
*/
|
|
30
|
+
export declare function isSource(code: string): SourcePattern | null;
|
|
31
|
+
/**
|
|
32
|
+
* Get all sources matching a category
|
|
33
|
+
*/
|
|
34
|
+
export declare function getSourcesByCategory(category: SourcePattern['category']): SourcePattern[];
|
|
35
|
+
//# sourceMappingURL=sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.d.ts","sourceRoot":"","sources":["../../src/engine/sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,GAAG,KAAK,GAAG,UAAU,CAAC;IACvD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;CAC1C;AAED;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,EAUvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY,EAAE,aAAa,EAIvC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,aAAa,EAGtC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,iBAIvB,CAAC;AAEF;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,IAAI,CAO3D;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAAG,aAAa,EAAE,CAEzF"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Catalog of untrusted input sources (taint origins)
|
|
3
|
+
* These represent user-controlled data that could be malicious
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* HTTP/API sources - user input from web requests
|
|
7
|
+
*/
|
|
8
|
+
export const HTTP_SOURCES = [
|
|
9
|
+
{ pattern: 'req.query', category: 'http', description: 'URL query parameters', severity: 'critical' },
|
|
10
|
+
{ pattern: 'req.params', category: 'http', description: 'Route parameters', severity: 'critical' },
|
|
11
|
+
{ pattern: 'req.body', category: 'http', description: 'Request body', severity: 'critical' },
|
|
12
|
+
{ pattern: 'req.headers', category: 'http', description: 'HTTP headers', severity: 'high' },
|
|
13
|
+
{ pattern: 'req.cookies', category: 'http', description: 'Cookies', severity: 'high' },
|
|
14
|
+
{ pattern: 'request.query', category: 'http', description: 'Query string', severity: 'critical' },
|
|
15
|
+
{ pattern: 'request.body', category: 'http', description: 'Request body', severity: 'critical' },
|
|
16
|
+
{ pattern: 'ctx.request.body', category: 'http', description: 'Koa/context body', severity: 'critical' },
|
|
17
|
+
{ pattern: 'ctx.query', category: 'http', description: 'Koa query', severity: 'critical' },
|
|
18
|
+
];
|
|
19
|
+
/**
|
|
20
|
+
* File system sources - external file content
|
|
21
|
+
*/
|
|
22
|
+
export const FILE_SOURCES = [
|
|
23
|
+
{ pattern: 'fs.readFileSync', category: 'file', description: 'File content', severity: 'high' },
|
|
24
|
+
{ pattern: 'fs.readFile', category: 'file', description: 'File content async', severity: 'high' },
|
|
25
|
+
{ pattern: 'readFileSync', category: 'file', description: 'File read', severity: 'high' },
|
|
26
|
+
];
|
|
27
|
+
/**
|
|
28
|
+
* Environment/config sources - potentially untrusted config
|
|
29
|
+
*/
|
|
30
|
+
export const ENV_SOURCES = [
|
|
31
|
+
{ pattern: 'process.env', category: 'env', description: 'Environment variables', severity: 'medium' },
|
|
32
|
+
{ pattern: 'process.argv', category: 'cli', description: 'Command-line arguments', severity: 'high' },
|
|
33
|
+
];
|
|
34
|
+
/**
|
|
35
|
+
* All sources combined
|
|
36
|
+
*/
|
|
37
|
+
export const ALL_SOURCES = [
|
|
38
|
+
...HTTP_SOURCES,
|
|
39
|
+
...FILE_SOURCES,
|
|
40
|
+
...ENV_SOURCES,
|
|
41
|
+
];
|
|
42
|
+
/**
|
|
43
|
+
* Check if a code string matches any source pattern
|
|
44
|
+
*/
|
|
45
|
+
export function isSource(code) {
|
|
46
|
+
for (const source of ALL_SOURCES) {
|
|
47
|
+
if (code.includes(source.pattern)) {
|
|
48
|
+
return source;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Get all sources matching a category
|
|
55
|
+
*/
|
|
56
|
+
export function getSourcesByCategory(category) {
|
|
57
|
+
return ALL_SOURCES.filter(s => s.category === category);
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sources.js","sourceRoot":"","sources":["../../src/engine/sources.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,EAAE,QAAQ,EAAE,UAAU,EAAE;IACrG,EAAE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE;IAClG,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;IAC5F,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC3F,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,EAAE;IACtF,EAAE,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;IACjG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE;IAChG,EAAE,OAAO,EAAE,kBAAkB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,QAAQ,EAAE,UAAU,EAAE;IACxG,EAAE,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU,EAAE;CAC3F,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,YAAY,GAAoB;IAC3C,EAAE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC/F,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,QAAQ,EAAE,MAAM,EAAE;IACjG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE;CAC1F,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAoB;IAC1C,EAAE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,QAAQ,EAAE,QAAQ,EAAE;IACrG,EAAE,OAAO,EAAE,cAAc,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,wBAAwB,EAAE,QAAQ,EAAE,MAAM,EAAE;CACtG,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,GAAG,YAAY;IACf,GAAG,YAAY;IACf,GAAG,WAAW;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,KAAK,MAAM,MAAM,IAAI,WAAW,EAAE,CAAC;QACjC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAmC;IACtE,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC;AAC1D,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taint Analysis - tracks data flow from sources to sinks
|
|
3
|
+
* Generates taint-trace proofs for each vulnerability
|
|
4
|
+
*/
|
|
5
|
+
import { DataFlowGraph } from './graph.js';
|
|
6
|
+
export interface TaintTrace {
|
|
7
|
+
finding: string;
|
|
8
|
+
severity: 'critical' | 'high' | 'medium';
|
|
9
|
+
category: string;
|
|
10
|
+
cwe?: string;
|
|
11
|
+
path: string;
|
|
12
|
+
evidence: string[];
|
|
13
|
+
location: {
|
|
14
|
+
file: string;
|
|
15
|
+
line: number;
|
|
16
|
+
column: number;
|
|
17
|
+
};
|
|
18
|
+
sanitized: boolean;
|
|
19
|
+
confidence: number;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Generate taint traces from data-flow graph
|
|
23
|
+
*/
|
|
24
|
+
export declare function generateTaintTraces(graph: DataFlowGraph, filename: string): TaintTrace[];
|
|
25
|
+
/**
|
|
26
|
+
* Filter traces by severity
|
|
27
|
+
*/
|
|
28
|
+
export declare function filterBySeverity(traces: TaintTrace[], severity: 'critical' | 'high' | 'medium'): TaintTrace[];
|
|
29
|
+
/**
|
|
30
|
+
* Get only vulnerable (unsanitized) traces
|
|
31
|
+
*/
|
|
32
|
+
export declare function getVulnerableTraces(traces: TaintTrace[]): TaintTrace[];
|
|
33
|
+
/**
|
|
34
|
+
* Format trace for display
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatTrace(trace: TaintTrace): string;
|
|
37
|
+
//# sourceMappingURL=taint.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taint.d.ts","sourceRoot":"","sources":["../../src/engine/taint.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAA8B,MAAM,YAAY,CAAC;AAEvE,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,CAAC;IACzC,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE;QACR,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,GAAG,UAAU,EAAE,CASxF;AA6CD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,UAAU,EAAE,EACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GACvC,UAAU,EAAE,CAEd;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE,CAEtE;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAgBrD"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Taint Analysis - tracks data flow from sources to sinks
|
|
3
|
+
* Generates taint-trace proofs for each vulnerability
|
|
4
|
+
*/
|
|
5
|
+
import { formatTaintPath } from './graph.js';
|
|
6
|
+
/**
|
|
7
|
+
* Generate taint traces from data-flow graph
|
|
8
|
+
*/
|
|
9
|
+
export function generateTaintTraces(graph, filename) {
|
|
10
|
+
const traces = [];
|
|
11
|
+
for (const taintPath of graph.taintPaths) {
|
|
12
|
+
const trace = buildTaintTrace(taintPath, filename);
|
|
13
|
+
traces.push(trace);
|
|
14
|
+
}
|
|
15
|
+
return traces;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Build a single taint trace from a taint path
|
|
19
|
+
*/
|
|
20
|
+
function buildTaintTrace(path, filename) {
|
|
21
|
+
const source = path.source;
|
|
22
|
+
const sink = path.sink;
|
|
23
|
+
const evidence = [];
|
|
24
|
+
// Build evidence chain
|
|
25
|
+
evidence.push(`Source: ${source.value} at line ${source.loc?.start.line || '?'}`);
|
|
26
|
+
evidence.push(` Type: ${source.sourcePattern?.description || 'untrusted input'}`);
|
|
27
|
+
if (path.sanitized) {
|
|
28
|
+
evidence.push(' ✅ Sanitized');
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
evidence.push(' ❌ NOT sanitized');
|
|
32
|
+
}
|
|
33
|
+
evidence.push(`Sink: ${sink.name} at line ${sink.loc?.start.line || '?'}`);
|
|
34
|
+
evidence.push(` Type: ${sink.sinkPattern?.description || 'dangerous operation'}`);
|
|
35
|
+
const finding = path.sanitized
|
|
36
|
+
? `Sanitized ${sink.sinkPattern?.category || 'data flow'}`
|
|
37
|
+
: `Potential ${sink.sinkPattern?.category || 'vulnerability'}`;
|
|
38
|
+
return {
|
|
39
|
+
finding,
|
|
40
|
+
severity: sink.sinkPattern?.severity || 'medium',
|
|
41
|
+
category: sink.sinkPattern?.category || 'unknown',
|
|
42
|
+
cwe: sink.sinkPattern?.cwe,
|
|
43
|
+
path: formatTaintPath(path),
|
|
44
|
+
evidence,
|
|
45
|
+
location: {
|
|
46
|
+
file: filename,
|
|
47
|
+
line: sink.loc?.start.line || 0,
|
|
48
|
+
column: sink.loc?.start.column || 0,
|
|
49
|
+
},
|
|
50
|
+
sanitized: path.sanitized,
|
|
51
|
+
confidence: path.confidence,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Filter traces by severity
|
|
56
|
+
*/
|
|
57
|
+
export function filterBySeverity(traces, severity) {
|
|
58
|
+
return traces.filter(t => t.severity === severity);
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get only vulnerable (unsanitized) traces
|
|
62
|
+
*/
|
|
63
|
+
export function getVulnerableTraces(traces) {
|
|
64
|
+
return traces.filter(t => !t.sanitized);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Format trace for display
|
|
68
|
+
*/
|
|
69
|
+
export function formatTrace(trace) {
|
|
70
|
+
const icon = trace.sanitized ? '✅' : '❌';
|
|
71
|
+
const lines = [
|
|
72
|
+
`${icon} [${trace.severity.toUpperCase()}] ${trace.finding}`,
|
|
73
|
+
` ${trace.location.file}:${trace.location.line}:${trace.location.column}`,
|
|
74
|
+
` ${trace.path}`,
|
|
75
|
+
];
|
|
76
|
+
if (trace.cwe) {
|
|
77
|
+
lines.push(` CWE: ${trace.cwe}`);
|
|
78
|
+
}
|
|
79
|
+
lines.push(' Evidence:');
|
|
80
|
+
trace.evidence.forEach(e => lines.push(` ${e}`));
|
|
81
|
+
return lines.join('\n');
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=taint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"taint.js","sourceRoot":"","sources":["../../src/engine/taint.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix Verification - Re-analyze code after fix to check for regressions
|
|
3
|
+
*/
|
|
4
|
+
export interface VerificationResult {
|
|
5
|
+
success: boolean;
|
|
6
|
+
originalIssues: number;
|
|
7
|
+
remainingIssues: number;
|
|
8
|
+
newIssues: number;
|
|
9
|
+
regression: boolean;
|
|
10
|
+
message: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Verify that a fix actually resolved the vulnerability
|
|
14
|
+
*/
|
|
15
|
+
export declare function verifyFix(originalCode: string, fixedCode: string, targetLine: number): VerificationResult;
|
|
16
|
+
/**
|
|
17
|
+
* Verify multiple fixes
|
|
18
|
+
*/
|
|
19
|
+
export declare function verifyMultipleFixes(originalCode: string, fixedCode: string): VerificationResult;
|
|
20
|
+
//# sourceMappingURL=verify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.d.ts","sourceRoot":"","sources":["../../src/engine/verify.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,wBAAgB,SAAS,CACvB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,kBAAkB,CA0CpB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,MAAM,GAChB,kBAAkB,CAoBpB"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fix Verification - Re-analyze code after fix to check for regressions
|
|
3
|
+
*/
|
|
4
|
+
import { buildDataFlowGraph } from './graph.js';
|
|
5
|
+
import { generateTaintTraces } from './taint.js';
|
|
6
|
+
/**
|
|
7
|
+
* Verify that a fix actually resolved the vulnerability
|
|
8
|
+
*/
|
|
9
|
+
export function verifyFix(originalCode, fixedCode, targetLine) {
|
|
10
|
+
// Analyze original code
|
|
11
|
+
const originalGraph = buildDataFlowGraph(originalCode);
|
|
12
|
+
const originalTraces = generateTaintTraces(originalGraph, 'original.js');
|
|
13
|
+
const originalVulns = originalTraces.filter(t => !t.sanitized);
|
|
14
|
+
// Analyze fixed code
|
|
15
|
+
const fixedGraph = buildDataFlowGraph(fixedCode);
|
|
16
|
+
const fixedTraces = generateTaintTraces(fixedGraph, 'fixed.js');
|
|
17
|
+
const fixedVulns = fixedTraces.filter(t => !t.sanitized);
|
|
18
|
+
// Check for target vulnerability
|
|
19
|
+
const targetVuln = originalVulns.find(v => v.location.line === targetLine);
|
|
20
|
+
const targetFixed = !fixedVulns.find(v => v.location.line === targetLine);
|
|
21
|
+
// Check for regressions (new vulnerabilities introduced)
|
|
22
|
+
const newIssues = fixedVulns.filter(fv => !originalVulns.some(ov => ov.location.line === fv.location.line &&
|
|
23
|
+
ov.category === fv.category)).length;
|
|
24
|
+
const regression = newIssues > 0;
|
|
25
|
+
let message = '';
|
|
26
|
+
if (targetFixed && !regression) {
|
|
27
|
+
message = '✅ Fix verified: vulnerability resolved, no regressions';
|
|
28
|
+
}
|
|
29
|
+
else if (targetFixed && regression) {
|
|
30
|
+
message = `⚠️ Fix applied but introduced ${newIssues} new issue(s)`;
|
|
31
|
+
}
|
|
32
|
+
else if (!targetFixed) {
|
|
33
|
+
message = '❌ Fix failed: vulnerability still present';
|
|
34
|
+
}
|
|
35
|
+
return {
|
|
36
|
+
success: targetFixed && !regression,
|
|
37
|
+
originalIssues: originalVulns.length,
|
|
38
|
+
remainingIssues: fixedVulns.length,
|
|
39
|
+
newIssues,
|
|
40
|
+
regression,
|
|
41
|
+
message,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Verify multiple fixes
|
|
46
|
+
*/
|
|
47
|
+
export function verifyMultipleFixes(originalCode, fixedCode) {
|
|
48
|
+
const originalGraph = buildDataFlowGraph(originalCode);
|
|
49
|
+
const originalTraces = generateTaintTraces(originalGraph, 'original.js');
|
|
50
|
+
const originalVulns = originalTraces.filter(t => !t.sanitized);
|
|
51
|
+
const fixedGraph = buildDataFlowGraph(fixedCode);
|
|
52
|
+
const fixedTraces = generateTaintTraces(fixedGraph, 'fixed.js');
|
|
53
|
+
const fixedVulns = fixedTraces.filter(t => !t.sanitized);
|
|
54
|
+
const resolved = originalVulns.length - fixedVulns.length;
|
|
55
|
+
const newIssues = Math.max(0, fixedVulns.length - originalVulns.length);
|
|
56
|
+
return {
|
|
57
|
+
success: fixedVulns.length < originalVulns.length && newIssues === 0,
|
|
58
|
+
originalIssues: originalVulns.length,
|
|
59
|
+
remainingIssues: fixedVulns.length,
|
|
60
|
+
newIssues,
|
|
61
|
+
regression: newIssues > 0,
|
|
62
|
+
message: `Resolved ${resolved} issue(s), ${newIssues} new issue(s) introduced`,
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=verify.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verify.js","sourceRoot":"","sources":["../../src/engine/verify.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Badge Generator - Creates shareable security report cards
|
|
3
|
+
*/
|
|
4
|
+
import { AuditResult } from '../index.js';
|
|
5
|
+
export interface SecurityBadge {
|
|
6
|
+
grade: string;
|
|
7
|
+
score: number;
|
|
8
|
+
color: string;
|
|
9
|
+
markdown: string;
|
|
10
|
+
shield: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate security badge
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateBadge(result: AuditResult): SecurityBadge;
|
|
16
|
+
/**
|
|
17
|
+
* Generate badge markdown for README
|
|
18
|
+
*/
|
|
19
|
+
export declare function generateBadgeMarkdown(result: AuditResult): string;
|
|
20
|
+
//# sourceMappingURL=badge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.d.ts","sourceRoot":"","sources":["../../src/features/badge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,WAAW,GAAG,aAAa,CA+BhE;AA+CD;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,CAGjE"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Badge Generator - Creates shareable security report cards
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Generate security badge
|
|
6
|
+
*/
|
|
7
|
+
export function generateBadge(result) {
|
|
8
|
+
const grade = calculateGrade(result);
|
|
9
|
+
const score = calculateScore(result);
|
|
10
|
+
const color = getGradeColor(grade);
|
|
11
|
+
const shield = `https://img.shields.io/badge/security-${grade}-${color}`;
|
|
12
|
+
const markdown = `## 🛡️ Security Report Card
|
|
13
|
+
|
|
14
|
+

|
|
15
|
+
|
|
16
|
+
**Grade:** ${grade}
|
|
17
|
+
**Score:** ${score}/100
|
|
18
|
+
|
|
19
|
+
### Summary
|
|
20
|
+
- Total Issues: ${result.summary.total}
|
|
21
|
+
- Critical: ${result.summary.critical}
|
|
22
|
+
- High: ${result.summary.high}
|
|
23
|
+
- Medium: ${result.summary.medium}
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
Scanned by [FivoSense](https://github.com/fivosense) — Neuro-symbolic AI security scanner
|
|
27
|
+
`;
|
|
28
|
+
return {
|
|
29
|
+
grade,
|
|
30
|
+
score,
|
|
31
|
+
color,
|
|
32
|
+
markdown,
|
|
33
|
+
shield,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Calculate security grade (A+ to F)
|
|
38
|
+
*/
|
|
39
|
+
function calculateGrade(result) {
|
|
40
|
+
const { summary } = result;
|
|
41
|
+
if (summary.total === 0)
|
|
42
|
+
return 'A+';
|
|
43
|
+
if (summary.critical === 0 && summary.high === 0)
|
|
44
|
+
return 'A';
|
|
45
|
+
if (summary.critical === 0 && summary.high <= 2)
|
|
46
|
+
return 'B';
|
|
47
|
+
if (summary.critical === 0 && summary.high <= 5)
|
|
48
|
+
return 'C';
|
|
49
|
+
if (summary.critical <= 1)
|
|
50
|
+
return 'D';
|
|
51
|
+
return 'F';
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Calculate numeric security score (0-100)
|
|
55
|
+
*/
|
|
56
|
+
function calculateScore(result) {
|
|
57
|
+
const { summary } = result;
|
|
58
|
+
// Start at 100, deduct for issues
|
|
59
|
+
let score = 100;
|
|
60
|
+
score -= summary.critical * 20; // -20 per critical
|
|
61
|
+
score -= summary.high * 10; // -10 per high
|
|
62
|
+
score -= summary.medium * 5; // -5 per medium
|
|
63
|
+
return Math.max(0, score);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Get color for grade
|
|
67
|
+
*/
|
|
68
|
+
function getGradeColor(grade) {
|
|
69
|
+
const colors = {
|
|
70
|
+
'A+': 'brightgreen',
|
|
71
|
+
'A': 'green',
|
|
72
|
+
'B': 'yellowgreen',
|
|
73
|
+
'C': 'yellow',
|
|
74
|
+
'D': 'orange',
|
|
75
|
+
'F': 'red',
|
|
76
|
+
};
|
|
77
|
+
return colors[grade] || 'lightgrey';
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Generate badge markdown for README
|
|
81
|
+
*/
|
|
82
|
+
export function generateBadgeMarkdown(result) {
|
|
83
|
+
const badge = generateBadge(result);
|
|
84
|
+
return badge.markdown;
|
|
85
|
+
}
|
|
86
|
+
//# sourceMappingURL=badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"badge.js","sourceRoot":"","sources":["../../src/features/badge.ts"],"names":[],"mappings":"AAAA;;GAEG;AAYH;;GAEG;AACH,MAAM,UAAU,aAAa,CAAC,MAAmB;IAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAEnC,MAAM,MAAM,GAAG,yCAAyC,KAAK,IAAI,KAAK,EAAE,CAAC;IAEzE,MAAM,QAAQ,GAAG;;oBAEC,MAAM;;aAEb,KAAK;aACL,KAAK;;;kBAGA,MAAM,CAAC,OAAO,CAAC,KAAK;cACxB,MAAM,CAAC,OAAO,CAAC,QAAQ;UAC3B,MAAM,CAAC,OAAO,CAAC,IAAI;YACjB,MAAM,CAAC,OAAO,CAAC,MAAM;;;;CAIhC,CAAC;IAEA,OAAO;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,QAAQ;QACR,MAAM;KACP,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,IAAI,OAAO,CAAC,KAAK,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACrC,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC7D,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5D,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IAC5D,IAAI,OAAO,CAAC,QAAQ,IAAI,CAAC;QAAE,OAAO,GAAG,CAAC;IACtC,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,MAAmB;IACzC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAE3B,kCAAkC;IAClC,IAAI,KAAK,GAAG,GAAG,CAAC;IAChB,KAAK,IAAI,OAAO,CAAC,QAAQ,GAAG,EAAE,CAAC,CAAE,mBAAmB;IACpD,KAAK,IAAI,OAAO,CAAC,IAAI,GAAG,EAAE,CAAC,CAAM,eAAe;IAChD,KAAK,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAK,gBAAgB;IAEjD,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AAC5B,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,KAAa;IAClC,MAAM,MAAM,GAA2B;QACrC,IAAI,EAAE,aAAa;QACnB,GAAG,EAAE,OAAO;QACZ,GAAG,EAAE,aAAa;QAClB,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,QAAQ;QACb,GAAG,EAAE,KAAK;KACX,CAAC;IAEF,OAAO,MAAM,CAAC,KAAK,CAAC,IAAI,WAAW,CAAC;AACtC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmB;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACpC,OAAO,KAAK,CAAC,QAAQ,CAAC;AACxB,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Auto-fix Generator - Suggests and applies security fixes
|
|
3
|
+
*/
|
|
4
|
+
import { TaintTrace } from '../engine/taint.js';
|
|
5
|
+
export interface SecurityFix {
|
|
6
|
+
original: string;
|
|
7
|
+
fixed: string;
|
|
8
|
+
explanation: string;
|
|
9
|
+
confidence: number;
|
|
10
|
+
type: 'sanitize' | 'parameterize' | 'encode' | 'validate';
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate fix for a vulnerability
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateFix(trace: TaintTrace, code: string): SecurityFix | null;
|
|
16
|
+
/**
|
|
17
|
+
* Apply fix to code
|
|
18
|
+
*/
|
|
19
|
+
export declare function applyFix(code: string, fix: SecurityFix, lineNumber: number): string;
|
|
20
|
+
//# sourceMappingURL=fix.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fix.d.ts","sourceRoot":"","sources":["../../src/features/fix.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,QAAQ,GAAG,UAAU,CAAC;CAC3D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CAa/E;AAgGD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAQnF"}
|