Unsachgemäße Behandlung unzureichender Privilegien

Beschreibung

Unsachgemäße Behandlung unzureichender Privilegien ist eine Schwachstelle, die auftritt, wenn ein Produkt Situationen nicht ordnungsgemäß adressiert, in denen es keine ausreichenden Privilegien hat, um eine Operation abzuschließen, was möglicherweise nachgelagerte Sicherheitsprobleme erzeugt. Wenn Anwendungen auf privilegienbezogene Fehler stoßen, kann unsachgemäße Behandlung zu unerwartetem Verhalten führen, einschließlich Abstürzen, Sicherheitsumgehungen oder fortgesetztem Betrieb in einem unsicheren Zustand. Diese Schwäche bezieht sich darauf, wie Software reagiert, wenn sie Aktionen aufgrund unzureichender Berechtigungen nicht ausführen kann, nicht darauf, wie sie ihre eigenen Privilegien verwaltet.

Risiko

Das Versäumnis, unzureichende Privilegienbedingungen ordnungsgemäß zu behandeln, erzeugt unvorhersehbares Anwendungsverhalten, das die Sicherheit kompromittieren kann. Wenn Privilegienprüfungen fehlschlagen, können Anwendungen auf eine Weise abstürzen, die sensible Informationen durch Fehlermeldungen oder Core Dumps preisgibt. Alternativ können sie in degradierten oder unsicheren Modi weiter operieren und Sicherheitskontrollen umgehen, die von den fehlgeschlagenen privilegierten Operationen abhängen. Firewalls und Sicherheitstools, die abstürzen, wenn sie nicht auf geschützte Ressourcen zugreifen können, lassen Systeme ungeschützt. Anwendungen, die fehlgeschlagene Sicherheitsprüfungen stillschweigend überspringen, können Anfragen ohne ordnungsgemäße Autorisierung verarbeiten. Das Risiko erstreckt sich auf Denial of Service, wenn Abstürze von Angreifern auslösbar sind, die die Privilegienabhängigkeiten verstehen.

Lösung

Implementieren Sie robuste Fehlerbehandlung für alle privilegienabhängigen Operationen. Wenn Operationen aufgrund unzureichender Privilegien fehlschlagen, scheitern Sie sicher, indem Sie die angeforderte Aktion verweigern, anstatt in einem degradierten Zustand fortzufahren. Protokollieren Sie Privilegienfehler für Sicherheitsüberwachung, aber vermeiden Sie es, sensible Informationen in Fehlermeldungen preiszugeben. Entwerfen Sie privilegienabhängige Operationen, um geschlossen zu scheitern, und stellen Sie sicher, dass die Unfähigkeit, eine Sicherheitsprüfung durchzuführen, zur Verweigerung führt anstatt zur Umgehung. Testen Sie Anwendungsverhalten unter verschiedenen Privilegienkonfigurationen, um ordnungsgemäße Degradation sicherzustellen. Für kritische Sicherheitsanwendungen wie Firewalls implementieren Sie Fail-Safe-Modi, die Schutz aufrechterhalten, selbst wenn einige Operationen nicht ausgeführt werden können. Dokumentieren Sie Privilegienanforderungen klar, damit Deployment-Konfigurationen sicherstellen können, dass notwendige Privilegien verfügbar sind.

Häufige Auswirkungen

AuswirkungDetails
AndereBereich: Ändere

Die Schwäche kann modifizieren, wie die Anwendung sich verhält oder Operationen verarbeitet. Wenn privilegienabhängige Operationen fehlschlagen, kann die Anwendung unerwartete Codepfade nehmen, Sicherheitsprüfungen überspringen oder auf eine Weise abstürzen, die Sicherheit oder Verfügbarkeit kompromittiert.

Beispielcode

Anfälliger Code (C)

Die folgenden Beispiele demonstrieren unsachgemäße Behandlung unzureichender Privilegien:

// Anfällig: Stürzt ab bei unzureichenden Privilegien
#include <stdio.h>
#include <stdlib.h>

void vulnerable_firewall_operation(void *protected_memory) {
    // Versuche auf geschützten Kernel-Speicher zuzugreifen
    // Anfällig: Keine Fehlerbehandlung für Zugriffsfehler

    char *data = (char *)protected_memory;
    // Wenn unzureichende Privilegien, verursacht dies einen Absturz
    // Firewall geht runter, lässt System ungeschützt
    process_packet_data(data);
}

