upstream-radar 0.4.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 +176 -0
- package/README.md +222 -0
- package/README.zh-CN.md +170 -0
- package/cordis.patch.yml +11 -0
- package/dist/src/cli.d.ts +3 -0
- package/dist/src/cli.d.ts.map +1 -0
- package/dist/src/cli.js +286 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/compatibility.d.ts +12 -0
- package/dist/src/compatibility.d.ts.map +1 -0
- package/dist/src/compatibility.js +195 -0
- package/dist/src/compatibility.js.map +1 -0
- package/dist/src/dsh-analysis.d.ts +7 -0
- package/dist/src/dsh-analysis.d.ts.map +1 -0
- package/dist/src/dsh-analysis.js +53 -0
- package/dist/src/dsh-analysis.js.map +1 -0
- package/dist/src/dsh-plugin.d.ts +45 -0
- package/dist/src/dsh-plugin.d.ts.map +1 -0
- package/dist/src/dsh-plugin.js +121 -0
- package/dist/src/dsh-plugin.js.map +1 -0
- package/dist/src/graph.d.ts +14 -0
- package/dist/src/graph.d.ts.map +1 -0
- package/dist/src/graph.js +198 -0
- package/dist/src/graph.js.map +1 -0
- package/dist/src/index.d.ts +19 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +19 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/inventory.d.ts +4 -0
- package/dist/src/inventory.d.ts.map +1 -0
- package/dist/src/inventory.js +182 -0
- package/dist/src/inventory.js.map +1 -0
- package/dist/src/npm-release.d.ts +24 -0
- package/dist/src/npm-release.d.ts.map +1 -0
- package/dist/src/npm-release.js +131 -0
- package/dist/src/npm-release.js.map +1 -0
- package/dist/src/npm.d.ts +36 -0
- package/dist/src/npm.d.ts.map +1 -0
- package/dist/src/npm.js +803 -0
- package/dist/src/npm.js.map +1 -0
- package/dist/src/osv.d.ts +18 -0
- package/dist/src/osv.d.ts.map +1 -0
- package/dist/src/osv.js +238 -0
- package/dist/src/osv.js.map +1 -0
- package/dist/src/policy.d.ts +5 -0
- package/dist/src/policy.d.ts.map +1 -0
- package/dist/src/policy.js +32 -0
- package/dist/src/policy.js.map +1 -0
- package/dist/src/radar-render.d.ts +4 -0
- package/dist/src/radar-render.d.ts.map +1 -0
- package/dist/src/radar-render.js +50 -0
- package/dist/src/radar-render.js.map +1 -0
- package/dist/src/radar-state.d.ts +5 -0
- package/dist/src/radar-state.d.ts.map +1 -0
- package/dist/src/radar-state.js +87 -0
- package/dist/src/radar-state.js.map +1 -0
- package/dist/src/radar-types.d.ts +163 -0
- package/dist/src/radar-types.d.ts.map +1 -0
- package/dist/src/radar-types.js +7 -0
- package/dist/src/radar-types.js.map +1 -0
- package/dist/src/radar.d.ts +24 -0
- package/dist/src/radar.d.ts.map +1 -0
- package/dist/src/radar.js +234 -0
- package/dist/src/radar.js.map +1 -0
- package/dist/src/render.d.ts +3 -0
- package/dist/src/render.d.ts.map +1 -0
- package/dist/src/render.js +58 -0
- package/dist/src/render.js.map +1 -0
- package/dist/src/scan.d.ts +8 -0
- package/dist/src/scan.d.ts.map +1 -0
- package/dist/src/scan.js +293 -0
- package/dist/src/scan.js.map +1 -0
- package/dist/src/semver.d.ts +13 -0
- package/dist/src/semver.d.ts.map +1 -0
- package/dist/src/semver.js +136 -0
- package/dist/src/semver.js.map +1 -0
- package/dist/src/tar.d.ts +25 -0
- package/dist/src/tar.d.ts.map +1 -0
- package/dist/src/tar.js +327 -0
- package/dist/src/tar.js.map +1 -0
- package/dist/src/types.d.ts +111 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/version.d.ts +2 -0
- package/dist/src/version.d.ts.map +1 -0
- package/dist/src/version.js +2 -0
- package/dist/src/version.js.map +1 -0
- package/docs/assets/upstream-radar-hero-mobile.jpg +0 -0
- package/docs/assets/upstream-radar-hero.jpg +0 -0
- package/package.json +84 -0
- package/schemas/analysis-result.schema.json +39 -0
package/dist/src/tar.js
ADDED
|
@@ -0,0 +1,327 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { gunzipSync } from 'node:zlib';
|
|
3
|
+
const TAR_BLOCK = 512;
|
|
4
|
+
const DEFAULT_MAX_ENTRIES = 10_000;
|
|
5
|
+
const DEFAULT_MAX_UNPACKED_BYTES = 64 * 1024 * 1024;
|
|
6
|
+
const DEFAULT_MAX_FILE_BYTES = 16 * 1024 * 1024;
|
|
7
|
+
const MAX_PATH_BYTES = 4 * 1024;
|
|
8
|
+
const MAX_PATH_SEGMENT_BYTES = 255;
|
|
9
|
+
const MAX_REPORTED_FINDINGS = 100;
|
|
10
|
+
const WINDOWS_RESERVED = /^(?:con|prn|aux|nul|com[1-9]|lpt[1-9])(?:\..*)?$/i;
|
|
11
|
+
const UTF8_DECODER = new TextDecoder('utf-8', { fatal: true });
|
|
12
|
+
const SEVERITY_RANK = { info: 0, low: 1, medium: 2, high: 3, critical: 4 };
|
|
13
|
+
function finding(code, severity, summary, detail, evidence) {
|
|
14
|
+
const result = { code, severity, summary, detail };
|
|
15
|
+
if (evidence !== undefined)
|
|
16
|
+
result.evidence = evidence;
|
|
17
|
+
return result;
|
|
18
|
+
}
|
|
19
|
+
function readString(buffer, start, length) {
|
|
20
|
+
const slice = buffer.subarray(start, start + length);
|
|
21
|
+
const nul = slice.indexOf(0);
|
|
22
|
+
return UTF8_DECODER.decode(slice.subarray(0, nul === -1 ? slice.length : nul));
|
|
23
|
+
}
|
|
24
|
+
function readOctal(buffer, start, length, field) {
|
|
25
|
+
const slice = buffer.subarray(start, start + length);
|
|
26
|
+
if ((slice[0] ?? 0) >= 0x80)
|
|
27
|
+
throw new Error(`unsupported base-256 tar ${field}`);
|
|
28
|
+
const value = slice.toString('ascii').replace(/\0.*$/s, '').trim();
|
|
29
|
+
if (value === '')
|
|
30
|
+
return 0;
|
|
31
|
+
if (!/^[0-7]+$/.test(value))
|
|
32
|
+
throw new Error(`invalid octal tar ${field}`);
|
|
33
|
+
const parsed = Number.parseInt(value, 8);
|
|
34
|
+
if (!Number.isSafeInteger(parsed) || parsed < 0)
|
|
35
|
+
throw new Error(`unsafe tar ${field}`);
|
|
36
|
+
return parsed;
|
|
37
|
+
}
|
|
38
|
+
function verifyHeaderChecksum(header) {
|
|
39
|
+
const expected = readOctal(header, 148, 8, 'checksum');
|
|
40
|
+
let actual = 0;
|
|
41
|
+
for (let index = 0; index < TAR_BLOCK; index += 1) {
|
|
42
|
+
actual += index >= 148 && index < 156 ? 0x20 : (header[index] ?? 0);
|
|
43
|
+
}
|
|
44
|
+
if (actual !== expected)
|
|
45
|
+
throw new Error(`tar header checksum mismatch: expected ${expected}, got ${actual}`);
|
|
46
|
+
}
|
|
47
|
+
function parsePax(contents) {
|
|
48
|
+
const values = {};
|
|
49
|
+
let offset = 0;
|
|
50
|
+
while (offset < contents.length) {
|
|
51
|
+
const space = contents.indexOf(0x20, offset);
|
|
52
|
+
if (space === -1)
|
|
53
|
+
throw new Error('invalid PAX record length');
|
|
54
|
+
const lengthText = contents.subarray(offset, space).toString('ascii');
|
|
55
|
+
if (!/^[1-9][0-9]*$/.test(lengthText))
|
|
56
|
+
throw new Error('invalid PAX record length');
|
|
57
|
+
const length = Number.parseInt(lengthText, 10);
|
|
58
|
+
const end = offset + length;
|
|
59
|
+
if (!Number.isSafeInteger(length) || end > contents.length || length <= space - offset + 2) {
|
|
60
|
+
throw new Error('PAX record exceeds archive bounds');
|
|
61
|
+
}
|
|
62
|
+
const record = UTF8_DECODER.decode(contents.subarray(space + 1, end - 1));
|
|
63
|
+
const equals = record.indexOf('=');
|
|
64
|
+
if (equals <= 0)
|
|
65
|
+
throw new Error('invalid PAX key/value record');
|
|
66
|
+
values[record.slice(0, equals)] = record.slice(equals + 1);
|
|
67
|
+
offset = end;
|
|
68
|
+
}
|
|
69
|
+
return values;
|
|
70
|
+
}
|
|
71
|
+
function pathIssue(rawPath) {
|
|
72
|
+
if (rawPath.includes('\0'))
|
|
73
|
+
return 'contains a NUL byte';
|
|
74
|
+
if (/[\u0001-\u001f\u007f-\u009f]/.test(rawPath))
|
|
75
|
+
return 'contains a control character';
|
|
76
|
+
if (Buffer.byteLength(rawPath) > MAX_PATH_BYTES)
|
|
77
|
+
return 'exceeds the path length budget';
|
|
78
|
+
if (rawPath.includes('\\'))
|
|
79
|
+
return 'contains a backslash';
|
|
80
|
+
if (rawPath.includes('//'))
|
|
81
|
+
return 'contains an empty path segment';
|
|
82
|
+
if (/[<>:"|?*]/.test(rawPath))
|
|
83
|
+
return 'contains a platform-reserved path character';
|
|
84
|
+
if (rawPath.startsWith('/') || /^[A-Za-z]:/.test(rawPath))
|
|
85
|
+
return 'is absolute';
|
|
86
|
+
const segments = rawPath.split('/');
|
|
87
|
+
if (segments.some(segment => Buffer.byteLength(segment) > MAX_PATH_SEGMENT_BYTES))
|
|
88
|
+
return 'contains an oversized path segment';
|
|
89
|
+
if (segments.some(segment => segment === '..'))
|
|
90
|
+
return 'contains a parent traversal segment';
|
|
91
|
+
if (segments.some(segment => segment.endsWith(' ') || segment.endsWith('.')))
|
|
92
|
+
return 'has a platform-ambiguous trailing character';
|
|
93
|
+
if (segments.some(segment => WINDOWS_RESERVED.test(segment)))
|
|
94
|
+
return 'contains a Windows reserved path segment';
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
function normalizeNpmPath(rawPath, expectedRoot) {
|
|
98
|
+
const issue = pathIssue(rawPath);
|
|
99
|
+
if (issue !== undefined)
|
|
100
|
+
return { issue };
|
|
101
|
+
const segments = rawPath.split('/').filter(segment => segment !== '' && segment !== '.');
|
|
102
|
+
const root = segments[0];
|
|
103
|
+
if (root === undefined)
|
|
104
|
+
return { issue: 'has no top-level archive directory' };
|
|
105
|
+
if (expectedRoot !== undefined && root !== expectedRoot) {
|
|
106
|
+
return { issue: `uses top-level directory ${root} instead of ${expectedRoot}` };
|
|
107
|
+
}
|
|
108
|
+
return { path: segments.slice(1).join('/'), root };
|
|
109
|
+
}
|
|
110
|
+
function linkEscapesPackage(entryPath, rawTarget) {
|
|
111
|
+
if (Buffer.byteLength(rawTarget) > MAX_PATH_BYTES)
|
|
112
|
+
return true;
|
|
113
|
+
if (rawTarget.includes('\0') || rawTarget.includes('\\') || rawTarget.startsWith('/') || /^[A-Za-z]:/.test(rawTarget))
|
|
114
|
+
return true;
|
|
115
|
+
const base = entryPath.split('/').slice(0, -1);
|
|
116
|
+
const stack = [...base];
|
|
117
|
+
for (const segment of rawTarget.split('/')) {
|
|
118
|
+
if (segment === '' || segment === '.')
|
|
119
|
+
continue;
|
|
120
|
+
if (segment.endsWith(' ') || segment.endsWith('.') || WINDOWS_RESERVED.test(segment))
|
|
121
|
+
return true;
|
|
122
|
+
if (segment === '..') {
|
|
123
|
+
if (stack.length === 0)
|
|
124
|
+
return true;
|
|
125
|
+
stack.pop();
|
|
126
|
+
}
|
|
127
|
+
else {
|
|
128
|
+
stack.push(segment);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
function treeDigest(entries) {
|
|
134
|
+
const hash = createHash('sha256');
|
|
135
|
+
for (const entry of [...entries].sort((left, right) => left.path < right.path ? -1 : left.path > right.path ? 1 : 0)) {
|
|
136
|
+
hash.update(entry.path);
|
|
137
|
+
hash.update('\0');
|
|
138
|
+
hash.update(entry.type);
|
|
139
|
+
hash.update('\0');
|
|
140
|
+
hash.update(entry.digest);
|
|
141
|
+
hash.update('\0');
|
|
142
|
+
hash.update(String(entry.mode & 0o777));
|
|
143
|
+
hash.update('\n');
|
|
144
|
+
}
|
|
145
|
+
return `sha256:${hash.digest('hex')}`;
|
|
146
|
+
}
|
|
147
|
+
function inspectPathTopology(entries, addFinding) {
|
|
148
|
+
const byPortablePath = new Map(entries.map(entry => [entry.path.normalize('NFC').toLowerCase(), entry]));
|
|
149
|
+
const reported = new Set();
|
|
150
|
+
for (const entry of entries) {
|
|
151
|
+
const segments = entry.path.normalize('NFC').toLowerCase().split('/');
|
|
152
|
+
for (let length = 1; length < segments.length; length += 1) {
|
|
153
|
+
const ancestor = byPortablePath.get(segments.slice(0, length).join('/'));
|
|
154
|
+
if (ancestor === undefined || ancestor.type === 'directory')
|
|
155
|
+
continue;
|
|
156
|
+
const key = `${ancestor.path}\0${entry.path}`;
|
|
157
|
+
if (reported.has(key))
|
|
158
|
+
continue;
|
|
159
|
+
reported.add(key);
|
|
160
|
+
addFinding(finding('archive-path-topology-conflict', 'critical', `Archive path is nested below a non-directory: ${entry.path}`, 'File/link and child-path conflicts materialize inconsistently and can redirect writes across package managers.', { path: entry.path, ancestor: ancestor.path, ancestorType: ancestor.type }));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export function parseNpmTarball(compressed, options = {}) {
|
|
165
|
+
const maxEntries = options.maxEntries ?? DEFAULT_MAX_ENTRIES;
|
|
166
|
+
const maxUnpackedBytes = options.maxUnpackedBytes ?? DEFAULT_MAX_UNPACKED_BYTES;
|
|
167
|
+
const maxFileBytes = options.maxFileBytes ?? DEFAULT_MAX_FILE_BYTES;
|
|
168
|
+
const maxCompressionRatio = options.maxCompressionRatio ?? 200;
|
|
169
|
+
if (compressed.length < 2 || compressed[0] !== 0x1f || compressed[1] !== 0x8b) {
|
|
170
|
+
throw new Error('npm artifact is not a gzip-compressed tarball');
|
|
171
|
+
}
|
|
172
|
+
let archive;
|
|
173
|
+
try {
|
|
174
|
+
archive = gunzipSync(compressed, { maxOutputLength: maxUnpackedBytes + TAR_BLOCK * 4 });
|
|
175
|
+
}
|
|
176
|
+
catch (error) {
|
|
177
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
178
|
+
throw new Error(`unable to decompress npm artifact within budget: ${message}`);
|
|
179
|
+
}
|
|
180
|
+
const findings = [];
|
|
181
|
+
let omittedFindings = 0;
|
|
182
|
+
const addFinding = (candidate) => {
|
|
183
|
+
if (findings.length < MAX_REPORTED_FINDINGS) {
|
|
184
|
+
findings.push(candidate);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
omittedFindings += 1;
|
|
188
|
+
let lowestIndex = 0;
|
|
189
|
+
for (let index = 1; index < findings.length; index += 1) {
|
|
190
|
+
if (SEVERITY_RANK[findings[index]?.severity ?? 'info'] < SEVERITY_RANK[findings[lowestIndex]?.severity ?? 'info']) {
|
|
191
|
+
lowestIndex = index;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
if (SEVERITY_RANK[candidate.severity] > SEVERITY_RANK[findings[lowestIndex]?.severity ?? 'info']) {
|
|
195
|
+
findings[lowestIndex] = candidate;
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
if (archive.length > compressed.length * maxCompressionRatio + 1024 * 1024) {
|
|
199
|
+
addFinding(finding('archive-suspicious-compression-ratio', 'critical', 'Archive expansion ratio exceeds policy', 'The compressed artifact expands far beyond its download size and may be intended to exhaust scanner resources.', { compressedBytes: compressed.length, unpackedBytes: archive.length, maxCompressionRatio }));
|
|
200
|
+
}
|
|
201
|
+
const entries = [];
|
|
202
|
+
const exactPaths = new Set();
|
|
203
|
+
const portablePaths = new Map();
|
|
204
|
+
let offset = 0;
|
|
205
|
+
let pendingPax = {};
|
|
206
|
+
let globalPax = {};
|
|
207
|
+
let pendingLongName;
|
|
208
|
+
let pendingLongLink;
|
|
209
|
+
let archiveRoot;
|
|
210
|
+
let headerCount = 0;
|
|
211
|
+
let budgetBytes = 0;
|
|
212
|
+
let fileBytes = 0;
|
|
213
|
+
while (offset + TAR_BLOCK <= archive.length) {
|
|
214
|
+
const header = archive.subarray(offset, offset + TAR_BLOCK);
|
|
215
|
+
if (header.every(byte => byte === 0))
|
|
216
|
+
break;
|
|
217
|
+
headerCount += 1;
|
|
218
|
+
if (headerCount > maxEntries)
|
|
219
|
+
throw new Error(`tar entry count exceeds ${maxEntries}`);
|
|
220
|
+
verifyHeaderChecksum(header);
|
|
221
|
+
const headerSize = readOctal(header, 124, 12, 'size');
|
|
222
|
+
if (headerSize > maxFileBytes)
|
|
223
|
+
throw new Error('tar entry exceeds per-entry budget');
|
|
224
|
+
budgetBytes += headerSize;
|
|
225
|
+
if (budgetBytes > maxUnpackedBytes)
|
|
226
|
+
throw new Error(`tar contents exceed ${maxUnpackedBytes} bytes`);
|
|
227
|
+
const contentStart = offset + TAR_BLOCK;
|
|
228
|
+
const contentEnd = contentStart + headerSize;
|
|
229
|
+
if (contentEnd > archive.length)
|
|
230
|
+
throw new Error('tar entry exceeds archive bounds');
|
|
231
|
+
const paddedSize = Math.ceil(headerSize / TAR_BLOCK) * TAR_BLOCK;
|
|
232
|
+
const nextOffset = contentStart + paddedSize;
|
|
233
|
+
if (nextOffset > archive.length)
|
|
234
|
+
throw new Error('tar padding exceeds archive bounds');
|
|
235
|
+
const typeFlag = String.fromCharCode(header[156] ?? 0);
|
|
236
|
+
const contents = archive.subarray(contentStart, contentEnd);
|
|
237
|
+
const headerName = readString(header, 0, 100);
|
|
238
|
+
const prefix = readString(header, 345, 155);
|
|
239
|
+
const combinedHeaderName = prefix === '' ? headerName : `${prefix}/${headerName}`;
|
|
240
|
+
if (typeFlag === 'x' || typeFlag === 'g') {
|
|
241
|
+
const parsed = parsePax(contents);
|
|
242
|
+
if (parsed.size !== undefined)
|
|
243
|
+
throw new Error('unsupported PAX size override');
|
|
244
|
+
if (typeFlag === 'g')
|
|
245
|
+
globalPax = { ...globalPax, ...parsed };
|
|
246
|
+
else
|
|
247
|
+
pendingPax = parsed;
|
|
248
|
+
offset = nextOffset;
|
|
249
|
+
continue;
|
|
250
|
+
}
|
|
251
|
+
if (typeFlag === 'L' || typeFlag === 'K') {
|
|
252
|
+
const value = UTF8_DECODER.decode(contents).replace(/\0.*$/s, '').replace(/\n$/, '');
|
|
253
|
+
if (typeFlag === 'L')
|
|
254
|
+
pendingLongName = value;
|
|
255
|
+
else
|
|
256
|
+
pendingLongLink = value;
|
|
257
|
+
offset = nextOffset;
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const pax = { ...globalPax, ...pendingPax };
|
|
261
|
+
const rawPath = pax.path ?? pendingLongName ?? combinedHeaderName;
|
|
262
|
+
const rawLink = pax.linkpath ?? pendingLongLink ?? readString(header, 157, 100);
|
|
263
|
+
pendingPax = {};
|
|
264
|
+
pendingLongName = undefined;
|
|
265
|
+
pendingLongLink = undefined;
|
|
266
|
+
const normalized = normalizeNpmPath(rawPath, archiveRoot);
|
|
267
|
+
if (normalized.path === undefined) {
|
|
268
|
+
addFinding(finding('archive-unsafe-path', 'critical', `Unsafe archive path: ${rawPath.slice(0, 1_024)}`, `The entry ${normalized.issue ?? 'cannot be normalized safely'}.`, { path: rawPath.slice(0, 1_024) }));
|
|
269
|
+
offset = nextOffset;
|
|
270
|
+
continue;
|
|
271
|
+
}
|
|
272
|
+
archiveRoot ??= normalized.root;
|
|
273
|
+
const entryPath = normalized.path;
|
|
274
|
+
if (entryPath === '') {
|
|
275
|
+
if (typeFlag !== '5') {
|
|
276
|
+
addFinding(finding('archive-invalid-root-entry', 'critical', 'Archive package root is not a directory', 'Only a directory entry may represent the top-level archive root.', { path: rawPath.slice(0, 1_024), typeFlag }));
|
|
277
|
+
}
|
|
278
|
+
offset = nextOffset;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
const portableKey = entryPath.normalize('NFC').toLowerCase();
|
|
282
|
+
const existingPortable = portablePaths.get(portableKey);
|
|
283
|
+
if (exactPaths.has(entryPath) || (existingPortable !== undefined && existingPortable !== entryPath)) {
|
|
284
|
+
addFinding(finding('archive-path-collision', 'critical', `Archive path collides with another entry: ${entryPath}`, 'Duplicate or case/Unicode-colliding paths can materialize differently across filesystems.', { path: entryPath, collidesWith: existingPortable ?? entryPath }));
|
|
285
|
+
offset = nextOffset;
|
|
286
|
+
continue;
|
|
287
|
+
}
|
|
288
|
+
exactPaths.add(entryPath);
|
|
289
|
+
portablePaths.set(portableKey, entryPath);
|
|
290
|
+
const mode = readOctal(header, 100, 8, 'mode');
|
|
291
|
+
const regularFile = typeFlag === '\0' || typeFlag === '0' || typeFlag === '7';
|
|
292
|
+
if (regularFile) {
|
|
293
|
+
fileBytes += headerSize;
|
|
294
|
+
const digest = createHash('sha256').update(contents).digest('hex');
|
|
295
|
+
entries.push({ path: entryPath, type: 'file', mode, size: headerSize, digest, contents: Buffer.from(contents) });
|
|
296
|
+
}
|
|
297
|
+
else if (typeFlag === '5') {
|
|
298
|
+
const digest = createHash('sha256').update('directory').digest('hex');
|
|
299
|
+
entries.push({ path: entryPath, type: 'directory', mode, size: 0, digest });
|
|
300
|
+
}
|
|
301
|
+
else if (typeFlag === '2' || typeFlag === '1') {
|
|
302
|
+
const escapes = linkEscapesPackage(entryPath, rawLink);
|
|
303
|
+
const linkType = typeFlag === '2' ? 'symlink' : 'hardlink';
|
|
304
|
+
addFinding(finding(escapes ? 'archive-link-escapes-package' : 'archive-link-present', escapes ? 'critical' : 'medium', escapes ? `Archive ${linkType} escapes the package root` : `Archive contains a ${linkType}`, escapes
|
|
305
|
+
? 'Materializing this link could access or overwrite content outside the reviewed package.'
|
|
306
|
+
: 'Links require review because materialization differs across package managers and platforms.', { path: entryPath, target: rawLink.slice(0, 1_024), linkType }));
|
|
307
|
+
const digest = createHash('sha256').update(`${linkType}:${rawLink}`).digest('hex');
|
|
308
|
+
entries.push({ path: entryPath, type: linkType, mode, size: 0, digest, linkTarget: rawLink.slice(0, MAX_PATH_BYTES) });
|
|
309
|
+
}
|
|
310
|
+
else {
|
|
311
|
+
addFinding(finding('archive-special-entry', 'critical', `Archive contains unsupported entry type ${JSON.stringify(typeFlag)}`, 'Device, FIFO and unknown tar entry types are not safe to materialize during plugin review.', { path: entryPath, typeFlag }));
|
|
312
|
+
}
|
|
313
|
+
offset = nextOffset;
|
|
314
|
+
}
|
|
315
|
+
inspectPathTopology(entries, addFinding);
|
|
316
|
+
if (omittedFindings > 0) {
|
|
317
|
+
findings.push(finding('archive-findings-truncated', 'high', 'Additional archive findings were omitted', 'The report retained the highest-severity archive findings within its output budget.', { omittedFindings, retainedFindings: findings.length }));
|
|
318
|
+
}
|
|
319
|
+
return {
|
|
320
|
+
entries,
|
|
321
|
+
findings,
|
|
322
|
+
compressedBytes: compressed.length,
|
|
323
|
+
unpackedBytes: fileBytes,
|
|
324
|
+
treeDigest: treeDigest(entries),
|
|
325
|
+
};
|
|
326
|
+
}
|
|
327
|
+
//# sourceMappingURL=tar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tar.js","sourceRoot":"","sources":["../../src/tar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import type { DependencyGraph } from './radar-types.js';
|
|
2
|
+
export declare const REPORT_SCHEMA: 'upstream-radar.scan/v1alpha1';
|
|
3
|
+
export type Severity = 'info' | 'low' | 'medium' | 'high' | 'critical';
|
|
4
|
+
export type Verdict = 'allow' | 'warn' | 'review' | 'block';
|
|
5
|
+
export type CoverageVerdict = 'complete' | 'incomplete';
|
|
6
|
+
export type CheckStatus = 'verified' | 'missing' | 'invalid' | 'failed' | 'not-checked' | 'present-unverified';
|
|
7
|
+
export interface Finding {
|
|
8
|
+
code: string;
|
|
9
|
+
severity: Severity;
|
|
10
|
+
summary: string;
|
|
11
|
+
detail: string;
|
|
12
|
+
evidence?: Record<string, boolean | number | string | string[]>;
|
|
13
|
+
remediation?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface DependencyEvidence {
|
|
16
|
+
name: string;
|
|
17
|
+
scope: 'dependency' | 'devDependency' | 'optionalDependency' | 'peerDependency';
|
|
18
|
+
spec: string;
|
|
19
|
+
}
|
|
20
|
+
export interface LifecycleScriptEvidence {
|
|
21
|
+
name: string;
|
|
22
|
+
command: string;
|
|
23
|
+
}
|
|
24
|
+
export interface DshEvidence {
|
|
25
|
+
isBundle: boolean;
|
|
26
|
+
patch?: string;
|
|
27
|
+
}
|
|
28
|
+
export interface Coverage {
|
|
29
|
+
staticSource: 'complete' | 'incomplete';
|
|
30
|
+
artifactIntegrity: 'locally-hashed' | 'verified' | 'invalid' | 'not-checked';
|
|
31
|
+
registrySignature: CheckStatus;
|
|
32
|
+
dependencyResolution: 'manifest-only' | 'resolved';
|
|
33
|
+
provenance: CheckStatus;
|
|
34
|
+
sourceArtifactMatch: 'not-checked' | 'matched' | 'mismatch';
|
|
35
|
+
sandboxDetonation: 'not-run';
|
|
36
|
+
}
|
|
37
|
+
export interface VulnerabilitySummary {
|
|
38
|
+
info: number;
|
|
39
|
+
low: number;
|
|
40
|
+
moderate: number;
|
|
41
|
+
high: number;
|
|
42
|
+
critical: number;
|
|
43
|
+
total: number;
|
|
44
|
+
}
|
|
45
|
+
export interface NpmProvenanceEvidence {
|
|
46
|
+
status: CheckStatus;
|
|
47
|
+
predicateType?: string;
|
|
48
|
+
sourceRepository?: string;
|
|
49
|
+
sourceRef?: string;
|
|
50
|
+
sourceCommit?: string;
|
|
51
|
+
workflow?: string;
|
|
52
|
+
builder?: string;
|
|
53
|
+
}
|
|
54
|
+
export interface NpmEvidence {
|
|
55
|
+
registry: string;
|
|
56
|
+
tarball: string;
|
|
57
|
+
compressedBytes: number;
|
|
58
|
+
unpackedBytes: number;
|
|
59
|
+
integrity: {
|
|
60
|
+
status: 'verified' | 'invalid';
|
|
61
|
+
algorithm: string;
|
|
62
|
+
expected: string;
|
|
63
|
+
actual: string;
|
|
64
|
+
};
|
|
65
|
+
registrySignature: {
|
|
66
|
+
status: CheckStatus;
|
|
67
|
+
keyIds: string[];
|
|
68
|
+
};
|
|
69
|
+
provenance: NpmProvenanceEvidence;
|
|
70
|
+
dependencyAudit: {
|
|
71
|
+
status: 'not-run' | 'verified' | 'findings' | 'failed';
|
|
72
|
+
packages: number | null;
|
|
73
|
+
graphDigest?: string;
|
|
74
|
+
graph?: DependencyGraph;
|
|
75
|
+
invalidSignatures: string[];
|
|
76
|
+
missingSignatures: string[];
|
|
77
|
+
vulnerabilities: VulnerabilitySummary | null;
|
|
78
|
+
error?: string;
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
export interface ScanReport {
|
|
82
|
+
schema: typeof REPORT_SCHEMA;
|
|
83
|
+
tool: {
|
|
84
|
+
name: 'upstream-radar';
|
|
85
|
+
version: string;
|
|
86
|
+
};
|
|
87
|
+
target: {
|
|
88
|
+
kind: 'directory' | 'npm';
|
|
89
|
+
name: string;
|
|
90
|
+
version: string | null;
|
|
91
|
+
artifactDigest: string;
|
|
92
|
+
treeDigest?: string;
|
|
93
|
+
spec?: string;
|
|
94
|
+
};
|
|
95
|
+
dsh: DshEvidence;
|
|
96
|
+
evidence: {
|
|
97
|
+
filesScanned: number;
|
|
98
|
+
bytesHashed: number;
|
|
99
|
+
lockfiles: string[];
|
|
100
|
+
packageManager: string | null;
|
|
101
|
+
lifecycleScripts: LifecycleScriptEvidence[];
|
|
102
|
+
dependencies: DependencyEvidence[];
|
|
103
|
+
npm?: NpmEvidence;
|
|
104
|
+
};
|
|
105
|
+
coverage: Coverage;
|
|
106
|
+
findings: Finding[];
|
|
107
|
+
riskVerdict: Verdict;
|
|
108
|
+
coverageVerdict: CoverageVerdict;
|
|
109
|
+
verdict: Verdict;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAG,8BAAuC,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,YAAY,UAAU,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/version.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAA"}
|
|
Binary file
|
|
Binary file
|
package/package.json
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "upstream-radar",
|
|
3
|
+
"version": "0.4.0",
|
|
4
|
+
"description": "Always-on vulnerability and breaking-change impact monitoring for DeepSeek Harness plugins.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"author": "MicroMilo",
|
|
8
|
+
"homepage": "https://github.com/MicroMilo/upstream-radar#readme",
|
|
9
|
+
"repository": {
|
|
10
|
+
"type": "git",
|
|
11
|
+
"url": "git+https://github.com/MicroMilo/upstream-radar.git"
|
|
12
|
+
},
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/MicroMilo/upstream-radar/issues"
|
|
15
|
+
},
|
|
16
|
+
"keywords": [
|
|
17
|
+
"deepseek-harness",
|
|
18
|
+
"dsh-plugin",
|
|
19
|
+
"cordis",
|
|
20
|
+
"dependency-security",
|
|
21
|
+
"vulnerability-monitoring",
|
|
22
|
+
"breaking-changes",
|
|
23
|
+
"supply-chain"
|
|
24
|
+
],
|
|
25
|
+
"engines": {
|
|
26
|
+
"node": ">=22"
|
|
27
|
+
},
|
|
28
|
+
"packageManager": "pnpm@11.3.0",
|
|
29
|
+
"publishConfig": {
|
|
30
|
+
"access": "public"
|
|
31
|
+
},
|
|
32
|
+
"bin": {
|
|
33
|
+
"upstream-radar": "dist/src/cli.js"
|
|
34
|
+
},
|
|
35
|
+
"exports": {
|
|
36
|
+
".": {
|
|
37
|
+
"types": "./dist/src/index.d.ts",
|
|
38
|
+
"import": "./dist/src/index.js"
|
|
39
|
+
},
|
|
40
|
+
"./dsh": {
|
|
41
|
+
"types": "./dist/src/dsh-plugin.d.ts",
|
|
42
|
+
"import": "./dist/src/dsh-plugin.js"
|
|
43
|
+
},
|
|
44
|
+
"./cordis.patch.yml": {
|
|
45
|
+
"default": "./cordis.patch.yml"
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
"files": [
|
|
49
|
+
"dist/src",
|
|
50
|
+
"schemas",
|
|
51
|
+
"cordis.patch.yml",
|
|
52
|
+
"docs/assets/upstream-radar-hero.jpg",
|
|
53
|
+
"docs/assets/upstream-radar-hero-mobile.jpg",
|
|
54
|
+
"README.md",
|
|
55
|
+
"README.zh-CN.md",
|
|
56
|
+
"LICENSE"
|
|
57
|
+
],
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsc -p tsconfig.json",
|
|
60
|
+
"cli": "node dist/src/cli.js",
|
|
61
|
+
"check": "tsc -p tsconfig.json --noEmit",
|
|
62
|
+
"scan:self": "pnpm run build && node dist/src/cli.js scan . --fail-on block",
|
|
63
|
+
"showcase": "pnpm run build && node scripts/radar-showcase.mjs",
|
|
64
|
+
"showcase:reports": "pnpm run build && node scripts/radar-showcase.mjs --write-reports",
|
|
65
|
+
"showcase:admission": "pnpm run build && node scripts/showcase.mjs",
|
|
66
|
+
"showcase:admission:reports": "pnpm run build && node scripts/showcase.mjs --write-reports",
|
|
67
|
+
"showcase:radar": "pnpm run build && node scripts/radar-showcase.mjs",
|
|
68
|
+
"showcase:radar:reports": "pnpm run build && node scripts/radar-showcase.mjs --write-reports",
|
|
69
|
+
"try:dsh": "pnpm run build && node scripts/dsh-headless-showcase.mjs",
|
|
70
|
+
"try:dsh:live": "pnpm run build && node scripts/dsh-headless-showcase.mjs --live-feeds",
|
|
71
|
+
"try:dsh:report": "pnpm run build && node scripts/dsh-headless-showcase.mjs --write-report",
|
|
72
|
+
"prepublishOnly": "pnpm test",
|
|
73
|
+
"test": "pnpm run build && node --test dist/test/*.test.js"
|
|
74
|
+
},
|
|
75
|
+
"dsh": {
|
|
76
|
+
"bundle": {
|
|
77
|
+
"patch": "./cordis.patch.yml"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
"devDependencies": {
|
|
81
|
+
"@types/node": "26.2.0",
|
|
82
|
+
"typescript": "7.0.2"
|
|
83
|
+
}
|
|
84
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
|
+
"$id": "https://github.com/MicroMilo/upstream-radar/blob/main/schemas/analysis-result.schema.json",
|
|
4
|
+
"title": "Upstream Radar project analysis result",
|
|
5
|
+
"type": "object",
|
|
6
|
+
"additionalProperties": false,
|
|
7
|
+
"required": [
|
|
8
|
+
"project_exposure",
|
|
9
|
+
"confidence",
|
|
10
|
+
"evidence",
|
|
11
|
+
"recommended_action",
|
|
12
|
+
"urgency",
|
|
13
|
+
"reasoning_summary"
|
|
14
|
+
],
|
|
15
|
+
"properties": {
|
|
16
|
+
"project_exposure": {
|
|
17
|
+
"enum": ["exposed", "likely_exposed", "not_exposed", "unknown"]
|
|
18
|
+
},
|
|
19
|
+
"confidence": {
|
|
20
|
+
"enum": ["high", "medium", "low"]
|
|
21
|
+
},
|
|
22
|
+
"evidence": {
|
|
23
|
+
"type": "array",
|
|
24
|
+
"items": { "type": "string" },
|
|
25
|
+
"maxItems": 100
|
|
26
|
+
},
|
|
27
|
+
"recommended_action": {
|
|
28
|
+
"type": "string",
|
|
29
|
+
"maxLength": 8192
|
|
30
|
+
},
|
|
31
|
+
"urgency": {
|
|
32
|
+
"enum": ["immediate", "within_24_hours", "planned", "monitor"]
|
|
33
|
+
},
|
|
34
|
+
"reasoning_summary": {
|
|
35
|
+
"type": "string",
|
|
36
|
+
"maxLength": 8192
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|