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
| Auswirkung | Details |
|---|---|
| Zugriffskontrolle | Bereich: Zugriffskontrolle Responder-Geräte können beabsichtigte Zugriffsbeschränkungen umgehen und unbefugte Transaktionen initiieren. |
| Integrität | Bereich: Integrität Speicheränderung möglich wenn Responder Master-Fähigkeit erlangen. |
| Vertraulichkeit | Bereich: 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
- MITRE Corporation. "CWE-1315: Improper Setting of Bus Controlling Capability in Fabric End-point." https://cwe.mitre.org/data/definitions/1315.html
- ARM. "AMBA AXI Protocol Specification"
- Intel. "System-on-Chip Fabric Security Guidelines"