// Anfällig: Fährt ohne ordnungsgemäße Sicherheitsprüfungen fort
int vulnerable_security_check(int user_id, int resource_id) {
    int result = check_authorization(user_id, resource_id);

    if (result == PRIVILEGE_INSUFFICIENT) {
        // Anfällig: Fährt stillschweigend ohne Autorisierung fort
        // Protokolliert Warnung aber blockiert Zugang nicht
        log_warning("Unzureichende Privilegien für Autorisierungsprüfung");
        // Gibt trotzdem Erfolg zurück!
    }

    return SUCCESS;  // Immer erfolgreich, selbst bei Privilegienfehler
}
# Anfällig: Ignoriert privilegienbezogene Fehler
class VulnerableService:

    def process_request(self, request):
        try:
            # Versuche privilegierte Operation
            self.verify_signature(request)
        except PermissionError:
            # Anfällig: Fährt mit Verarbeitung ohne Verifikation fort
            pass  # Stiller Fehler!

        # Anfrage ohne Signaturverifikation verarbeitet
        return self.execute_action(request)

    def apply_security_policy(self, policy):
        try:
            # Versuche Sicherheitsrichtlinie anzuwenden
            os.chmod(policy.file, policy.permissions)
        except PermissionError:
            # Anfällig: Richtlinie nicht angewendet aber keine Anzeige
            print(f"Warnung: Konnte Richtlinie nicht auf {policy.file} anwenden")
            # Anwendung fährt fort im Glauben, Richtlinie sei angewendet

        return True  # Gibt Erfolg zurück trotz Fehler
// Anfällig: Inadäquate Reaktion auf Privilegienfehler
public class VulnerableAccessControl {

    public boolean checkAccess(User user, Resource resource) {
        try {
            // Versuche privilegierte Sicherheitsprüfung
            return securityService.isAuthorized(user, resource);
        } catch (InsufficientPrivilegesException e) {
            // Anfällig: Standardmäßig Zugang erlauben
            logger.warn("Konnte Autorisierung nicht verifizieren: " + e.getMessage());
            return true;  // Fail-Open-Verhalten!
        }
    }

    public void enforceQuotas(User user) {
        try {
            quotaService.checkAndEnforce(user);
        } catch (PrivilegeException e) {
            // Anfällig: Quotas nicht durchgesetzt
            // Benutzer kann Limits überschreiten
            logger.error("Quota-Durchsetzung fehlgeschlagen");
            // Keine Aktion - Benutzer fährt ohne Limits fort
        }
    }
}

Korrigierter Code (C)

// Korrigiert: Ordnungsgemäße Behandlung unzureichender Privilegien
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <signal.h>

int secure_firewall_operation(void *protected_memory) {
    // Sicheren Fehlermodus einrichten vor privilegierter Operation
    if (!enter_failsafe_mode()) {
        log_error("Kann Failsafe-Modus nicht etablieren");
        return SECURITY_FAILURE;
    }

    // Zuerst prüfen, ob wir erforderliche Privilegien haben
    if (!check_kernel_access_privilege()) {
        log_error("Unzureichende Privilegien für Kernel-Speicherzugriff");
        // Im Blocking-Modus bleiben - keine Pakete verarbeiten
        activate_deny_all_mode();
        return INSUFFICIENT_PRIVILEGE;
    }

    // Zugriff mit ordnungsgemäßer Fehlerbehandlung versuchen
    char *data = safe_kernel_read(protected_memory);
    if (data == NULL) {
        if (errno == EPERM || errno == EACCES) {
            log_security_event("Privilegienbasierter Zugriffsfehler");
            activate_deny_all_mode();
            return SECURITY_FAILURE;
        }
        return OPERATION_FAILURE;
    }

    process_packet_data(data);
    exit_failsafe_mode();
    return SUCCESS;
}

// Korrigiert: Fail-Closed bei Privilegienproblemen
int secure_security_check(int user_id, int resource_id) {
    int result = check_authorization(user_id, resource_id);

    switch (result) {
        case AUTHORIZED:
            return SUCCESS;

        case NOT_AUTHORIZED:
            log_access_denied(user_id, resource_id);
            return ACCESS_DENIED;

        case PRIVILEGE_INSUFFICIENT:
            // Korrigiert: Fail closed - Zugang verweigern wenn nicht verifizierbar
            log_security_event(
                "Autorisierungsprüfung wegen unzureichender Privilegien fehlgeschlagen. "
                "Zugang als Vorsichtsmaßnahme verweigert."
            );
            return ACCESS_DENIED;

        default:
            // Unbekanntes Ergebnis - fail closed
            return ACCESS_DENIED;
    }
}
# Korrigiert: Ordnungsgemäße Privilegienfehlerbehandlung
class SecureService:

    def process_request(self, request):
        try:
            # Versuche privilegierte Operation
            self.verify_signature(request)
        except PermissionError as e:
            # Korrigiert: Anfrage verweigern wenn Verifikation nicht durchführbar
            log_security_event(
                f"Signaturverifikation wegen Privilegienproblem fehlgeschlagen: {e}. "
                f"Anfrage abgelehnt."
            )
            raise SecurityException("Anfrage kann nicht verarbeitet werden")

        # Erreicht hier nur, wenn Signatur verifiziert
        return self.execute_action(request)

    def apply_security_policy(self, policy):
        try:
            # Versuche Sicherheitsrichtlinie anzuwenden
            os.chmod(policy.file, policy.permissions)
        except PermissionError as e:
            # Korrigiert: Operation fehlschlagen lassen und alarmieren
            log_security_alert(
                f"SICHERHEIT: Konnte Richtlinie nicht auf {policy.file} anwenden: {e}"
            )
            # Fehler zurückgeben, damit Aufrufer weiß, dass Richtlinie nicht in Kraft ist
            return False

        # Verifizieren, dass Richtlinie tatsächlich angewendet wurde
        actual_perms = os.stat(policy.file).st_mode & 0o777
        if actual_perms != policy.permissions:
            log_security_alert(
                f"Richtlinienverifikation für {policy.file} fehlgeschlagen"
            )
            return False

        return True
