opena2a-cli 0.1.1 → 0.1.2
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 +2 -2
- package/dist/adapters/registry.js +1 -1
- package/dist/adapters/registry.js.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +78 -3
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/protect.d.ts +2 -0
- package/dist/commands/protect.d.ts.map +1 -1
- package/dist/commands/protect.js +56 -10
- package/dist/commands/protect.js.map +1 -1
- package/dist/commands/runtime.d.ts +1 -1
- package/dist/commands/runtime.js +5 -5
- package/dist/commands/runtime.js.map +1 -1
- package/dist/commands/self-register.js +6 -6
- package/dist/commands/self-register.js.map +1 -1
- package/dist/commands/shield.d.ts +36 -0
- package/dist/commands/shield.d.ts.map +1 -0
- package/dist/commands/shield.js +834 -0
- package/dist/commands/shield.js.map +1 -0
- package/dist/commands/verify.js +1 -1
- package/dist/commands/verify.js.map +1 -1
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -1
- package/dist/shield/detect.d.ts +18 -0
- package/dist/shield/detect.d.ts.map +1 -0
- package/dist/shield/detect.js +402 -0
- package/dist/shield/detect.js.map +1 -0
- package/dist/shield/events.d.ts +65 -0
- package/dist/shield/events.d.ts.map +1 -0
- package/dist/shield/events.js +342 -0
- package/dist/shield/events.js.map +1 -0
- package/dist/shield/init.d.ts +22 -0
- package/dist/shield/init.d.ts.map +1 -0
- package/dist/shield/init.js +290 -0
- package/dist/shield/init.js.map +1 -0
- package/dist/shield/integrity.d.ts +75 -0
- package/dist/shield/integrity.d.ts.map +1 -0
- package/dist/shield/integrity.js +435 -0
- package/dist/shield/integrity.js.map +1 -0
- package/dist/shield/llm-backend.d.ts +36 -0
- package/dist/shield/llm-backend.d.ts.map +1 -0
- package/dist/shield/llm-backend.js +145 -0
- package/dist/shield/llm-backend.js.map +1 -0
- package/dist/shield/llm.d.ts +116 -0
- package/dist/shield/llm.d.ts.map +1 -0
- package/dist/shield/llm.js +536 -0
- package/dist/shield/llm.js.map +1 -0
- package/dist/shield/policy.d.ts +70 -0
- package/dist/shield/policy.d.ts.map +1 -0
- package/dist/shield/policy.js +399 -0
- package/dist/shield/policy.js.map +1 -0
- package/dist/shield/session.d.ts +63 -0
- package/dist/shield/session.d.ts.map +1 -0
- package/dist/shield/session.js +242 -0
- package/dist/shield/session.js.map +1 -0
- package/dist/shield/signing.d.ts +41 -0
- package/dist/shield/signing.d.ts.map +1 -0
- package/dist/shield/signing.js +161 -0
- package/dist/shield/signing.js.map +1 -0
- package/dist/shield/status.d.ts +4 -0
- package/dist/shield/status.d.ts.map +1 -0
- package/dist/shield/status.js +241 -0
- package/dist/shield/status.js.map +1 -0
- package/dist/shield/types.d.ts +398 -0
- package/dist/shield/types.d.ts.map +1 -0
- package/dist/shield/types.js +31 -0
- package/dist/shield/types.js.map +1 -0
- package/dist/util/drift-liveness.d.ts +37 -0
- package/dist/util/drift-liveness.d.ts.map +1 -0
- package/dist/util/drift-liveness.js +114 -0
- package/dist/util/drift-liveness.js.map +1 -0
- package/dist/util/drift-verification.d.ts +60 -0
- package/dist/util/drift-verification.d.ts.map +1 -0
- package/dist/util/drift-verification.js +457 -0
- package/dist/util/drift-verification.js.map +1 -0
- package/package.json +4 -2
|
@@ -0,0 +1,457 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Drift liveness verification.
|
|
4
|
+
*
|
|
5
|
+
* After pattern matching detects a credential (e.g., DRIFT-001 Google API key),
|
|
6
|
+
* this module performs an actual API call to verify whether the credential has
|
|
7
|
+
* drifted capabilities (e.g., Gemini access on a Maps key).
|
|
8
|
+
*
|
|
9
|
+
* Liveness checks are opt-in, non-blocking, and timeout after 5 seconds.
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.verifyGeminiAccess = verifyGeminiAccess;
|
|
46
|
+
exports.verifyBedrockAccess = verifyBedrockAccess;
|
|
47
|
+
exports.verifyDriftFindings = verifyDriftFindings;
|
|
48
|
+
exports.applyLivenessResults = applyLivenessResults;
|
|
49
|
+
const crypto = __importStar(require("crypto"));
|
|
50
|
+
// --- Constants ---
|
|
51
|
+
const LIVENESS_TIMEOUT_MS = 5_000;
|
|
52
|
+
const GEMINI_MODELS_ENDPOINT = 'https://generativelanguage.googleapis.com/v1beta/models';
|
|
53
|
+
// --- Verification functions ---
|
|
54
|
+
/**
|
|
55
|
+
* Verify whether a Google API key has active Gemini access by calling
|
|
56
|
+
* the Generative Language API's models endpoint.
|
|
57
|
+
*
|
|
58
|
+
* - 200: Key has Gemini access (drift confirmed)
|
|
59
|
+
* - 403/401/400: No Gemini access or key invalid
|
|
60
|
+
* - Network error: Inconclusive
|
|
61
|
+
*/
|
|
62
|
+
async function verifyGeminiAccess(apiKey) {
|
|
63
|
+
const result = {
|
|
64
|
+
findingId: 'DRIFT-001',
|
|
65
|
+
checked: true,
|
|
66
|
+
live: false,
|
|
67
|
+
originalSeverity: 'high',
|
|
68
|
+
escalatedSeverity: 'high',
|
|
69
|
+
detail: '',
|
|
70
|
+
};
|
|
71
|
+
try {
|
|
72
|
+
const controller = new AbortController();
|
|
73
|
+
const timeout = setTimeout(() => controller.abort(), LIVENESS_TIMEOUT_MS);
|
|
74
|
+
const url = `${GEMINI_MODELS_ENDPOINT}?key=${apiKey}`;
|
|
75
|
+
const response = await fetch(url, {
|
|
76
|
+
method: 'GET',
|
|
77
|
+
signal: controller.signal,
|
|
78
|
+
headers: {
|
|
79
|
+
'User-Agent': 'opena2a-drift-check/1.0',
|
|
80
|
+
},
|
|
81
|
+
});
|
|
82
|
+
clearTimeout(timeout);
|
|
83
|
+
if (response.status === 200) {
|
|
84
|
+
let modelCount = 0;
|
|
85
|
+
try {
|
|
86
|
+
const body = await response.json();
|
|
87
|
+
modelCount = body.models?.length ?? 0;
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
// Response parsing failed but 200 confirms access
|
|
91
|
+
}
|
|
92
|
+
result.live = true;
|
|
93
|
+
result.escalatedSeverity = 'critical';
|
|
94
|
+
result.detail = modelCount > 0
|
|
95
|
+
? `Gemini access confirmed: key can reach ${modelCount} model(s) via Generative Language API`
|
|
96
|
+
: 'Gemini access confirmed: key authenticates to Generative Language API';
|
|
97
|
+
}
|
|
98
|
+
else if (response.status === 403 || response.status === 401) {
|
|
99
|
+
result.detail = 'No Gemini access: key is restricted or Generative Language API is not enabled';
|
|
100
|
+
}
|
|
101
|
+
else if (response.status === 400) {
|
|
102
|
+
result.detail = 'Key format valid but rejected by Google API (may be revoked or restricted)';
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
result.detail = `Unexpected response (HTTP ${response.status}): unable to confirm drift`;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
110
|
+
result.detail = 'Liveness check timed out (5s) -- unable to confirm drift';
|
|
111
|
+
result.error = 'timeout';
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
result.detail = 'Network error during liveness check -- unable to confirm drift';
|
|
115
|
+
result.error = err instanceof Error ? err.message : String(err);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return result;
|
|
119
|
+
}
|
|
120
|
+
// --- AWS SigV4 Helpers (minimal, zero-dependency implementation) ---
|
|
121
|
+
function hmacSha256(key, data) {
|
|
122
|
+
return crypto.createHmac('sha256', key).update(data).digest();
|
|
123
|
+
}
|
|
124
|
+
function sha256Hex(data) {
|
|
125
|
+
return crypto.createHash('sha256').update(data).digest('hex');
|
|
126
|
+
}
|
|
127
|
+
function getSignatureKey(secretKey, dateStamp, region, service) {
|
|
128
|
+
const kDate = hmacSha256('AWS4' + secretKey, dateStamp);
|
|
129
|
+
const kRegion = hmacSha256(kDate, region);
|
|
130
|
+
const kService = hmacSha256(kRegion, service);
|
|
131
|
+
return hmacSha256(kService, 'aws4_request');
|
|
132
|
+
}
|
|
133
|
+
function signAwsRequest(params) {
|
|
134
|
+
const now = new Date();
|
|
135
|
+
const amzDate = now.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, '');
|
|
136
|
+
const dateStamp = amzDate.slice(0, 8);
|
|
137
|
+
const payloadHash = sha256Hex(params.body);
|
|
138
|
+
const canonicalHeaders = `host:${params.host}\n` +
|
|
139
|
+
`x-amz-date:${amzDate}\n`;
|
|
140
|
+
const signedHeaders = 'host;x-amz-date';
|
|
141
|
+
const canonicalRequest = [
|
|
142
|
+
params.method,
|
|
143
|
+
params.path,
|
|
144
|
+
'', // query string (empty for POST)
|
|
145
|
+
canonicalHeaders,
|
|
146
|
+
signedHeaders,
|
|
147
|
+
payloadHash,
|
|
148
|
+
].join('\n');
|
|
149
|
+
const credentialScope = `${dateStamp}/${params.region}/${params.service}/aws4_request`;
|
|
150
|
+
const stringToSign = [
|
|
151
|
+
'AWS4-HMAC-SHA256',
|
|
152
|
+
amzDate,
|
|
153
|
+
credentialScope,
|
|
154
|
+
sha256Hex(canonicalRequest),
|
|
155
|
+
].join('\n');
|
|
156
|
+
const signingKey = getSignatureKey(params.secretAccessKey, dateStamp, params.region, params.service);
|
|
157
|
+
const signature = crypto
|
|
158
|
+
.createHmac('sha256', signingKey)
|
|
159
|
+
.update(stringToSign)
|
|
160
|
+
.digest('hex');
|
|
161
|
+
const authorization = `AWS4-HMAC-SHA256 Credential=${params.accessKeyId}/${credentialScope}, ` +
|
|
162
|
+
`SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
|
163
|
+
return {
|
|
164
|
+
'Host': params.host,
|
|
165
|
+
'X-Amz-Date': amzDate,
|
|
166
|
+
'Authorization': authorization,
|
|
167
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
168
|
+
'User-Agent': 'opena2a-drift-check/1.0',
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
// --- AWS STS and Bedrock API calls ---
|
|
172
|
+
async function callStsGetCallerIdentity(accessKeyId, secretAccessKey, signal) {
|
|
173
|
+
const host = 'sts.amazonaws.com';
|
|
174
|
+
const body = 'Action=GetCallerIdentity&Version=2011-06-15';
|
|
175
|
+
const headers = signAwsRequest({
|
|
176
|
+
method: 'POST',
|
|
177
|
+
host,
|
|
178
|
+
path: '/',
|
|
179
|
+
body,
|
|
180
|
+
accessKeyId,
|
|
181
|
+
secretAccessKey,
|
|
182
|
+
region: 'us-east-1',
|
|
183
|
+
service: 'sts',
|
|
184
|
+
});
|
|
185
|
+
const response = await fetch(`https://${host}/`, {
|
|
186
|
+
method: 'POST',
|
|
187
|
+
headers,
|
|
188
|
+
body,
|
|
189
|
+
signal,
|
|
190
|
+
});
|
|
191
|
+
if (response.status === 200) {
|
|
192
|
+
const text = await response.text();
|
|
193
|
+
// Extract account ID from XML response
|
|
194
|
+
const accountMatch = text.match(/<Account>(\d+)<\/Account>/);
|
|
195
|
+
const arnMatch = text.match(/<Arn>([^<]+)<\/Arn>/);
|
|
196
|
+
const account = accountMatch?.[1] ?? 'unknown';
|
|
197
|
+
const arn = arnMatch?.[1] ?? 'unknown';
|
|
198
|
+
return { live: true, detail: `Account ${account}, ARN: ${arn}` };
|
|
199
|
+
}
|
|
200
|
+
if (response.status === 403) {
|
|
201
|
+
return { live: false, detail: 'AWS key is invalid or expired' };
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
live: false,
|
|
205
|
+
detail: `STS returned unexpected status ${response.status}`,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
async function callBedrockListModels(accessKeyId, secretAccessKey, signal) {
|
|
209
|
+
const region = 'us-east-1';
|
|
210
|
+
const host = `bedrock.${region}.amazonaws.com`;
|
|
211
|
+
const path = '/foundation-models';
|
|
212
|
+
const now = new Date();
|
|
213
|
+
const amzDate = now.toISOString().replace(/[-:]/g, '').replace(/\.\d{3}/, '');
|
|
214
|
+
const dateStamp = amzDate.slice(0, 8);
|
|
215
|
+
const payloadHash = sha256Hex('');
|
|
216
|
+
const canonicalHeaders = `host:${host}\n` +
|
|
217
|
+
`x-amz-date:${amzDate}\n`;
|
|
218
|
+
const signedHeaders = 'host;x-amz-date';
|
|
219
|
+
const canonicalRequest = [
|
|
220
|
+
'GET',
|
|
221
|
+
path,
|
|
222
|
+
'', // query string
|
|
223
|
+
canonicalHeaders,
|
|
224
|
+
signedHeaders,
|
|
225
|
+
payloadHash,
|
|
226
|
+
].join('\n');
|
|
227
|
+
const credentialScope = `${dateStamp}/${region}/bedrock/aws4_request`;
|
|
228
|
+
const stringToSign = [
|
|
229
|
+
'AWS4-HMAC-SHA256',
|
|
230
|
+
amzDate,
|
|
231
|
+
credentialScope,
|
|
232
|
+
sha256Hex(canonicalRequest),
|
|
233
|
+
].join('\n');
|
|
234
|
+
const signingKey = getSignatureKey(secretAccessKey, dateStamp, region, 'bedrock');
|
|
235
|
+
const signature = crypto
|
|
236
|
+
.createHmac('sha256', signingKey)
|
|
237
|
+
.update(stringToSign)
|
|
238
|
+
.digest('hex');
|
|
239
|
+
const authorization = `AWS4-HMAC-SHA256 Credential=${accessKeyId}/${credentialScope}, ` +
|
|
240
|
+
`SignedHeaders=${signedHeaders}, Signature=${signature}`;
|
|
241
|
+
const response = await fetch(`https://${host}${path}`, {
|
|
242
|
+
method: 'GET',
|
|
243
|
+
headers: {
|
|
244
|
+
'Host': host,
|
|
245
|
+
'X-Amz-Date': amzDate,
|
|
246
|
+
'Authorization': authorization,
|
|
247
|
+
'User-Agent': 'opena2a-drift-check/1.0',
|
|
248
|
+
},
|
|
249
|
+
signal,
|
|
250
|
+
});
|
|
251
|
+
if (response.status === 200) {
|
|
252
|
+
let modelCount = 0;
|
|
253
|
+
try {
|
|
254
|
+
const body = await response.json();
|
|
255
|
+
modelCount = body.modelSummaries?.length ?? 0;
|
|
256
|
+
}
|
|
257
|
+
catch {
|
|
258
|
+
// Response parsing failed but 200 confirms access
|
|
259
|
+
}
|
|
260
|
+
return {
|
|
261
|
+
hasAccess: true,
|
|
262
|
+
detail: modelCount > 0
|
|
263
|
+
? `can access ${modelCount} foundation model(s)`
|
|
264
|
+
: 'Bedrock API is accessible',
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
return { hasAccess: false, detail: `Bedrock returned ${response.status}` };
|
|
268
|
+
}
|
|
269
|
+
// --- Secret key proximity search ---
|
|
270
|
+
/**
|
|
271
|
+
* Try to find an AWS secret access key near an access key ID in the same file.
|
|
272
|
+
* Searches within 5 lines of the access key's location.
|
|
273
|
+
*/
|
|
274
|
+
function findSecretKeyNearAccessKey(match) {
|
|
275
|
+
try {
|
|
276
|
+
const fs = require('fs');
|
|
277
|
+
const content = fs.readFileSync(match.filePath, 'utf-8');
|
|
278
|
+
const lines = content.split('\n');
|
|
279
|
+
const startLine = Math.max(0, match.line - 6);
|
|
280
|
+
const endLine = Math.min(lines.length, match.line + 5);
|
|
281
|
+
const region = lines.slice(startLine, endLine).join('\n');
|
|
282
|
+
// AWS secret access keys are 40 chars of base64-like characters
|
|
283
|
+
const secretKeyPattern = /(?:secret[_-]?(?:access)?[_-]?key|aws_secret)\s*[=:]\s*['"]?([A-Za-z0-9/+=]{40})['"]?/i;
|
|
284
|
+
// Try the labeled pattern first
|
|
285
|
+
const labeled = secretKeyPattern.exec(region);
|
|
286
|
+
if (labeled)
|
|
287
|
+
return labeled[1];
|
|
288
|
+
// Fallback: look for 40-char base64 strings that aren't the access key itself
|
|
289
|
+
const envPattern = /[A-Za-z0-9/+=]{40}/g;
|
|
290
|
+
const allMatches = region.match(envPattern);
|
|
291
|
+
if (allMatches) {
|
|
292
|
+
for (const m of allMatches) {
|
|
293
|
+
if (m !== match.value && /[a-z]/.test(m) && /[A-Z]/.test(m)) {
|
|
294
|
+
return m;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
catch {
|
|
301
|
+
return undefined;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
// --- AWS Bedrock drift verification ---
|
|
305
|
+
/**
|
|
306
|
+
* Verify whether an AWS access key is live and has Bedrock access.
|
|
307
|
+
*
|
|
308
|
+
* Step 1: STS GetCallerIdentity -- confirms key is live (always works, zero permissions needed).
|
|
309
|
+
* Step 2: If live, try ListFoundationModels to check Bedrock access.
|
|
310
|
+
*
|
|
311
|
+
* AWS SigV4 signing is done manually -- no SDK dependency.
|
|
312
|
+
* Requires the secret key to be found alongside the access key.
|
|
313
|
+
*/
|
|
314
|
+
async function verifyBedrockAccess(accessKeyId, secretAccessKey) {
|
|
315
|
+
const result = {
|
|
316
|
+
findingId: 'DRIFT-002',
|
|
317
|
+
checked: true,
|
|
318
|
+
live: false,
|
|
319
|
+
originalSeverity: 'high',
|
|
320
|
+
escalatedSeverity: 'high',
|
|
321
|
+
detail: '',
|
|
322
|
+
};
|
|
323
|
+
if (!secretAccessKey) {
|
|
324
|
+
result.checked = false;
|
|
325
|
+
result.detail = 'Secret access key not found alongside access key ID -- cannot verify liveness';
|
|
326
|
+
return result;
|
|
327
|
+
}
|
|
328
|
+
try {
|
|
329
|
+
const controller = new AbortController();
|
|
330
|
+
const timeout = setTimeout(() => controller.abort(), LIVENESS_TIMEOUT_MS);
|
|
331
|
+
// Step 1: STS GetCallerIdentity (works with any valid key, zero permissions needed)
|
|
332
|
+
const stsResult = await callStsGetCallerIdentity(accessKeyId, secretAccessKey, controller.signal);
|
|
333
|
+
clearTimeout(timeout);
|
|
334
|
+
if (!stsResult.live) {
|
|
335
|
+
result.detail = stsResult.detail;
|
|
336
|
+
result.error = stsResult.error;
|
|
337
|
+
return result;
|
|
338
|
+
}
|
|
339
|
+
// Key is live
|
|
340
|
+
result.live = true;
|
|
341
|
+
result.escalatedSeverity = 'critical';
|
|
342
|
+
result.detail = `AWS key is live (${stsResult.detail})`;
|
|
343
|
+
// Step 2: Try Bedrock ListFoundationModels
|
|
344
|
+
const controller2 = new AbortController();
|
|
345
|
+
const timeout2 = setTimeout(() => controller2.abort(), LIVENESS_TIMEOUT_MS);
|
|
346
|
+
try {
|
|
347
|
+
const bedrockResult = await callBedrockListModels(accessKeyId, secretAccessKey, controller2.signal);
|
|
348
|
+
clearTimeout(timeout2);
|
|
349
|
+
if (bedrockResult.hasAccess) {
|
|
350
|
+
result.detail += `. Bedrock access confirmed: ${bedrockResult.detail}`;
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
result.detail += '. No Bedrock access detected (key is still live and exploitable)';
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
clearTimeout(timeout2);
|
|
358
|
+
result.detail += '. Bedrock check inconclusive (key is still live and exploitable)';
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
catch (err) {
|
|
362
|
+
if (err instanceof Error && err.name === 'AbortError') {
|
|
363
|
+
result.detail = 'Liveness check timed out (5s) -- unable to confirm drift';
|
|
364
|
+
result.error = 'timeout';
|
|
365
|
+
}
|
|
366
|
+
else {
|
|
367
|
+
result.detail = 'Network error during liveness check -- unable to confirm drift';
|
|
368
|
+
result.error = err instanceof Error ? err.message : String(err);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return result;
|
|
372
|
+
}
|
|
373
|
+
/**
|
|
374
|
+
* Run liveness verification on all DRIFT-prefixed credential matches.
|
|
375
|
+
* Returns a map of credential value -> LivenessResult.
|
|
376
|
+
*
|
|
377
|
+
* Runs checks in parallel with a concurrency limit of 3.
|
|
378
|
+
*/
|
|
379
|
+
async function verifyDriftFindings(matches) {
|
|
380
|
+
const results = new Map();
|
|
381
|
+
// Deduplicate: only check each unique key value once
|
|
382
|
+
const seen = new Set();
|
|
383
|
+
const uniqueDriftMatches = [];
|
|
384
|
+
for (const m of matches) {
|
|
385
|
+
if (!m.findingId.startsWith('DRIFT-'))
|
|
386
|
+
continue;
|
|
387
|
+
if (seen.has(m.value))
|
|
388
|
+
continue;
|
|
389
|
+
seen.add(m.value);
|
|
390
|
+
uniqueDriftMatches.push(m);
|
|
391
|
+
}
|
|
392
|
+
if (uniqueDriftMatches.length === 0)
|
|
393
|
+
return results;
|
|
394
|
+
// Run verifications in parallel (max 3 concurrent)
|
|
395
|
+
const CONCURRENCY = 3;
|
|
396
|
+
for (let i = 0; i < uniqueDriftMatches.length; i += CONCURRENCY) {
|
|
397
|
+
const chunk = uniqueDriftMatches.slice(i, i + CONCURRENCY);
|
|
398
|
+
const promises = chunk.map(async (match) => {
|
|
399
|
+
let result;
|
|
400
|
+
switch (match.findingId) {
|
|
401
|
+
case 'DRIFT-001':
|
|
402
|
+
result = await verifyGeminiAccess(match.value);
|
|
403
|
+
break;
|
|
404
|
+
case 'DRIFT-002': {
|
|
405
|
+
const secretKey = findSecretKeyNearAccessKey(match);
|
|
406
|
+
result = await verifyBedrockAccess(match.value, secretKey);
|
|
407
|
+
break;
|
|
408
|
+
}
|
|
409
|
+
default:
|
|
410
|
+
result = {
|
|
411
|
+
findingId: match.findingId,
|
|
412
|
+
checked: false,
|
|
413
|
+
live: false,
|
|
414
|
+
originalSeverity: match.severity,
|
|
415
|
+
escalatedSeverity: match.severity,
|
|
416
|
+
detail: 'No liveness check available for this drift type',
|
|
417
|
+
};
|
|
418
|
+
}
|
|
419
|
+
results.set(match.value, result);
|
|
420
|
+
});
|
|
421
|
+
await Promise.all(promises);
|
|
422
|
+
}
|
|
423
|
+
return results;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Apply liveness results to credential matches: escalate severity
|
|
427
|
+
* and update explanation text for confirmed drift.
|
|
428
|
+
*
|
|
429
|
+
* Returns new match objects (does not mutate originals).
|
|
430
|
+
*/
|
|
431
|
+
function applyLivenessResults(matches, livenessResults) {
|
|
432
|
+
return matches.map(match => {
|
|
433
|
+
const result = livenessResults.get(match.value);
|
|
434
|
+
if (!result)
|
|
435
|
+
return match;
|
|
436
|
+
if (result.live) {
|
|
437
|
+
return {
|
|
438
|
+
...match,
|
|
439
|
+
severity: result.escalatedSeverity,
|
|
440
|
+
explanation: (match.explanation ?? '') +
|
|
441
|
+
` CONFIRMED: ${result.detail}`,
|
|
442
|
+
businessImpact: (match.businessImpact ?? '') +
|
|
443
|
+
' Liveness verification confirmed the key has active Gemini access -- this is an active exposure, not theoretical.',
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
// Not live but checked -- append verification note
|
|
447
|
+
if (result.checked && !result.error) {
|
|
448
|
+
return {
|
|
449
|
+
...match,
|
|
450
|
+
explanation: (match.explanation ?? '') +
|
|
451
|
+
` Verification: ${result.detail}`,
|
|
452
|
+
};
|
|
453
|
+
}
|
|
454
|
+
return match;
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
//# sourceMappingURL=drift-verification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drift-verification.js","sourceRoot":"","sources":["../../src/util/drift-verification.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "opena2a-cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Unified CLI for the OpenA2A security platform",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -25,7 +25,9 @@
|
|
|
25
25
|
"vitest": "^3.0.0",
|
|
26
26
|
"@types/node": "^22.0.0"
|
|
27
27
|
},
|
|
28
|
-
"files": [
|
|
28
|
+
"files": [
|
|
29
|
+
"dist"
|
|
30
|
+
],
|
|
29
31
|
"engines": {
|
|
30
32
|
"node": ">=18.0.0"
|
|
31
33
|
},
|