Unsachgemäße Einstellung der Bus-Steuerungsfähigkeit am Fabric-Endpunkt

Beschreibung

Die unsachgemäße Einstellung der Bus-Steuerungsfähigkeit am Fabric-Endpunkt tritt auf, wenn der Bus-Controller Bits im Fabric-Endpunkt aktiviert, die Responder-Geräten erlauben, Transaktionen auf dem Fabric zu steuern. Diese Schwachstelle entsteht, wenn konfigurierbare Registerbits in Fabric-Schnittstellen fälschlicherweise IP-Blöcken, die nur antworten sollten, ermöglicht, Transaktionen zu anderen Peripheriegeräten zu initiieren. Geräte, die als Responder konzipiert sind und Master-Fähigkeiten erlangen, können die gesamte Systemsicherheit kompromittieren, indem sie auf beliebigen Speicher oder Peripheriegeräte zugreifen.

Risiko

Unsachgemäße Bus-Steuerungsfähigkeit hat schwerwiegende Auswirkungen. Responder-Geräte können zu Mastern werden. Unbefugter Speicherzugriff ermöglicht. Peripherie-zu-Peripherie-Angriffe möglich. Systemintegrität kompromittiert. Audio-/Video-Codecs greifen auf CPU-Speicher zu. DMA-artige Angriffe aus unerwarteten Quellen. Schutzmechanismen umgangen. Vollständige Systemkompromittierung möglich. Mittlere bis hohe Wahrscheinlichkeit wenn Fähigkeitsbits nicht ordnungsgemäß eingeschränkt sind.

Lösung

Setzen Sie das Bus-Steuerungsfähigkeits-Registerbit während der Architektur- und Entwurfsphase standardmäßig auf 0 in Hardware. Verhindern Sie, dass dieses Bit während Secure-Boot-Abläufen gesetzt wird. Implementieren Sie Zugriffskontrollen, um unbefugte Änderungen am Register zu blockieren. Sperren Sie das Register nach der Erstkonfiguration. Verwenden Sie Hardware-Fuses für permanente Deaktivierung in der Produktion. Verifizieren Sie die Einstellung durch Plattform-Firmware während des Bootvorgangs.

Häufige Auswirkungen

AuswirkungDetails
ZugriffskontrolleBereich: Zugriffskontrolle

Responder-Geräte können beabsichtigte Zugriffsbeschränkungen umgehen und unbefugte Transaktionen initiieren.
IntegritätBereich: Integrität

Speicheränderung möglich wenn Responder Master-Fähigkeit erlangen.
VertraulichkeitBereich: Vertraulichkeit

Unbefugtes Speicherlesen durch Responder-zu-Master-Transaktionen.

Beispielcode und Lösung

Verwundbarer Code

// VERWUNDBAR: Fabric-Endpunkt mit ungeschütztem Bus-Master-Enable

module vulnerable_fabric_endpoint (
    input  wire        clk,
    input  wire        rst_n,

    // Konfigurationsschnittstelle
    input  wire [31:0] cfg_addr,
    input  wire [31:0] cfg_wdata,
    input  wire        cfg_write,

    // Fabric-Schnittstelle
    output reg         fabric_master_en,
    output reg  [31:0] fabric_addr,
    output reg  [31:0] fabric_wdata,
    output reg         fabric_write,
    output reg         fabric_read,

    // Gerätespezifische Schnittstelle
    input  wire [31:0] device_data,
    output reg  [31:0] device_addr_out,
    output reg         device_access
);

    // Konfigurationsregister
    reg [31:0] control_reg;

    localparam CTRL_REG_ADDR = 32'h0000_0100;
    localparam BUS_MASTER_EN_BIT = 0;

    // VERWUNDBAR: Bus-Master-Enable nicht geschützt
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            // VERWUNDBAR: Reset-Wert erlaubt Bus-Master-Fähigkeit
            control_reg <= 32'h0000_0001;  // Bus Master standardmäßig aktiviert!
        end else if (cfg_write && cfg_addr == CTRL_REG_ADDR) begin
            // VERWUNDBAR: Jeder Schreibzugriff kann Bus-Master-Enable ändern
            control_reg <= cfg_wdata;
        end
    end

    // VERWUNDBAR: Responder kann zum Master werden
    assign fabric_master_en = control_reg[BUS_MASTER_EN_BIT];

    // Wenn Bus-Master aktiviert, kann das Gerät Transaktionen initiieren
    always @(posedge clk) begin
        if (fabric_master_en) begin
            // VERWUNDBAR: Gerät kann auf jede Adresse zugreifen
            fabric_addr <= device_addr_out;
            fabric_wdata <= device_data;
            fabric_write <= device_access;
        end
    end

    // Angriff:
    // 1. Audio-Codec mit aktiviertem Bus-Master
    // 2. Bösartige Firmware lädt Angriffs-Payload in Codec
    // 3. Codec initiiert Transaktionen zum CPU-Speicher
    // 4. Liest Geheimnisse oder modifiziert kritische Daten

