ASP.NET-Fehlkonfiguration: Verwendung von Identitätsübernahme

Beschreibung

ASP.NET-Fehlkonfiguration: Verwendung von Identitätsübernahme ist eine Schwachstelle, bei der eine ASP.NET-Anwendung so konfiguriert ist, dass sie mit übernommenen Anmeldeinformationen läuft, was ihr potenziell unnötige oder übermäßige Privilegien gewährt. Identitätsübernahme ermöglicht der Anwendung, Operationen unter einem anderen Sicherheitskontext als ihrem Standard auszuführen, was die Identität des Clients oder ein spezifisch konfiguriertes Konto sein kann. Bei Fehlkonfiguration kann dies dazu führen, dass die Anwendung Zugriff auf Ressourcen hat, die über das Erforderliche hinausgehen, was das Prinzip der geringsten Privilegien verletzt.

Risiko

Fehlkonfigurierte Identitätsübernahme erzeugt erhebliche Sicherheitsrisiken. Wenn Anwendungen Clients übernehmen, wird jede Benutzeranfrage mit den vollständigen Berechtigungen dieses Benutzers ausgeführt, was potenziell auf Ressourcen zugreift, die die Anwendung nicht nutzen sollte. Bei Übernahme eines hochprivilegierten Kontos wird jede Schwachstelle in der Anwendung zu einem Weg zur Systemkompromittierung. Angreifer, die Anwendungsschwachstellen ausnutzen, erben die Berechtigungen der übernommenen Identität. Fehlkonfigurierte Übernahme kann auch zu Privilegieneskalationsangriffen führen.

Lösung

Wenden Sie das Prinzip der geringsten Privilegien bei der Konfiguration der ASP.NET-Anwendungsidentität an. Vermeiden Sie die Verwendung von Identitätsübernahme, es sei denn, sie wird speziell von der Anwendungsarchitektur erfordert. Wenn Übernahme erforderlich ist, stellen Sie sicher, dass das übernommene Konto nur die minimal erforderlichen Berechtigungen hat. Verwenden Sie spezifische Dienstkonten mit eingeschränkten Privilegien anstelle der Übernahme administrativer Konten. Implementieren Sie ordnungsgemäße Autorisierungsprüfungen im Anwendungscode unabhängig von Übernahmeeinstellungen.

Häufige Auswirkungen

AuswirkungDetails
ZugriffskontrolleBereich: Zugriffskontrolle

Privilegien erlangen oder Identität annehmen - Fehlkonfigurierte Übernahme kann Angreifern ermöglichen, Privilegien zu eskalieren oder auf Ressourcen über den vorgesehenen Bereich der Anwendung hinaus zuzugreifen.

Beispielcode

Verwundbarer Code

<!-- Verwundbar: web.config mit aktivierter Übernahme -->
<configuration>
    <system.web>
        <!-- Verwundbar: Übernahme eines hochprivilegierten Kontos -->
        <identity impersonate="true"
                  userName="DOMAIN\Administrator"
                  password="AdminPassword123!" />
        <!-- Dies gewährt der Anwendung volle Administrator-Privilegien -->
    </system.web>
</configuration>
<!-- Verwundbar: Übernahme der Client-Identität -->
<configuration>
    <system.web>
        <authentication mode="Windows" />
        <!-- Verwundbar: Übernahme aller Client-Identitäten -->
        <identity impersonate="true" />
        <!-- Jede Anfrage läuft mit vollständigen Berechtigungen des Aufrufers -->
        <!-- Wenn ein Domain-Admin browst, hat die App Admin-Rechte -->
    </system.web>
</configuration>
// Verwundbar: Code-Level-Übernahme mit übermäßigen Privilegien
using System.Security.Principal;

public class VerwundbarerDateiService
{
    public void ProcessFile(string filePath)
    {
        // Verwundbar: Hartcodierte Admin-Anmeldeinformationen
        const string domain = "COMPANY";
        const string username = "FileAdmin";
        const string password = "FileAdmin123!";

        using (WindowsImpersonationContext context = ImpersonateUser(domain, username, password))
        {
            // Verwundbar: Alle Dateioperationen laufen als Admin
            File.ReadAllText(filePath);
            File.WriteAllText(filePath + ".processed", "...");
            File.Delete(filePath);
        }
    }
}
// Verwundbar: Controller mit Übernahme ohne ordnungsgemäße Prüfungen
public class VerwundbarerAdminController : Controller
{
    [HttpGet]
    public ActionResult ReadSystemFile(string path)
    {
        // Verwundbar: Admin-Übernahme zur Umgehung von Dateiberechtigungen
        using (var impersonation = new ImpersonationHelper("SYSTEM"))
        {
            // Benutzer-kontrollierter Pfad + System-Übernahme = Schwachstelle
            string content = System.IO.File.ReadAllText(path);
            return Content(content);
        }
    }
}

