Fehlende Unterstützung für Sicherheitsfunktionen in On-Chip Fabrics oder Bussen

Beschreibung

Fehlende Unterstützung für Sicherheitsfunktionen in On-Chip Fabrics oder Bussen tritt auf, wenn On-Chip Fabrics oder Busse entweder keine Berechtigungstrennung oder andere Sicherheitsfunktionen wie Zugriffskontrolle unterstützen oder nicht dafür konfiguriert sind. Die Schwachstelle zeigt sich, wenn die On-Chip-Kommunikationsinfrastruktur keine Mechanismen zum Transport von Sicherheitsattributen (Berechtigungsstufen, Identität, Zugriffskontrolldaten) zwischen Bus-Mastern und Slaves besitzt. Selbst wenn unterstützt, können diese Funktionen während der RTL-Generierung unkonfiguriert bleiben, was sie unwirksam macht und sicherheitskritische Kommunikation ungeschützt lässt.

Risiko

Fehlende Sicherheitsfunktionen in Fabrics haben schwerwiegende Auswirkungen. Keine Berechtigungstrennung möglich. Sicherheitsattribute nicht transportiert. Zugriffskontrolle nicht durchsetzbar. Alle Master erscheinen gleich vertrauenswürdig. Geschützte Peripheriegeräte für jeden zugänglich. Sichere und nicht-sichere Welten nicht trennbar. TrustZone-artige Isolation versagt. Seitenkanalangriffe zwischen Domänen. Mittlere Wahrscheinlichkeit bei Verwendung von Protokollen mit optionaler Sicherheit oder bei kostenoptimierten Designs.

Lösung

Implementieren Sie Sicherheitsprüfungen an Fabric-Bridges oder Zwischenmodulen. Trennen Sie ungesicherte Busse von sicherheitskritischen Peripheriegeräten. Verbinden Sie sicherheitssensitive Assets mit Bussen, die Sicherheitsfunktionen unterstützen. Konfigurieren Sie optionale Sicherheitssignale (z.B. MReqInfo/SRespInfo in OCP, AxPROT in AXI) während der RTL-Generierung. Führen Sie Architektur- und Entwurfsprüfungen durch, um sicherzustellen, dass Fabric-Spezifikationen die erforderlichen Sicherheitssignale enthalten.

Häufige Auswirkungen

AuswirkungDetails
ZugriffskontrolleBereich: Zugriffskontrolle

Berechtigungstrennung oder Zugriffsbeschränkungen nicht durchsetzbar.
VertraulichkeitBereich: Vertraulichkeit

Unbefugter Speicherlesezugriff durch fehlende Sicherheitsattribute.
IntegritätBereich: Integrität

Speicheränderung möglich wenn Zugriffskontrolle nicht durchgesetzt werden kann.
VerfügbarkeitBereich: Verfügbarkeit

Denial of Service durch unbefugten Zugriff auf kritische Ressourcen.

Beispielcode und Lösung

Verwundbarer Code

// VERWUNDBAR: APB-Bus ohne ausreichende Sicherheitssignale

