Fabric-Adresskarte ermöglicht Programmierung unberechtigter Überlappungen von geschützten und ungeschützten Bereichen

Beschreibung

Die Fabric-Adresskarte ermöglicht die Programmierung unberechtigter Überlappungen von geschützten und ungeschützten Bereichen, wenn die Adresskarte des On-Chip Fabric überlappende geschützte und ungeschützte Regionen enthält, wodurch Angreifer Zugriffskontrollen für den überlappten Teil des geschützten Speichers umgehen können. Adressbereiche in Speicher oder Memory-Mapped-IO (MMIO) werden über Bereichsregister mit Basisadresse und Größeninformation definiert. Wenn sich Schutz- und Nicht-Schutzzonen überschneiden -- entweder durch Entwurfsfehler oder bösartige Konfiguration -- können Angreifer über den ungeschützten Alias auf geschützte Daten zugreifen.

Risiko

Adresskarten-Überlappungen haben schwerwiegende Auswirkungen. Zugriffskontrolle vollständig umgehbar. Geschützter Speicher über ungeschützten Bereich zugänglich. Isolationsgarantien kompromittiert. Vertrauliche Daten offengelegt. Speicherbeschädigung möglich. Sicherheitsgrenzen verletzt. DMA-Angriffe durch Überlappungen ermöglicht. Virtualisierungsschutz umgangen. Mittlere Wahrscheinlichkeit wenn dynamische Neuzuordnung unterstützt oder Bereichsvalidierung fehlt.

Lösung

Stellen Sie sicher, dass geschützte und ungeschützte Bereiche in der Chip-Adresszuordnung und fest kodierten RTL-Bereichen während der Architektur- und Entwurfsphase isoliert ohne Überlappung bleiben. Verhindern Sie firmware-konfigurierte Bereichsüberlappungen während der Implementierung. Wenn Überlappungen aufgrund von Hardware-Einschränkungen zwingend erforderlich sind, stellen Sie sicher, dass keine sensiblen Assets überlappte Bereiche belegen. Validieren Sie Schutzmaßnahmen durch umfassende Tests. Implementieren Sie Überlappungserkennungslogik in Hardware.

Häufige Auswirkungen

AuswirkungDetails
VertraulichkeitBereich: Vertraulichkeit

Geschützte Daten über ungeschützten überlappenden Adressbereich lesbar.
IntegritätBereich: Integrität

Speicheränderung über den ungeschützten Teil überlappter Bereiche.
ZugriffskontrolleBereich: Zugriffskontrolle

Schutzmechanismen durch Adressüberlappungs-Ausnutzung vollständig umgangen.

Beispielcode und Lösung

Verwundbarer Code

// VERWUNDBAR: Adressbereichs-Controller ohne Überlappungserkennung