Lösungscode

<!-- Behoben: web.config mit minimalen Privilegien -->
<configuration>
    <system.web>
        <authentication mode="Windows" />
        <!-- Behoben: Keine Übernahme - als Application-Pool-Identität laufen -->
        <identity impersonate="false" />

        <authorization>
            <!-- Behoben: Explizite Autorisierungsregeln -->
            <deny users="?" />
            <allow users="*" />
        </authorization>
    </system.web>

    <!-- Behoben: Spezifische Ordner mit gezieltem Zugriff -->
    <location path="admin">
        <system.web>
            <authorization>
                <allow roles="COMPANY\AppAdmins" />
                <deny users="*" />
            </authorization>
        </system.web>
    </location>
</configuration>
// Behoben: Service mit ordnungsgemäßer Autorisierung statt Übernahme
using System.Security.Principal;

public class SichererDateiService
{
    private readonly IAuthorizationService _authService;
    private readonly ILogger _logger;

    public SichererDateiService(IAuthorizationService authService, ILogger logger)
    {
        _authService = authService;
        _logger = logger;
    }

    public void ProcessFile(string filePath, IPrincipal user)
    {
        // Behoben: Autorisierung vor Verarbeitung prüfen
        if (!_authService.CanAccessFile(user, filePath))
        {
            _logger.LogWarning("Unbefugter Dateizugriffsversuch: {User} -> {Path}",
                user.Identity.Name, filePath);
            throw new UnauthorizedAccessException("Zugriff auf Datei verweigert");
        }

        // Behoben: Dateipfad validieren
        if (!IsValidFilePath(filePath))
        {
            throw new ArgumentException("Ungültiger Dateipfad");
        }

        // Behoben: Mit Anwendungsidentität laufen (geringste Privilegien)
        File.ReadAllText(filePath);
        File.WriteAllText(filePath + ".processed", "...");
    }

    private bool IsValidFilePath(string path)
    {
        // Behoben: Erlaubte Verzeichnisse auf Whitelist
        string fullPath = Path.GetFullPath(path);
        string allowedDir = Path.GetFullPath(@"C:\AppData\Processing");
        return fullPath.StartsWith(allowedDir, StringComparison.OrdinalIgnoreCase);
    }
}
// Behoben: Controller mit ordnungsgemäßer Autorisierung
[Authorize]
public class SichererAdminController : Controller
{
    // Behoben: Keine Übernahme - ordnungsgemäße Autorisierung verwenden
    [HttpGet]
    [Authorize(Roles = "AppAdmins")]  // Behoben: Rollenbasierter Zugriff
    public ActionResult ReadConfigFile()
    {
        // Behoben: Anwendung liest eigene Konfiguration
        string configPath = Server.MapPath("~/App_Data/config.xml");
        string content = System.IO.File.ReadAllText(configPath);
        return Content(content);
    }

    [HttpPost]
    [Authorize(Roles = "AppAdmins")]
    [ValidateAntiForgeryToken]  // Behoben: CSRF-Schutz
    public ActionResult ModifyConfig(string setting, string value)
    {
        // Behoben: Eingabe validieren
        if (!IsValidSetting(setting) || !IsValidValue(value))
        {
            return BadRequest("Ungültige Konfiguration");
        }

        // Behoben: Konfigurationsservice der Anwendung verwenden
        _configService.UpdateSetting(setting, value, User.Identity.Name);
        return Ok();
    }

    private bool IsValidSetting(string setting)
    {
        // Behoben: Erlaubte Einstellungen auf Whitelist
        var allowedSettings = new[] { "Theme", "Language", "PageSize" };
        return allowedSettings.Contains(setting);
    }
}

CVE-Beispiele

Keine spezifischen CVEs für diese CWE, aber Übernahme-Fehlkonfigurationen haben zu Privilegieneskalation in verschiedenen ASP.NET-Anwendungen beigetragen.


Referenzen

  1. MITRE Corporation. "CWE-556: ASP.NET Misconfiguration: Use of Identity Impersonation." https://cwe.mitre.org/data/definitions/556.html
  2. Microsoft. "ASP.NET Impersonation."
  3. OWASP. "Authorization Cheat Sheet."