endmodule

// VERWUNDBAR: Fabric-Controller ohne Endpunkt-Einschränkungen
module vulnerable_fabric_controller (
    input  wire        clk,
    input  wire        rst_n,

    // Endpunkt-Master-Anfragen
    input  wire        ep_master_req,
    input  wire [31:0] ep_master_addr,
    input  wire [31:0] ep_master_data,
    input  wire        ep_master_write,
    input  wire [3:0]  ep_id,

    // Fabric-Ausgabe
    output reg  [31:0] fabric_addr,
    output reg  [31:0] fabric_data,
    output reg         fabric_write,
    output reg         fabric_valid
);

    // VERWUNDBAR: Keine Prüfung welche Endpunkte Master sein können
    // Jeder Endpunkt kann Transaktionen initiieren

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            fabric_valid <= 1'b0;
        end else if (ep_master_req) begin
            // VERWUNDBAR: Akzeptiert Master-Anfragen blind
            fabric_addr <= ep_master_addr;
            fabric_data <= ep_master_data;
            fabric_write <= ep_master_write;
            fabric_valid <= 1'b1;
        end else begin
            fabric_valid <= 1'b0;
        end
    end

    // Angriff:
    // Endpunkt der nur Responder sein sollte kann zum Master werden
    // Keine Richtlinien-Durchsetzung welche Endpunkte Master sein können

endmodule

Sichere Lösung

// SICHER: Fabric-Endpunkt mit geschützter Bus-Master-Fähigkeit

module secure_fabric_endpoint (
    input  wire        clk,
    input  wire        rst_n,

    // Konfigurationsschnittstelle
    input  wire [31:0] cfg_addr,
    input  wire [31:0] cfg_wdata,
    input  wire        cfg_write,
    input  wire        privileged_access,

    // Lebenszyklus-Signale
    input  wire        secure_boot_complete,
    input  wire        bus_master_fuse,      // OTP-Fuse für permanente Deaktivierung

    // Fabric-Schnittstelle
    output reg         fabric_master_en,
    output reg  [31:0] fabric_addr,
    output reg  [31:0] fabric_wdata,
    output reg         fabric_write,
    output reg         fabric_read,
    output reg         config_denied,

    // Gerätespezifische Schnittstelle
    input  wire [31:0] device_data,
    output reg  [31:0] device_addr_out,
    output reg         device_access
);

    // Konfigurationsregister
    reg [31:0] control_reg;
    reg config_locked;

    localparam CTRL_REG_ADDR = 32'h0000_0100;
    localparam BUS_MASTER_EN_BIT = 0;

    // SICHER: Konfiguration nach Secure Boot sperren
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            config_locked <= 1'b0;
        end else if (secure_boot_complete) begin
            // SICHER: Nach Secure-Boot-Abschluss sperren
            config_locked <= 1'b1;
        end
    end

    // SICHER: Geschützte Bus-Master-Konfiguration
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            // SICHER: Reset auf Bus-Master deaktiviert (nur Responder)
            control_reg <= 32'h0000_0000;
            config_denied <= 1'b0;
        end else if (cfg_write && cfg_addr == CTRL_REG_ADDR) begin
            config_denied <= 1'b0;

            // SICHER: Fuse, Sperre und Berechtigung prüfen
            if (bus_master_fuse) begin
                // SICHER: Fuse deaktiviert Bus-Master-Fähigkeit permanent
                control_reg[BUS_MASTER_EN_BIT] <= 1'b0;
                config_denied <= cfg_wdata[BUS_MASTER_EN_BIT];
            end else if (config_locked) begin
                // SICHER: Änderungen nach Sperre ablehnen
                config_denied <= 1'b1;
            end else if (!privileged_access) begin
                // SICHER: Nur privilegierter Zugriff kann Bus-Master aktivieren
                control_reg <= cfg_wdata & ~(1 << BUS_MASTER_EN_BIT);
                if (cfg_wdata[BUS_MASTER_EN_BIT]) begin
                    config_denied <= 1'b1;
                end
            end else begin
                // Privilegiert, entsperrt, keine Fuse - Konfiguration erlauben
                control_reg <= cfg_wdata;
            end
        end
    end

    // SICHER: Bus-Master-Fähigkeit mit Fuse-Überschreibung
    wire bus_master_allowed = control_reg[BUS_MASTER_EN_BIT] && !bus_master_fuse;
    assign fabric_master_en = bus_master_allowed;

    // SICHER: Transaktionen nur erlauben wenn Master-Fähigkeit ordnungsgemäß aktiviert
    always @(posedge clk) begin
        if (bus_master_allowed) begin
            fabric_addr <= device_addr_out;
            fabric_wdata <= device_data;
            fabric_write <= device_access;
        end else begin
            fabric_addr <= 32'h0;
            fabric_wdata <= 32'h0;
            fabric_write <= 1'b0;
        end
    end

