@surfinguard/core-engine 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/README.md +65 -0
- package/dist/analyzers/base.d.ts +38 -0
- package/dist/analyzers/base.d.ts.map +1 -0
- package/dist/analyzers/base.js +2 -0
- package/dist/analyzers/base.js.map +1 -0
- package/dist/analyzers/command.d.ts +44 -0
- package/dist/analyzers/command.d.ts.map +1 -0
- package/dist/analyzers/command.js +544 -0
- package/dist/analyzers/command.js.map +1 -0
- package/dist/analyzers/file-read.d.ts +31 -0
- package/dist/analyzers/file-read.d.ts.map +1 -0
- package/dist/analyzers/file-read.js +159 -0
- package/dist/analyzers/file-read.js.map +1 -0
- package/dist/analyzers/file-write.d.ts +32 -0
- package/dist/analyzers/file-write.d.ts.map +1 -0
- package/dist/analyzers/file-write.js +177 -0
- package/dist/analyzers/file-write.js.map +1 -0
- package/dist/analyzers/index.d.ts +7 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +6 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/text.d.ts +30 -0
- package/dist/analyzers/text.d.ts.map +1 -0
- package/dist/analyzers/text.js +139 -0
- package/dist/analyzers/text.js.map +1 -0
- package/dist/analyzers/url.d.ts +33 -0
- package/dist/analyzers/url.d.ts.map +1 -0
- package/dist/analyzers/url.js +325 -0
- package/dist/analyzers/url.js.map +1 -0
- package/dist/classifier.d.ts +7 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +12 -0
- package/dist/classifier.js.map +1 -0
- package/dist/context.d.ts +10 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +9 -0
- package/dist/context.js.map +1 -0
- package/dist/engine.d.ts +49 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +122 -0
- package/dist/engine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/patterns.d.ts +8 -0
- package/dist/patterns.d.ts.map +1 -0
- package/dist/patterns.js +66 -0
- package/dist/patterns.js.map +1 -0
- package/dist/scorer.d.ts +23 -0
- package/dist/scorer.d.ts.map +1 -0
- package/dist/scorer.js +52 -0
- package/dist/scorer.js.map +1 -0
- package/dist/verdict.d.ts +7 -0
- package/dist/verdict.d.ts.map +1 -0
- package/dist/verdict.js +41 -0
- package/dist/verdict.js.map +1 -0
- package/package.json +44 -0
- package/patterns/brands.json +205 -0
- package/patterns/commands.json +44 -0
- package/patterns/file-read.json +85 -0
- package/patterns/file-write.json +100 -0
- package/patterns/text.json +190 -0
- package/patterns/urls.json +412 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../../src/analyzers/url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAc,MAAM,oBAAoB,CAAC;AAC/F,OAAO,KAAK,EAAE,QAAQ,EAAmB,cAAc,EAAE,MAAM,WAAW,CAAC;AAK3E;;;;;GAKG;AACH,qBAAa,WAAY,YAAW,QAAQ;IAC1C,QAAQ,CAAC,UAAU,EAAG,KAAK,CAAU;IAErC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAc;IAC7C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAc;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAc;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAc;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAW;IAChD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAW;IAC5C,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAc;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAe;gBAE1B,WAAW,EAAE,kBAAkB,EAAE,aAAa,EAAE,oBAAoB;IAchF,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,cAAc;IAgNtC,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,mBAAmB;IAS3B,OAAO,CAAC,uBAAuB;IAY/B,OAAO,CAAC,uBAAuB;IA8B/B,OAAO,CAAC,gBAAgB;IAyBxB,OAAO,CAAC,eAAe;CAgBxB"}
|
|
@@ -0,0 +1,325 @@
|
|
|
1
|
+
const IPV4_REGEX = /^\d{1,3}(\.\d{1,3}){3}$/;
|
|
2
|
+
const DOUBLE_EXT_REGEX = /\.[a-z]{2,4}\.[a-z]{2,4}$/i;
|
|
3
|
+
/**
|
|
4
|
+
* URL Analyzer — heuristic URL threat detection.
|
|
5
|
+
*
|
|
6
|
+
* Ported from Surfinguard Android RiskEngine.kt with additions
|
|
7
|
+
* for RFC 1918 / cloud metadata detection (ESCALATION primitive).
|
|
8
|
+
*/
|
|
9
|
+
export class UrlAnalyzer {
|
|
10
|
+
actionType = 'url';
|
|
11
|
+
trackerDomains;
|
|
12
|
+
adClickParams;
|
|
13
|
+
shorteners;
|
|
14
|
+
freeHostingPlatforms;
|
|
15
|
+
riskyTlds;
|
|
16
|
+
redirectParamKeys;
|
|
17
|
+
highRiskKeywords;
|
|
18
|
+
suspiciousExtensions;
|
|
19
|
+
internalIpRanges;
|
|
20
|
+
cloudMetadataEndpoints;
|
|
21
|
+
brands;
|
|
22
|
+
constructor(urlPatterns, brandPatterns) {
|
|
23
|
+
this.trackerDomains = new Set(urlPatterns.trackerDomains);
|
|
24
|
+
this.adClickParams = new Set(urlPatterns.adClickParams);
|
|
25
|
+
this.shorteners = new Set(urlPatterns.shorteners);
|
|
26
|
+
this.freeHostingPlatforms = new Set(urlPatterns.freeHostingPlatforms);
|
|
27
|
+
this.riskyTlds = new Set(urlPatterns.riskyTlds);
|
|
28
|
+
this.redirectParamKeys = new Set(urlPatterns.redirectParamKeys);
|
|
29
|
+
this.highRiskKeywords = urlPatterns.highRiskKeywords;
|
|
30
|
+
this.suspiciousExtensions = urlPatterns.suspiciousExtensions;
|
|
31
|
+
this.internalIpRanges = urlPatterns.internalIpRanges;
|
|
32
|
+
this.cloudMetadataEndpoints = new Set(urlPatterns.cloudMetadataEndpoints);
|
|
33
|
+
this.brands = brandPatterns.brands;
|
|
34
|
+
}
|
|
35
|
+
analyze(value) {
|
|
36
|
+
const trimmedUrl = value.trim();
|
|
37
|
+
const findings = [];
|
|
38
|
+
const add = (primitive, score, reason, threatId) => {
|
|
39
|
+
findings.push({ primitive, score, reason, threatId });
|
|
40
|
+
};
|
|
41
|
+
// ── Special URIs ──────────────────────────────────────────────────
|
|
42
|
+
const lower = trimmedUrl.toLowerCase();
|
|
43
|
+
if (lower.startsWith('data:')) {
|
|
44
|
+
add('MANIPULATION', 10, 'Data URI can hide malicious content', 'U01');
|
|
45
|
+
return { actionType: 'url', findings };
|
|
46
|
+
}
|
|
47
|
+
if (lower.startsWith('javascript:')) {
|
|
48
|
+
add('MANIPULATION', 10, 'JavaScript URI detected', 'U02');
|
|
49
|
+
return { actionType: 'url', findings };
|
|
50
|
+
}
|
|
51
|
+
// ── URL Parsing ───────────────────────────────────────────────────
|
|
52
|
+
let parsed;
|
|
53
|
+
try {
|
|
54
|
+
parsed = new URL(trimmedUrl);
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
add('MANIPULATION', 10, 'Malformed or invalid URL', 'U03');
|
|
58
|
+
return { actionType: 'url', findings };
|
|
59
|
+
}
|
|
60
|
+
const host = parsed.hostname.toLowerCase().replace(/^www\./, '');
|
|
61
|
+
if (!host) {
|
|
62
|
+
add('MANIPULATION', 10, 'Malformed or invalid URL', 'U03');
|
|
63
|
+
return { actionType: 'url', findings };
|
|
64
|
+
}
|
|
65
|
+
// ── Known tracker bypass ──────────────────────────────────────────
|
|
66
|
+
if (this.isKnownTracker(host)) {
|
|
67
|
+
return {
|
|
68
|
+
actionType: 'url',
|
|
69
|
+
findings: [],
|
|
70
|
+
shortCircuit: { safe: true, reason: 'Known ad/analytics service' },
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
// ── HIGH SEVERITY (5-8 pts) ───────────────────────────────────────
|
|
74
|
+
// @ symbol in URL (credential theft / URL obfuscation)
|
|
75
|
+
if (trimmedUrl.includes('@') && trimmedUrl.substring(0, trimmedUrl.indexOf('@')).includes('://')) {
|
|
76
|
+
add('MANIPULATION', 6, "URL uses '@' to disguise real destination", 'U05');
|
|
77
|
+
}
|
|
78
|
+
// IP address instead of domain
|
|
79
|
+
if (IPV4_REGEX.test(host)) {
|
|
80
|
+
// Check cloud metadata endpoints first
|
|
81
|
+
if (this.cloudMetadataEndpoints.has(host)) {
|
|
82
|
+
add('ESCALATION', 9, `Targets cloud metadata endpoint (${host})`, 'U14');
|
|
83
|
+
}
|
|
84
|
+
// Check internal/RFC1918 ranges
|
|
85
|
+
else if (this.isInternalIp(host)) {
|
|
86
|
+
add('ESCALATION', 7, 'Targets internal network address', 'U13');
|
|
87
|
+
}
|
|
88
|
+
// Public IP
|
|
89
|
+
else {
|
|
90
|
+
add('MANIPULATION', 7, 'Uses IP address instead of domain name', 'U04');
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
// IPv6 address
|
|
94
|
+
if (host.startsWith('[') && host.endsWith(']')) {
|
|
95
|
+
add('MANIPULATION', 7, 'Uses IPv6 address instead of domain name', 'U04');
|
|
96
|
+
}
|
|
97
|
+
// Punycode (internationalized domain - potential homograph)
|
|
98
|
+
if (host.startsWith('xn--') || host.includes('.xn--')) {
|
|
99
|
+
add('MANIPULATION', 5, 'Internationalized domain (punycode) may hide lookalike characters', 'U06');
|
|
100
|
+
}
|
|
101
|
+
// Brand impersonation check
|
|
102
|
+
const brandCheck = this.checkBrandImpersonation(host);
|
|
103
|
+
if (brandCheck) {
|
|
104
|
+
add('MANIPULATION', brandCheck.score, brandCheck.reason, 'U07');
|
|
105
|
+
}
|
|
106
|
+
// ── MEDIUM SEVERITY (2-4 pts) ─────────────────────────────────────
|
|
107
|
+
// URL shortener
|
|
108
|
+
if (this.isShortener(host)) {
|
|
109
|
+
add('MANIPULATION', 3, 'Link shortener hides actual destination', 'U08');
|
|
110
|
+
}
|
|
111
|
+
// Free hosting platform check
|
|
112
|
+
const hostingMatch = this.findHostingPlatform(host);
|
|
113
|
+
if (hostingMatch) {
|
|
114
|
+
const subdomain = host.slice(0, -(hostingMatch.length + 1)); // remove ".platform"
|
|
115
|
+
const looksLikeBrand = this.subdomainLooksLikeBrand(subdomain);
|
|
116
|
+
if (looksLikeBrand) {
|
|
117
|
+
add('MANIPULATION', 7, `Suspicious site on free hosting (${hostingMatch}) impersonating a brand`, 'U09');
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
add('MANIPULATION', 4, `Site hosted on free platform (${hostingMatch}) commonly used for scams`, 'U09');
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Deep subdomain structure
|
|
124
|
+
const subdomainCount = host.split('.').length;
|
|
125
|
+
if (subdomainCount >= 5) {
|
|
126
|
+
add('MANIPULATION', 3, `Unusually deep subdomain structure (${subdomainCount} levels)`);
|
|
127
|
+
}
|
|
128
|
+
else if (subdomainCount === 4) {
|
|
129
|
+
add('MANIPULATION', 1, 'Multiple subdomains detected');
|
|
130
|
+
}
|
|
131
|
+
// High-risk TLD
|
|
132
|
+
const tld = host.split('.').pop();
|
|
133
|
+
if (this.riskyTlds.has(tld)) {
|
|
134
|
+
add('MANIPULATION', 3, `Uses high-risk TLD (.${tld}) commonly associated with scams`, 'U10');
|
|
135
|
+
}
|
|
136
|
+
// Heavy URL encoding
|
|
137
|
+
const percentCount = countChar(trimmedUrl, '%');
|
|
138
|
+
if (percentCount >= 12) {
|
|
139
|
+
add('MANIPULATION', 3, 'Heavily obfuscated URL encoding');
|
|
140
|
+
}
|
|
141
|
+
else if (percentCount >= 8) {
|
|
142
|
+
add('MANIPULATION', 2, 'Suspicious URL encoding');
|
|
143
|
+
}
|
|
144
|
+
// Very long URL
|
|
145
|
+
if (trimmedUrl.length >= 300) {
|
|
146
|
+
add('MANIPULATION', 3, `Extremely long URL (${trimmedUrl.length} chars)`);
|
|
147
|
+
}
|
|
148
|
+
else if (trimmedUrl.length >= 200) {
|
|
149
|
+
add('MANIPULATION', 2, 'Very long URL');
|
|
150
|
+
}
|
|
151
|
+
else if (trimmedUrl.length >= 150) {
|
|
152
|
+
add('MANIPULATION', 1, 'Long URL');
|
|
153
|
+
}
|
|
154
|
+
// Nested redirects
|
|
155
|
+
const { count: nestedCount, finalHost: finalDest } = this.analyzeRedirects(parsed, host);
|
|
156
|
+
if (nestedCount >= 3) {
|
|
157
|
+
add('MANIPULATION', 4, `Multiple nested redirects detected (${nestedCount} levels)`, 'U11');
|
|
158
|
+
}
|
|
159
|
+
else if (nestedCount >= 1) {
|
|
160
|
+
add('MANIPULATION', 2, 'Contains redirect to another URL', 'U11');
|
|
161
|
+
if (finalDest && finalDest !== host) {
|
|
162
|
+
add('MANIPULATION', 1, `Redirects to different domain: ${finalDest}`);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// ── LOW SEVERITY (1-2 pts) ────────────────────────────────────────
|
|
166
|
+
// Sensitive keywords in path/query/host
|
|
167
|
+
const haystack = `${parsed.pathname} ${parsed.search} ${host}`.toLowerCase();
|
|
168
|
+
const keywordHits = this.highRiskKeywords.filter((kw) => haystack.includes(kw)).length;
|
|
169
|
+
if (keywordHits >= 4) {
|
|
170
|
+
add('MANIPULATION', 4, 'Multiple sensitive keywords found (login, password, verify, etc.)');
|
|
171
|
+
}
|
|
172
|
+
else if (keywordHits >= 2) {
|
|
173
|
+
add('MANIPULATION', 2, 'Contains sensitive keywords (potential phishing)');
|
|
174
|
+
}
|
|
175
|
+
else if (keywordHits === 1) {
|
|
176
|
+
add('MANIPULATION', 1, 'Contains a sensitive keyword');
|
|
177
|
+
}
|
|
178
|
+
// Domain with many hyphens
|
|
179
|
+
const hyphenCount = countChar(host, '-');
|
|
180
|
+
if (hyphenCount >= 5) {
|
|
181
|
+
add('MANIPULATION', 2, 'Domain contains excessive hyphens');
|
|
182
|
+
}
|
|
183
|
+
else if (hyphenCount >= 3) {
|
|
184
|
+
add('MANIPULATION', 1, 'Domain contains multiple hyphens');
|
|
185
|
+
}
|
|
186
|
+
// Domain with many digits
|
|
187
|
+
const digitCount = host.split('').filter((c) => c >= '0' && c <= '9').length;
|
|
188
|
+
if (digitCount >= 8) {
|
|
189
|
+
add('MANIPULATION', 2, 'Domain contains many digits');
|
|
190
|
+
}
|
|
191
|
+
else if (digitCount >= 5) {
|
|
192
|
+
add('MANIPULATION', 1, 'Domain contains several digits');
|
|
193
|
+
}
|
|
194
|
+
// Mixed protocols in URL
|
|
195
|
+
if ((lower.startsWith('http://') && lower.includes('https://')) ||
|
|
196
|
+
(lower.startsWith('https://') && lower.substring(8).includes('http://'))) {
|
|
197
|
+
add('MANIPULATION', 1, 'URL contains mixed HTTP/HTTPS protocols');
|
|
198
|
+
}
|
|
199
|
+
// Suspicious file extensions
|
|
200
|
+
if (this.suspiciousExtensions.some((ext) => lower.includes(ext))) {
|
|
201
|
+
add('DESTRUCTION', 3, 'URL references potentially dangerous file type', 'U12');
|
|
202
|
+
}
|
|
203
|
+
// Double file extensions
|
|
204
|
+
if (DOUBLE_EXT_REGEX.test(trimmedUrl)) {
|
|
205
|
+
add('DESTRUCTION', 2, 'Double file extension detected (common malware trick)', 'U12');
|
|
206
|
+
}
|
|
207
|
+
// ── AD CLICK PARAMETER ADJUSTMENT ─────────────────────────────────
|
|
208
|
+
const hasAdClickParams = [...parsed.searchParams.keys()].some((key) => this.adClickParams.has(key.toLowerCase()));
|
|
209
|
+
if (hasAdClickParams && findings.length > 0) {
|
|
210
|
+
// Apply a -3 adjustment as a negative-score finding
|
|
211
|
+
add('MANIPULATION', -3, 'Ad click detected — reduced risk (paid ad destination)');
|
|
212
|
+
}
|
|
213
|
+
return { actionType: 'url', findings };
|
|
214
|
+
}
|
|
215
|
+
// ── Helpers ───────────────────────────────────────────────────────────
|
|
216
|
+
isKnownTracker(host) {
|
|
217
|
+
if (this.trackerDomains.has(host))
|
|
218
|
+
return true;
|
|
219
|
+
const parts = host.split('.');
|
|
220
|
+
for (let i = 1; i < parts.length - 1; i++) {
|
|
221
|
+
if (this.trackerDomains.has(parts.slice(i).join('.')))
|
|
222
|
+
return true;
|
|
223
|
+
}
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
isInternalIp(ip) {
|
|
227
|
+
return this.internalIpRanges.some((prefix) => ip.startsWith(prefix));
|
|
228
|
+
}
|
|
229
|
+
isShortener(host) {
|
|
230
|
+
if (this.shorteners.has(host))
|
|
231
|
+
return true;
|
|
232
|
+
for (const shortener of this.shorteners) {
|
|
233
|
+
if (host.endsWith(`.${shortener}`))
|
|
234
|
+
return true;
|
|
235
|
+
}
|
|
236
|
+
return false;
|
|
237
|
+
}
|
|
238
|
+
findHostingPlatform(host) {
|
|
239
|
+
for (const platform of this.freeHostingPlatforms) {
|
|
240
|
+
if (host.endsWith(`.${platform}`) || host === platform) {
|
|
241
|
+
return platform;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
return null;
|
|
245
|
+
}
|
|
246
|
+
subdomainLooksLikeBrand(subdomain) {
|
|
247
|
+
if (!subdomain)
|
|
248
|
+
return false;
|
|
249
|
+
const lower = subdomain.toLowerCase();
|
|
250
|
+
// Check against brand names
|
|
251
|
+
if (this.brands.some((b) => lower.includes(b.brand)))
|
|
252
|
+
return true;
|
|
253
|
+
// Check suspicious keywords in subdomain
|
|
254
|
+
const suspiciousWords = ['bank', 'pay', 'gov', 'secure', 'login', 'verify'];
|
|
255
|
+
return suspiciousWords.some((w) => lower.includes(w));
|
|
256
|
+
}
|
|
257
|
+
checkBrandImpersonation(host) {
|
|
258
|
+
const normalizedHost = host.toLowerCase();
|
|
259
|
+
for (const brand of this.brands) {
|
|
260
|
+
// First check if this is a legitimate domain for this brand
|
|
261
|
+
const isLegit = brand.legitimateDomains.some((legit) => normalizedHost === legit || normalizedHost.endsWith(`.${legit}`));
|
|
262
|
+
if (isLegit)
|
|
263
|
+
continue;
|
|
264
|
+
// Check for obvious typosquatting variants
|
|
265
|
+
if (brand.variants.some((v) => normalizedHost.includes(v))) {
|
|
266
|
+
return { score: 7, reason: `Possible impersonation of ${brand.brand} (suspicious spelling)` };
|
|
267
|
+
}
|
|
268
|
+
// Check if brand name appears on non-official domain
|
|
269
|
+
if (normalizedHost.includes(brand.brand)) {
|
|
270
|
+
if (!normalizedHost.endsWith(`.${brand.brand}.com`) &&
|
|
271
|
+
!normalizedHost.endsWith(`.${brand.brand}.net`) &&
|
|
272
|
+
!normalizedHost.endsWith(`.${brand.brand}.org`)) {
|
|
273
|
+
return { score: 5, reason: `Brand name '${brand.brand}' used on non-official domain` };
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
analyzeRedirects(url, _originalHost) {
|
|
280
|
+
let count = 0;
|
|
281
|
+
let currentParams = url.searchParams;
|
|
282
|
+
let lastHost = null;
|
|
283
|
+
for (let i = 0; i < 5; i++) {
|
|
284
|
+
const nestedUrl = this.findRedirectUrl(currentParams);
|
|
285
|
+
if (!nestedUrl)
|
|
286
|
+
break;
|
|
287
|
+
count++;
|
|
288
|
+
try {
|
|
289
|
+
const nestedParsed = new URL(nestedUrl);
|
|
290
|
+
lastHost = nestedParsed.hostname.toLowerCase().replace(/^www\./, '');
|
|
291
|
+
currentParams = nestedParsed.searchParams;
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
break;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
return { count, finalHost: lastHost };
|
|
298
|
+
}
|
|
299
|
+
findRedirectUrl(params) {
|
|
300
|
+
for (const [key, value] of params) {
|
|
301
|
+
if (this.redirectParamKeys.has(key.toLowerCase())) {
|
|
302
|
+
let decoded;
|
|
303
|
+
try {
|
|
304
|
+
decoded = decodeURIComponent(value);
|
|
305
|
+
}
|
|
306
|
+
catch {
|
|
307
|
+
decoded = value;
|
|
308
|
+
}
|
|
309
|
+
if (decoded.startsWith('http://') || decoded.startsWith('https://')) {
|
|
310
|
+
return decoded;
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
return null;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
function countChar(str, char) {
|
|
318
|
+
let count = 0;
|
|
319
|
+
for (let i = 0; i < str.length; i++) {
|
|
320
|
+
if (str[i] === char)
|
|
321
|
+
count++;
|
|
322
|
+
}
|
|
323
|
+
return count;
|
|
324
|
+
}
|
|
325
|
+
//# sourceMappingURL=url.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../../src/analyzers/url.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { ActionType } from '@surfinguard/types';
|
|
2
|
+
/**
|
|
3
|
+
* Classifies an action input to determine which analyzer to use.
|
|
4
|
+
* Returns the action type if an analyzer exists, otherwise null.
|
|
5
|
+
*/
|
|
6
|
+
export declare function classifyAction(type: ActionType): ActionType | null;
|
|
7
|
+
//# sourceMappingURL=classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.d.ts","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAKrD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,GAAG,IAAI,CAGlE"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** Action types with implemented analyzers. */
|
|
2
|
+
const SUPPORTED_TYPES = new Set(['url', 'command', 'text', 'file_read', 'file_write']);
|
|
3
|
+
/**
|
|
4
|
+
* Classifies an action input to determine which analyzer to use.
|
|
5
|
+
* Returns the action type if an analyzer exists, otherwise null.
|
|
6
|
+
*/
|
|
7
|
+
export function classifyAction(type) {
|
|
8
|
+
if (SUPPORTED_TYPES.has(type))
|
|
9
|
+
return type;
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classifier.js","sourceRoot":"","sources":["../src/classifier.ts"],"names":[],"mappings":"AAEA,+CAA+C;AAC/C,MAAM,eAAe,GAAoB,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,CAAC;AAExG;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,IAAgB;IAC7C,IAAI,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { ActionContext } from '@surfinguard/types';
|
|
2
|
+
/**
|
|
3
|
+
* Context engine stub for M0.
|
|
4
|
+
* Future milestones will use session history, agent trust, and behavioral patterns
|
|
5
|
+
* to adjust risk scores contextually.
|
|
6
|
+
*/
|
|
7
|
+
export declare function applyContext(_context?: ActionContext): {
|
|
8
|
+
multiplier: number;
|
|
9
|
+
};
|
|
10
|
+
//# sourceMappingURL=context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAExD;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,QAAQ,CAAC,EAAE,aAAa,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAE7E"}
|
package/dist/context.js
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Context engine stub for M0.
|
|
3
|
+
* Future milestones will use session history, agent trust, and behavioral patterns
|
|
4
|
+
* to adjust risk scores contextually.
|
|
5
|
+
*/
|
|
6
|
+
export function applyContext(_context) {
|
|
7
|
+
return { multiplier: 1.0 };
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,QAAwB;IACnD,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;AAC7B,CAAC"}
|
package/dist/engine.d.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { ActionInput, ActionContext, CheckResult } from '@surfinguard/types';
|
|
2
|
+
export interface CoreEngineOptions {
|
|
3
|
+
/** Custom URL patterns (overrides default) */
|
|
4
|
+
urlPatternsPath?: string;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Main entry point for the Surfinguard AI Security SDK.
|
|
8
|
+
*
|
|
9
|
+
* Usage:
|
|
10
|
+
* ```ts
|
|
11
|
+
* const engine = new CoreEngine();
|
|
12
|
+
* const result = engine.check({ type: 'url', value: 'https://example.com' });
|
|
13
|
+
* if (!result.allow) { // block the action }
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export declare class CoreEngine {
|
|
17
|
+
static readonly VERSION = "0.3.0";
|
|
18
|
+
private readonly urlAnalyzer;
|
|
19
|
+
private readonly commandAnalyzer;
|
|
20
|
+
private readonly textAnalyzer;
|
|
21
|
+
private readonly fileReadAnalyzer;
|
|
22
|
+
private readonly fileWriteAnalyzer;
|
|
23
|
+
constructor();
|
|
24
|
+
/**
|
|
25
|
+
* Analyze a single action and return a verdict.
|
|
26
|
+
*/
|
|
27
|
+
check(input: ActionInput, _context?: ActionContext): CheckResult;
|
|
28
|
+
/**
|
|
29
|
+
* Convenience method: analyze a URL string directly.
|
|
30
|
+
*/
|
|
31
|
+
checkUrl(url: string): CheckResult;
|
|
32
|
+
/**
|
|
33
|
+
* Convenience method: analyze a shell command string directly.
|
|
34
|
+
*/
|
|
35
|
+
checkCommand(command: string): CheckResult;
|
|
36
|
+
/**
|
|
37
|
+
* Convenience method: analyze text for prompt injection.
|
|
38
|
+
*/
|
|
39
|
+
checkText(text: string): CheckResult;
|
|
40
|
+
/**
|
|
41
|
+
* Convenience method: analyze a file read operation.
|
|
42
|
+
*/
|
|
43
|
+
checkFileRead(path: string): CheckResult;
|
|
44
|
+
/**
|
|
45
|
+
* Convenience method: analyze a file write operation with optional content.
|
|
46
|
+
*/
|
|
47
|
+
checkFileWrite(path: string, content?: string): CheckResult;
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAUlF,MAAM,WAAW,iBAAiB;IAChC,8CAA8C;IAC9C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,qBAAa,UAAU;IACrB,MAAM,CAAC,QAAQ,CAAC,OAAO,WAAW;IAElC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAc;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAkB;IAClD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAe;IAC5C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAoB;;IAoBtD;;OAEG;IACH,KAAK,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,EAAE,aAAa,GAAG,WAAW;IAoDhE;;OAEG;IACH,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAIlC;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW;IAI1C;;OAEG;IACH,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIpC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;IAIxC;;OAEG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,WAAW;CAG5D"}
|
package/dist/engine.js
ADDED
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { UrlAnalyzer } from './analyzers/url.js';
|
|
2
|
+
import { CommandAnalyzer } from './analyzers/command.js';
|
|
3
|
+
import { TextAnalyzer } from './analyzers/text.js';
|
|
4
|
+
import { FileReadAnalyzer } from './analyzers/file-read.js';
|
|
5
|
+
import { FileWriteAnalyzer } from './analyzers/file-write.js';
|
|
6
|
+
import { classifyAction } from './classifier.js';
|
|
7
|
+
import { buildVerdict } from './verdict.js';
|
|
8
|
+
import { loadUrlPatterns, loadBrandPatterns, loadCommandPatterns, loadTextPatterns, loadFileReadPatterns, loadFileWritePatterns } from './patterns.js';
|
|
9
|
+
/**
|
|
10
|
+
* Main entry point for the Surfinguard AI Security SDK.
|
|
11
|
+
*
|
|
12
|
+
* Usage:
|
|
13
|
+
* ```ts
|
|
14
|
+
* const engine = new CoreEngine();
|
|
15
|
+
* const result = engine.check({ type: 'url', value: 'https://example.com' });
|
|
16
|
+
* if (!result.allow) { // block the action }
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export class CoreEngine {
|
|
20
|
+
static VERSION = '0.3.0';
|
|
21
|
+
urlAnalyzer;
|
|
22
|
+
commandAnalyzer;
|
|
23
|
+
textAnalyzer;
|
|
24
|
+
fileReadAnalyzer;
|
|
25
|
+
fileWriteAnalyzer;
|
|
26
|
+
constructor() {
|
|
27
|
+
const urlPatterns = loadUrlPatterns();
|
|
28
|
+
const brandPatterns = loadBrandPatterns();
|
|
29
|
+
this.urlAnalyzer = new UrlAnalyzer(urlPatterns, brandPatterns);
|
|
30
|
+
const commandPatterns = loadCommandPatterns();
|
|
31
|
+
this.commandAnalyzer = new CommandAnalyzer(commandPatterns);
|
|
32
|
+
const textPatterns = loadTextPatterns();
|
|
33
|
+
this.textAnalyzer = new TextAnalyzer(textPatterns);
|
|
34
|
+
const fileReadPatterns = loadFileReadPatterns();
|
|
35
|
+
this.fileReadAnalyzer = new FileReadAnalyzer(fileReadPatterns);
|
|
36
|
+
const fileWritePatterns = loadFileWritePatterns();
|
|
37
|
+
this.fileWriteAnalyzer = new FileWriteAnalyzer(fileWritePatterns);
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Analyze a single action and return a verdict.
|
|
41
|
+
*/
|
|
42
|
+
check(input, _context) {
|
|
43
|
+
const startTime = performance.now();
|
|
44
|
+
const classified = classifyAction(input.type);
|
|
45
|
+
if (!classified) {
|
|
46
|
+
return {
|
|
47
|
+
allow: true,
|
|
48
|
+
score: 0,
|
|
49
|
+
level: 'SAFE',
|
|
50
|
+
primitive: null,
|
|
51
|
+
primitiveScores: [],
|
|
52
|
+
reasons: [`Action type '${input.type}' not yet supported`],
|
|
53
|
+
latencyMs: Math.round((performance.now() - startTime) * 100) / 100,
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
switch (classified) {
|
|
57
|
+
case 'url': {
|
|
58
|
+
const result = this.urlAnalyzer.analyze(input.value);
|
|
59
|
+
return buildVerdict(result, startTime);
|
|
60
|
+
}
|
|
61
|
+
case 'command': {
|
|
62
|
+
const result = this.commandAnalyzer.analyze(input.value);
|
|
63
|
+
return buildVerdict(result, startTime);
|
|
64
|
+
}
|
|
65
|
+
case 'text': {
|
|
66
|
+
const result = this.textAnalyzer.analyze(input.value);
|
|
67
|
+
return buildVerdict(result, startTime);
|
|
68
|
+
}
|
|
69
|
+
case 'file_read': {
|
|
70
|
+
const result = this.fileReadAnalyzer.analyze(input.value);
|
|
71
|
+
return buildVerdict(result, startTime);
|
|
72
|
+
}
|
|
73
|
+
case 'file_write': {
|
|
74
|
+
const content = input.metadata?.content;
|
|
75
|
+
const result = this.fileWriteAnalyzer.analyzeWithContent(input.value, content);
|
|
76
|
+
return buildVerdict(result, startTime);
|
|
77
|
+
}
|
|
78
|
+
default: {
|
|
79
|
+
return {
|
|
80
|
+
allow: true,
|
|
81
|
+
score: 0,
|
|
82
|
+
level: 'SAFE',
|
|
83
|
+
primitive: null,
|
|
84
|
+
primitiveScores: [],
|
|
85
|
+
reasons: [`Action type '${classified}' not yet implemented`],
|
|
86
|
+
latencyMs: Math.round((performance.now() - startTime) * 100) / 100,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Convenience method: analyze a URL string directly.
|
|
93
|
+
*/
|
|
94
|
+
checkUrl(url) {
|
|
95
|
+
return this.check({ type: 'url', value: url });
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Convenience method: analyze a shell command string directly.
|
|
99
|
+
*/
|
|
100
|
+
checkCommand(command) {
|
|
101
|
+
return this.check({ type: 'command', value: command });
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Convenience method: analyze text for prompt injection.
|
|
105
|
+
*/
|
|
106
|
+
checkText(text) {
|
|
107
|
+
return this.check({ type: 'text', value: text });
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Convenience method: analyze a file read operation.
|
|
111
|
+
*/
|
|
112
|
+
checkFileRead(path) {
|
|
113
|
+
return this.check({ type: 'file_read', value: path });
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Convenience method: analyze a file write operation with optional content.
|
|
117
|
+
*/
|
|
118
|
+
checkFileWrite(path, content) {
|
|
119
|
+
return this.check({ type: 'file_write', value: path, metadata: content ? { content } : undefined });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export { CoreEngine } from './engine.js';
|
|
2
|
+
export { UrlAnalyzer } from './analyzers/url.js';
|
|
3
|
+
export { CommandAnalyzer } from './analyzers/command.js';
|
|
4
|
+
export { TextAnalyzer } from './analyzers/text.js';
|
|
5
|
+
export { FileReadAnalyzer } from './analyzers/file-read.js';
|
|
6
|
+
export { FileWriteAnalyzer } from './analyzers/file-write.js';
|
|
7
|
+
export { scorePrimitives, scoreComposite } from './scorer.js';
|
|
8
|
+
export { buildVerdict } from './verdict.js';
|
|
9
|
+
export { loadUrlPatterns, loadBrandPatterns, loadCommandPatterns, loadTextPatterns, loadFileReadPatterns, loadFileWritePatterns } from './patterns.js';
|
|
10
|
+
export type { Analyzer, AnalyzerFinding, AnalyzerResult } from './analyzers/base.js';
|
|
11
|
+
export type { CompositeResult } from './scorer.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC;AACvJ,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrF,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { CoreEngine } from './engine.js';
|
|
2
|
+
export { UrlAnalyzer } from './analyzers/url.js';
|
|
3
|
+
export { CommandAnalyzer } from './analyzers/command.js';
|
|
4
|
+
export { TextAnalyzer } from './analyzers/text.js';
|
|
5
|
+
export { FileReadAnalyzer } from './analyzers/file-read.js';
|
|
6
|
+
export { FileWriteAnalyzer } from './analyzers/file-write.js';
|
|
7
|
+
export { scorePrimitives, scoreComposite } from './scorer.js';
|
|
8
|
+
export { buildVerdict } from './verdict.js';
|
|
9
|
+
export { loadUrlPatterns, loadBrandPatterns, loadCommandPatterns, loadTextPatterns, loadFileReadPatterns, loadFileWritePatterns } from './patterns.js';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,eAAe,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { UrlPatternDatabase, BrandPatternDatabase, CommandPatternDatabase, TextPatternDatabase, FileReadPatternDatabase, FileWritePatternDatabase } from '@surfinguard/types';
|
|
2
|
+
export declare function loadUrlPatterns(): UrlPatternDatabase;
|
|
3
|
+
export declare function loadBrandPatterns(): BrandPatternDatabase;
|
|
4
|
+
export declare function loadCommandPatterns(): CommandPatternDatabase;
|
|
5
|
+
export declare function loadTextPatterns(): TextPatternDatabase;
|
|
6
|
+
export declare function loadFileReadPatterns(): FileReadPatternDatabase;
|
|
7
|
+
export declare function loadFileWritePatterns(): FileWritePatternDatabase;
|
|
8
|
+
//# sourceMappingURL=patterns.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"patterns.d.ts","sourceRoot":"","sources":["../src/patterns.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,MAAM,oBAAoB,CAAC;AAmBnL,wBAAgB,eAAe,IAAI,kBAAkB,CAMpD;AAED,wBAAgB,iBAAiB,IAAI,oBAAoB,CAMxD;AAED,wBAAgB,mBAAmB,IAAI,sBAAsB,CAM5D;AAED,wBAAgB,gBAAgB,IAAI,mBAAmB,CAMtD;AAED,wBAAgB,oBAAoB,IAAI,uBAAuB,CAM9D;AAED,wBAAgB,qBAAqB,IAAI,wBAAwB,CAMhE"}
|