Skip to content

Commit 414bc75

Browse files
committed
Security docs
Signed-off-by: Mihai Criveti <[email protected]>
1 parent 7f7793e commit 414bc75

File tree

3 files changed

+64
-56
lines changed

3 files changed

+64
-56
lines changed

docs/docs/architecture/security-features.md

Lines changed: 40 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -6,31 +6,35 @@
66

77
## Comprehensive Security Capabilities
88

9+
**Legend**: ✅ = Completed | 🚧 = In Progress | 📋 = Planned
10+
911
### 🔐 Authentication & Identity Management
1012

11-
* **JWT Token Management** - Configurable JWT tokens with expiration, per-user token catalogs, and revocation support ([#87](https://github.com/IBM/mcp-context-forge/issues/87), [#425](https://github.com/IBM/mcp-context-forge/issues/425))
13+
* **JWT Token Management** - Configurable JWT tokens with expiration, per-user token catalogs, and revocation support ([#87](https://github.com/IBM/mcp-context-forge/issues/87), [#425](https://github.com/IBM/mcp-context-forge/issues/425))
1214

13-
* **Database-Backed User Authentication** - Argon2id password hashing replacing basic auth ([#544](https://github.com/IBM/mcp-context-forge/issues/544))
15+
* **Database-Backed User Authentication** - Argon2id password hashing replacing basic auth ([#544](https://github.com/IBM/mcp-context-forge/issues/544)) 🚧
1416

1517
* **Enterprise SSO Integration** - Support for GitHub, Google, LDAP/Active Directory identity providers ([#220](https://github.com/IBM/mcp-context-forge/issues/220), [#277](https://github.com/IBM/mcp-context-forge/issues/277), [#278](https://github.com/IBM/mcp-context-forge/issues/278), [#284](https://github.com/IBM/mcp-context-forge/issues/284))
1618

19+
* **OAuth Integration** - Support for OAuth 2.0 for delegated access to MCP servers ([#605](https://github.com/IBM/mcp-context-forge/issues/605)) 🚧
20+
1721
* **Per-Virtual-Server API Keys** - Scoped access control for individual virtual servers ([#282](https://github.com/IBM/mcp-context-forge/issues/282))
1822

19-
* **Enhanced Session Management** - Secure session handling for Admin UI ([#541](https://github.com/IBM/mcp-context-forge/issues/541))
23+
* **Enhanced Session Management** - Secure session handling for Admin UI ([#541](https://github.com/IBM/mcp-context-forge/issues/541)) 🚧
2024

21-
* **CSRF Token Protection** - Cross-site request forgery prevention ([#543](https://github.com/IBM/mcp-context-forge/issues/543))
25+
* **CSRF Token Protection** - Cross-site request forgery prevention ([#543](https://github.com/IBM/mcp-context-forge/issues/543)) 🚧
2226

2327
### 🛡️ Authorization & Access Control
2428

2529
* **Role-Based Access Control (RBAC)** - User/Team/Global scopes with private, team, and global catalog separation ([#283](https://github.com/IBM/mcp-context-forge/issues/283))
2630

27-
* **Attribute-Based Access Control (ABAC)** - Dynamic authorization based on user attributes, resource properties, and environmental context (Planned)
31+
* **Attribute-Based Access Control (ABAC)** - Dynamic authorization based on user attributes, resource properties, and environmental context ([#706](https://github.com/IBM/mcp-context-forge/issues/706)) 🚧
2832

2933
* **Policy-as-Code Engine** - Rego-based policy enforcement for fine-grained authorization ([#271](https://github.com/IBM/mcp-context-forge/issues/271))
3034

31-
* **IP-Based Access Control** - Configurable IP allowlisting for network-level security ([#536](https://github.com/IBM/mcp-context-forge/issues/536))
35+
* **IP-Based Access Control** - Configurable IP allowlisting for network-level security ([#536](https://github.com/IBM/mcp-context-forge/issues/536)) 🚧
3236

33-
* **Endpoint Feature Flags** - Selectively enable/disable tools, resources, prompts, servers, gateways ([#537](https://github.com/IBM/mcp-context-forge/issues/537))
37+
* **Endpoint Feature Flags** - Selectively enable/disable tools, resources, prompts, servers, gateways ([#537](https://github.com/IBM/mcp-context-forge/issues/537)) 🚧
3438

3539
* **Resource-Level Access Control** - Virtual server composition with granular tool/resource visibility control
3640

@@ -40,9 +44,9 @@
4044

4145
* **Cryptographic Request Signing** - End-to-end request/response signing and verification ([#230](https://github.com/IBM/mcp-context-forge/issues/230))
4246

43-
* **TLS/mTLS Support** - Certificate-based authentication with private CA support ([#568](https://github.com/IBM/mcp-context-forge/issues/568))
47+
* **TLS/mTLS Support** - Certificate-based authentication with private CA support ([#568](https://github.com/IBM/mcp-context-forge/issues/568)) 🚧
4448

45-
* **Enterprise Secrets Management** - HashiCorp Vault integration for secure credential storage ([#542](https://github.com/IBM/mcp-context-forge/issues/542))
49+
* **Enterprise Secrets Management** - HashiCorp Vault integration for secure credential storage ([#542](https://github.com/IBM/mcp-context-forge/issues/542)) 🚧
4650

4751
* **Transport Layer Security** - Multiple secure protocols (SSE, WebSocket, HTTPS) with configurable TLS termination
4852

@@ -58,15 +62,15 @@
5862

5963
* **AI Guardrails & PII Masking** - Input/output sanitization with sensitive data detection ([#229](https://github.com/IBM/mcp-context-forge/issues/229))
6064

61-
* **Content Size & Type Limits** - Security limits for resources and prompts ([#538](https://github.com/IBM/mcp-context-forge/issues/538))
65+
* **Content Size & Type Limits** - Security limits for resources and prompts ([#538](https://github.com/IBM/mcp-context-forge/issues/538)) 🚧
6266

63-
* **XSS Prevention** - DOMPurify integration and content sanitization ([#336](https://github.com/IBM/mcp-context-forge/issues/336), [#341](https://github.com/IBM/mcp-context-forge/issues/341), [#361](https://github.com/IBM/mcp-context-forge/issues/361))
67+
* **XSS Prevention** - DOMPurify integration and content sanitization ([#336](https://github.com/IBM/mcp-context-forge/issues/336), [#341](https://github.com/IBM/mcp-context-forge/issues/341), [#361](https://github.com/IBM/mcp-context-forge/issues/361))
6468

65-
* **SQL Injection Prevention** - Database-level security constraints ([#342](https://github.com/IBM/mcp-context-forge/issues/342))
69+
* **SQL Injection Prevention** - Database-level security constraints ([#342](https://github.com/IBM/mcp-context-forge/issues/342)) 🚧
6670

6771
### 🛠️ Plugin & Middleware Framework
6872

69-
* **Pre/Post Request Hooks** - Extensible plugin system for custom security policies ([#319](https://github.com/IBM/mcp-context-forge/issues/319))
73+
* **Pre/Post Request Hooks** - Extensible plugin system for custom security policies ([#319](https://github.com/IBM/mcp-context-forge/issues/319), ✅ [#682](https://github.com/IBM/mcp-context-forge/issues/682))
7074

7175
* **AI Middleware Integration** - Framework for adding LLM-based security capabilities ([#313](https://github.com/IBM/mcp-context-forge/issues/313))
7276

@@ -76,11 +80,11 @@
7680

7781
### 📊 Monitoring & Audit
7882

79-
* **Comprehensive Audit Logging** - Database-backed audit trail for all operations ([#535](https://github.com/IBM/mcp-context-forge/issues/535))
83+
* **Comprehensive Audit Logging** - Database-backed audit trail for all operations ([#535](https://github.com/IBM/mcp-context-forge/issues/535)) 🚧
8084

8185
* **Structured JSON Logging** - Correlation IDs for request tracing ([#300](https://github.com/IBM/mcp-context-forge/issues/300))
8286

83-
* **Dual Logging Support** - Console and file outputs with rotation policies ([#364](https://github.com/IBM/mcp-context-forge/issues/364))
87+
* **Dual Logging Support** - Console and file outputs with rotation policies ([#364](https://github.com/IBM/mcp-context-forge/issues/364))
8488

8589
* **OpenTelemetry Integration** - OpenLLMetry for comprehensive observability ([#175](https://github.com/IBM/mcp-context-forge/issues/175))
8690

@@ -96,35 +100,35 @@
96100

97101
* **Gateway-Level Rate Limiting** - Configurable request throttling per client/endpoint ([#257](https://github.com/IBM/mcp-context-forge/issues/257))
98102

99-
* **Tool Execution Limits** - Resource controls and execution boundaries ([#539](https://github.com/IBM/mcp-context-forge/issues/539))
103+
* **Tool Execution Limits** - Resource controls and execution boundaries ([#539](https://github.com/IBM/mcp-context-forge/issues/539)) 🚧
100104

101105
* **Circuit Breakers** - Automatic failover for unstable backends ([#301](https://github.com/IBM/mcp-context-forge/issues/301))
102106

103-
* **Smart Retry Mechanisms** - Exponential backoff with jitter ([#258](https://github.com/IBM/mcp-context-forge/issues/258), [#456](https://github.com/IBM/mcp-context-forge/issues/456))
107+
* **Smart Retry Mechanisms** - Exponential backoff with jitter ([#258](https://github.com/IBM/mcp-context-forge/issues/258), [#456](https://github.com/IBM/mcp-context-forge/issues/456))
104108

105109
### 🔍 Security Testing & Validation
106110

107111
* **SAST/DAST Integration** - Semgrep and OWASP ZAP automated testing ([#259](https://github.com/IBM/mcp-context-forge/issues/259))
108112

109-
* **Input Validation Test Suite** - Comprehensive security validation tests ([#552](https://github.com/IBM/mcp-context-forge/issues/552))
113+
* **Input Validation Test Suite** - Comprehensive security validation tests ([#552](https://github.com/IBM/mcp-context-forge/issues/552))
110114

111115
* **Fuzz Testing** - Hypothesis, atheris, schemathesis, RESTler ([#256](https://github.com/IBM/mcp-context-forge/issues/256))
112116

113117
* **Mutation Testing** - Test quality validation with mutmut ([#280](https://github.com/IBM/mcp-context-forge/issues/280))
114118

115-
* **Security Scanners** - Bandit, grype, nodejsscan integration ([#279](https://github.com/IBM/mcp-context-forge/issues/279), [#415](https://github.com/IBM/mcp-context-forge/issues/415), [#499](https://github.com/IBM/mcp-context-forge/issues/499))
119+
* **Security Scanners** - Bandit, grype, nodejsscan integration ([#279](https://github.com/IBM/mcp-context-forge/issues/279), [#415](https://github.com/IBM/mcp-context-forge/issues/415), [#499](https://github.com/IBM/mcp-context-forge/issues/499))
116120

117121
### 🏗️ Infrastructure Security
118122

119-
* **Zero-Trust Architecture** - Peer gateway health checks with automatic failover ([#424](https://github.com/IBM/mcp-context-forge/issues/424))
123+
* **Zero-Trust Architecture** - Peer gateway health checks with automatic failover ([#424](https://github.com/IBM/mcp-context-forge/issues/424))
120124

121-
* **Configuration Validation** - Schema enforcement with startup security checks ([#285](https://github.com/IBM/mcp-context-forge/issues/285), [#534](https://github.com/IBM/mcp-context-forge/issues/534))
125+
* **Configuration Validation** - Schema enforcement with startup security checks ([#285](https://github.com/IBM/mcp-context-forge/issues/285), [#534](https://github.com/IBM/mcp-context-forge/issues/534)) 🚧
122126

123-
* **Security Headers** - Configurable headers and CORS policies ([#344](https://github.com/IBM/mcp-context-forge/issues/344), [#533](https://github.com/IBM/mcp-context-forge/issues/533))
127+
* **Security Headers** - Configurable headers and CORS policies ([#344](https://github.com/IBM/mcp-context-forge/issues/344), [#533](https://github.com/IBM/mcp-context-forge/issues/533)) 🚧
124128

125-
* **Well-Known URI Handler** - security.txt and robots.txt support ([#540](https://github.com/IBM/mcp-context-forge/issues/540))
129+
* **Well-Known URI Handler** - security.txt and robots.txt support ([#540](https://github.com/IBM/mcp-context-forge/issues/540)) 🚧
126130

127-
* **Password Policy Engine** - Configurable password and secret policies ([#426](https://github.com/IBM/mcp-context-forge/issues/426))
131+
* **Password Policy Engine** - Configurable password and secret policies ([#426](https://github.com/IBM/mcp-context-forge/issues/426)) 🚧
128132

129133
* **Graceful Shutdown** - SIGTERM-safe rollouts with connection draining ([#217](https://github.com/IBM/mcp-context-forge/issues/217))
130134

@@ -138,7 +142,7 @@ These advanced security features are under consideration for future releases:
138142

139143
* **Signature Verification** - Digital signature validation for MCP server responses and tool executions
140144

141-
* **MCP Server Code Scanning** - Automated security analysis of MCP server source code using multiple linters and security scanners (Bandit, Semgrep, CodeQL) before deployment
145+
* **MCP Server Code Scanning** - Automated security analysis of MCP server source code using multiple linters and security scanners (Bandit, Semgrep, CodeQL) before deployment ([#654](https://github.com/IBM/mcp-context-forge/issues/654)) 🚧
142146

143147
* **Binary Analysis** - Static and dynamic analysis of compiled MCP server binaries for vulnerabilities
144148

@@ -204,13 +208,13 @@ MCP Gateway implements a comprehensive, multi-layered security approach with "de
204208

205209
### Comprehensive Security Pipeline
206210

207-
**Pre-commit Security Gates**:
211+
**Pre-commit Security Gates**:
208212

209213
- Bandit, Semgrep, Dodgy for security scanning
210214
- Type checking and code quality enforcement
211215
- Run `make security-all` locally before pushing
212216

213-
**Continuous Integration Security**:
217+
**Continuous Integration Security**:
214218

215219
- 30+ security scans on every PR
216220
- CodeQL semantic analysis
@@ -228,11 +232,11 @@ MCP Gateway implements a comprehensive, multi-layered security approach with "de
228232

229233
### 🏆 Currently Implemented (v0.5.0)
230234

231-
* **Authentication**: JWT tokens with configurable secrets, Basic Auth support
232-
* **Input Validation**: Comprehensive validation across all API endpoints using Pydantic
233-
* **XSS Prevention**: Character restrictions, URL scheme validation, JSON depth limits
234-
* **Security Scanning**: 30+ security tools integrated, 100% Bandit pass rate
235-
* **Container Hardening**:
235+
* **Authentication**: JWT tokens with configurable secrets, Basic Auth support (✅ [#663](https://github.com/IBM/mcp-context-forge/issues/663), ✅ [#705](https://github.com/IBM/mcp-context-forge/issues/705))
236+
* **Input Validation**: Comprehensive validation across all API endpoints using Pydantic (✅ [#339](https://github.com/IBM/mcp-context-forge/issues/339), ✅ [#340](https://github.com/IBM/mcp-context-forge/issues/340))
237+
* **XSS Prevention**: Character restrictions, URL scheme validation, JSON depth limits (✅ [#409](https://github.com/IBM/mcp-context-forge/issues/409))
238+
* **Security Scanning**: 30+ security tools integrated, 100% Bandit pass rate (✅ [#421](https://github.com/IBM/mcp-context-forge/issues/421), ✅ [#638](https://github.com/IBM/mcp-context-forge/issues/638), ✅ [#590](https://github.com/IBM/mcp-context-forge/issues/590))
239+
* **Container Hardening**:
236240
- **Ultra-minimal scratch-based runtime** - Final image contains only Python runtime and application
237241
- **Red Hat UBI9-based build** - Built from latest patched UBI9 (registry.access.redhat.com/ubi9/ubi:9.6)
238242
- **Fully patched on every build** - Automatic security updates via `dnf upgrade -y`
@@ -243,7 +247,9 @@ MCP Gateway implements a comprehensive, multi-layered security approach with "de
243247
- **Pre-compiled Python bytecode** - Optimized with -OO, stripping docstrings and assertions
244248
- **Minimal attack surface** - No shell, no development tools, no documentation
245249
* **Secure Defaults**: Admin UI disabled by default, localhost-only binding
246-
* **Secret Detection**: Gitleaks, Dodgy integration preventing credential leaks
250+
* **Secret Detection**: Gitleaks, Dodgy integration preventing credential leaks (✅ [#558](https://github.com/IBM/mcp-context-forge/issues/558))
251+
* **Security Headers**: HTTP header passthrough with authorization support (✅ [#685](https://github.com/IBM/mcp-context-forge/issues/685))
252+
* **Authentication Masking**: Auth values masked in API responses (✅ [#601](https://github.com/IBM/mcp-context-forge/issues/601), ✅ [#471](https://github.com/IBM/mcp-context-forge/issues/471), ✅ [#472](https://github.com/IBM/mcp-context-forge/issues/472))
247253

248254
### 🚀 Upcoming Security Enhancements
249255

@@ -407,4 +413,4 @@ For security vulnerabilities, report privately via [GitHub's security reporting]
407413
2. Click "Report a vulnerability"
408414
3. Fill out the vulnerability details
409415

410-
For more information, see our [Security Policy](https://github.com/IBM/mcp-context-forge/security/policy).
416+
For more information, see our [Security Policy](https://github.com/IBM/mcp-context-forge/security/policy).

mutmut_config.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
# -*- coding: utf-8 -*-
12
"""Configuration for mutmut mutation testing framework."""
23

34

@@ -16,4 +17,4 @@ def pre_mutation(context):
1617

1718
def post_mutation(context):
1819
"""Any post-mutation processing."""
19-
pass
20+
pass

run_mutmut.py

Lines changed: 22 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#!/usr/bin/env python3
2+
# -*- coding: utf-8 -*-
23
"""
34
Workaround script for mutmut v3 stats collection failure.
45
Generates mutants and then runs them despite stats failure.
@@ -19,69 +20,69 @@ def main():
1920
# Check for command line arguments
2021
sample_mode = "--sample" in sys.argv or len(sys.argv) == 1 # Default to sample mode
2122
sample_size = 20 # Default sample size
22-
23+
2324
if "--full" in sys.argv:
2425
sample_mode = False
2526
print("🧬 Starting FULL mutation testing (this will take a long time)...")
2627
else:
2728
print("🧬 Starting mutation testing (sample mode)...")
2829
print("💡 Tip: Use 'python run_mutmut.py --full' for complete testing")
29-
30+
3031
# Clean previous runs
3132
print("🧹 Cleaning previous mutants...")
3233
os.system("rm -rf mutants .mutmut-cache")
33-
34+
3435
# Generate mutants (will fail at stats but mutants are created)
3536
print("📝 Generating mutants (this may take a minute)...")
3637
stdout, stderr, _ = run_command("mutmut run --max-children 2 2>&1 || true")
37-
38+
3839
# Show some output to indicate progress
3940
if "done in" in stdout:
4041
import re
4142
match = re.search(r'done in (\d+)ms', stdout)
4243
if match:
4344
print(f" Generated in {int(match.group(1))/1000:.1f} seconds")
44-
45+
4546
# Check if mutants were generated
4647
if not Path("mutants").exists():
4748
print("❌ Failed to generate mutants")
4849
return 1
49-
50+
5051
print("✅ Mutants generated successfully")
51-
52+
5253
# Get list of mutants
5354
print("📊 Getting list of mutants...")
5455
stdout, stderr, _ = run_command("mutmut results 2>&1 | grep -E 'mutmut_[0-9]+:' | cut -d: -f1")
5556
all_mutants = [m.strip() for m in stdout.strip().split('\n') if m.strip()]
56-
57+
5758
if not all_mutants:
5859
print("❌ No mutants found")
5960
return 1
60-
61+
6162
# Sample mutants for quicker testing
6263
import random
63-
64+
6465
print(f"🔍 Found {len(all_mutants)} total mutants")
65-
66+
6667
if sample_mode:
6768
actual_sample_size = min(sample_size, len(all_mutants))
6869
mutants = random.sample(all_mutants, actual_sample_size)
6970
print(f"📈 Testing a sample of {len(mutants)} mutants for quick results")
7071
else:
7172
mutants = all_mutants
7273
print(f"🚀 Testing ALL {len(mutants)} mutants (this will take a while)...")
73-
74+
7475
# Run each mutant
7576
results = {"killed": 0, "survived": 0, "timeout": 0, "error": 0}
7677
survived_mutants = []
77-
78+
7879
for i, mutant in enumerate(mutants, 1):
7980
print(f" [{i}/{len(mutants)}] Testing {mutant}...", end=" ", flush=True)
80-
81+
8182
# Run the mutant with a shorter timeout and minimal tests
8283
cmd = f"timeout 10 bash -c 'cd mutants && MUTANT_UNDER_TEST={mutant} python -m pytest tests/unit/mcpgateway/utils/ -x --tb=no -q 2>&1'"
8384
stdout, stderr, returncode = run_command(cmd)
84-
85+
8586
if returncode == 124: # timeout
8687
print("⏰ TIMEOUT")
8788
results["timeout"] += 1
@@ -95,7 +96,7 @@ def main():
9596
else:
9697
print("❓ ERROR")
9798
results["error"] += 1
98-
99+
99100
# Print summary
100101
print("\n" + "="*50)
101102
print("📊 MUTATION TESTING RESULTS:")
@@ -104,24 +105,24 @@ def main():
104105
print(f"🙁 Survived: {results['survived']} mutants")
105106
print(f"⏰ Timeout: {results['timeout']} mutants")
106107
print(f"❓ Error: {results['error']} mutants")
107-
108+
108109
total = sum(results.values())
109110
if total > 0:
110111
score = (results['killed'] / total) * 100
111112
print(f"\n📈 Mutation Score: {score:.1f}%")
112-
113+
113114
if sample_mode and len(all_mutants) > len(mutants):
114115
estimated_total_score = score # Rough estimate
115116
print(f"📊 Estimated overall score: ~{estimated_total_score:.1f}% (based on sample)")
116-
117+
117118
# Show surviving mutants if any
118119
if survived_mutants and len(survived_mutants) <= 5:
119120
print("\n⚠️ Surviving mutants (need better tests):")
120121
for mutant in survived_mutants[:5]:
121122
print(f" - {mutant}")
122123
print(f" View with: mutmut show {mutant}")
123-
124+
124125
return 0
125126

126127
if __name__ == "__main__":
127-
sys.exit(main())
128+
sys.exit(main())

0 commit comments

Comments
 (0)