Skip to main content

Fail-Secure Behaviors

Overview

ASCEND implements fail-secure (also known as fail-closed or fail-safe) behavior across all 12 security layers. When any security component fails, encounters an error, or becomes unavailable, the system defaults to the most secure state: DENY.

This approach ensures that security is maintained even during infrastructure failures, misconfigurations, or attack attempts that might try to exploit error conditions.

Why It Matters

Fail-secure design is critical for enterprise security because:

  1. Attack Mitigation: Attackers often attempt to trigger errors to bypass security controls
  2. Compliance Requirements: SOC 2, HIPAA, and PCI-DSS require systems to fail in a secure manner
  3. Defense in Depth: Ensures protection even when individual components fail
  4. Trust Maintenance: Customers can trust that their data remains protected during outages

The alternative approach, "fail-open," would allow requests through when security controls fail - creating potential security gaps during the most vulnerable moments.

Architecture

Fail-Secure Decision Flow

+------------------+
| Security Check |
+--------+---------+
|
+----+----+
| |
v v
+-------+ +-------+
| PASS | | FAIL |
+---+---+ +---+---+
| |
| +-----+-----+
| | |
v v v
+------+ +--------+ +---------+
| ALLOW| | ERROR | | TIMEOUT |
+------+ +---+----+ +----+----+
| |
+------+-----+
|
v
+------+------+
| DENY |
| (Fail-Secure)|
+-------------+

Layer-by-Layer Fail-Secure Behavior

Layer 1: Rate Limiting

Failure ScenarioDefault BehaviorRationale
Redis unavailableDENY all rate-limited requestsPrevents abuse during outage
Rate limit config missingApply strictest default (5/min)Assumes sensitive endpoint
Counter update failsDENY and log errorPrevents counter bypass
IP geolocation failsApply global limitsNo geographic exemptions

Error Response:

{
"error": "service_unavailable",
"message": "Rate limiting service temporarily unavailable",
"retry_after": 60
}

Layer 2: Prompt Security

Failure ScenarioDefault BehaviorRationale
Pattern loading failsBLOCK all promptsAssumes all prompts potentially malicious
Pattern matching timeoutBLOCK promptPrevents timeout-based bypass
Encoding detection failsBLOCK promptAssumes encoded attack
Database config unavailableUse strictest defaultsEnforces maximum protection

Error Response:

{
"error": "prompt_security_error",
"message": "Prompt security analysis failed - request blocked",
"blocked": true,
"reason": "fail_secure"
}

Layer 3: Code Analysis

Failure ScenarioDefault BehaviorRationale
Pattern loading failsBLOCK all code executionAssumes code is dangerous
Analysis timeoutBLOCK codePrevents complexity-based bypass
Language detection failsAnalyze as "any" languageApplies all patterns
Config unavailableUse strictest modeMaximum protection

Error Response:

{
"error": "code_analysis_error",
"message": "Code analysis failed - execution blocked",
"blocked": true,
"reason": "fail_secure"
}

Layer 4: Action Governance

Failure ScenarioDefault BehaviorRationale
Policy engine unavailableDENY all actionsNo unchecked actions
Risk scoring failsAssign maximum risk (100)Assumes worst case
Smart rules unavailableDENY pending reviewRequires human approval
Kill switch state unknownAssume BLOCKEDSafest assumption

Error Response:

{
"error": "governance_error",
"message": "Action governance check failed - action denied",
"decision": "DENY",
"reason": "fail_secure"
}

Layer 5: JWT Authentication

Failure ScenarioDefault BehaviorRationale
JWKS fetch failsDENY authenticationNo signature validation possible
Public key not foundDENY authenticationCannot verify token
Signature verification errorDENY authenticationToken may be tampered
Claims validation errorDENY authenticationToken may be invalid
Token revocation check failsDENY authenticationCannot confirm token validity
Cognito unavailableDENY authenticationNo identity verification

Error Response:

{
"error": "authentication_error",
"message": "Authentication service temporarily unavailable",
"status": 401
}

Layer 6: API Key Validation

Failure ScenarioDefault BehaviorRationale
Database unavailableDENY authenticationCannot validate key
Hash comparison errorDENY authenticationCannot verify key
Rate limit check failsDENY requestCannot enforce limits
Key lookup returns errorDENY authenticationCannot confirm validity

Error Response:

{
"error": "api_key_error",
"message": "API key validation failed",
"status": 401
}

Layer 7: RBAC Authorization

Failure ScenarioDefault BehaviorRationale
Permission check failsDENY authorizationCannot confirm permissions
Role lookup failsAssume RESTRICTED (level 0)Minimum privileges
SoD check failsRequire additional approvalCannot confirm dual control
User lookup failsDENY authorizationCannot confirm identity

Error Response:

{
"error": "authorization_error",
"message": "Authorization check failed - access denied",
"status": 403
}

Layer 8: BYOK Encryption

Failure ScenarioDefault BehaviorRationale
KMS unavailableFAIL operationNo unencrypted data storage
DEK decryption failsFAIL operationCannot access encrypted data
CMK rotation in progressQueue and retryMaintain encryption
Key cache expiredFetch new key or FAILNo stale key usage

Error Response:

{
"error": "encryption_error",
"message": "Encryption service unavailable - operation failed",
"operation_blocked": true
}

Layer 9: Audit Logging

