M6: Insecure Authorization

M6: Insecure Authorization

Poor authorization allows users to access resources or perform actions beyond their privileges.

// Android - Secure authorization implementation
class AuthorizationManager(private val context: Context) {
    
    // VULNERABLE: Common authorization flaws
    class InsecureAuthorization {
        // Bad: Client-side authorization checks only
        fun canAccessAdminPanel(userRole: String): Boolean {
            return userRole == "admin" // Easily bypassed
        }
        
        // Bad: Predictable resource IDs
        fun getUserData(userId: Int): UserData {
            // Direct access without authorization check
            return database.getUser(userId)
        }
    }
    
    // SECURE: Robust authorization system
    class SecureAuthorization(private val apiClient: ApiClient) {
        
        // Server-side authorization with signed requests
        suspend fun accessResource(
            resourceId: String,
            action: Action,
            userToken: String
        ): AccessResult {
            
            // Create signed request
            val request = AuthorizationRequest(
                resourceId = resourceId,
                action = action,
                timestamp = System.currentTimeMillis(),
                nonce = generateNonce()
            )
            
            val signature = signRequest(request, userToken)
            
            return try {
                val response = apiClient.post(
                    "/auth/authorize",
                    body = request,
                    headers = mapOf(
                        "Authorization" to "Bearer $userToken",
                        "X-Signature" to signature
                    )
                )
                
                when (response.code) {
                    200 -> AccessResult.Granted(response.data)
                    403 -> AccessResult.Denied("Insufficient privileges")
                    404 -> AccessResult.ResourceNotFound
                    else -> AccessResult.Error("Authorization failed")
                }
            } catch (e: Exception) {
                AccessResult.Error(e.message ?: "Unknown error")
            }
        }
        
        // Implement role-based access control (RBAC)
        class RBACManager {
            private val rolePermissions = mapOf(
                "user" to setOf(
                    Permission.READ_OWN_PROFILE,
                    Permission.UPDATE_OWN_PROFILE
                ),
                "moderator" to setOf(
                    Permission.READ_OWN_PROFILE,
                    Permission.UPDATE_OWN_PROFILE,
                    Permission.READ_ALL_PROFILES,
                    Permission.MODERATE_CONTENT
                ),
                "admin" to Permission.values().toSet()
            )
            
            fun hasPermission(
                userRole: String,
                requiredPermission: Permission
            ): Boolean {
                return rolePermissions[userRole]?.contains(requiredPermission) ?: false
            }
            
            // Attribute-based access control (ABAC)
            fun evaluateAccess(
                subject: Subject,
                resource: Resource,
                action: Action,
                environment: Environment
            ): Boolean {
                // Complex policy evaluation
                val policies = loadPolicies()
                
                return policies.any { policy ->
                    policy.evaluate(subject, resource, action, environment)
                }
            }
        }
        
        enum class Permission {
            READ_OWN_PROFILE,
            UPDATE_OWN_PROFILE,
            READ_ALL_PROFILES,
            UPDATE_ALL_PROFILES,
            DELETE_PROFILES,
            MODERATE_CONTENT,
            MANAGE_USERS,
            SYSTEM_ADMIN
        }
    }
}