tangkal 1.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/README.md +62 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/src/analyzers/dependencies.d.ts +4 -0
- package/dist/src/analyzers/dependencies.d.ts.map +1 -0
- package/dist/src/analyzers/dependencies.js +79 -0
- package/dist/src/analyzers/dependencies.js.map +1 -0
- package/dist/src/analyzers/network.d.ts +17 -0
- package/dist/src/analyzers/network.d.ts.map +1 -0
- package/dist/src/analyzers/network.js +203 -0
- package/dist/src/analyzers/network.js.map +1 -0
- package/dist/src/analyzers/static-analysis.d.ts +18 -0
- package/dist/src/analyzers/static-analysis.d.ts.map +1 -0
- package/dist/src/analyzers/static-analysis.js +246 -0
- package/dist/src/analyzers/static-analysis.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +112 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +9 -0
- package/dist/src/config.d.ts.map +1 -0
- package/dist/src/config.js +40 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/scanner.d.ts +8 -0
- package/dist/src/scanner.d.ts.map +1 -0
- package/dist/src/scanner.js +115 -0
- package/dist/src/scanner.js.map +1 -0
- package/dist/src/utils/entropy.d.ts +7 -0
- package/dist/src/utils/entropy.d.ts.map +1 -0
- package/dist/src/utils/entropy.js +25 -0
- package/dist/src/utils/entropy.js.map +1 -0
- package/dist/src/utils/ignore.d.ts +3 -0
- package/dist/src/utils/ignore.d.ts.map +1 -0
- package/dist/src/utils/ignore.js +18 -0
- package/dist/src/utils/ignore.js.map +1 -0
- package/dist/src/utils/lockfile.d.ts +9 -0
- package/dist/src/utils/lockfile.d.ts.map +1 -0
- package/dist/src/utils/lockfile.js +143 -0
- package/dist/src/utils/lockfile.js.map +1 -0
- package/dist/src/utils/popular-packages.d.ts +2 -0
- package/dist/src/utils/popular-packages.d.ts.map +1 -0
- package/dist/src/utils/popular-packages.js +22 -0
- package/dist/src/utils/popular-packages.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import ignore from 'ignore';
|
|
2
|
+
import fs from 'fs/promises';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
export async function loadIgnore(dir) {
|
|
5
|
+
const ig = ignore();
|
|
6
|
+
const ignorePath = path.join(dir, '.tangkalignore');
|
|
7
|
+
try {
|
|
8
|
+
const content = await fs.readFile(ignorePath, 'utf-8');
|
|
9
|
+
ig.add(content);
|
|
10
|
+
}
|
|
11
|
+
catch (e) {
|
|
12
|
+
// If file doesn't exist, we just return the empty ignore instance
|
|
13
|
+
}
|
|
14
|
+
// Always ignore common noise
|
|
15
|
+
ig.add(['node_modules', '.git', 'dist', 'build', 'coverage', '*.min.js', '*.map']);
|
|
16
|
+
return ig;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=ignore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ignore.js","sourceRoot":"","sources":["../../../src/utils/ignore.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,EAAE,MAAM,aAAa,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,GAAW;IAC1C,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC;IACpB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;IAEpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,kEAAkE;IACpE,CAAC;IAED,6BAA6B;IAC7B,EAAE,CAAC,GAAG,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC;IAEnF,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Dependency {
|
|
2
|
+
name: string;
|
|
3
|
+
version: string;
|
|
4
|
+
}
|
|
5
|
+
/**
|
|
6
|
+
* Parses lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) to get a flat list of dependencies.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parsePackageLock(dir: string): Promise<Dependency[] | null>;
|
|
9
|
+
//# sourceMappingURL=lockfile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../../src/utils/lockfile.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAOD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,CAmIhF"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import fs from 'fs/promises';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import * as yarnLockfile from '@yarnpkg/lockfile';
|
|
4
|
+
import yaml from 'yaml';
|
|
5
|
+
/**
|
|
6
|
+
* Parses lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml) to get a flat list of dependencies.
|
|
7
|
+
*/
|
|
8
|
+
export async function parsePackageLock(dir) {
|
|
9
|
+
// 1. Try package-lock.json
|
|
10
|
+
try {
|
|
11
|
+
const lockPath = path.join(dir, 'package-lock.json');
|
|
12
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
13
|
+
const lock = JSON.parse(content);
|
|
14
|
+
const dependencies = [];
|
|
15
|
+
if (lock.packages) {
|
|
16
|
+
for (const [key, val] of Object.entries(lock.packages)) {
|
|
17
|
+
if (key === '')
|
|
18
|
+
continue;
|
|
19
|
+
const name = key.split('node_modules/').pop();
|
|
20
|
+
if (name && typeof val.version === 'string') {
|
|
21
|
+
dependencies.push({ name, version: val.version });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
else if (lock.dependencies) {
|
|
26
|
+
// v1 recursive
|
|
27
|
+
const traverse = (deps) => {
|
|
28
|
+
for (const [name, val] of Object.entries(deps)) {
|
|
29
|
+
if (typeof val.version === 'string') {
|
|
30
|
+
dependencies.push({ name, version: val.version });
|
|
31
|
+
}
|
|
32
|
+
if (val.dependencies)
|
|
33
|
+
traverse(val.dependencies);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
traverse(lock.dependencies);
|
|
37
|
+
}
|
|
38
|
+
return deduplicate(dependencies);
|
|
39
|
+
}
|
|
40
|
+
catch (e) { }
|
|
41
|
+
// 2. Try yarn.lock
|
|
42
|
+
try {
|
|
43
|
+
const lockPath = path.join(dir, 'yarn.lock');
|
|
44
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
45
|
+
const parsed = yarnLockfile.parse(content);
|
|
46
|
+
if (parsed.type === 'success' && parsed.object) {
|
|
47
|
+
const dependencies = [];
|
|
48
|
+
for (const [key, val] of Object.entries(parsed.object)) {
|
|
49
|
+
const nameMatch = key.match(/^(@?[^@]+)@/);
|
|
50
|
+
const name = nameMatch ? nameMatch[1] : key;
|
|
51
|
+
if (name && typeof val.version === 'string') {
|
|
52
|
+
dependencies.push({ name, version: val.version });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return deduplicate(dependencies);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
catch (e) { }
|
|
59
|
+
// 3. Try pnpm-lock.yaml
|
|
60
|
+
try {
|
|
61
|
+
const lockPath = path.join(dir, 'pnpm-lock.yaml');
|
|
62
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
63
|
+
const parsed = yaml.parse(content);
|
|
64
|
+
const dependencies = [];
|
|
65
|
+
if (parsed.packages) {
|
|
66
|
+
for (const key of Object.keys(parsed.packages)) {
|
|
67
|
+
let cleanKey = key.startsWith('/') ? key.substring(1) : key;
|
|
68
|
+
if (cleanKey.includes('(')) {
|
|
69
|
+
cleanKey = cleanKey.split('(')[0] ?? cleanKey;
|
|
70
|
+
}
|
|
71
|
+
const parts = cleanKey.split('/');
|
|
72
|
+
if (parts.length >= 2) {
|
|
73
|
+
const version = parts.pop();
|
|
74
|
+
const name = parts.join('/');
|
|
75
|
+
if (name && typeof version === 'string') {
|
|
76
|
+
dependencies.push({ name, version });
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
else if (cleanKey.includes('@')) {
|
|
80
|
+
const lastAt = cleanKey.lastIndexOf('@');
|
|
81
|
+
const name = cleanKey.substring(0, lastAt);
|
|
82
|
+
const version = cleanKey.substring(lastAt + 1);
|
|
83
|
+
if (name && typeof version === 'string') {
|
|
84
|
+
dependencies.push({ name, version });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
return deduplicate(dependencies);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
catch (e) { }
|
|
92
|
+
// 4. Try bun.lock (Text format)
|
|
93
|
+
try {
|
|
94
|
+
const lockPath = path.join(dir, 'bun.lock');
|
|
95
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
96
|
+
if (content.trim().startsWith('#') || content.includes('lockfile v1')) {
|
|
97
|
+
const parsed = yarnLockfile.parse(content);
|
|
98
|
+
if (parsed.type === 'success' && parsed.object) {
|
|
99
|
+
const dependencies = [];
|
|
100
|
+
for (const [key, val] of Object.entries(parsed.object)) {
|
|
101
|
+
const nameMatch = key.match(/^(@?[^@]+)@/);
|
|
102
|
+
const name = nameMatch ? nameMatch[1] : key;
|
|
103
|
+
if (name && typeof val.version === 'string') {
|
|
104
|
+
dependencies.push({ name, version: val.version });
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return deduplicate(dependencies);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
catch (e) { }
|
|
112
|
+
// 5. Try deno.lock (JSON)
|
|
113
|
+
try {
|
|
114
|
+
const lockPath = path.join(dir, 'deno.lock');
|
|
115
|
+
const content = await fs.readFile(lockPath, 'utf-8');
|
|
116
|
+
const lock = JSON.parse(content);
|
|
117
|
+
const dependencies = [];
|
|
118
|
+
if (lock.packages && lock.packages.specifiers) {
|
|
119
|
+
for (const key of Object.keys(lock.packages.specifiers)) {
|
|
120
|
+
if (key.startsWith('npm:')) {
|
|
121
|
+
const resolved = lock.packages.specifiers[key];
|
|
122
|
+
if (typeof resolved === 'string' && resolved.startsWith('npm:')) {
|
|
123
|
+
const parts = resolved.replace('npm:', '').split('@');
|
|
124
|
+
const version = parts.pop();
|
|
125
|
+
const name = parts.join('@');
|
|
126
|
+
if (name && typeof version === 'string') {
|
|
127
|
+
dependencies.push({ name, version });
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
return deduplicate(dependencies);
|
|
134
|
+
}
|
|
135
|
+
catch (e) { }
|
|
136
|
+
return null;
|
|
137
|
+
}
|
|
138
|
+
function deduplicate(deps) {
|
|
139
|
+
const unique = new Map();
|
|
140
|
+
deps.forEach(d => unique.set(`${d.name}@${d.version}`, d));
|
|
141
|
+
return Array.from(unique.values());
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=lockfile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../../src/utils/lockfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popular-packages.d.ts","sourceRoot":"","sources":["../../../src/utils/popular-packages.ts"],"names":[],"mappings":"AAMA,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAe5D"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import axios from 'axios';
|
|
2
|
+
import { POPULAR_PACKAGES as FALLBACK_PACKAGES } from '../config.js';
|
|
3
|
+
const LIST_URL = 'https://raw.githubusercontent.com/wooorm/npm-high-impact/main/data.json';
|
|
4
|
+
let cachedPackages = null;
|
|
5
|
+
export async function getPopularPackages() {
|
|
6
|
+
if (cachedPackages)
|
|
7
|
+
return cachedPackages;
|
|
8
|
+
try {
|
|
9
|
+
const { data } = await axios.get(LIST_URL, { timeout: 5000 });
|
|
10
|
+
if (Array.isArray(data)) {
|
|
11
|
+
cachedPackages = [...new Set([...data, ...FALLBACK_PACKAGES])];
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
cachedPackages = FALLBACK_PACKAGES;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
cachedPackages = FALLBACK_PACKAGES;
|
|
19
|
+
}
|
|
20
|
+
return cachedPackages;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=popular-packages.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"popular-packages.js","sourceRoot":"","sources":["../../../src/utils/popular-packages.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,gBAAgB,IAAI,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAErE,MAAM,QAAQ,GAAG,yEAAyE,CAAC;AAC3F,IAAI,cAAc,GAAoB,IAAI,CAAC;AAE3C,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,IAAI,cAAc;QAAE,OAAO,cAAc,CAAC;IAE1C,IAAI,CAAC;QACH,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9D,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YACxB,cAAc,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC;aAAM,CAAC;YACN,cAAc,GAAG,iBAAiB,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,GAAG,iBAAiB,CAAC;IACrC,CAAC;IAED,OAAO,cAAe,CAAC;AACzB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "tangkal",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Preventive security scanner for cloned repositories. Detects malicious AST patterns, vulnerable dependencies, and typosquatting.",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"bin": {
|
|
8
|
+
"tangkal": "./dist/index.js"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"prepublishOnly": "pnpm build",
|
|
17
|
+
"test": "echo \"Error: no test specified\" && exit 1"
|
|
18
|
+
},
|
|
19
|
+
"keywords": [
|
|
20
|
+
"security",
|
|
21
|
+
"scanner",
|
|
22
|
+
"malware",
|
|
23
|
+
"static-analysis",
|
|
24
|
+
"vulnerability",
|
|
25
|
+
"typosquatting",
|
|
26
|
+
"ast"
|
|
27
|
+
],
|
|
28
|
+
"author": "Andrew Virya Victorio",
|
|
29
|
+
"license": "ISC",
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@babel/parser": "^7.28.6",
|
|
32
|
+
"@babel/traverse": "^7.28.6",
|
|
33
|
+
"@yarnpkg/lockfile": "^1.1.0",
|
|
34
|
+
"axios": "^1.13.3",
|
|
35
|
+
"chalk": "^5.6.2",
|
|
36
|
+
"commander": "^14.0.2",
|
|
37
|
+
"fast-glob": "^3.3.3",
|
|
38
|
+
"fast-levenshtein": "^3.0.0",
|
|
39
|
+
"ignore": "^7.0.5",
|
|
40
|
+
"inquirer": "^13.2.1",
|
|
41
|
+
"ora": "^9.1.0",
|
|
42
|
+
"p-limit": "^7.2.0",
|
|
43
|
+
"shannon-entropy": "^0.0.3",
|
|
44
|
+
"yaml": "^2.7.0"
|
|
45
|
+
},
|
|
46
|
+
"devDependencies": {
|
|
47
|
+
"@types/fast-levenshtein": "^0.0.4",
|
|
48
|
+
"@types/inquirer": "^9.0.9",
|
|
49
|
+
"@types/node": "^25.0.10",
|
|
50
|
+
"ts-node": "^10.9.2",
|
|
51
|
+
"typescript": "^5.9.3"
|
|
52
|
+
}
|
|
53
|
+
}
|