Unsachgemäße Behandlung von Hardware-Verhalten in extrem kalten Umgebungen
Beschreibung
Unsachgemäße Behandlung von Hardware-Verhalten in extrem kalten Umgebungen tritt auf, wenn Hardware-Geräte oder ihre Firmware keine geeigneten Schutzmechanismen haben, um die Sicherheit aufrechtzuerhalten, wenn sie unter die Standard-Betriebstemperaturen gekühlt werden. Designer berücksichtigen möglicherweise nicht, wie sich Hardware unter extremen Kältebedingungen verhält. Ein Hauptanliegen betrifft die Persistenz des flüchtigem Speicherzustands: Stromverlust bereinigt oder setzt keinen flüchtigem Zustand zurück, wenn er unter Standard-Betriebstemperaturen gekühlt wird. Dies erzeugt Risiken, wenn Systeme sich auf anfängliche Speicherzustande für Sicherheitsentscheidungen verlassen. Die Schwachstelle adressiert speziell Physical Unclonable Functions (PUFs), die mit temperaturempfindlichen Entropiequellen wie DRAM oder SRAM gepaart sind, wo kalte Temperaturen verhindern, dass normale bitweise Fertigungs-Biases entstehen, wodurch Angreifer PUF-Seed-Daten kontrollieren können.
Risiko
Schwachstellen in kalten Umgebungen haben schwerwiegende Auswirkungen. PUF-basierte Authentifizierungsumgehung. Persistenz des flüchtigem Speicherzustands ermöglicht Geheimnis-Extraktion. Manipulation von Entropiequellen. Umgehung von Sicherheitsprimitiven. Authentifizierungsversagen. Wiederherstellung kryptographischer Schlüssel. Geräteklonen durch PUF-Manipulation. Geringe Wahrscheinlichkeit aber hohe Auswirkung bei erfolgreicher Ausnutzung. Erfordert physischen Zugang und spezialisierte Ausrüstung.
Lösung
Verhalten von Sicherheitsprimitiven bei Kühlung außerhalb der Standardtemperaturen während der Architektur- und Designphase berücksichtigen. Temperaturüberwachung implementieren, die den Betrieb unter sicheren Schwellenwerten erkennt. Sicherheitsprimitive so entwerfen, dass sie bei erkannten Temperaturanomalien sicher ausfallen. Mehrere unabhängige Entropiequellen während der Implementierungsphase verwenden. Umgebungsangriffsszenarien in der Bedrohungsmodellierung berücksichtigen.
Häufige Auswirkungen
| Auswirkung | Details |
|---|---|
| Integrität | Bereich: Integrität, Authentifizierung Umgehung von Sicherheitsprimitiven und Authentifizierungsversagen, wenn sich das Systemverhalten bei extremen Temperaturen ändert. |
| Vertraulichkeit | Bereich: Vertraulichkeit Potenzielle Extraktion von Geheimnissen durch Manipulation flüchtigem Speicherzustande bei niedrigen Temperaturen. |
Beispielcode
Verwundbarer Code
// VERWUNDBAR: PUF ohne Temperaturüberwachung
module vulnerable_puf (
input wire clk,
input wire rst_n,
input wire generate_key,
output reg [255:0] puf_key,
output reg key_valid
);
// VERWUNDBAR: SRAM-basierter PUF ohne Temperaturbewusstsein
// Bei normalen Temperaturen haben SRAM-Zellen Fertigungs-Bias
// Bei extremer Kälte verschwindet der Bias und kann manipuliert werden
reg [255:0] sram_puf_cells; // Simulierter SRAM-PUF
// VERWUNDBAR: Keine Temperaturüberwachung
// Keine Erkennung von Kälteumgebungsangriffen
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// VERWUNDBAR: Nimmt an, dass SRAM mit konsistentem Bias hochfährt
// Bei kalten Temperaturen kann Angreifer Zellen vorinitialisieren
sram_puf_cells <= 256'h0; // Würde normalerweise Bias haben
puf_key <= 256'h0;
key_valid <= 1'b0;
end else if (generate_key) begin
// VERWUNDBAR: Verwendet PUF-Ausgabe direkt ohne Verifikation
puf_key <= sram_puf_cells;
key_valid <= 1'b1;
// Angriffsszenario:
// 1. Gerät unter Betriebstemperatur kühlen
// 2. SRAM-Zellen auf bekannten Zustand vorladen
// 3. Gerät einschalten während es noch kalt ist
// 4. SRAM behält angreiferkontrollierten Zustand
// 5. PUF generiert vorhersagbaren/bekannten Schlüssel
end
end
endmodule
// VERWUNDBAR: Flüchtige Geheimnis-Speicherung ohne Cold-Boot-Schutz
module vulnerable_secret_storage (
input wire clk,
input wire rst_n,
input wire write_secret,
input wire [127:0] secret_in,
input wire read_secret,
output reg [127:0] secret_out,
output reg secret_valid
);
// VERWUNDBAR: Geheimnis in flüchtigem Speicher gespeichert
reg [127:0] stored_secret;
// VERWUNDBAR: Keine Temperaturüberwachung
// Geheimnisse persistieren in kaltem Speicher auch nach "Ausschalten"
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
// VERWUNDBAR: Reset nimmt an, dass Stromzyklus Speicher löscht
// Bei kalten Temperaturen behält Speicher Daten
stored_secret <= 128'h0;
secret_valid <= 1'b0;
end else begin
if (write_secret) begin
stored_secret <= secret_in;
end
if (read_secret) begin
secret_out <= stored_secret;
secret_valid <= 1'b1;
end
end
end
// Angriffsszenario (Cold-Boot-Attack-Variante):
// 1. System speichert Verschlüsselungsschlüssel im RAM
// 2. Angreifer kühlt RAM auf -50 Grad C oder darunter
// 3. Strom wird entfernt
// 4. Bei kalter Temperatur behält RAM Daten für Minuten
// 5. Angreifer liest RAM-Inhalt vor dem Zerfall
// 6. Verschlüsselungsschlüssel wiederhergestellt
endmodule
// VERWUNDBAR: Entropiequelle ohne Temperaturqualifizierung
module vulnerable_rng (
input wire clk,
input wire rst_n,
input wire generate_random,
output reg [31:0] random_number,
output reg random_valid
);
// VERWUNDBAR: Thermisches-Rauschen-basierter RNG
// Bei kalten Temperaturen nimmt thermisches Rauschen ab
// Entropiequalität verschlechtert sich erheblich
reg [31:0] noise_samples;
// VERWUNDBAR: Keine Temperaturprüfung
// Keine Entropiequalitätsverifikation
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
random_number <= 32'h0;
random_valid <= 1'b0;
end else if (generate_random) begin
// VERWUNDBAR: Nimmt ausreichende Entropie bei allen Temperaturen an
random_number <= noise_samples;
random_valid <= 1'b1;
// Bei -40 Grad C und darunter:
// - Thermisches Rauschen reduziert
// - Weniger Zufälligkeit in Proben
// - Generierte "Zufalls"-Zahlen vorhersagbarer
end
end
endmodule
Sichere Lösung
// SICHER: PUF mit Temperaturüberwachung und Schutz
module secure_puf (
input wire clk,
input wire rst_n,
input wire generate_key,
// SICHER: Temperatursensor-Eingang
input wire [11:0] temperature_reading,
input wire temp_sensor_valid,
output reg [255:0] puf_key,
output reg key_valid,
output reg temperature_alarm
);
// SICHER: Temperaturschwellenwerte
localparam TEMP_MIN_SAFE = 12'd1024; // Minimale sichere Betriebstemperatur
localparam TEMP_MAX_SAFE = 12'd3072; // Maximale sichere Betriebstemperatur
reg [255:0] sram_puf_cells;
reg puf_qualified;
// SICHER: Temperaturqualifizierungszustand
reg [1:0] temp_state;
localparam TEMP_CHECKING = 2'b00;
localparam TEMP_QUALIFIED = 2'b01;
localparam TEMP_FAILED = 2'b10;
// SICHER: Temperaturüberwachung
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
temp_state <= TEMP_CHECKING;
temperature_alarm <= 1'b0;
puf_qualified <= 1'b0;
end else begin
case (temp_state)
TEMP_CHECKING: begin
if (temp_sensor_valid) begin
// SICHER: Prüfen ob Temperatur im sicheren Bereich ist
if (temperature_reading >= TEMP_MIN_SAFE &&
temperature_reading <= TEMP_MAX_SAFE) begin
temp_state <= TEMP_QUALIFIED;
puf_qualified <= 1'b1;
end else begin
temp_state <= TEMP_FAILED;
temperature_alarm <= 1'b1;
end
end
end
TEMP_QUALIFIED: begin
// SICHER: Kontinuierliche Überwachung
if (temp_sensor_valid) begin
if (temperature_reading < TEMP_MIN_SAFE ||
temperature_reading > TEMP_MAX_SAFE) begin
temp_state <= TEMP_FAILED;
temperature_alarm <= 1'b1;
puf_qualified <= 1'b0;
end
end
end
TEMP_FAILED: begin
// SICHER: Kann ohne ordnungsgemäßen Reset nicht wiederhergestellt werden
puf_qualified <= 1'b0;
end
endcase
end
end
// SICHER: PUF-Schlüsselgenerierung nur wenn Temperatur qualifiziert
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
puf_key <= 256'h0;
key_valid <= 1'b0;
end else if (generate_key) begin
// SICHER: Schlüssel nur generieren wenn Temperatur sicher ist
if (puf_qualified && temp_state == TEMP_QUALIFIED) begin
puf_key <= sram_puf_cells;
key_valid <= 1'b1;
end else begin
// SICHER: Schlüsselgenerierung unter unsicheren Bedingungen ablehnen
puf_key <= 256'h0;
key_valid <= 1'b0;
end
end
end
endmodule
// SICHER: Geheimnis-Speicherung mit aktiver Speicherbereinigung
module secure_secret_storage (
input wire clk,
input wire rst_n,
input wire write_secret,
input wire [127:0] secret_in,
input wire read_secret,
// SICHER: Temperatur- und Leistungsüberwachung
input wire [11:0] temperature_reading,
input wire power_loss_imminent,
output reg [127:0] secret_out,
output reg secret_valid,
output reg security_alert
);
reg [127:0] stored_secret;
localparam TEMP_MIN_SAFE = 12'd1024;
// SICHER: Aktive Speicherbereinigung bei Sicherheitsereignissen
wire clear_secrets = power_loss_imminent ||
(temperature_reading < TEMP_MIN_SAFE);
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
stored_secret <= 128'h0;
secret_valid <= 1'b0;
security_alert <= 1'b0;
end else begin
// SICHER: Geheimnisse bei Sicherheitsbedrohungen löschen
if (clear_secrets) begin
// Speicher aktiv mehrfach überschreiben
stored_secret <= 128'hFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;
secret_valid <= 1'b0;
security_alert <= 1'b1;
end else begin
if (write_secret) begin
stored_secret <= secret_in;
end
if (read_secret) begin
secret_out <= stored_secret;
secret_valid <= 1'b1;
end
end
end
end
// SICHER: Zweiter Bereinigungsdurchgang
always @(posedge clk) begin
if (clear_secrets) begin
#1 stored_secret <= 128'h0;
#1 stored_secret <= 128'hAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;
#1 stored_secret <= 128'h5555555555555555555555555555555;
#1 stored_secret <= 128'h0;
end
end
endmodule
// SICHER: RNG mit temperaturqualifizierter Entropie
module secure_rng (
input wire clk,
input wire rst_n,
input wire generate_random,
// SICHER: Temperaturüberwachung
input wire [11:0] temperature_reading,
input wire temp_sensor_valid,
output reg [31:0] random_number,
output reg random_valid,
output reg entropy_degraded
);
localparam TEMP_MIN_ENTROPY = 12'd1200; // Minimum für gute Entropie
reg [31:0] noise_samples;
reg [31:0] entropy_pool [0:7]; // SICHER: Entropie-Akkumulator
reg [2:0] pool_index;
reg [7:0] samples_accumulated;
// SICHER: Temperaturbasierte Entropiequalitätsbewertung
wire entropy_qualified = temp_sensor_valid &&
(temperature_reading >= TEMP_MIN_ENTROPY);
// SICHER: Mehr Proben bei marginalen Temperaturen erfordern
wire [7:0] required_samples = (temperature_reading < 12'd1500) ? 8'd64 :
(temperature_reading < 12'd2000) ? 8'd32 :
8'd16;
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
random_number <= 32'h0;
random_valid <= 1'b0;
entropy_degraded <= 1'b0;
samples_accumulated <= 8'h0;
end else begin
// SICHER: Degradierte Entropie bei niedrigen Temperaturen anzeigen
entropy_degraded <= !entropy_qualified;
if (entropy_qualified) begin
// SICHER: Entropie akkumulieren
entropy_pool[pool_index] <= entropy_pool[pool_index] ^ noise_samples;
pool_index <= pool_index + 1;
samples_accumulated <= samples_accumulated + 1;
end
if (generate_random) begin
// SICHER: Zufallszahl nur mit ausreichender Entropie bereitstellen
if (entropy_qualified && samples_accumulated >= required_samples) begin
// SICHER: Entropie-Pool mischen
random_number <= entropy_pool[0] ^ entropy_pool[1] ^
entropy_pool[2] ^ entropy_pool[3] ^
entropy_pool[4] ^ entropy_pool[5] ^
entropy_pool[6] ^ entropy_pool[7];
random_valid <= 1'b1;
samples_accumulated <= 8'h0;
end else begin
// SICHER: Schwache Zufallszahlen nicht bereitstellen
random_number <= 32'h0;
random_valid <= 1'b0;
end
end
end
end
endmodule
CVE-Beispiele
- CVE-2008-1231: Cold-Boot-Angriff, der DRAM-Datenwiederherstellung nach Ausschalten ermöglicht.
- CVE-2017-18269: Temperaturbasierter Angriff auf Hardware-Sicherheitsmodul.
Verwandte CWEs
- CWE-1384: Improper Handling of Physical or Environmental Conditions (übergeordnet)
- CWE-1205: Security Primitives and Cryptography Issues (Kategorie)
- CWE-1388: Physical Access Issues and Concerns (Kategorie)
Referenzen
- MITRE Corporation. "CWE-1351: Improper Handling of Hardware Behavior in Exceptionally Cold Environments." https://cwe.mitre.org/data/definitions/1351.html
- Halderman, J.A. et al. "Lest We Remember: Cold-Boot Attacks on Encryption Keys"
- NIST. "Hardware Security Guidelines"