// Korrigiert: Fail-Closed Zugriffskontrolle
public class SecureAccessControl {

    public boolean checkAccess(User user, Resource resource)
            throws SecurityException {
        try {
            return securityService.isAuthorized(user, resource);
        } catch (InsufficientPrivilegesException e) {
            // Korrigiert: Fail-closed - Zugang verweigern wenn nicht verifizierbar
            logger.error("Autorisierungsprüfung wegen unzureichender " +
                        "Privilegien fehlgeschlagen. Zugang verweigert: " + e.getMessage());

            // Sicherheitsteam alarmieren
            securityAlerts.raise(SecurityAlert.PRIVILEGE_FAILURE,
                "Autorisierungsdienst nicht verfügbar", e);

            // Zugang als Vorsichtsmaßnahme verweigern
            return false;
        }
    }

    public void enforceQuotas(User user) throws QuotaEnforcementException {
        try {
            quotaService.checkAndEnforce(user);
        } catch (PrivilegeException e) {
            // Korrigiert: Benutzeraktion blockieren wenn Quotas nicht durchsetzbar
            logger.error("Quota-Durchsetzung fehlgeschlagen - Benutzeraktion blockiert");

            throw new QuotaEnforcementException(
                "Kann Quota-Compliance nicht verifizieren - Aktion blockiert", e);
        }
    }
}

Die Korrektur stellt sicher, dass Privilegienfehler zu Fail-Closed-Verhalten, ordnungsgemäßer Fehlerberichterstattung und Sicherheitsalarmen führen, anstatt zu stillem Fortfahren oder Abstürzen.


Ausgenutzt in der Praxis

Firewall-Umgehung durch Privilegienfehler (Netzwerksicherheitsprodukte, Historisch)

Sicherheitsprodukte einschließlich Firewalls und IDS-Systeme haben Abstürze erfahren, wenn sie auf privilegienbezogene Fehler während der Paketinspektion stießen. Angreifer haben diese Abstürze absichtlich ausgelöst, um Netzwerksicherheit zu deaktivieren und bösartigen Verkehr passieren zu lassen.

Autorisierungsumgehung durch Dienstausfälle (Webanwendungen, Fortlaufend)

Webanwendungen, die fail-open verhalten, wenn Autorisierungsdienste nicht verfügbar sind, haben unbefugten Zugriff ermöglicht. Wenn Backend-Sicherheitsdienste aufgrund von Privilegienproblemen ausfallen, wurden Anwendungen, die standardmäßig Zugang erlauben, ausgenutzt.

Systemlimit-Umgehung (Unix-Systeme, Historisch)

Systeme, die Limits nach Privilegienablegung nicht ordnungsgemäß durchsetzten, haben Benutzern ermöglicht, Ressourcenquoten und Zuweisungen zu überschreiten. CVE-2001-1564 dokumentierte, wie Systemlimits in solchen Szenarien nicht ordnungsgemäß durchgesetzt wurden.


Tools zum Testen/Ausnutzen

  • Chaos Monkey — Fehlerinjektionstool, das Anwendungsverhalten bei Dienstausfällen testen kann.

  • Fault Injection Tools — Tools zum Testen der Anwendungsresilienz gegenüber verschiedenen Fehlermodi.

  • Custom Fuzzers — Fuzzing-Tools, die Grenzfälle einschließlich Privilegienfehler auslösen können.


CVE-Beispiele

  • CVE-2001-1564 — Systemlimits nach Privilegienablegung nicht ordnungsgemäß durchgesetzt.

  • CVE-2005-3286 — Firewall stürzt ab, wenn sie nicht auf geschützten Speicher zugreifen kann.

  • CVE-2005-1641 — Admin hat unzureichende Privilegien, um legitime Benutzeraktionen zu überschreiben.


Referenzen

  1. MITRE Corporation. "CWE-274: Improper Handling of Insufficient Privileges." Common Weakness Enumeration. https://cwe.mitre.org/data/definitions/274.html

  2. OWASP Foundation. "Error Handling." OWASP Cheat Sheet Series. https://cheatsheetseries.owasp.org/cheatsheets/Error_Handling_Cheat_Sheet.html

  3. NIST. "Guide to General Server Security." SP 800-123. https://csrc.nist.gov/publications/detail/sp/800-123/final