DÍA 270 DE 365

Fase 5: Diseño Industrial y Proyecto Final

📖 Teoría a Estudiar

El Penetration Test Físico (Bit-Flipping Attack)

En ciberseguridad industrial, un Penetration Test (Pen Test) no es solo usar Kali Linux para escanear puertos de red. Involucra manipular el hardware. Supongamos que el ESP32 ha descargado la nueva versión del firmware v1.2.bin y la ha guardado en una memoria externa (Flash SPI o EEPROM).

Un atacante abre la máquina, conecta unas pinzas lógicas directamente a las patas de la memoria externa y lee el archivo binario. El atacante no tiene tu Llave Privada RSA, así que no puede generar un archivo nuevo desde cero. Su única opción es la Alteración Quirúrgica (Bit-Flipping): Modificar un byte específico del código existente. Por ejemplo, busca en el código hexadecimal el límite de calibración del K-Factor y lo cambia de 0x03E8 (1000) a 0x0000.

El Efecto Avalancha (Avalanche Effect) en SHA-256

La genialidad de las funciones Hash criptográficas (como SHA-256) es el Efecto Avalancha. En matemáticas normales, si cambias el 1% de los datos de entrada, el resultado cambia un 1%. En SHA-256, si tomas un archivo de 192 KB y cambias un solo bit (un 0 por un 1), la "Huella Digital" de 32 bytes cambiará en promedio más del 50%. De repente, el Hash calculado por el microcontrolador no coincidirá en absoluto con el Hash encriptado en la firma RSA. El Bootloader lanzará una alerta de intrusión y borrará la Flash.

SIMULACIÓN DE ATAQUE: BIT-FLIPPING Y EL EFECTO AVALANCHA FIRMWARE LEGÍTIMO (192 KB) ... 2A 4B 8F C3 99 10 FF 00 ... SHA-256 a591a6d40bf420404a011733cfb7b190d62c65bf... Coincide con Firma RSA -> BOOT APROBADO ATAQUE: FIRMWARE MODIFICADO Hacker altera un byte en EEPROM/Flash ... 2A 4B 8F C4 99 10 FF 00 ... SHA-256 8f434346648f6b96df89dda901c5176b10a6d839... Efecto Avalancha: Hash totalmente diferente Firma RSA Rechazada -> MASS ERASE Y BRICK

⚙️ Ejercicios Prácticos

Entorno de Pruebas (Test Bench): No vamos a hackear el chip con un láser hoy. Vamos a programar una función dentro de nuestro propio firmware de pruebas que emule el comportamiento de un hacker. Esta función tomará un arreglo de memoria válido y firmado en la RAM, modificará deliberadamente su contenido, y luego llamará al motor de Secure Boot (Día 269) esperando que éste salte como una trampa para ratones.

Ejercicio 1: Script de Penetration Testing. Escribiremos la función Test_FOTA_Security_Injection(). Se ejecuta en la consola de depuración UART durante la etapa de pruebas de control de calidad (QA).


/**
 * @file fota_pentest_suite.c
 * @brief Suite de Penetration Testing para Secure Boot y Efecto Avalancha
 */

#include "stm32f401xe.h"
#include <stdint.h>
#include <stdbool.h>
#include <string.h>
#include <stdio.h>

// Dependencias de nuestro Secure Boot (Día 269)
extern bool SecureBoot_Validar_Autenticidad(uint32_t address, uint32_t size);
extern void UART_Print(const char* msg);

// =========================================================================
// MOCK DE FIRMWARE (Simulación de un bloque descargado)
// =========================================================================
// Imagina que este es un bloque de firmware legítimo de 64 bytes
// que el ESP32 descargó y guardó en la memoria, junto con su firma RSA válida.
uint8_t mock_firmware_valido[64] = {
    0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
    0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
    // ... [Relleno omitido]
    0xFF, 0xEE, 0xDD, 0xCC, 0xBB, 0xAA, 0x99, 0x88 
};

// =========================================================================
// FUNCIÓN DE PRUEBA DE PENETRACIÓN (PEN-TEST)
// =========================================================================
/**
 * @brief Ejecuta una batería de pruebas mutando el firmware para verificar 
 *        la fortaleza del cerrojo criptográfico SHA-256 + RSA.
 */
void Test_FOTA_Security_Injection(void) {
    
    UART_Print("\n[!] INICIANDO PENETRATION TEST DE SECURE BOOT...\r\n");
    
    uint32_t direccion_mock = (uint32_t)&mock_firmware_valido;
    uint32_t tamano_mock = sizeof(mock_firmware_valido);
    
    // -----------------------------------------------------------------
    // PRUEBA 1: Validación de Línea Base (Baseline)
    // -----------------------------------------------------------------
    UART_Print("[-] PRUEBA 1: Verificando Firmware Inmaculado...\r\n");
    
    // (En un entorno real, esta función usaría la llave pública para validar el mock)
    bool auth_ok = SecureBoot_Validar_Autenticidad(direccion_mock, tamano_mock);
    
    if (auth_ok) {
        UART_Print("    [OK] Línea base aprobada. El firmware original es válido.\r\n");
    } else {
        UART_Print("    [FAIL] Error en el entorno de pruebas. Línea base inválida.\r\n");
        return;
    }
    
    // -----------------------------------------------------------------
    // PRUEBA 2: Ataque de Bit-Flipping (Inyección de un bit falso)
    // -----------------------------------------------------------------
    UART_Print("[-] PRUEBA 2: Ejecutando ataque de Bit-Flipping (offset 15)...\r\n");
    
    // El "Hacker" modifica un solo byte. 
    // Cambiamos el 0x0F original por un 0x1F (Solo cambió 1 bit: 00001111 -> 00011111)
    mock_firmware_valido[15] = 0x1F; 
    
    UART_Print("    [>] Byte modificado. Llamando al validador Secure Boot...\r\n");
    
    // El Bootloader audita el archivo. Aquí entra el Efecto Avalancha de SHA-256.
    auth_ok = SecureBoot_Validar_Autenticidad(direccion_mock, tamano_mock);
    
    if (!auth_ok) {
        UART_Print("    [OK] SECURE BOOT ACTUÓ: Archivo malicioso detectado y rechazado.\r\n");
        UART_Print("    [OK] Efecto avalancha confirmado. Sistema asegurado.\r\n");
    } else {
        // Si el código llega aquí, tu criptografía no sirve. Renuncia.
        UART_Print("    [FATAL ERROR] Criptografía rota. El sistema aceptó código modificado.\r\n");
    }
    
    // -----------------------------------------------------------------
    // PRUEBA 3: Ataque de Truncamiento (Cortar el archivo)
    // -----------------------------------------------------------------
    UART_Print("[-] PRUEBA 3: Ataque de Truncamiento (Falta de datos)...\r\n");
    
    // Restauramos el byte atacado a la normalidad
    mock_firmware_valido[15] = 0x0F;
    
    // Engañamos al bootloader pasándole un tamaño menor (simulando que la red se cayó
    // o que el atacante cortó la firma adjunta).
    auth_ok = SecureBoot_Validar_Autenticidad(direccion_mock, tamano_mock - 16U);
    
    if (!auth_ok) {
        UART_Print("    [OK] SECURE BOOT ACTUÓ: Truncamiento detectado. Abortando.\r\n");
    } else {
        UART_Print("    [FATAL ERROR] Truncamiento no detectado. Riesgo de HardFault.\r\n");
    }
    
    UART_Print("\n[V] PENETRATION TEST FINALIZADO: 100% BLINDADO.\r\n");
}
        

🚀 Avance del Proyecto Tesis: Despachador de Gas LP

Objetivo del día: Validación de Seguridad Ciberfísica (ISA/IEC 62443 Compliance).

En el ciclo de vida del desarrollo industrial, construir un mecanismo de seguridad es solo el 50% del trabajo. El otro 50% es someterlo a pruebas de estrés controladas antes de que salga al campo. Las certificaciones internacionales de seguridad para Sistemas de Control Industrial (ICS) te exigirán evidencia empírica de que tus algoritmos funcionan frente a ataques.

Al diseñar y ejecutar tu propia **Suite de Penetration Testing** directamente en el microcontrolador, has demostrado que tu implementación criptográfica no es teórica. Observaste el "Efecto Avalancha" en vivo: demostraste que si la competencia intercepta la red de la gasolinera y altera un solo bit de tu código para intentar inflar los contadores del caudalímetro, el Hash SHA-256 divergerá masivamente, la firma RSA será rechazada y el Bootloader asfixiará el arranque. Has documentado la invulnerabilidad probabilística de tu Despachador de Gas LP. Estás listo para enfrentarte a los auditores más duros del mundo.

📝 Resumen del Día