@claude-flow/security 3.0.0-alpha.1
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/.agentic-flow/intelligence.json +16 -0
- package/README.md +234 -0
- package/__tests__/acceptance/security-compliance.test.ts +674 -0
- package/__tests__/coverage/base.css +224 -0
- package/__tests__/coverage/block-navigation.js +87 -0
- package/__tests__/coverage/coverage-final.json +11 -0
- package/__tests__/coverage/favicon.png +0 -0
- package/__tests__/coverage/index.html +161 -0
- package/__tests__/coverage/lcov-report/base.css +224 -0
- package/__tests__/coverage/lcov-report/block-navigation.js +87 -0
- package/__tests__/coverage/lcov-report/favicon.png +0 -0
- package/__tests__/coverage/lcov-report/index.html +161 -0
- package/__tests__/coverage/lcov-report/prettify.css +1 -0
- package/__tests__/coverage/lcov-report/prettify.js +2 -0
- package/__tests__/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/lcov-report/sorter.js +210 -0
- package/__tests__/coverage/lcov-report/src/CVE-REMEDIATION.ts.html +838 -0
- package/__tests__/coverage/lcov-report/src/application/services/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/application/services/security-application-service.ts.html +664 -0
- package/__tests__/coverage/lcov-report/src/credential-generator.ts.html +1189 -0
- package/__tests__/coverage/lcov-report/src/domain/entities/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/domain/entities/security-context.ts.html +604 -0
- package/__tests__/coverage/lcov-report/src/domain/services/index.html +116 -0
- package/__tests__/coverage/lcov-report/src/domain/services/security-domain-service.ts.html +973 -0
- package/__tests__/coverage/lcov-report/src/index.html +206 -0
- package/__tests__/coverage/lcov-report/src/input-validator.ts.html +1483 -0
- package/__tests__/coverage/lcov-report/src/password-hasher.ts.html +895 -0
- package/__tests__/coverage/lcov-report/src/path-validator.ts.html +1660 -0
- package/__tests__/coverage/lcov-report/src/safe-executor.ts.html +1660 -0
- package/__tests__/coverage/lcov-report/src/token-generator.ts.html +1474 -0
- package/__tests__/coverage/lcov.info +3650 -0
- package/__tests__/coverage/prettify.css +1 -0
- package/__tests__/coverage/prettify.js +2 -0
- package/__tests__/coverage/sort-arrow-sprite.png +0 -0
- package/__tests__/coverage/sorter.js +210 -0
- package/__tests__/coverage/src/CVE-REMEDIATION.ts.html +838 -0
- package/__tests__/coverage/src/application/services/index.html +116 -0
- package/__tests__/coverage/src/application/services/security-application-service.ts.html +664 -0
- package/__tests__/coverage/src/credential-generator.ts.html +1189 -0
- package/__tests__/coverage/src/domain/entities/index.html +116 -0
- package/__tests__/coverage/src/domain/entities/security-context.ts.html +604 -0
- package/__tests__/coverage/src/domain/services/index.html +116 -0
- package/__tests__/coverage/src/domain/services/security-domain-service.ts.html +973 -0
- package/__tests__/coverage/src/index.html +206 -0
- package/__tests__/coverage/src/input-validator.ts.html +1483 -0
- package/__tests__/coverage/src/password-hasher.ts.html +895 -0
- package/__tests__/coverage/src/path-validator.ts.html +1660 -0
- package/__tests__/coverage/src/safe-executor.ts.html +1660 -0
- package/__tests__/coverage/src/token-generator.ts.html +1474 -0
- package/__tests__/credential-generator.test.ts +310 -0
- package/__tests__/fixtures/configurations.ts +419 -0
- package/__tests__/fixtures/index.ts +21 -0
- package/__tests__/helpers/create-mock.ts +469 -0
- package/__tests__/helpers/index.ts +32 -0
- package/__tests__/input-validator.test.ts +381 -0
- package/__tests__/integration/security-flow.test.ts +606 -0
- package/__tests__/password-hasher.test.ts +239 -0
- package/__tests__/path-validator.test.ts +302 -0
- package/__tests__/safe-executor.test.ts +292 -0
- package/__tests__/token-generator.test.ts +371 -0
- package/__tests__/unit/credential-generator.test.ts +182 -0
- package/__tests__/unit/password-hasher.test.ts +359 -0
- package/__tests__/unit/path-validator.test.ts +509 -0
- package/__tests__/unit/safe-executor.test.ts +667 -0
- package/__tests__/unit/token-generator.test.ts +310 -0
- package/dist/CVE-REMEDIATION.d.ts +86 -0
- package/dist/CVE-REMEDIATION.d.ts.map +1 -0
- package/dist/CVE-REMEDIATION.js +221 -0
- package/dist/CVE-REMEDIATION.js.map +1 -0
- package/dist/application/index.d.ts +7 -0
- package/dist/application/index.d.ts.map +1 -0
- package/dist/application/index.js +7 -0
- package/dist/application/index.js.map +1 -0
- package/dist/application/services/security-application-service.d.ts +71 -0
- package/dist/application/services/security-application-service.d.ts.map +1 -0
- package/dist/application/services/security-application-service.js +153 -0
- package/dist/application/services/security-application-service.js.map +1 -0
- package/dist/credential-generator.d.ts +176 -0
- package/dist/credential-generator.d.ts.map +1 -0
- package/dist/credential-generator.js +272 -0
- package/dist/credential-generator.js.map +1 -0
- package/dist/domain/entities/security-context.d.ts +68 -0
- package/dist/domain/entities/security-context.d.ts.map +1 -0
- package/dist/domain/entities/security-context.js +132 -0
- package/dist/domain/entities/security-context.js.map +1 -0
- package/dist/domain/index.d.ts +8 -0
- package/dist/domain/index.d.ts.map +1 -0
- package/dist/domain/index.js +8 -0
- package/dist/domain/index.js.map +1 -0
- package/dist/domain/services/security-domain-service.d.ts +71 -0
- package/dist/domain/services/security-domain-service.d.ts.map +1 -0
- package/dist/domain/services/security-domain-service.js +237 -0
- package/dist/domain/services/security-domain-service.js.map +1 -0
- package/dist/index.d.ts +119 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +145 -0
- package/dist/index.js.map +1 -0
- package/dist/input-validator.d.ts +306 -0
- package/dist/input-validator.d.ts.map +1 -0
- package/dist/input-validator.js +393 -0
- package/dist/input-validator.js.map +1 -0
- package/dist/password-hasher.d.ts +128 -0
- package/dist/password-hasher.d.ts.map +1 -0
- package/dist/password-hasher.js +183 -0
- package/dist/password-hasher.js.map +1 -0
- package/dist/path-validator.d.ts +148 -0
- package/dist/path-validator.d.ts.map +1 -0
- package/dist/path-validator.js +421 -0
- package/dist/path-validator.js.map +1 -0
- package/dist/safe-executor.d.ts +173 -0
- package/dist/safe-executor.d.ts.map +1 -0
- package/dist/safe-executor.js +370 -0
- package/dist/safe-executor.js.map +1 -0
- package/dist/token-generator.d.ts +224 -0
- package/dist/token-generator.d.ts.map +1 -0
- package/dist/token-generator.js +351 -0
- package/dist/token-generator.js.map +1 -0
- package/package.json +28 -0
- package/src/CVE-REMEDIATION.ts +251 -0
- package/src/application/index.ts +10 -0
- package/src/application/services/security-application-service.ts +193 -0
- package/src/credential-generator.ts +368 -0
- package/src/domain/entities/security-context.ts +173 -0
- package/src/domain/index.ts +17 -0
- package/src/domain/services/security-domain-service.ts +296 -0
- package/src/index.ts +271 -0
- package/src/input-validator.ts +466 -0
- package/src/password-hasher.ts +270 -0
- package/src/path-validator.ts +525 -0
- package/src/safe-executor.ts +525 -0
- package/src/token-generator.ts +463 -0
- package/tsconfig.json +9 -0
- package/tsconfig.tsbuildinfo +1 -0
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Generator - Secure Token Generation
|
|
3
|
+
*
|
|
4
|
+
* Provides cryptographically secure token generation for:
|
|
5
|
+
* - JWT tokens
|
|
6
|
+
* - Session tokens
|
|
7
|
+
* - CSRF tokens
|
|
8
|
+
* - API tokens
|
|
9
|
+
* - Verification codes
|
|
10
|
+
*
|
|
11
|
+
* Security Properties:
|
|
12
|
+
* - Uses crypto.randomBytes for all randomness
|
|
13
|
+
* - Configurable entropy levels
|
|
14
|
+
* - Timing-safe comparison
|
|
15
|
+
* - Token expiration handling
|
|
16
|
+
*
|
|
17
|
+
* @module v3/security/token-generator
|
|
18
|
+
*/
|
|
19
|
+
import { randomBytes, createHmac, timingSafeEqual } from 'crypto';
|
|
20
|
+
export class TokenGeneratorError extends Error {
|
|
21
|
+
code;
|
|
22
|
+
constructor(message, code) {
|
|
23
|
+
super(message);
|
|
24
|
+
this.code = code;
|
|
25
|
+
this.name = 'TokenGeneratorError';
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Secure token generator.
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const generator = new TokenGenerator({ hmacSecret: 'secret' });
|
|
34
|
+
*
|
|
35
|
+
* // Generate session token
|
|
36
|
+
* const session = generator.generateSessionToken();
|
|
37
|
+
*
|
|
38
|
+
* // Generate signed token
|
|
39
|
+
* const signed = generator.generateSignedToken({ userId: '123' });
|
|
40
|
+
*
|
|
41
|
+
* // Verify signed token
|
|
42
|
+
* const isValid = generator.verifySignedToken(signed.combined);
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export class TokenGenerator {
|
|
46
|
+
config;
|
|
47
|
+
constructor(config = {}) {
|
|
48
|
+
this.config = {
|
|
49
|
+
defaultLength: config.defaultLength ?? 32,
|
|
50
|
+
encoding: config.encoding ?? 'base64url',
|
|
51
|
+
hmacSecret: config.hmacSecret ?? '',
|
|
52
|
+
defaultExpiration: config.defaultExpiration ?? 3600,
|
|
53
|
+
};
|
|
54
|
+
if (this.config.defaultLength < 16) {
|
|
55
|
+
throw new TokenGeneratorError('Token length must be at least 16 bytes', 'INVALID_LENGTH');
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Generates a random token.
|
|
60
|
+
*
|
|
61
|
+
* @param length - Token length in bytes
|
|
62
|
+
* @returns Random token string
|
|
63
|
+
*/
|
|
64
|
+
generate(length) {
|
|
65
|
+
const len = length ?? this.config.defaultLength;
|
|
66
|
+
const buffer = randomBytes(len);
|
|
67
|
+
return this.encode(buffer);
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Generates a token with expiration.
|
|
71
|
+
*
|
|
72
|
+
* @param expirationSeconds - Expiration time in seconds
|
|
73
|
+
* @param metadata - Optional metadata to attach
|
|
74
|
+
* @returns Token with expiration
|
|
75
|
+
*/
|
|
76
|
+
generateWithExpiration(expirationSeconds, metadata) {
|
|
77
|
+
const expiration = expirationSeconds ?? this.config.defaultExpiration;
|
|
78
|
+
const now = new Date();
|
|
79
|
+
const expiresAt = new Date(now.getTime() + expiration * 1000);
|
|
80
|
+
return {
|
|
81
|
+
value: this.generate(),
|
|
82
|
+
createdAt: now,
|
|
83
|
+
expiresAt,
|
|
84
|
+
metadata,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Generates a session token (URL-safe).
|
|
89
|
+
*
|
|
90
|
+
* @param length - Token length in bytes (default: 32)
|
|
91
|
+
* @returns Session token
|
|
92
|
+
*/
|
|
93
|
+
generateSessionToken(length = 32) {
|
|
94
|
+
return this.generateWithExpiration(this.config.defaultExpiration);
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Generates a CSRF token.
|
|
98
|
+
*
|
|
99
|
+
* @returns CSRF token (shorter expiration)
|
|
100
|
+
*/
|
|
101
|
+
generateCsrfToken() {
|
|
102
|
+
return this.generateWithExpiration(1800); // 30 minutes
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Generates an API token with prefix.
|
|
106
|
+
*
|
|
107
|
+
* @param prefix - Token prefix (e.g., 'cf_')
|
|
108
|
+
* @returns Prefixed API token
|
|
109
|
+
*/
|
|
110
|
+
generateApiToken(prefix = 'cf_') {
|
|
111
|
+
const tokenBody = this.generate(32);
|
|
112
|
+
const now = new Date();
|
|
113
|
+
return {
|
|
114
|
+
value: `${prefix}${tokenBody}`,
|
|
115
|
+
createdAt: now,
|
|
116
|
+
expiresAt: new Date(now.getTime() + 365 * 24 * 60 * 60 * 1000), // 1 year
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Generates a numeric verification code.
|
|
121
|
+
*
|
|
122
|
+
* @param length - Number of digits (default: 6)
|
|
123
|
+
* @param expirationMinutes - Expiration in minutes (default: 10)
|
|
124
|
+
* @param maxAttempts - Maximum verification attempts (default: 3)
|
|
125
|
+
* @returns Verification code
|
|
126
|
+
*/
|
|
127
|
+
generateVerificationCode(length = 6, expirationMinutes = 10, maxAttempts = 3) {
|
|
128
|
+
const buffer = randomBytes(length);
|
|
129
|
+
let code = '';
|
|
130
|
+
for (let i = 0; i < length; i++) {
|
|
131
|
+
code += (buffer[i] % 10).toString();
|
|
132
|
+
}
|
|
133
|
+
const now = new Date();
|
|
134
|
+
return {
|
|
135
|
+
code,
|
|
136
|
+
createdAt: now,
|
|
137
|
+
expiresAt: new Date(now.getTime() + expirationMinutes * 60 * 1000),
|
|
138
|
+
attempts: 0,
|
|
139
|
+
maxAttempts,
|
|
140
|
+
};
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Generates a signed token using HMAC.
|
|
144
|
+
*
|
|
145
|
+
* @param payload - Data to include in token
|
|
146
|
+
* @param expirationSeconds - Token expiration
|
|
147
|
+
* @returns Signed token
|
|
148
|
+
*/
|
|
149
|
+
generateSignedToken(payload, expirationSeconds) {
|
|
150
|
+
if (!this.config.hmacSecret) {
|
|
151
|
+
throw new TokenGeneratorError('HMAC secret required for signed tokens', 'NO_SECRET');
|
|
152
|
+
}
|
|
153
|
+
const expiration = expirationSeconds ?? this.config.defaultExpiration;
|
|
154
|
+
const now = new Date();
|
|
155
|
+
const expiresAt = new Date(now.getTime() + expiration * 1000);
|
|
156
|
+
const tokenData = {
|
|
157
|
+
...payload,
|
|
158
|
+
iat: now.getTime(),
|
|
159
|
+
exp: expiresAt.getTime(),
|
|
160
|
+
nonce: this.generate(8),
|
|
161
|
+
};
|
|
162
|
+
const token = Buffer.from(JSON.stringify(tokenData)).toString('base64url');
|
|
163
|
+
const signature = this.sign(token);
|
|
164
|
+
return {
|
|
165
|
+
token,
|
|
166
|
+
signature,
|
|
167
|
+
combined: `${token}.${signature}`,
|
|
168
|
+
createdAt: now,
|
|
169
|
+
expiresAt,
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Verifies a signed token.
|
|
174
|
+
*
|
|
175
|
+
* @param combined - Combined token string (token.signature)
|
|
176
|
+
* @returns Decoded payload if valid, null otherwise
|
|
177
|
+
*/
|
|
178
|
+
verifySignedToken(combined) {
|
|
179
|
+
if (!this.config.hmacSecret) {
|
|
180
|
+
throw new TokenGeneratorError('HMAC secret required for signed tokens', 'NO_SECRET');
|
|
181
|
+
}
|
|
182
|
+
const parts = combined.split('.');
|
|
183
|
+
if (parts.length !== 2) {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
const [token, signature] = parts;
|
|
187
|
+
// Verify signature
|
|
188
|
+
const expectedSignature = this.sign(token);
|
|
189
|
+
try {
|
|
190
|
+
const sigBuffer = Buffer.from(signature, 'base64url');
|
|
191
|
+
const expectedBuffer = Buffer.from(expectedSignature, 'base64url');
|
|
192
|
+
if (sigBuffer.length !== expectedBuffer.length) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
if (!timingSafeEqual(sigBuffer, expectedBuffer)) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
// Decode and validate payload
|
|
203
|
+
try {
|
|
204
|
+
const payload = JSON.parse(Buffer.from(token, 'base64url').toString());
|
|
205
|
+
// Check expiration
|
|
206
|
+
if (payload.exp && payload.exp < Date.now()) {
|
|
207
|
+
return null;
|
|
208
|
+
}
|
|
209
|
+
return payload;
|
|
210
|
+
}
|
|
211
|
+
catch {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Generates a refresh token pair.
|
|
217
|
+
*
|
|
218
|
+
* @returns Access and refresh tokens
|
|
219
|
+
*/
|
|
220
|
+
generateTokenPair() {
|
|
221
|
+
return {
|
|
222
|
+
accessToken: this.generateWithExpiration(900), // 15 minutes
|
|
223
|
+
refreshToken: this.generateWithExpiration(604800), // 7 days
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Generates a password reset token.
|
|
228
|
+
*
|
|
229
|
+
* @returns Password reset token (short expiration)
|
|
230
|
+
*/
|
|
231
|
+
generatePasswordResetToken() {
|
|
232
|
+
return this.generateWithExpiration(1800); // 30 minutes
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Generates an email verification token.
|
|
236
|
+
*
|
|
237
|
+
* @returns Email verification token
|
|
238
|
+
*/
|
|
239
|
+
generateEmailVerificationToken() {
|
|
240
|
+
return this.generateWithExpiration(86400); // 24 hours
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Generates a unique request ID.
|
|
244
|
+
*
|
|
245
|
+
* @returns Request ID (shorter, for logging)
|
|
246
|
+
*/
|
|
247
|
+
generateRequestId() {
|
|
248
|
+
return this.generate(8);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Generates a correlation ID for distributed tracing.
|
|
252
|
+
*
|
|
253
|
+
* @returns Correlation ID
|
|
254
|
+
*/
|
|
255
|
+
generateCorrelationId() {
|
|
256
|
+
const timestamp = Date.now().toString(36);
|
|
257
|
+
const random = this.generate(8);
|
|
258
|
+
return `${timestamp}-${random}`;
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Checks if a token has expired.
|
|
262
|
+
*
|
|
263
|
+
* @param token - Token to check
|
|
264
|
+
* @returns True if expired
|
|
265
|
+
*/
|
|
266
|
+
isExpired(token) {
|
|
267
|
+
return token.expiresAt < new Date();
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Compares two tokens in constant time.
|
|
271
|
+
*
|
|
272
|
+
* @param a - First token
|
|
273
|
+
* @param b - Second token
|
|
274
|
+
* @returns True if equal
|
|
275
|
+
*/
|
|
276
|
+
compare(a, b) {
|
|
277
|
+
if (a.length !== b.length) {
|
|
278
|
+
return false;
|
|
279
|
+
}
|
|
280
|
+
try {
|
|
281
|
+
const bufferA = Buffer.from(a);
|
|
282
|
+
const bufferB = Buffer.from(b);
|
|
283
|
+
return timingSafeEqual(bufferA, bufferB);
|
|
284
|
+
}
|
|
285
|
+
catch {
|
|
286
|
+
return false;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
/**
|
|
290
|
+
* Signs data using HMAC-SHA256.
|
|
291
|
+
*/
|
|
292
|
+
sign(data) {
|
|
293
|
+
return createHmac('sha256', this.config.hmacSecret)
|
|
294
|
+
.update(data)
|
|
295
|
+
.digest('base64url');
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Encodes bytes according to configuration.
|
|
299
|
+
*/
|
|
300
|
+
encode(buffer) {
|
|
301
|
+
switch (this.config.encoding) {
|
|
302
|
+
case 'hex':
|
|
303
|
+
return buffer.toString('hex');
|
|
304
|
+
case 'base64':
|
|
305
|
+
return buffer.toString('base64');
|
|
306
|
+
case 'base64url':
|
|
307
|
+
default:
|
|
308
|
+
return buffer.toString('base64url');
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Factory function to create a production token generator.
|
|
314
|
+
*
|
|
315
|
+
* @param hmacSecret - HMAC secret for signed tokens
|
|
316
|
+
* @returns Configured TokenGenerator
|
|
317
|
+
*/
|
|
318
|
+
export function createTokenGenerator(hmacSecret) {
|
|
319
|
+
return new TokenGenerator({
|
|
320
|
+
hmacSecret,
|
|
321
|
+
defaultLength: 32,
|
|
322
|
+
encoding: 'base64url',
|
|
323
|
+
});
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Singleton instance for quick token generation without configuration.
|
|
327
|
+
*/
|
|
328
|
+
let defaultGenerator = null;
|
|
329
|
+
/**
|
|
330
|
+
* Gets or creates the default token generator.
|
|
331
|
+
* Note: Does not support signed tokens without configuration.
|
|
332
|
+
*/
|
|
333
|
+
export function getDefaultGenerator() {
|
|
334
|
+
if (!defaultGenerator) {
|
|
335
|
+
defaultGenerator = new TokenGenerator();
|
|
336
|
+
}
|
|
337
|
+
return defaultGenerator;
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Quick token generation functions.
|
|
341
|
+
*/
|
|
342
|
+
export const quickGenerate = {
|
|
343
|
+
token: (length = 32) => getDefaultGenerator().generate(length),
|
|
344
|
+
sessionToken: () => getDefaultGenerator().generateSessionToken(),
|
|
345
|
+
csrfToken: () => getDefaultGenerator().generateCsrfToken(),
|
|
346
|
+
apiToken: (prefix = 'cf_') => getDefaultGenerator().generateApiToken(prefix),
|
|
347
|
+
verificationCode: (length = 6) => getDefaultGenerator().generateVerificationCode(length),
|
|
348
|
+
requestId: () => getDefaultGenerator().generateRequestId(),
|
|
349
|
+
correlationId: () => getDefaultGenerator().generateCorrelationId(),
|
|
350
|
+
};
|
|
351
|
+
//# sourceMappingURL=token-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-generator.js","sourceRoot":"","sources":["../src/token-generator.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@claude-flow/security",
|
|
3
|
+
"version": "3.0.0-alpha.1",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Security module - CVE fixes, input validation, path security",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": "./dist/index.js",
|
|
10
|
+
"./*": "./dist/*.js"
|
|
11
|
+
},
|
|
12
|
+
"scripts": {
|
|
13
|
+
"test": "vitest run",
|
|
14
|
+
"build": "tsc"
|
|
15
|
+
},
|
|
16
|
+
"dependencies": {
|
|
17
|
+
"bcrypt": "^5.1.1",
|
|
18
|
+
"zod": "^3.22.0"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/bcrypt": "^5.0.2",
|
|
22
|
+
"vitest": "^1.0.0"
|
|
23
|
+
},
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public",
|
|
26
|
+
"tag": "v3alpha"
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -0,0 +1,251 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CVE Remediation Tracking
|
|
3
|
+
*
|
|
4
|
+
* This file documents all security vulnerabilities addressed in the V3 security module
|
|
5
|
+
* and provides programmatic tracking of remediation status.
|
|
6
|
+
*
|
|
7
|
+
* @module v3/security/CVE-REMEDIATION
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
export interface CVEEntry {
|
|
11
|
+
id: string;
|
|
12
|
+
title: string;
|
|
13
|
+
severity: 'critical' | 'high' | 'medium' | 'low';
|
|
14
|
+
description: string;
|
|
15
|
+
affectedFiles: string[];
|
|
16
|
+
remediationFile: string;
|
|
17
|
+
remediationStatus: 'fixed' | 'in_progress' | 'pending';
|
|
18
|
+
testFile: string;
|
|
19
|
+
testStatus: 'passing' | 'failing' | 'pending';
|
|
20
|
+
timeline: {
|
|
21
|
+
identified: string;
|
|
22
|
+
remediated?: string;
|
|
23
|
+
verified?: string;
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Complete list of addressed CVEs and security issues
|
|
29
|
+
*/
|
|
30
|
+
export const CVE_REGISTRY: CVEEntry[] = [
|
|
31
|
+
{
|
|
32
|
+
id: 'CVE-1',
|
|
33
|
+
title: 'Dependency Vulnerabilities',
|
|
34
|
+
severity: 'high',
|
|
35
|
+
description: 'Vulnerable versions of @anthropic-ai/claude-code and @modelcontextprotocol/sdk',
|
|
36
|
+
affectedFiles: [
|
|
37
|
+
'package.json',
|
|
38
|
+
],
|
|
39
|
+
remediationFile: 'package.json (dependency updates)',
|
|
40
|
+
remediationStatus: 'fixed',
|
|
41
|
+
testFile: 'npm audit',
|
|
42
|
+
testStatus: 'passing',
|
|
43
|
+
timeline: {
|
|
44
|
+
identified: '2026-01-03',
|
|
45
|
+
remediated: '2026-01-05',
|
|
46
|
+
verified: '2026-01-05',
|
|
47
|
+
},
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
id: 'CVE-2',
|
|
51
|
+
title: 'Weak Password Hashing',
|
|
52
|
+
severity: 'critical',
|
|
53
|
+
description: 'SHA-256 with hardcoded salt used for password hashing instead of bcrypt',
|
|
54
|
+
affectedFiles: [
|
|
55
|
+
'v2/src/api/auth-service.ts:580-588',
|
|
56
|
+
],
|
|
57
|
+
remediationFile: 'v3/security/password-hasher.ts',
|
|
58
|
+
remediationStatus: 'fixed',
|
|
59
|
+
testFile: 'v3/__tests__/security/password-hasher.test.ts',
|
|
60
|
+
testStatus: 'passing',
|
|
61
|
+
timeline: {
|
|
62
|
+
identified: '2025-01-01',
|
|
63
|
+
remediated: '2025-01-04',
|
|
64
|
+
verified: '2025-01-04',
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
id: 'CVE-3',
|
|
69
|
+
title: 'Hardcoded Default Credentials',
|
|
70
|
+
severity: 'critical',
|
|
71
|
+
description: 'Default admin/service credentials hardcoded in auth service initialization',
|
|
72
|
+
affectedFiles: [
|
|
73
|
+
'v2/src/api/auth-service.ts:602-643',
|
|
74
|
+
],
|
|
75
|
+
remediationFile: 'v3/security/credential-generator.ts',
|
|
76
|
+
remediationStatus: 'fixed',
|
|
77
|
+
testFile: 'v3/__tests__/security/credential-generator.test.ts',
|
|
78
|
+
testStatus: 'passing',
|
|
79
|
+
timeline: {
|
|
80
|
+
identified: '2025-01-01',
|
|
81
|
+
remediated: '2025-01-04',
|
|
82
|
+
verified: '2025-01-04',
|
|
83
|
+
},
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
id: 'HIGH-1',
|
|
87
|
+
title: 'Command Injection via Shell Execution',
|
|
88
|
+
severity: 'high',
|
|
89
|
+
description: 'spawn() and exec() calls with shell:true enable command injection',
|
|
90
|
+
affectedFiles: [
|
|
91
|
+
'Multiple spawn() locations across codebase',
|
|
92
|
+
],
|
|
93
|
+
remediationFile: 'v3/security/safe-executor.ts',
|
|
94
|
+
remediationStatus: 'fixed',
|
|
95
|
+
testFile: 'v3/__tests__/security/safe-executor.test.ts',
|
|
96
|
+
testStatus: 'passing',
|
|
97
|
+
timeline: {
|
|
98
|
+
identified: '2025-01-01',
|
|
99
|
+
remediated: '2025-01-04',
|
|
100
|
+
verified: '2025-01-04',
|
|
101
|
+
},
|
|
102
|
+
},
|
|
103
|
+
{
|
|
104
|
+
id: 'HIGH-2',
|
|
105
|
+
title: 'Path Traversal Vulnerability',
|
|
106
|
+
severity: 'high',
|
|
107
|
+
description: 'Unvalidated file paths allow directory traversal attacks',
|
|
108
|
+
affectedFiles: [
|
|
109
|
+
'All file operation modules',
|
|
110
|
+
],
|
|
111
|
+
remediationFile: 'v3/security/path-validator.ts',
|
|
112
|
+
remediationStatus: 'fixed',
|
|
113
|
+
testFile: 'v3/__tests__/security/path-validator.test.ts',
|
|
114
|
+
testStatus: 'passing',
|
|
115
|
+
timeline: {
|
|
116
|
+
identified: '2025-01-01',
|
|
117
|
+
remediated: '2025-01-04',
|
|
118
|
+
verified: '2025-01-04',
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
];
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* Security patterns implemented
|
|
125
|
+
*/
|
|
126
|
+
export const SECURITY_PATTERNS = {
|
|
127
|
+
passwordHashing: {
|
|
128
|
+
algorithm: 'bcrypt',
|
|
129
|
+
rounds: 12,
|
|
130
|
+
rationale: 'Industry standard adaptive hashing with automatic salt generation',
|
|
131
|
+
},
|
|
132
|
+
credentialGeneration: {
|
|
133
|
+
method: 'crypto.randomBytes',
|
|
134
|
+
minPasswordLength: 32,
|
|
135
|
+
minSecretLength: 64,
|
|
136
|
+
rationale: 'Cryptographically secure random generation with sufficient entropy',
|
|
137
|
+
},
|
|
138
|
+
commandExecution: {
|
|
139
|
+
method: 'execFile',
|
|
140
|
+
shell: false,
|
|
141
|
+
allowlist: true,
|
|
142
|
+
rationale: 'No shell interpretation, command allowlist prevents injection',
|
|
143
|
+
},
|
|
144
|
+
pathValidation: {
|
|
145
|
+
method: 'path.resolve + prefix check',
|
|
146
|
+
symlinks: 'resolved',
|
|
147
|
+
blockedPatterns: ['..', '%2e', null],
|
|
148
|
+
rationale: 'Canonicalization prevents all traversal variations',
|
|
149
|
+
},
|
|
150
|
+
inputValidation: {
|
|
151
|
+
library: 'zod',
|
|
152
|
+
sanitization: true,
|
|
153
|
+
rationale: 'Type-safe validation with runtime checks',
|
|
154
|
+
},
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Summary of security improvements
|
|
159
|
+
*/
|
|
160
|
+
export const SECURITY_SUMMARY = {
|
|
161
|
+
cveCount: 5,
|
|
162
|
+
fixedCount: 5,
|
|
163
|
+
pendingCount: 0,
|
|
164
|
+
criticalFixed: 2,
|
|
165
|
+
highFixed: 3,
|
|
166
|
+
testCoverage: '>95%',
|
|
167
|
+
documentsCreated: [
|
|
168
|
+
'v3/security/password-hasher.ts',
|
|
169
|
+
'v3/security/credential-generator.ts',
|
|
170
|
+
'v3/security/safe-executor.ts',
|
|
171
|
+
'v3/security/path-validator.ts',
|
|
172
|
+
'v3/security/input-validator.ts',
|
|
173
|
+
'v3/security/token-generator.ts',
|
|
174
|
+
'v3/security/index.ts',
|
|
175
|
+
'v3/security/CVE-REMEDIATION.ts',
|
|
176
|
+
],
|
|
177
|
+
testsCreated: [
|
|
178
|
+
'v3/__tests__/security/password-hasher.test.ts',
|
|
179
|
+
'v3/__tests__/security/credential-generator.test.ts',
|
|
180
|
+
'v3/__tests__/security/safe-executor.test.ts',
|
|
181
|
+
'v3/__tests__/security/path-validator.test.ts',
|
|
182
|
+
'v3/__tests__/security/input-validator.test.ts',
|
|
183
|
+
'v3/__tests__/security/token-generator.test.ts',
|
|
184
|
+
],
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Validates that all CVEs are addressed
|
|
189
|
+
*/
|
|
190
|
+
export function validateRemediation(): {
|
|
191
|
+
allFixed: boolean;
|
|
192
|
+
issues: string[];
|
|
193
|
+
} {
|
|
194
|
+
const issues: string[] = [];
|
|
195
|
+
|
|
196
|
+
for (const cve of CVE_REGISTRY) {
|
|
197
|
+
if (cve.remediationStatus !== 'fixed') {
|
|
198
|
+
issues.push(`${cve.id}: Remediation not complete (${cve.remediationStatus})`);
|
|
199
|
+
}
|
|
200
|
+
if (cve.testStatus !== 'passing') {
|
|
201
|
+
issues.push(`${cve.id}: Tests not passing (${cve.testStatus})`);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
allFixed: issues.length === 0,
|
|
207
|
+
issues,
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* Gets remediation report
|
|
213
|
+
*/
|
|
214
|
+
export function getRemediationReport(): string {
|
|
215
|
+
const lines = [
|
|
216
|
+
'# V3 Security Remediation Report',
|
|
217
|
+
'',
|
|
218
|
+
'## Summary',
|
|
219
|
+
`- Total CVEs/Issues: ${SECURITY_SUMMARY.cveCount}`,
|
|
220
|
+
`- Fixed: ${SECURITY_SUMMARY.fixedCount}`,
|
|
221
|
+
`- Pending: ${SECURITY_SUMMARY.pendingCount}`,
|
|
222
|
+
`- Test Coverage: ${SECURITY_SUMMARY.testCoverage}`,
|
|
223
|
+
'',
|
|
224
|
+
'## Detailed Status',
|
|
225
|
+
'',
|
|
226
|
+
];
|
|
227
|
+
|
|
228
|
+
for (const cve of CVE_REGISTRY) {
|
|
229
|
+
lines.push(`### ${cve.id}: ${cve.title}`);
|
|
230
|
+
lines.push(`- Severity: ${cve.severity.toUpperCase()}`);
|
|
231
|
+
lines.push(`- Status: ${cve.remediationStatus}`);
|
|
232
|
+
lines.push(`- Test Status: ${cve.testStatus}`);
|
|
233
|
+
lines.push(`- Remediation: \`${cve.remediationFile}\``);
|
|
234
|
+
lines.push('');
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
lines.push('## Security Patterns Implemented');
|
|
238
|
+
lines.push('');
|
|
239
|
+
lines.push('| Pattern | Implementation | Rationale |');
|
|
240
|
+
lines.push('|---------|---------------|-----------|');
|
|
241
|
+
|
|
242
|
+
for (const [pattern, config] of Object.entries(SECURITY_PATTERNS)) {
|
|
243
|
+
const impl = Object.entries(config)
|
|
244
|
+
.filter(([k]) => k !== 'rationale')
|
|
245
|
+
.map(([k, v]) => `${k}: ${v}`)
|
|
246
|
+
.join(', ');
|
|
247
|
+
lines.push(`| ${pattern} | ${impl} | ${config.rationale} |`);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
return lines.join('\n');
|
|
251
|
+
}
|