codeslick-cli 1.4.0 → 1.4.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/dist/packages/cli/src/commands/scan.d.ts.map +1 -1
- package/dist/packages/cli/src/commands/scan.js +7 -3
- package/dist/packages/cli/src/commands/scan.js.map +1 -1
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts +11 -0
- package/dist/packages/cli/src/reporters/cli-reporter.d.ts.map +1 -1
- package/dist/packages/cli/src/reporters/cli-reporter.js +150 -45
- package/dist/packages/cli/src/reporters/cli-reporter.js.map +1 -1
- package/dist/packages/cli/src/scanner/local-scanner.d.ts +2 -2
- package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -1
- package/dist/packages/cli/src/scanner/local-scanner.js +40 -9
- package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -1
- package/dist/src/lib/analyzers/go-analyzer.d.ts +12 -0
- package/dist/src/lib/analyzers/go-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/go-analyzer.js +113 -0
- package/dist/src/lib/analyzers/go-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/iac/pii-detector.d.ts +27 -0
- package/dist/src/lib/analyzers/iac/pii-detector.d.ts.map +1 -0
- package/dist/src/lib/analyzers/iac/pii-detector.js +199 -0
- package/dist/src/lib/analyzers/iac/pii-detector.js.map +1 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.d.ts +43 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.d.ts.map +1 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.js +228 -0
- package/dist/src/lib/analyzers/iac/pii-patterns.js.map +1 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/java-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/java-analyzer.js +51 -0
- package/dist/src/lib/analyzers/java-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts +8 -4
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js +109 -13
- package/dist/src/lib/analyzers/javascript/quality-checks/ai-hallucinations.js.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js +7 -8
- package/dist/src/lib/analyzers/javascript/quality-checks/reference-errors.js.map +1 -1
- package/dist/src/lib/analyzers/javascript-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/javascript-analyzer.js +16 -12
- package/dist/src/lib/analyzers/javascript-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.d.ts +33 -0
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.js +184 -0
- package/dist/src/lib/analyzers/kubernetes/checks/network-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.d.ts +60 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.js +418 -0
- package/dist/src/lib/analyzers/kubernetes/checks/pod-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.d.ts +44 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.js +275 -0
- package/dist/src/lib/analyzers/kubernetes/checks/rbac-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.d.ts +32 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.js +176 -0
- package/dist/src/lib/analyzers/kubernetes/checks/resource-management.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.d.ts +38 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.js +266 -0
- package/dist/src/lib/analyzers/kubernetes/checks/secrets-management.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.d.ts +26 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.js +120 -0
- package/dist/src/lib/analyzers/kubernetes/checks/service-security.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/parser.d.ts +74 -0
- package/dist/src/lib/analyzers/kubernetes/parser.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/parser.js +233 -0
- package/dist/src/lib/analyzers/kubernetes/parser.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.d.ts +34 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.js +182 -0
- package/dist/src/lib/analyzers/kubernetes/pii-detector.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/types.d.ts +266 -0
- package/dist/src/lib/analyzers/kubernetes/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes/types.js +77 -0
- package/dist/src/lib/analyzers/kubernetes/types.js.map +1 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.d.ts +93 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.js +215 -0
- package/dist/src/lib/analyzers/kubernetes-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/python-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/python-analyzer.js +32 -48
- package/dist/src/lib/analyzers/python-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/ai-providers.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/aws.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/cloud-providers.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/communication.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/generic.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/github.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys/stripe.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/api-keys.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/private-keys.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/tokens.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +2 -32
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/types.d.ts +40 -0
- package/dist/src/lib/analyzers/secrets/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/secrets/types.js +10 -0
- package/dist/src/lib/analyzers/secrets/types.js.map +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/terraform-analyzer.js +28 -0
- package/dist/src/lib/analyzers/terraform-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts +5 -0
- package/dist/src/lib/analyzers/typescript-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/typescript-analyzer.js +76 -0
- package/dist/src/lib/analyzers/typescript-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/utils/false-positive-filter.d.ts +27 -0
- package/dist/src/lib/analyzers/utils/false-positive-filter.d.ts.map +1 -0
- package/dist/src/lib/analyzers/utils/false-positive-filter.js +176 -0
- package/dist/src/lib/analyzers/utils/false-positive-filter.js.map +1 -0
- package/dist/src/lib/security/epss-service.d.ts.map +1 -1
- package/dist/src/lib/security/epss-service.js +27 -8
- package/dist/src/lib/security/epss-service.js.map +1 -1
- package/dist/src/lib/security/severity-scoring.d.ts.map +1 -1
- package/dist/src/lib/security/severity-scoring.js +24 -0
- package/dist/src/lib/security/severity-scoring.js.map +1 -1
- package/dist/src/lib/types/index.d.ts +3 -3
- package/dist/src/lib/types/index.d.ts.map +1 -1
- package/dist/src/lib/utils/ignore-patterns.d.ts +60 -0
- package/dist/src/lib/utils/ignore-patterns.d.ts.map +1 -0
- package/dist/src/lib/utils/ignore-patterns.js +212 -0
- package/dist/src/lib/utils/ignore-patterns.js.map +1 -0
- package/package.json +1 -1
- package/src/commands/scan.ts +7 -3
- package/src/reporters/cli-reporter.ts +174 -48
- package/src/scanner/local-scanner.ts +54 -10
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pod-security.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/kubernetes/checks/pod-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes RBAC Security Checks
|
|
3
|
+
*
|
|
4
|
+
* WR3 Week 6: 5 Critical/High/Medium Severity RBAC Security Checks
|
|
5
|
+
* - Cluster-admin bindings
|
|
6
|
+
* - Wildcard rules
|
|
7
|
+
* - Overly permissive roles
|
|
8
|
+
* - ServiceAccount token automount
|
|
9
|
+
* - Default ServiceAccount usage
|
|
10
|
+
*
|
|
11
|
+
* Created: February 5, 2026
|
|
12
|
+
*/
|
|
13
|
+
import { SecurityVulnerability } from '../../types';
|
|
14
|
+
import type { KubernetesResource } from '../types';
|
|
15
|
+
/**
|
|
16
|
+
* Check #9: Cluster-Admin Bindings (Critical - CVSS 9.5)
|
|
17
|
+
* Detects RoleBindings/ClusterRoleBindings that grant cluster-admin role
|
|
18
|
+
*/
|
|
19
|
+
export declare function checkClusterAdminBindings(resource: KubernetesResource): SecurityVulnerability | null;
|
|
20
|
+
/**
|
|
21
|
+
* Check #10: Wildcard RBAC Rules (High - CVSS 8.5)
|
|
22
|
+
* Detects roles with wildcard (*) permissions on resources or verbs
|
|
23
|
+
*/
|
|
24
|
+
export declare function checkWildcardRules(resource: KubernetesResource): SecurityVulnerability | null;
|
|
25
|
+
/**
|
|
26
|
+
* Check #11: Overly Permissive Roles (High - CVSS 8.0)
|
|
27
|
+
* Detects roles with dangerous verbs on sensitive resources
|
|
28
|
+
*/
|
|
29
|
+
export declare function checkOverlyPermissiveRoles(resource: KubernetesResource): SecurityVulnerability | null;
|
|
30
|
+
/**
|
|
31
|
+
* Check #12: ServiceAccount Token Automount (Medium - CVSS 6.5)
|
|
32
|
+
* Detects pods with automountServiceAccountToken not disabled
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkServiceAccountTokenAutomount(resource: KubernetesResource): SecurityVulnerability | null;
|
|
35
|
+
/**
|
|
36
|
+
* Check #13: Default ServiceAccount Usage (Medium - CVSS 6.0)
|
|
37
|
+
* Detects pods using the default service account
|
|
38
|
+
*/
|
|
39
|
+
export declare function checkDefaultServiceAccount(resource: KubernetesResource): SecurityVulnerability | null;
|
|
40
|
+
/**
|
|
41
|
+
* Run all RBAC security checks on a resource
|
|
42
|
+
*/
|
|
43
|
+
export declare function runRBACSecurityChecks(resource: KubernetesResource): SecurityVulnerability[];
|
|
44
|
+
//# sourceMappingURL=rbac-security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac-security.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/kubernetes/checks/rbac-security.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAY,MAAM,UAAU,CAAC;AAI7D;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CA0CpG;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAqD7F;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAwDrG;AAED;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,kBAAkB,GAC3B,qBAAqB,GAAG,IAAI,CAmC9B;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAqCrG;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,EAAE,CAmB3F"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Kubernetes RBAC Security Checks
|
|
4
|
+
*
|
|
5
|
+
* WR3 Week 6: 5 Critical/High/Medium Severity RBAC Security Checks
|
|
6
|
+
* - Cluster-admin bindings
|
|
7
|
+
* - Wildcard rules
|
|
8
|
+
* - Overly permissive roles
|
|
9
|
+
* - ServiceAccount token automount
|
|
10
|
+
* - Default ServiceAccount usage
|
|
11
|
+
*
|
|
12
|
+
* Created: February 5, 2026
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.checkClusterAdminBindings = checkClusterAdminBindings;
|
|
16
|
+
exports.checkWildcardRules = checkWildcardRules;
|
|
17
|
+
exports.checkOverlyPermissiveRoles = checkOverlyPermissiveRoles;
|
|
18
|
+
exports.checkServiceAccountTokenAutomount = checkServiceAccountTokenAutomount;
|
|
19
|
+
exports.checkDefaultServiceAccount = checkDefaultServiceAccount;
|
|
20
|
+
exports.runRBACSecurityChecks = runRBACSecurityChecks;
|
|
21
|
+
const parser_1 = require("../parser");
|
|
22
|
+
const types_1 = require("../types");
|
|
23
|
+
/**
|
|
24
|
+
* Check #9: Cluster-Admin Bindings (Critical - CVSS 9.5)
|
|
25
|
+
* Detects RoleBindings/ClusterRoleBindings that grant cluster-admin role
|
|
26
|
+
*/
|
|
27
|
+
function checkClusterAdminBindings(resource) {
|
|
28
|
+
if (!['RoleBinding', 'ClusterRoleBinding'].includes(resource.kind)) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
const roleRef = resource.roleRef;
|
|
32
|
+
if (!roleRef)
|
|
33
|
+
return null;
|
|
34
|
+
// Check if binding references cluster-admin role
|
|
35
|
+
if (roleRef.name === 'cluster-admin' || roleRef.name.includes('cluster-admin')) {
|
|
36
|
+
const subjects = resource.subjects || [];
|
|
37
|
+
const subjectNames = subjects.map(s => `${s.kind}:${s.name}`).join(', ');
|
|
38
|
+
return {
|
|
39
|
+
severity: 'critical',
|
|
40
|
+
message: `Cluster-admin role binding detected in ${(0, parser_1.getResourceIdentifier)(resource)} for subjects: ${subjectNames}`,
|
|
41
|
+
suggestion: 'Avoid binding cluster-admin role. Use least-privilege principle with specific roles that grant only required permissions.',
|
|
42
|
+
category: 'kubernetes-cluster-admin-binding',
|
|
43
|
+
cvssScore: 9.5,
|
|
44
|
+
exploitLikelihood: 'high',
|
|
45
|
+
impact: 'privilege-escalation',
|
|
46
|
+
owasp: 'A01:2021',
|
|
47
|
+
cwe: 'CWE-250',
|
|
48
|
+
attackVector: {
|
|
49
|
+
description: 'Cluster-admin grants full cluster control. If compromised, attacker has unlimited access to all resources.',
|
|
50
|
+
exploitExample: 'Attacker compromises service account → Has cluster-admin → Accesses all secrets → Full cluster takeover',
|
|
51
|
+
realWorldImpact: [
|
|
52
|
+
'Complete cluster compromise',
|
|
53
|
+
'Access to all secrets and sensitive data',
|
|
54
|
+
'Ability to create/delete any resource',
|
|
55
|
+
'Node-level access via pod exec',
|
|
56
|
+
],
|
|
57
|
+
},
|
|
58
|
+
remediation: {
|
|
59
|
+
before: `roleRef:\n apiGroup: rbac.authorization.k8s.io\n kind: ClusterRole\n name: cluster-admin`,
|
|
60
|
+
after: `roleRef:\n apiGroup: rbac.authorization.k8s.io\n kind: Role\n name: app-specific-role # Create custom role with minimal permissions`,
|
|
61
|
+
explanation: 'Create a custom Role with only the specific permissions needed (e.g., get/list pods in specific namespace).',
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Check #10: Wildcard RBAC Rules (High - CVSS 8.5)
|
|
69
|
+
* Detects roles with wildcard (*) permissions on resources or verbs
|
|
70
|
+
*/
|
|
71
|
+
function checkWildcardRules(resource) {
|
|
72
|
+
if (!['Role', 'ClusterRole'].includes(resource.kind)) {
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
const rules = resource.rules || [];
|
|
76
|
+
const wildcardRules = [];
|
|
77
|
+
for (let i = 0; i < rules.length; i++) {
|
|
78
|
+
const rule = rules[i];
|
|
79
|
+
const hasWildcardVerbs = rule.verbs.includes('*');
|
|
80
|
+
const hasWildcardResources = rule.resources?.includes('*');
|
|
81
|
+
const hasWildcardApiGroups = rule.apiGroups?.includes('*');
|
|
82
|
+
if (hasWildcardVerbs || hasWildcardResources || hasWildcardApiGroups) {
|
|
83
|
+
const details = [];
|
|
84
|
+
if (hasWildcardVerbs)
|
|
85
|
+
details.push('verbs: *');
|
|
86
|
+
if (hasWildcardResources)
|
|
87
|
+
details.push('resources: *');
|
|
88
|
+
if (hasWildcardApiGroups)
|
|
89
|
+
details.push('apiGroups: *');
|
|
90
|
+
wildcardRules.push(`Rule ${i + 1} (${details.join(', ')})`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (wildcardRules.length > 0) {
|
|
94
|
+
return {
|
|
95
|
+
severity: 'high',
|
|
96
|
+
message: `Wildcard RBAC permissions detected in ${(0, parser_1.getResourceIdentifier)(resource)}: ${wildcardRules.join('; ')}`,
|
|
97
|
+
suggestion: 'Replace wildcard (*) permissions with explicit resource types and verbs. Use principle of least privilege.',
|
|
98
|
+
category: 'kubernetes-rbac-wildcard',
|
|
99
|
+
cvssScore: 8.5,
|
|
100
|
+
exploitLikelihood: 'high',
|
|
101
|
+
impact: 'privilege-escalation',
|
|
102
|
+
owasp: 'A01:2021',
|
|
103
|
+
cwe: 'CWE-269',
|
|
104
|
+
attackVector: {
|
|
105
|
+
description: 'Wildcard permissions grant excessive privileges that can be exploited for privilege escalation and lateral movement.',
|
|
106
|
+
exploitExample: 'Service account with verbs:* on secrets → Attacker reads all secrets in namespace → Accesses database credentials',
|
|
107
|
+
realWorldImpact: [
|
|
108
|
+
'Excessive permissions beyond requirements',
|
|
109
|
+
'Privilege escalation opportunities',
|
|
110
|
+
'Access to sensitive resources (secrets, configmaps)',
|
|
111
|
+
'Ability to modify critical workloads',
|
|
112
|
+
],
|
|
113
|
+
},
|
|
114
|
+
remediation: {
|
|
115
|
+
before: `rules:\n - apiGroups: ["*"]\n resources: ["*"]\n verbs: ["*"]`,
|
|
116
|
+
after: `rules:\n - apiGroups: [""]\n resources: ["pods", "services"]\n verbs: ["get", "list", "watch"]`,
|
|
117
|
+
explanation: 'Specify exact API groups, resource types, and verbs needed for the application to function.',
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Check #11: Overly Permissive Roles (High - CVSS 8.0)
|
|
125
|
+
* Detects roles with dangerous verbs on sensitive resources
|
|
126
|
+
*/
|
|
127
|
+
function checkOverlyPermissiveRoles(resource) {
|
|
128
|
+
if (!['Role', 'ClusterRole'].includes(resource.kind)) {
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const rules = resource.rules || [];
|
|
132
|
+
const dangerousRules = [];
|
|
133
|
+
for (let i = 0; i < rules.length; i++) {
|
|
134
|
+
const rule = rules[i];
|
|
135
|
+
const resources = rule.resources || [];
|
|
136
|
+
const verbs = rule.verbs || [];
|
|
137
|
+
// Check if rule grants dangerous verbs on sensitive resources
|
|
138
|
+
const hasSensitiveResource = resources.some(r => types_1.SENSITIVE_RESOURCES.includes(r));
|
|
139
|
+
const hasDangerousVerb = verbs.some(v => types_1.DANGEROUS_VERBS.includes(v));
|
|
140
|
+
if (hasSensitiveResource && hasDangerousVerb) {
|
|
141
|
+
const sensitiveFound = resources.filter(r => types_1.SENSITIVE_RESOURCES.includes(r));
|
|
142
|
+
const dangerousFound = verbs.filter(v => types_1.DANGEROUS_VERBS.includes(v));
|
|
143
|
+
dangerousRules.push(`Rule ${i + 1}: ${dangerousFound.join(', ')} on ${sensitiveFound.join(', ')}`);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
if (dangerousRules.length > 0) {
|
|
147
|
+
return {
|
|
148
|
+
severity: 'high',
|
|
149
|
+
message: `Overly permissive RBAC role detected in ${(0, parser_1.getResourceIdentifier)(resource)}: ${dangerousRules.join('; ')}`,
|
|
150
|
+
suggestion: 'Limit dangerous verbs (create, delete, update, patch) on sensitive resources (secrets, pods/exec, clusterroles).',
|
|
151
|
+
category: 'kubernetes-rbac-overly-permissive',
|
|
152
|
+
cvssScore: 8.0,
|
|
153
|
+
exploitLikelihood: 'high',
|
|
154
|
+
impact: 'privilege-escalation',
|
|
155
|
+
owasp: 'A01:2021',
|
|
156
|
+
cwe: 'CWE-269',
|
|
157
|
+
attackVector: {
|
|
158
|
+
description: 'Dangerous verbs on sensitive resources enable privilege escalation, secret theft, and command execution.',
|
|
159
|
+
exploitExample: 'Role with create on pods/exec → Attacker creates pod → Executes commands in container → Accesses secrets',
|
|
160
|
+
realWorldImpact: [
|
|
161
|
+
'Secret exfiltration (create/update on secrets)',
|
|
162
|
+
'Remote code execution (create on pods/exec)',
|
|
163
|
+
'Privilege escalation (update on clusterroles)',
|
|
164
|
+
'Data deletion (delete on persistentvolumes)',
|
|
165
|
+
],
|
|
166
|
+
},
|
|
167
|
+
remediation: {
|
|
168
|
+
before: `rules:\n - apiGroups: [""]\n resources: ["secrets"]\n verbs: ["*", "delete", "create"]`,
|
|
169
|
+
after: `rules:\n - apiGroups: [""]\n resources: ["secrets"]\n verbs: ["get", "list"] # Read-only access`,
|
|
170
|
+
explanation: 'Grant only read permissions (get, list, watch) unless write access is absolutely required.',
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Check #12: ServiceAccount Token Automount (Medium - CVSS 6.5)
|
|
178
|
+
* Detects pods with automountServiceAccountToken not disabled
|
|
179
|
+
*/
|
|
180
|
+
function checkServiceAccountTokenAutomount(resource) {
|
|
181
|
+
const podSpec = (0, parser_1.getPodSpec)(resource);
|
|
182
|
+
if (!podSpec)
|
|
183
|
+
return null;
|
|
184
|
+
// Check if automountServiceAccountToken is explicitly set to false
|
|
185
|
+
if (podSpec.automountServiceAccountToken !== false) {
|
|
186
|
+
return {
|
|
187
|
+
severity: 'medium',
|
|
188
|
+
message: `ServiceAccount token automount enabled in ${(0, parser_1.getResourceIdentifier)(resource)}`,
|
|
189
|
+
suggestion: 'Set automountServiceAccountToken: false unless the pod needs Kubernetes API access.',
|
|
190
|
+
category: 'kubernetes-serviceaccount-automount',
|
|
191
|
+
cvssScore: 6.5,
|
|
192
|
+
exploitLikelihood: 'medium',
|
|
193
|
+
impact: 'privilege-escalation',
|
|
194
|
+
owasp: 'A05:2021',
|
|
195
|
+
cwe: 'CWE-250',
|
|
196
|
+
attackVector: {
|
|
197
|
+
description: 'Automounted service account tokens can be stolen from compromised containers and used to access Kubernetes API.',
|
|
198
|
+
exploitExample: 'Attacker compromises container → Reads /var/run/secrets/kubernetes.io/serviceaccount/token → Accesses API with pod permissions',
|
|
199
|
+
realWorldImpact: [
|
|
200
|
+
'Service account token theft',
|
|
201
|
+
'Kubernetes API access from compromised container',
|
|
202
|
+
'Lateral movement within cluster',
|
|
203
|
+
'Privilege escalation if service account has elevated permissions',
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
remediation: {
|
|
207
|
+
before: `spec:\n # automountServiceAccountToken defaults to true`,
|
|
208
|
+
after: `spec:\n automountServiceAccountToken: false\n # Only set to true if pod needs K8s API access`,
|
|
209
|
+
explanation: 'Disable service account token mounting for pods that do not need to communicate with the Kubernetes API.',
|
|
210
|
+
},
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
return null;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* Check #13: Default ServiceAccount Usage (Medium - CVSS 6.0)
|
|
217
|
+
* Detects pods using the default service account
|
|
218
|
+
*/
|
|
219
|
+
function checkDefaultServiceAccount(resource) {
|
|
220
|
+
const podSpec = (0, parser_1.getPodSpec)(resource);
|
|
221
|
+
if (!podSpec)
|
|
222
|
+
return null;
|
|
223
|
+
const serviceAccountName = podSpec.serviceAccountName;
|
|
224
|
+
// Check if using default service account (explicitly or implicitly)
|
|
225
|
+
if (!serviceAccountName || serviceAccountName === 'default') {
|
|
226
|
+
return {
|
|
227
|
+
severity: 'medium',
|
|
228
|
+
message: `Default ServiceAccount usage detected in ${(0, parser_1.getResourceIdentifier)(resource)}`,
|
|
229
|
+
suggestion: 'Create a dedicated ServiceAccount with minimal permissions instead of using the default account.',
|
|
230
|
+
category: 'kubernetes-default-serviceaccount',
|
|
231
|
+
cvssScore: 6.0,
|
|
232
|
+
exploitLikelihood: 'medium',
|
|
233
|
+
impact: 'privilege-escalation',
|
|
234
|
+
owasp: 'A05:2021',
|
|
235
|
+
cwe: 'CWE-250',
|
|
236
|
+
attackVector: {
|
|
237
|
+
description: 'Default service accounts may have excessive permissions or be shared across multiple workloads, increasing blast radius.',
|
|
238
|
+
exploitExample: 'Multiple pods use default SA → One pod compromised → Attacker has permissions from shared SA → Lateral movement',
|
|
239
|
+
realWorldImpact: [
|
|
240
|
+
'Shared permissions across multiple workloads',
|
|
241
|
+
'Difficult to audit which pod performed action',
|
|
242
|
+
'Excessive permissions if default SA is over-privileged',
|
|
243
|
+
'Increased blast radius of compromise',
|
|
244
|
+
],
|
|
245
|
+
},
|
|
246
|
+
remediation: {
|
|
247
|
+
before: `spec:\n # serviceAccountName defaults to "default"`,
|
|
248
|
+
after: `spec:\n serviceAccountName: my-app-sa\n---\napiVersion: v1\nkind: ServiceAccount\nmetadata:\n name: my-app-sa`,
|
|
249
|
+
explanation: 'Create dedicated ServiceAccounts for each application with specific RBAC permissions tailored to their needs.',
|
|
250
|
+
},
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
return null;
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Run all RBAC security checks on a resource
|
|
257
|
+
*/
|
|
258
|
+
function runRBACSecurityChecks(resource) {
|
|
259
|
+
const vulnerabilities = [];
|
|
260
|
+
const checks = [
|
|
261
|
+
checkClusterAdminBindings,
|
|
262
|
+
checkWildcardRules,
|
|
263
|
+
checkOverlyPermissiveRoles,
|
|
264
|
+
checkServiceAccountTokenAutomount,
|
|
265
|
+
checkDefaultServiceAccount,
|
|
266
|
+
];
|
|
267
|
+
for (const check of checks) {
|
|
268
|
+
const vuln = check(resource);
|
|
269
|
+
if (vuln) {
|
|
270
|
+
vulnerabilities.push(vuln);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return vulnerabilities;
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=rbac-security.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rbac-security.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/kubernetes/checks/rbac-security.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Resource Management Checks
|
|
3
|
+
*
|
|
4
|
+
* WR3 Week 6: 3 High/Medium Severity Resource Management Checks
|
|
5
|
+
* - Missing resource limits
|
|
6
|
+
* - Missing resource requests
|
|
7
|
+
* - Latest image tag usage
|
|
8
|
+
*
|
|
9
|
+
* Created: February 5, 2026
|
|
10
|
+
*/
|
|
11
|
+
import { SecurityVulnerability } from '../../types';
|
|
12
|
+
import type { KubernetesResource } from '../types';
|
|
13
|
+
/**
|
|
14
|
+
* Check #21: Missing Resource Limits (High - CVSS 7.0)
|
|
15
|
+
* Detects containers without resource limits (CPU/memory)
|
|
16
|
+
*/
|
|
17
|
+
export declare function checkMissingResourceLimits(resource: KubernetesResource): SecurityVulnerability | null;
|
|
18
|
+
/**
|
|
19
|
+
* Check #22: Missing Resource Requests (Medium - CVSS 6.0)
|
|
20
|
+
* Detects containers without resource requests (CPU/memory)
|
|
21
|
+
*/
|
|
22
|
+
export declare function checkMissingResourceRequests(resource: KubernetesResource): SecurityVulnerability | null;
|
|
23
|
+
/**
|
|
24
|
+
* Check #23: Latest Image Tag (Medium - CVSS 5.5)
|
|
25
|
+
* Detects containers using :latest or no tag (mutable tags)
|
|
26
|
+
*/
|
|
27
|
+
export declare function checkLatestImageTag(resource: KubernetesResource): SecurityVulnerability | null;
|
|
28
|
+
/**
|
|
29
|
+
* Run all resource management checks on a resource
|
|
30
|
+
*/
|
|
31
|
+
export declare function runResourceManagementChecks(resource: KubernetesResource): SecurityVulnerability[];
|
|
32
|
+
//# sourceMappingURL=resource-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-management.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/kubernetes/checks/resource-management.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAa,MAAM,UAAU,CAAC;AAG9D;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,kBAAkB,GAC3B,qBAAqB,GAAG,IAAI,CA6C9B;AAED;;;GAGG;AACH,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,kBAAkB,GAC3B,qBAAqB,GAAG,IAAI,CA6C9B;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAgD9F;AAED;;GAEG;AACH,wBAAgB,2BAA2B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,EAAE,CAiBjG"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Kubernetes Resource Management Checks
|
|
4
|
+
*
|
|
5
|
+
* WR3 Week 6: 3 High/Medium Severity Resource Management Checks
|
|
6
|
+
* - Missing resource limits
|
|
7
|
+
* - Missing resource requests
|
|
8
|
+
* - Latest image tag usage
|
|
9
|
+
*
|
|
10
|
+
* Created: February 5, 2026
|
|
11
|
+
*/
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.checkMissingResourceLimits = checkMissingResourceLimits;
|
|
14
|
+
exports.checkMissingResourceRequests = checkMissingResourceRequests;
|
|
15
|
+
exports.checkLatestImageTag = checkLatestImageTag;
|
|
16
|
+
exports.runResourceManagementChecks = runResourceManagementChecks;
|
|
17
|
+
const parser_1 = require("../parser");
|
|
18
|
+
/**
|
|
19
|
+
* Check #21: Missing Resource Limits (High - CVSS 7.0)
|
|
20
|
+
* Detects containers without resource limits (CPU/memory)
|
|
21
|
+
*/
|
|
22
|
+
function checkMissingResourceLimits(resource) {
|
|
23
|
+
const podSpec = (0, parser_1.getPodSpec)(resource);
|
|
24
|
+
if (!podSpec)
|
|
25
|
+
return null;
|
|
26
|
+
const containers = [...(podSpec.containers || []), ...(podSpec.initContainers || [])];
|
|
27
|
+
const missingLimits = [];
|
|
28
|
+
for (const container of containers) {
|
|
29
|
+
const limits = container.resources?.limits;
|
|
30
|
+
if (!limits || (!limits.cpu && !limits.memory)) {
|
|
31
|
+
missingLimits.push(container.name);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
if (missingLimits.length > 0) {
|
|
35
|
+
return {
|
|
36
|
+
severity: 'high',
|
|
37
|
+
message: `Containers without resource limits in ${(0, parser_1.getResourceIdentifier)(resource)}: ${missingLimits.join(', ')}`,
|
|
38
|
+
suggestion: 'Set resources.limits.cpu and resources.limits.memory for all containers to prevent resource exhaustion.',
|
|
39
|
+
category: 'kubernetes-missing-resource-limits',
|
|
40
|
+
cvssScore: 7.0,
|
|
41
|
+
exploitLikelihood: 'high',
|
|
42
|
+
impact: 'denial-of-service',
|
|
43
|
+
owasp: 'A04:2021',
|
|
44
|
+
cwe: 'CWE-770',
|
|
45
|
+
attackVector: {
|
|
46
|
+
description: 'Containers without resource limits can consume all node resources, causing denial of service for other workloads.',
|
|
47
|
+
exploitExample: 'Attacker exploits vulnerability → Triggers resource-intensive operation → Container consumes all CPU/memory → Node becomes unresponsive',
|
|
48
|
+
realWorldImpact: [
|
|
49
|
+
'Noisy neighbor problem',
|
|
50
|
+
'Node resource exhaustion',
|
|
51
|
+
'Cascading failures across workloads',
|
|
52
|
+
'Cluster instability',
|
|
53
|
+
],
|
|
54
|
+
},
|
|
55
|
+
remediation: {
|
|
56
|
+
before: `containers:\n - name: app\n image: myapp:1.0`,
|
|
57
|
+
after: `containers:\n - name: app\n image: myapp:1.0\n resources:\n limits:\n cpu: "1000m"\n memory: "512Mi"\n requests:\n cpu: "500m"\n memory: "256Mi"`,
|
|
58
|
+
explanation: 'Define resource limits based on application profiling. Set limits slightly above peak usage to prevent OOM kills while protecting the node.',
|
|
59
|
+
},
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Check #22: Missing Resource Requests (Medium - CVSS 6.0)
|
|
66
|
+
* Detects containers without resource requests (CPU/memory)
|
|
67
|
+
*/
|
|
68
|
+
function checkMissingResourceRequests(resource) {
|
|
69
|
+
const podSpec = (0, parser_1.getPodSpec)(resource);
|
|
70
|
+
if (!podSpec)
|
|
71
|
+
return null;
|
|
72
|
+
const containers = [...(podSpec.containers || []), ...(podSpec.initContainers || [])];
|
|
73
|
+
const missingRequests = [];
|
|
74
|
+
for (const container of containers) {
|
|
75
|
+
const requests = container.resources?.requests;
|
|
76
|
+
if (!requests || (!requests.cpu && !requests.memory)) {
|
|
77
|
+
missingRequests.push(container.name);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
if (missingRequests.length > 0) {
|
|
81
|
+
return {
|
|
82
|
+
severity: 'medium',
|
|
83
|
+
message: `Containers without resource requests in ${(0, parser_1.getResourceIdentifier)(resource)}: ${missingRequests.join(', ')}`,
|
|
84
|
+
suggestion: 'Set resources.requests.cpu and resources.requests.memory for proper pod scheduling and QoS.',
|
|
85
|
+
category: 'kubernetes-missing-resource-requests',
|
|
86
|
+
cvssScore: 6.0,
|
|
87
|
+
exploitLikelihood: 'medium',
|
|
88
|
+
impact: 'availability',
|
|
89
|
+
owasp: 'A04:2021',
|
|
90
|
+
cwe: 'CWE-770',
|
|
91
|
+
attackVector: {
|
|
92
|
+
description: 'Without resource requests, pods may be scheduled on overcommitted nodes, leading to poor performance and evictions.',
|
|
93
|
+
exploitExample: 'Pod scheduled without requests → Node becomes overcommitted → Kubelet evicts pods under pressure → Service disruption',
|
|
94
|
+
realWorldImpact: [
|
|
95
|
+
'Poor QoS (BestEffort class)',
|
|
96
|
+
'Unpredictable pod evictions',
|
|
97
|
+
'Suboptimal scheduling decisions',
|
|
98
|
+
'Performance degradation under load',
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
remediation: {
|
|
102
|
+
before: `containers:\n - name: app\n image: myapp:1.0`,
|
|
103
|
+
after: `containers:\n - name: app\n image: myapp:1.0\n resources:\n requests:\n cpu: "500m"\n memory: "256Mi"\n limits:\n cpu: "1000m"\n memory: "512Mi"`,
|
|
104
|
+
explanation: 'Set resource requests to typical usage levels to ensure proper scheduling. Guaranteed QoS requires requests == limits.',
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Check #23: Latest Image Tag (Medium - CVSS 5.5)
|
|
112
|
+
* Detects containers using :latest or no tag (mutable tags)
|
|
113
|
+
*/
|
|
114
|
+
function checkLatestImageTag(resource) {
|
|
115
|
+
const podSpec = (0, parser_1.getPodSpec)(resource);
|
|
116
|
+
if (!podSpec)
|
|
117
|
+
return null;
|
|
118
|
+
const containers = [...(podSpec.containers || []), ...(podSpec.initContainers || [])];
|
|
119
|
+
const latestImageContainers = [];
|
|
120
|
+
for (const container of containers) {
|
|
121
|
+
const image = container.image || '';
|
|
122
|
+
// Check for :latest tag or no tag at all
|
|
123
|
+
const hasLatestTag = image.endsWith(':latest') || !image.includes(':');
|
|
124
|
+
if (hasLatestTag) {
|
|
125
|
+
latestImageContainers.push(`${container.name} (${image})`);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
if (latestImageContainers.length > 0) {
|
|
129
|
+
return {
|
|
130
|
+
severity: 'medium',
|
|
131
|
+
message: `Containers using :latest or untagged images in ${(0, parser_1.getResourceIdentifier)(resource)}: ${latestImageContainers.join(', ')}`,
|
|
132
|
+
suggestion: 'Use specific image tags (e.g., v1.2.3) or SHA256 digests for reproducible deployments.',
|
|
133
|
+
category: 'kubernetes-latest-image-tag',
|
|
134
|
+
cvssScore: 5.5,
|
|
135
|
+
exploitLikelihood: 'medium',
|
|
136
|
+
impact: 'supply-chain',
|
|
137
|
+
owasp: 'A06:2021',
|
|
138
|
+
cwe: 'CWE-494',
|
|
139
|
+
attackVector: {
|
|
140
|
+
description: 'Mutable tags like :latest can change without notice, leading to unexpected behavior or supply chain attacks.',
|
|
141
|
+
exploitExample: 'Attacker compromises registry → Replaces :latest tag with malicious image → Pod restart pulls compromised image → Backdoor deployed',
|
|
142
|
+
realWorldImpact: [
|
|
143
|
+
'Non-reproducible deployments',
|
|
144
|
+
'Supply chain attack vector',
|
|
145
|
+
'Unexpected image changes',
|
|
146
|
+
'Difficult rollback scenarios',
|
|
147
|
+
],
|
|
148
|
+
},
|
|
149
|
+
remediation: {
|
|
150
|
+
before: `containers:\n - name: app\n image: nginx:latest # or just "nginx"`,
|
|
151
|
+
after: `containers:\n - name: app\n image: nginx:1.25.3 # Specific version\n # Or even better: use SHA256 digest\n # image: nginx@sha256:a1b2c3d4...`,
|
|
152
|
+
explanation: 'Pin to specific semantic versions (v1.2.3) for stability, or use SHA256 digests (@sha256:...) for maximum security.',
|
|
153
|
+
},
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Run all resource management checks on a resource
|
|
160
|
+
*/
|
|
161
|
+
function runResourceManagementChecks(resource) {
|
|
162
|
+
const vulnerabilities = [];
|
|
163
|
+
const checks = [
|
|
164
|
+
checkMissingResourceLimits,
|
|
165
|
+
checkMissingResourceRequests,
|
|
166
|
+
checkLatestImageTag,
|
|
167
|
+
];
|
|
168
|
+
for (const check of checks) {
|
|
169
|
+
const vuln = check(resource);
|
|
170
|
+
if (vuln) {
|
|
171
|
+
vulnerabilities.push(vuln);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return vulnerabilities;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=resource-management.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resource-management.js","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/kubernetes/checks/resource-management.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kubernetes Secrets Management Checks
|
|
3
|
+
*
|
|
4
|
+
* WR3 Week 6: 4 High/Medium Severity Secrets Management Checks
|
|
5
|
+
* - Hardcoded secrets in ConfigMaps
|
|
6
|
+
* - Secrets in environment variables
|
|
7
|
+
* - Secrets mounted without readOnly
|
|
8
|
+
* - Base64-encoded secrets in YAML
|
|
9
|
+
*
|
|
10
|
+
* Created: February 5, 2026
|
|
11
|
+
*/
|
|
12
|
+
import { SecurityVulnerability } from '../../types';
|
|
13
|
+
import type { KubernetesResource } from '../types';
|
|
14
|
+
/**
|
|
15
|
+
* Check #14: Hardcoded Secrets in ConfigMaps (High - CVSS 7.5)
|
|
16
|
+
* Detects sensitive data patterns in ConfigMap data fields
|
|
17
|
+
*/
|
|
18
|
+
export declare function checkHardcodedSecretsInConfigMaps(resource: KubernetesResource): SecurityVulnerability | null;
|
|
19
|
+
/**
|
|
20
|
+
* Check #15: Secrets in Environment Variables (High - CVSS 7.0)
|
|
21
|
+
* Detects containers with environment variables containing plain-text secrets
|
|
22
|
+
*/
|
|
23
|
+
export declare function checkSecretsInEnvVars(resource: KubernetesResource): SecurityVulnerability | null;
|
|
24
|
+
/**
|
|
25
|
+
* Check #16: Secrets Mounted Without ReadOnly (Medium - CVSS 6.0)
|
|
26
|
+
* Detects secret volumes mounted without readOnly: true
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkSecretVolumesWritable(resource: KubernetesResource): SecurityVulnerability | null;
|
|
29
|
+
/**
|
|
30
|
+
* Check #17: Base64-Encoded Secrets in YAML (Medium - CVSS 5.5)
|
|
31
|
+
* Detects Secret resources with base64 data that may contain sensitive patterns
|
|
32
|
+
*/
|
|
33
|
+
export declare function checkBase64SecretsInYAML(resource: KubernetesResource): SecurityVulnerability | null;
|
|
34
|
+
/**
|
|
35
|
+
* Run all secrets management checks on a resource
|
|
36
|
+
*/
|
|
37
|
+
export declare function runSecretsManagementChecks(resource: KubernetesResource): SecurityVulnerability[];
|
|
38
|
+
//# sourceMappingURL=secrets-management.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-management.d.ts","sourceRoot":"","sources":["../../../../../../../../src/lib/analyzers/kubernetes/checks/secrets-management.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,OAAO,KAAK,EAAE,kBAAkB,EAAqB,MAAM,UAAU,CAAC;AAatE;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,kBAAkB,GAC3B,qBAAqB,GAAG,IAAI,CAwD9B;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAsEhG;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,kBAAkB,GAC3B,qBAAqB,GAAG,IAAI,CAwD9B;AAED;;;GAGG;AACH,wBAAgB,wBAAwB,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,GAAG,IAAI,CAwCnG;AAED;;GAEG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,kBAAkB,GAAG,qBAAqB,EAAE,CAkBhG"}
|