Failure ScenarioDefault BehaviorRationale
Audit write failsBLOCK operationMaintains compliance trail
Hash chain validation failsAlert and investigatePotential tampering
Database unavailableBLOCK operationNo unaudited operations
Sequence number conflictRetry or BLOCKMaintains integrity

Error Response:

{
"error": "audit_error",
"message": "Audit logging failed - operation blocked for compliance",
"compliance_requirement": "SOC2-CC7.1"
}

Note: The AUDIT_FAIL_OPEN=false environment variable controls this behavior. Setting it to true would allow operations to proceed without audit logging - NOT RECOMMENDED for production.


Layer 10: Input Validation

Failure ScenarioDefault BehaviorRationale
Schema validation errorREJECT inputPrevents malformed data
Type coercion failsREJECT inputMaintains type safety
Cross-field validation failsREJECT inputMaintains data integrity
Validation library errorREJECT inputCannot confirm validity

Error Response:

{
"error": "validation_error",
"message": "Input validation failed",
"status": 422,
"details": [
{"field": "email", "error": "Invalid email format"}
]
}

Layer 11: Secrets Management

Failure ScenarioDefault BehaviorRationale
Secrets Manager unavailableBLOCK operationCannot access credentials
Secret not foundBLOCK operationCannot authenticate to external service
Secret expiredBLOCK and alertPrevents use of compromised credentials
Decryption failsBLOCK operationCannot access secret value

Error Response:

{
"error": "secrets_error",
"message": "Required credentials unavailable - operation blocked"
}

Layer 12: Security Headers

Failure ScenarioDefault BehaviorRationale
Header config missingApply strictest defaultsMaximum protection
CSP generation failsUse restrictive default CSPPrevents XSS
HSTS config errorEnable HSTS with max valuesPrevents downgrade

Default Headers (Applied on Any Error):

X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'; script-src 'self'; object-src 'none'
Strict-Transport-Security: max-age=63072000; includeSubDomains; preload
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: camera=(), microphone=(), geolocation=(), payment=()

Configuration

Environment Variables

# Fail-secure configuration
SECURITY_FAIL_MODE=secure # Options: secure, open (NEVER use open in production)
AUDIT_FAIL_OPEN=false # If true, allows operations without audit (NOT RECOMMENDED)
AUTH_FAIL_OPEN=false # If true, allows unauthenticated access (NEVER RECOMMENDED)
RATE_LIMIT_FAIL_OPEN=false # If true, disables rate limiting on Redis failure

# Timeout configurations (fail-secure triggers on timeout)
PROMPT_SECURITY_TIMEOUT_MS=5000 # Timeout for prompt analysis
CODE_ANALYSIS_TIMEOUT_MS=10000 # Timeout for code analysis
JWT_VALIDATION_TIMEOUT_MS=3000 # Timeout for JWT validation

Override Considerations

Warning: Overriding fail-secure behavior should only be done in specific circumstances:

OverrideWhen AcceptableWhen NOT Acceptable
AUDIT_FAIL_OPEN=trueDevelopment/testing onlyProduction environments
RATE_LIMIT_FAIL_OPEN=trueNeverAny environment
AUTH_FAIL_OPEN=trueNeverAny environment

Compliance Mapping

FrameworkControlFail-Secure Requirement
SOC 2CC6.1Logical access controls must fail securely
SOC 2CC7.1System operations must maintain security during failures
HIPAA164.312(a)(1)Access controls must be fail-secure
PCI-DSSReq 6.5Application security must fail securely
NIST 800-53SC-24Fail in known state
NIST 800-53SI-17Fail-safe procedures

Verification

Testing Fail-Secure Behavior

# Test rate limiting fail-secure (stop Redis first)
curl -X POST https://api.ascend.io/v1/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "test@example.com", "password": "test"}'
# Expected: 503 Service Unavailable (not 200 OK)

# Test audit fail-secure (simulate audit DB failure)
curl -X POST https://api.ascend.io/v1/actions/evaluate \
-H "Authorization: Bearer $TOKEN" \
-H "X-Test-Audit-Failure: true" \
-d '{"action_type": "execute_sql", "parameters": {}}'
# Expected: Operation blocked due to audit failure

# Verify fail-secure configuration
curl -X GET https://api.ascend.io/v1/admin/security/fail-secure-status \
-H "Authorization: Bearer $ADMIN_TOKEN"

Expected Response for Fail-Secure Status

{
"fail_secure_enabled": true,
"layers": {
"rate_limiting": {"fail_mode": "secure", "status": "active"},
"prompt_security": {"fail_mode": "secure", "status": "active"},
"code_analysis": {"fail_mode": "secure", "status": "active"},
"action_governance": {"fail_mode": "secure", "status": "active"},
"jwt_auth": {"fail_mode": "secure", "status": "active"},
"api_key_auth": {"fail_mode": "secure", "status": "active"},
"rbac": {"fail_mode": "secure", "status": "active"},
"encryption": {"fail_mode": "secure", "status": "active"},
"audit_logging": {"fail_mode": "secure", "status": "active"},
"input_validation": {"fail_mode": "secure", "status": "active"},
"secrets_management": {"fail_mode": "secure", "status": "active"},
"security_headers": {"fail_mode": "secure", "status": "active"}
},
"compliance_mode": "soc2_hipaa_pci",
"overrides_detected": []
}

Next Steps