En estaciones de servicio, la ciberseguridad no es solo evitar que te hackeen por Wi-Fi. Es evitar que manipulen los sensores. Existen dos ataques predominantes:
No necesitas encriptar el pulso de un sensor Hall (sería muy caro). Necesitas Coherencia Lógica. El STM32 sabe exactamente cuál es el estado de la Electroválvula de Gas. Si el Relé está apagado (Válvula Cerrada), y el caudalímetro registra pulsos, es físicamente imposible: o hay una fuga mecánica gravísima, o hay un intento de fraude electrónico. Ambas requieren el bloqueo inmediato del sistema.
Para evitar la manipulación física, instalamos un Anti-Tamper Switch (Micro-interruptor de intrusión). Es un botón normalmente cerrado (NC) en la puerta del gabinete. Si se abre la puerta sin activar el modo de mantenimiento por software, el equipo entra en pánico y bloquea la operación.
Paso 1: El Tamper Switch.
Instala un micro-interruptor industrial (estilo fin de carrera) en la puerta del gabinete NEMA. Conéctalo a un pin del STM32 configurado con Pull-Up interno. Cuando la puerta está cerrada, el switch presiona y conecta el pin a Tierra (0V). Si alguien abre la puerta, el circuito se abre y el pin flota hacia 3.3V. Esa es tu alarma de intrusión física.
Paso 2: Modo de Mantenimiento Seguro.
Si el STM32 se bloquea al abrir la puerta, ¿cómo le dará servicio tu propio técnico? Antes de abrir la puerta, el técnico debe interactuar con el teclado o una App y solicitar un "Access Token". Esto pone a la máquina en MAINTENANCE_MODE temporal. Si se abre la puerta durante este modo, se registra el evento en la EEPROM, pero no se bloquea la máquina.
El código a continuación actúa como el guardia de seguridad silencioso de la máquina. Se ejecuta en el bucle principal o será una Tarea dedicada en nuestro futuro RTOS. Compara la realidad física del Hardware (Relé) contra la realidad lógica del Sensor (EXTI).
/**
* @file security_fraud_detection.c
* @brief Auditoría Criptográfica de Intrusión y Coherencia de Hardware
*/
#include "stm32f4xx_hal.h"
#include <stdbool.h>
#include <stdio.h>
// Abstracciones de Hardware
#define TAMPER_PORT GPIOB
#define TAMPER_PIN GPIO_PIN_12
#define RELAY_VALVE_PORT GPIOA
#define RELAY_VALVE_PIN GPIO_PIN_8
extern volatile uint32_t flowmeter_pulse_count;
extern void Buzzer_Alarm_Siren(void);
extern void System_Enter_Lockdown(const char* reason_code);
// Variables de Estado
bool is_maintenance_mode = false;
uint32_t last_pulse_count_check = 0;
// =========================================================================
// TAREA DE AUDITORÍA DE SEGURIDAD (Se debe llamar cada 500ms)
// =========================================================================
void Security_Fraud_Detection_Task(void) {
// ---------------------------------------------------------------------
// 1. AUDITORÍA DE INTRUSIÓN FÍSICA (TAMPER SWITCH)
// ---------------------------------------------------------------------
// El switch está cerrado (LOW) cuando la puerta está cerrada.
// Si lee HIGH, la puerta ha sido abierta.
if (HAL_GPIO_ReadPin(TAMPER_PORT, TAMPER_PIN) == GPIO_PIN_SET) {
if (!is_maintenance_mode) {
printf("[!] BRECHA DE SEGURIDAD: Gabinete abierto sin autorización.\r\n");
Buzzer_Alarm_Siren();
System_Enter_Lockdown("E-98_TAMPER_CABINET");
// La máquina muere aquí. El Lockdown tiene un while(1) infinito
// que solo se destraba ingresando un PIN maestro.
}
}
// ---------------------------------------------------------------------
// 2. AUDITORÍA DE COHERENCIA LÓGICA ("EL PULSADOR")
// ---------------------------------------------------------------------
// Tomamos una "fotografía" de los pulsos acumulados en este instante
uint32_t current_pulses = flowmeter_pulse_count;
uint32_t delta_pulses = current_pulses - last_pulse_count_check;
// Evaluamos el hardware: ¿La válvula eléctrica de gas está cerrada?
bool is_valve_closed = (HAL_GPIO_ReadPin(RELAY_VALVE_PORT, RELAY_VALVE_PIN) == GPIO_PIN_RESET);
if (is_valve_closed) {
// Tolerancia: Permitimos hasta 5 pulsos de inercia (gas remanente en la tubería
// que sigue moviendo la turbina un par de milisegundos tras cerrar la válvula).
if (delta_pulses > 5) {
// ¡ESCENARIO IMPOSIBLE!
// La válvula está cortada (no hay flujo eléctrico hacia ella),
// pero el microcontrolador está recibiendo pulsos masivos del sensor.
// CAUSAS:
// 1. Fuga mecánica catastrófica (El sello de la válvula se rompió).
// 2. Fraude: Alguien conectó un inyector de pulsos (Generador de onda).
printf("[!] FRAUDE DETECTADO: Pulsos anómalos con válvula cerrada.\r\n");
printf(" Pulsos fantasma: %lu\r\n", delta_pulses);
Buzzer_Alarm_Siren();
System_Enter_Lockdown("E-99_FRAUD_INJECTION");
}
}
// Actualizamos el contador histórico para la siguiente ronda (500ms después)
last_pulse_count_check = current_pulses;
}
Objetivo del día: Seguridad Lógica e Integridad de Plataforma en Ambientes Hostiles.
Un ingeniero brillante pero ingenuo construye una máquina asumiendo que los usuarios querrán usarla correctamente. Un Arquitecto de Hardware Industrial asume que el usuario buscará activamente la manera de hackear, manipular y desmantelar el equipo para robar dinero. A lo largo de la Fase 5, hemos visto protecciones pasivas (diodos, filtros). Hoy, convertiste a tu STM32 en un ente activo y paranoico.
Al implementar el **Anti-Tamper Switch**, garantizas que la frontera física de tu caja NEMA sea inviolable, enviando una alarma letal a la EEPROM si alguien intenta llegar a tu hardware sin permiso por software. Y lo más hermoso de la ingeniería de sistemas: al implementar la **Validación de Coherencia Lógica**, anulaste el fraude del "Pulsador" sin necesidad de comprar caros sensores criptográficos. Usaste la pura deducción algorítmica. Si la máquina sabe que cortó el suministro de 24V al relé de la válvula, la física dicta que el gas debe detenerse. Si los pulsos no se detienen, el hardware deduce el engaño. Este nivel de detección cruzada de anomalías es la definición de "Ciberseguridad en el Borde" (Edge Cybersecurity).