Skip to content

security: Fix CORS Configuration Vulnerabilities (CWE-942) - 3 instances of wildcard origins #1321

@praisonai-triage-agent

Description

@praisonai-triage-agent

Security Vulnerability Report: CORS Misconfiguration (CWE-942)

Background Context

Following the security audit conducted for PR #1319, 3 instances of CORS misconfiguration vulnerabilities remain unaddressed across the PraisonAI codebase. These were identified by semgrep security scanning using the OWASP Top 10 and Python security rulesets.

Related Work: PR #1319 successfully fixed 29 MD5/debug vulnerabilities, but deliberately excluded these CORS issues as they require architectural decisions from maintainers.

Vulnerability Summary

Category Count CWE Risk Level
Wildcard CORS allow_origins=["*"] 3 CWE-942 MEDIUM-HIGH

Technical Details

Wildcard CORS Origins (3 instances)

Configuration: allow_origins=["*"] in CORS middleware setup
Risk: Any origin can make cross-origin requests to the API
Impact:

  • Credential theft via malicious websites
  • CSRF attacks bypassing same-origin policy
  • Data exfiltration from authenticated sessions
  • Cross-domain request forgery

Example Vulnerable Pattern:

# Vulnerable - allows any origin
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],  # SECURITY RISK
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"]
)

Security Implications

1. Cross-Origin Resource Sharing Bypass

  • Malicious websites can make authenticated requests to PraisonAI APIs
  • User credentials and session tokens accessible from any domain
  • Violates same-origin policy protection

2. Data Exfiltration Risk

  • Sensitive data (agent configurations, chat history, API keys) exposed
  • Cross-domain data theft through authenticated requests
  • Privacy violations for multi-tenant deployments

3. CSRF Attack Vector

  • Cross-site request forgery becomes trivial with wildcard origins
  • Malicious sites can perform actions on behalf of authenticated users
  • Bypasses CSRF protections that rely on origin validation

Recommended Remediation Strategy

Phase 1: Immediate Security Hardening

  1. Replace wildcard origins with explicit allow-lists:
# Secure configuration
ALLOWED_ORIGINS = [
    "http://localhost:3000",     # Development frontend
    "http://localhost:8000",     # Local development
    "https://app.praisonai.com",  # Production frontend
    # Add other trusted domains as needed
]

app.add_middleware(
    CORSMiddleware,
    allow_origins=ALLOWED_ORIGINS,  # Explicit origins only
    allow_credentials=True,
    allow_methods=["GET", "POST", "PUT", "DELETE"],  # Restrict methods
    allow_headers=["Authorization", "Content-Type"],     # Restrict headers
)
  1. Environment-based configuration:
import os

# Production vs development origins
if os.getenv("ENVIRONMENT") == "production":
    ALLOWED_ORIGINS = ["https://app.praisonai.com"]
else:
    ALLOWED_ORIGINS = [
        "http://localhost:3000",
        "http://localhost:8000",
        "http://127.0.0.1:3000",
    ]

Phase 2: Enhanced Security Controls

  1. Origin validation middleware:
def validate_origin(request):
    origin = request.headers.get("Origin")
    if origin and origin not in ALLOWED_ORIGINS:
        raise HTTPException(403, "Origin not allowed")
    return origin
  1. Dynamic origin configuration:
# Allow runtime configuration via environment variables
CORS_ORIGINS = os.getenv("CORS_ALLOWED_ORIGINS", "").split(",")
ALLOWED_ORIGINS = [origin.strip() for origin in CORS_ORIGINS if origin.strip()]

Phase 3: Security Monitoring

  1. CORS request logging:
# Log cross-origin requests for monitoring
@app.middleware("http")
async def log_cors_requests(request, call_next):
    origin = request.headers.get("Origin")
    if origin:
        logger.info(f"CORS request from origin: {origin}")
    return await call_next(request)
  1. Origin validation alerts:
# Alert on suspicious origin requests
def check_suspicious_origins(origin):
    suspicious_patterns = ["localhost", "127.0.0.1", "file://"]
    if any(pattern in origin for pattern in suspicious_patterns):
        logger.warning(f"Suspicious CORS origin: {origin}")

Deployment Considerations

Development vs Production

  • Development: Allow localhost origins for development convenience
  • Staging: Restrict to staging domain only
  • Production: Strict allow-list of production domains only

Multi-tenant Deployments

  • Dynamic origin configuration per tenant
  • Tenant-specific CORS policies
  • Origin validation against tenant domain registry

CDN and Proxy Configurations

  • Account for CDN domains in origin allow-lists
  • Handle forwarded origin headers correctly
  • Validate against actual client origins, not proxy origins

Affected Components

Likely locations of CORS configurations:

  • Main API Server: FastAPI/Flask application setup
  • Agent API Endpoints: WebSocket and HTTP APIs
  • Development Servers: Local development configurations
  • CLI Web Interface: Browser-based tools and dashboards

Implementation Steps

  1. Audit CORS configurations:
# Find all CORS middleware configurations
grep -r "allow_origins" . --include="*.py"
grep -r "CORSMiddleware" . --include="*.py" 
grep -r "CORS" . --include="*.py"
  1. Environment-specific configuration:
# Create environment-specific CORS settings
echo "CORS_ALLOWED_ORIGINS=https://app.praisonai.com" >> .env.production
echo "CORS_ALLOWED_ORIGINS=http://localhost:3000,http://localhost:8000" >> .env.development
  1. Validate configuration:
# Test CORS policy enforcement
curl -H "Origin: https://evil.com" -I http://localhost:8000/api/health
# Should return 403 or omit CORS headers

Security Testing

CORS Policy Validation:

# Test legitimate origins
curl -H "Origin: https://app.praisonai.com" -I http://api.praisonai.com/health

# Test malicious origins  
curl -H "Origin: https://malicious.com" -I http://api.praisonai.com/health

# Test credentials with cross-origin request
curl -H "Origin: https://evil.com" -H "Cookie: session=abc123" -I http://api.praisonai.com/api/user

Automated Security Testing:

# Test CORS policy enforcement
def test_cors_policy():
    # Should allow configured origins
    response = requests.get(url, headers={"Origin": "https://app.praisonai.com"})
    assert "Access-Control-Allow-Origin" in response.headers
    
    # Should reject unconfigured origins  
    response = requests.get(url, headers={"Origin": "https://evil.com"})
    assert "Access-Control-Allow-Origin" not in response.headers

References

Success Criteria

  • All 3 wildcard CORS configurations replaced with explicit allow-lists
  • Environment-specific CORS policies implemented
  • CORS policy validation added to test suite
  • Security scan shows 0 CWE-942 findings
  • Documentation updated with secure CORS configuration guidelines

Priority: MEDIUM-HIGH | Effort: Small to Medium
Dependencies: Frontend domain configuration, deployment environment setup

This issue tracks the remediation of CORS misconfiguration vulnerabilities identified during the security audit conducted for PR #1319.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdocumentationImprovements or additions to documentationsecurity

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions