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

AuswirkungDetails
IntegritätBereich: Integrität, Authentifizierung

Umgehung von Sicherheitsprimitiven und Authentifizierungsversagen, wenn sich das Systemverhalten bei extremen Temperaturen ändert.
VertraulichkeitBereich: 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

  1. MITRE Corporation. "CWE-1351: Improper Handling of Hardware Behavior in Exceptionally Cold Environments." https://cwe.mitre.org/data/definitions/1351.html
  2. Halderman, J.A. et al. "Lest We Remember: Cold-Boot Attacks on Encryption Keys"
  3. NIST. "Hardware Security Guidelines"