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
| Auswirkung | Details |
|---|---|
| Vertraulichkeit | Bereich: Vertraulichkeit Geschützte Daten über ungeschützten überlappenden Adressbereich lesbar. |
| Integrität | Bereich: Integrität Speicheränderung über den ungeschützten Teil überlappter Bereiche. |
| Zugriffskontrolle | Bereich: 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
- 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
- Intel. "Memory-Mapped I/O Configuration Guidelines"
- CAPEC-456: Infected Memory
- CAPEC-679: Exploitation of Improperly Configured Memory Protections