endmodule

// SICHER: Fabric-Controller mit Endpunkt-Fähigkeitsdurchsetzung
module secure_fabric_controller (
    input  wire        clk,
    input  wire        rst_n,

    // Endpunkt-Master-Anfragen
    input  wire        ep_master_req,
    input  wire [31:0] ep_master_addr,
    input  wire [31:0] ep_master_data,
    input  wire        ep_master_write,
    input  wire [3:0]  ep_id,

    // Konfiguration
    input  wire [15:0] master_capable_endpoints,  // Bitmap aus sicherer Konfiguration

    // Fabric-Ausgabe
    output reg  [31:0] fabric_addr,
    output reg  [31:0] fabric_data,
    output reg         fabric_write,
    output reg         fabric_valid,
    output reg         master_denied
);

    // SICHER: Prüfen ob Endpunkt Master sein darf
    wire endpoint_allowed = master_capable_endpoints[ep_id];

    always @(posedge clk or negedge rst_n) begin
        if (!rst_n) begin
            fabric_valid <= 1'b0;
            master_denied <= 1'b0;
        end else begin
            master_denied <= 1'b0;

            if (ep_master_req) begin
                // SICHER: Verifizieren ob Endpunkt Master-Fähigkeit hat
                if (endpoint_allowed) begin
                    fabric_addr <= ep_master_addr;
                    fabric_data <= ep_master_data;
                    fabric_write <= ep_master_write;
                    fabric_valid <= 1'b1;
                end else begin
                    // SICHER: Unbefugten Master-Versuch ablehnen und protokollieren
                    fabric_valid <= 1'b0;
                    master_denied <= 1'b1;
                end
            end else begin
                fabric_valid <= 1'b0;
            end
        end
    end

endmodule

CVE-Beispiele

  • CVE-2021-0146: Hardware ermöglicht Aktivierung von Test- oder Debug-Logik, die Responder-Endpunkten Bus-Master-Fähigkeiten gewährt.
  • CVE-2020-8703: Unsachgemäße Eingabevalidierung im Plattform-Fabric ermöglichte unbefugte Master-Transaktionen.

Verwandte CWEs

  • CWE-284: Improper Access Control (Eltern)
  • CWE-1203: Peripherals, On-chip Fabric, and Interface/IO Problems (Kategorie)
  • CWE-1317: Improper Access Control in Fabric Bridge (Peer)
  • CWE-1396: Comprehensive Categorization: Access Control (Kategorie)

Referenzen

  1. MITRE Corporation. "CWE-1315: Improper Setting of Bus Controlling Capability in Fabric End-point." https://cwe.mitre.org/data/definitions/1315.html
  2. ARM. "AMBA AXI Protocol Specification"
  3. Intel. "System-on-Chip Fabric Security Guidelines"