module vulnerable_address_range_controller (
    input  wire        clk,
    input  wire        rst_n,
    input  wire [31:0] protected_base,
    input  wire [31:0] protected_size,
    input  wire [31:0] unprotected_base,
    input  wire [31:0] unprotected_size,
    input  wire        range_write_en,
    input  wire [31:0] access_addr,
    input  wire        access_request,
    input  wire [1:0]  requester_privilege,
    output reg         access_granted,
    output reg         access_denied
);

    reg [31:0] prot_base_reg, prot_size_reg;
    reg [31:0] unprot_base_reg, unprot_size_reg;

    // VERWUNDBAR: Keine Überlappungsprüfung bei Bereichskonfiguration
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            prot_base_reg <= 32'h0; prot_size_reg <= 32'h0;
            unprot_base_reg <= 32'h0; unprot_size_reg <= 32'h0;
        end else if (range_write_en) begin
            // VERWUNDBAR: Akzeptiert jede Konfiguration
            prot_base_reg <= protected_base;
            prot_size_reg <= protected_size;
            unprot_base_reg <= unprotected_base;
            unprot_size_reg <= unprotected_size;
        end
    end

    wire [31:0] prot_end = prot_base_reg + prot_size_reg - 1;
    wire [31:0] unprot_end = unprot_base_reg + unprot_size_reg - 1;
    wire in_protected = (access_addr >= prot_base_reg) && (access_addr <= prot_end);
    wire in_unprotected = (access_addr >= unprot_base_reg) && (access_addr <= unprot_end);

    // VERWUNDBAR: Bei Überlappung hat ungeschützter Bereich Vorrang
    always @(posedge clk) begin
        if (access_request) begin
            if (in_unprotected) begin
                // VERWUNDBAR: Ungeschützter Zugriff immer gewährt
                access_granted <= 1'b1;
                access_denied <= 1'b0;
            end else if (in_protected) begin
                if (requester_privilege >= 2'b10) begin
                    access_granted <= 1'b1; access_denied <= 1'b0;
                end else begin
                    access_granted <= 1'b0; access_denied <= 1'b1;
                end
            end else begin
                access_granted <= 1'b1; access_denied <= 1'b0;
            end
        end
    end

    // Angriff:
    // Geschützter Bereich: 0x1000-0x1FFF (enthält Geheimnisse)
    // Angreifer konfiguriert ungeschützten Bereich: 0x1800-0x2FFF
    // Überlappung bei 0x1800-0x1FFF jetzt ohne Berechtigung zugänglich!

endmodule

Sichere Lösung

// SICHER: Adressbereichs-Controller mit Überlappungserkennung und -verhinderung

module secure_address_range_controller (
    input  wire        clk,
    input  wire        rst_n,
    input  wire [31:0] protected_base,
    input  wire [31:0] protected_size,
    input  wire [31:0] unprotected_base,
    input  wire [31:0] unprotected_size,
    input  wire        range_write_en,
    input  wire        privileged_config,
    input  wire [31:0] access_addr,
    input  wire        access_request,
    input  wire [1:0]  requester_privilege,
    output reg         access_granted,
    output reg         access_denied,
    output reg         overlap_detected,
    output reg         config_denied
);

    reg [31:0] prot_base_reg, prot_size_reg;
    reg [31:0] unprot_base_reg, unprot_size_reg;

    wire [31:0] new_prot_end = protected_base + protected_size - 1;
    wire [31:0] new_unprot_end = unprotected_base + unprotected_size - 1;

    // SICHER: Überlappungserkennungslogik
    wire ranges_overlap = !((new_prot_end < unprotected_base) ||
                            (new_unprot_end < protected_base));

    // SICHER: Überlappende Konfigurationen validieren und ablehnen
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            prot_base_reg <= 32'h0; prot_size_reg <= 32'h0;
            unprot_base_reg <= 32'h0; unprot_size_reg <= 32'h0;
            overlap_detected <= 1'b0; config_denied <= 1'b0;
        end else if (range_write_en) begin
            overlap_detected <= 1'b0; config_denied <= 1'b0;

            if (!privileged_config) begin
                config_denied <= 1'b1;
            end else if (ranges_overlap && protected_size > 0 && unprotected_size > 0) begin
                overlap_detected <= 1'b1;
                config_denied <= 1'b1;
            end else begin
                prot_base_reg <= protected_base;
                prot_size_reg <= protected_size;
                unprot_base_reg <= unprotected_base;
                unprot_size_reg <= unprotected_size;
            end
        end
    end

    wire [31:0] prot_end = prot_base_reg + prot_size_reg - 1;
    wire [31:0] unprot_end = unprot_base_reg + unprot_size_reg - 1;
    wire in_protected = (prot_size_reg > 0) && (access_addr >= prot_base_reg) && (access_addr <= prot_end);
    wire in_unprotected = (unprot_size_reg > 0) && (access_addr >= unprot_base_reg) && (access_addr <= unprot_end);

    // SICHER: Geschützter Bereich hat Vorrang (Defense in Depth)
    always @(posedge clk) begin
        if (access_request) begin
            if (in_protected) begin
                if (requester_privilege >= 2'b10) begin
                    access_granted <= 1'b1; access_denied <= 1'b0;
                end else begin
                    access_granted <= 1'b0; access_denied <= 1'b1;
                end
            end else if (in_unprotected) begin
                access_granted <= 1'b1; access_denied <= 1'b0;
            end else begin
                access_granted <= 1'b0; access_denied <= 1'b1;
            end
        end
    end

endmodule

CVE-Beispiele

  • CVE-2009-4419: Angreifer änderten das MCHBAR-Register, um Überlappungen zu erzeugen, die den SENTER-Befehl daran hinderten, VT-d-Schutz während der Measured Launch Environment-Initialisierung ordnungsgemäß anzuwenden.
  • CVE-2019-0151: Speicherbereichsüberlappungen ermöglichten die Umgehung von Intel-TXT-Schutz.

Verwandte CWEs

  • CWE-284: Improper Access Control (Eltern)
  • CWE-1203: Peripherals, On-chip Fabric, and Interface/IO Problems (Kategorie)
  • CWE-1260: Improper Handling of Overlap Between Protected Memory Ranges (verwandt)
  • CWE-1312: Missing Protection for Mirrored Regions in On-Chip Fabric Firewall (verwandt)

Referenzen

  1. MITRE Corporation. "CWE-1316: Fabric-Address Map Allows Programming of Unwarranted Overlaps of Protected and Unprotected Ranges." https://cwe.mitre.org/data/definitions/1316.html
  2. Intel. "Memory-Mapped I/O Configuration Guidelines"
  3. CAPEC-456: Infected Memory
  4. CAPEC-679: Exploitation of Improperly Configured Memory Protections