module vulnerable_apb_interconnect (
    input  wire        clk,
    input  wire        rst_n,
    input  wire [31:0] master_paddr,
    input  wire [31:0] master_pwdata,
    input  wire        master_pwrite,
    input  wire        master_psel,
    input  wire        master_penable,
    // VERWUNDBAR: Kein PPROT-Signal!

    output reg  [31:0] slave0_paddr,
    output reg  [31:0] slave0_pwdata,
    output reg         slave0_pwrite,
    output reg         slave0_psel,
    output reg         slave0_penable,

    output reg  [31:0] slave1_paddr,
    output reg  [31:0] slave1_pwdata,
    output reg         slave1_pwrite,
    output reg         slave1_psel,
    output reg         slave1_penable
);

    wire select_slave0 = (master_paddr[31:16] == 16'h4000);
    wire select_slave1 = (master_paddr[31:16] == 16'h4001);

    // VERWUNDBAR: Keine Sicherheitsattribut-Weiterleitung
    // Kann sichere von nicht-sicheren Transaktionen nicht unterscheiden
    always @(*) begin
        slave0_paddr = master_paddr;
        slave0_pwdata = master_pwdata;
        slave0_pwrite = master_pwrite;
        slave0_psel = master_psel && select_slave0;
        slave0_penable = master_penable;
        // VERWUNDBAR: Keine Schutzsignale zum Slave!

        slave1_paddr = master_paddr;
        slave1_pwdata = master_pwdata;
        slave1_pwrite = master_pwrite;
        slave1_psel = master_psel && select_slave1;
        slave1_penable = master_penable;
    end

endmodule

Sichere Lösung

// SICHER: APB-Verbindung mit Sicherheitssignalen

module secure_apb_interconnect (
    input  wire        clk,
    input  wire        rst_n,
    input  wire [31:0] master_paddr,
    input  wire [31:0] master_pwdata,
    input  wire        master_pwrite,
    input  wire        master_psel,
    input  wire        master_penable,
    input  wire [2:0]  master_pprot,    // SICHER: Schutzsignale

    output reg  [31:0] slave0_paddr,
    output reg  [31:0] slave0_pwdata,
    output reg         slave0_pwrite,
    output reg         slave0_psel,
    output reg         slave0_penable,
    output reg  [2:0]  slave0_pprot,    // SICHER: Schutz weiterleiten

    output reg  [31:0] slave1_paddr,
    output reg  [31:0] slave1_pwdata,
    output reg         slave1_pwrite,
    output reg         slave1_psel,
    output reg         slave1_penable,
    output reg  [2:0]  slave1_pprot,

    output reg         access_denied
);

    wire select_slave0 = (master_paddr[31:16] == 16'h4000);
    wire select_slave1 = (master_paddr[31:16] == 16'h4001);

    // SICHER: Zugangskontrolle für sicheren Slave
    wire slave0_access_ok = (master_pprot[0] == 1'b1) &&   // Privilegiert
                            (master_pprot[1] == 1'b0);     // Sicher

    always @(*) begin
        access_denied = 1'b0;
        slave0_paddr = master_paddr;
        slave0_pwdata = master_pwdata;
        slave0_pwrite = master_pwrite;
        slave0_pprot = master_pprot;

        if (select_slave0) begin
            if (slave0_access_ok) begin
                slave0_psel = master_psel;
                slave0_penable = master_penable;
            end else begin
                // SICHER: Nicht-sicheren oder nicht-privilegierten Zugriff blockieren
                slave0_psel = 1'b0;
                slave0_penable = 1'b0;
                access_denied = 1'b1;
            end
        end else begin
            slave0_psel = 1'b0;
            slave0_penable = 1'b0;
        end

        slave1_paddr = master_paddr;
        slave1_pwdata = master_pwdata;
        slave1_pwrite = master_pwrite;
        slave1_psel = master_psel && select_slave1;
        slave1_penable = master_penable;
        slave1_pprot = master_pprot;
    end

endmodule

CVE-Beispiele

  • CVE-2020-8705: Plattform-Fabric in Intel-Prozessoren hatte keine ordnungsgemäße Sicherheitssignal-Verbreitung.
  • CVE-2019-0090: Intel CSME verwendete Busse ohne angemessene Sicherheitsfunktions-Unterstützung.

Verwandte CWEs

  • CWE-693: Protection Mechanism Failure (Eltern)
  • CWE-1198: Privilege Separation and Access Control Issues (Kategorie)
  • CWE-1311: Improper Translation of Security Attributes by Fabric Bridge (verwandt)
  • CWE-1317: Improper Access Control in Fabric Bridge (verwandt)

Referenzen

  1. MITRE Corporation. "CWE-1318: Missing Support for Security Features in On-chip Fabrics or Buses." https://cwe.mitre.org/data/definitions/1318.html
  2. ARM. "AMBA APB Protocol Specification"
  3. OCP-IP. "Open Core Protocol Specification"
  4. ARM. "AMBA AXI and ACE Protocol Specification"