Capítulo 8 — Infraestructura crítica y seguridad sectorial: modos de fallo
Mapa de la lección
Lección 08 publicada. Mapa, ejemplo, EX029.
flowchart TD
N0["Resultados de aprendizaje y conexión"]
N1["8.1 Un catálogo de modos de fallo"]
N2["8.2 Reglas que se explican solas"]
N3["8.3 Dentro de rango no es verdadero"]
N4["8.5 Elegir los umbrales"]
N5["8.6 Actividad práctica"]
N6["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6
N6 --> EX["Ejemplo resuelto"]
EX --> Q["Ejercicio EX029"]
Dibujo lógico
flowchart LR
N0["Resultados de aprendizaje y conexión"]
N1["8.1 Un catálogo de modos de fallo"]
N2["8.2 Reglas que se explican solas"]
N3["8.3 Dentro de rango no es verdadero"]
N4["8.5 Elegir los umbrales"]
N5["8.6 Actividad práctica"]
N6["Síntesis del capítulo"]
N0 --> N1 --> N2 --> N3 --> N4 --> N5 --> N6 --> Q["EX029"]
[Resultados de aprendizaje y conexión]
|
v
[8.1 Un catálogo de modos de fallo]
|
v
[8.2 Reglas que se explican solas]
|
v
[8.3 Dentro de rango no es verdadero]
|
v
[8.5 Elegir los umbrales]
|
v
[8.6 Actividad práctica]
|
v
[Síntesis del capítulo]
|
v
[Ejemplo resuelto] --> [Ejercicio EX029]
Resultados de aprendizaje y conexión
Al terminar este capítulo debería ser capaz de:
- nombrar los modos de fallo técnicos habituales de la telemetría y del control (laguna, valor congelado, pico, deriva, fuera de rango, marca de tiempo obsoleta, pérdida de la autoridad de control) y sus causas habituales;
- detectarlos en una serie temporal con reglas sencillas y explicables;
- explicar por qué un valor dentro de rango puede seguir siendo falso y por qué un valor perfectamente constante es sospechoso;
- mantener abiertas a la vez las hipótesis de fallo y de ataque hasta que la evidencia las separe.
El capítulo 7 puso los eventos en orden. Este capítulo pregunta de cada medición: ¿es verdadera? Muchos eventos de seguridad aparecen primero como «datos erróneos», y muchos eventos de datos erróneos son fallos corrientes. Un técnico debe reconocer ambos.
8.1 Un catálogo de modos de fallo
| Modo | Aspecto | Causas corrientes | Causas relevantes para la seguridad |
|---|---|---|---|
| Laguna | Muestras que faltan | Caída del enlace, sobrecarga del sondeo (capítulo 1), reinicio del dispositivo | Tráfico bloqueado o descartado, denegación de servicio |
| Congelado / línea plana | Valores idénticos durante más tiempo del que el proceso permite | Sensor congelado, entrada analógica averiada, SCADA que sirve el último valor conocido | Valores reproducidos o congelados que ocultan un cambio real |
| Pico | Un salto más rápido de lo que permite la física | Ruido eléctrico, error de escalado, muestra errónea | Valor inyectado |
| Deriva | Divergencia lenta respecto a la realidad | Ensuciamiento del sensor, antigüedad de la calibración | Manipulación lenta (rara, difícil de detectar) |
| Fuera de rango | Valor imposible | Fallo de cableado, escalado erróneo | Valor fabricado |
| Marca de tiempo obsoleta | Valor con una hora antigua o futura | Error de reloj (capítulo 7), datos en búfer | Reproducción |
| Pérdida de la autoridad de control | Órdenes no ejecutadas o ejecutadas por otra persona | Selector local/remoto dejado en local, enclavamiento | Escritura no autorizada |
El sentido de la tabla no es que toda laguna sea un ataque. Es que el mismo síntoma tiene ambos tipos de causa, de modo que las detecciones deben notificar el síntoma con precisión, y la investigación (capítulo 13) separa las causas.
8.2 Reglas que se explican solas
Cada detección de este capítulo es una regla que una persona puede leer y verificar:
- Laguna: más de N muestras consecutivas que faltan, donde N se fija a partir del ciclo de sondeo y de la tolerancia del proceso.
- Congelado: más de M lecturas consecutivas idénticas, donde M refleja cuánto varía de forma natural un sensor sano. Un analizador de cloro que informa exactamente de 0,62 durante veinte minutos es sospechoso, porque los analizadores reales fluctúan en su último dígito.
- Pico: un cambio entre muestras consecutivas mayor que el paso máximo físicamente verosímil; un depósito de 12 m no puede subir 6,8 m en un minuto. Esto detecta valores que las comprobaciones de rango no ven.
- Rango: fuera de los límites del instrumento o del proceso (capítulo 4).
Estas reglas son toscas pero transparentes: cuando una se dispara, todo el mundo puede ver por qué. Los detectores de anomalías estadísticos o aprendidos pueden añadir sensibilidad más adelante; no deben sustituir a reglas que los operadores entienden.
8.3 Dentro de rango no es verdadero
Un valor de 9,80 m en un depósito de 12 m supera todas las comprobaciones de rango. Si el minuto anterior marcaba 2,96 m y el siguiente 2,97 m, el 9,80 es imposible como medición. A la inversa, un valor constante siempre está «dentro de rango». Las comprobaciones de rango protegen contra lo absurdo; las de velocidad de cambio y variación protegen contra lo falso de apariencia verosímil. Use un paso máximo derivado del proceso, como medio metro por minuto para el nivel de un depósito, para que una única muestra disparatada se detecte aunque esté dentro del rango del instrumento. Escriba el límite de paso junto al límite de rango en el esquema de la etiqueta y revise ambos después de cada falsa alarma.
8.4 Ejemplo resuelto: cuatro etiquetas, veinte minutos (sintético)
Lab 8 (guárdelo como lab08.py y ejecútelo con python3 lab08.py):
# Lab 8 - classify telemetry failure modes (offline, standard library only)
# Synthetic one-minute readings from four Kestrel Water tags, 06:00-06:19Z on 2026-10-12.
series = {
"KW-01 LEVEL_M": [3.40,3.41,3.41,3.42,3.43,3.43,3.44,3.45,3.45,3.46,3.47,3.47,3.48,3.49,3.49,3.50,3.51,3.51,3.52,3.53],
"KW-02 CL2_MGL": [0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62,0.62],
"KW-05 FLOW_LS": [41.0,40.8,41.2,40.9,None,None,None,None,None,None,None,41.1,40.7,41.0,41.3,40.9,41.2,41.0,40.8,41.1],
"KW-07 LEVEL_M": [2.95,2.96,2.95,2.97,2.96,2.96,9.80,2.97,2.96,2.98,2.97,2.97,2.98,2.97,2.99,2.98,2.98,2.99,2.98,2.99],
}
LIMITS = {"LEVEL_M": (0.0, 12.0), "CL2_MGL": (0.0, 5.0), "FLOW_LS": (0.0, 400.0)}
MAX_STEP = {"LEVEL_M": 0.5, "CL2_MGL": 0.3, "FLOW_LS": 25.0} # physically plausible change per minute
STUCK_MIN, GAP_MIN = 15, 5
for name, xs in series.items():
tag = name.split()[1]; lo, hi = LIMITS[tag]; out = []
run, longest = 0, 0
for i in range(len(xs)): # gaps
run = run + 1 if xs[i] is None else 0; longest = max(longest, run)
if longest >= GAP_MIN: out.append(f"gap: {longest} consecutive missing minutes")
vals = [(i, v) for i, v in enumerate(xs) if v is not None]
same, best = 1, 1
for (i0, a), (i1, b) in zip(vals, vals[1:]): # stuck / flatline (exact repeats)
same = same + 1 if a == b else 1; best = max(best, same)
if abs(b - a) > MAX_STEP[tag] and i1 - i0 == 1:
out.append(f"spike: 06:{i1:02d}Z jump {a} -> {b} exceeds {MAX_STEP[tag]}/min")
if best >= STUCK_MIN: out.append(f"stuck: {best} identical readings in a row")
out += [f"range: {v} outside {lo}-{hi}" for _, v in vals if not lo <= v <= hi]
print(f"{name:<14} {'; '.join(out) if out else 'no failure mode detected'}")
Salida esperada (Python 3.13.5):
KW-01 LEVEL_M no failure mode detected
KW-02 CL2_MGL stuck: 20 identical readings in a row
KW-05 FLOW_LS gap: 7 consecutive missing minutes
KW-07 LEVEL_M spike: 06:06Z jump 2.96 -> 9.8 exceeds 0.5/min; spike: 06:07Z jump 9.8 -> 2.97 exceeds 0.5/min
KW-01 se comporta como un depósito que se llena lentamente: ningún hallazgo. El cloro de KW-02 es idéntico en las veinte lecturas: o bien el analizador se ha congelado, o la RTU devuelve un valor almacenado, o el valor lo está suministrando algo distinto del analizador. KW-05 tiene una laguna de siete minutos: compruebe primero el enlace y el sondeo (capítulo 13). KW-07 muestra una desviación de una sola muestra hasta 9,80 m y de vuelta: un fallo típico de ruido o de escalado, pero también exactamente el aspecto que tendría una escritura inyectada puntual en un registro de notificación. Cada línea es un síntoma con una descripción precisa; ninguna es todavía una causa.
8.5 Elegir los umbrales
Fije los umbrales a partir de la evidencia, no de conjeturas: examine una semana de datos sanos por etiqueta, encuentre el mayor paso natural y la racha natural más larga de valores idénticos, y fije la regla por encima de ellos con un margen. Anote el motivo junto a la cifra y revise tras cada falsa alarma y cada evento no detectado. Una regla de valor congelado sobre una etiqueta que legítimamente se queda en 0,00 (una bomba parada) necesita una condición; por ejemplo, aplicarla solo mientras la bomba funciona.
8.6 Actividad práctica
Añada al Lab 8 una comprobación de deriva: compare la media de cada etiqueta en los primeros cinco minutos con su media en los últimos cinco y marque un cambio mayor que un límite específico de la etiqueta. Explique por qué la subida constante de KW-01 no debería marcarse y qué información adicional (estado de la bomba, caudal de entrada) haría significativa la detección de derivas. La subida constante de KW-01 es comportamiento del proceso mientras una bomba llena el depósito, así que una comparación ingenua de medias la marcaría erróneamente. La deriva adquiere sentido cuando se conoce el estado de la bomba o el caudal de entrada, o cuando se comparan dos sensores que deberían coincidir. Fije el límite específico de la etiqueta a partir de una semana de datos sanos y anote el motivo junto a la cifra.
8.7 Errores comunes y límites
- Tratar todo valor erróneo como un ataque, o ninguno.
- Solo comprobaciones de rango.
- Reglas de valor congelado sobre etiquetas que legítimamente permanecen quietas.
- Umbrales sin justificación registrada.
-
El Lab 8 ve una serie cada vez; una investigación real compara etiquetas relacionadas (una bomba en marcha con caudal cero es una incoherencia entre etiquetas).
-
Aplicar una regla de valor congelado a una etiqueta que legítimamente se queda en cero mientras una bomba está parada.
- Fijar los umbrales a partir de una conjetura en lugar de a partir de datos sanos con una justificación registrada.
- Investigar una serie de forma aislada cuando un bit de bomba en marcha y un caudal cero mostrarían un fallo entre etiquetas.
Ejercicios — capítulo 8
EX029 — Nombre el modo. Objetivo: clasificar síntomas. Entradas: (a) el nivel sube 0,01 m/min mientras la válvula de entrada indica que está cerrada; (b) el caudal marca 0,00 durante 40 minutos mientras la bomba 1 indica que está en marcha; (c) el historiador muestra valores con marcas de 03:00–03:10 que llegaron a las 03:25; (d) la bomba 2 no arranca tras una orden de la HMI y la RTU indica «local». Pasos: nombre el modo y dos causas candidatas de cada uno. Evidencia esperada: cuatro filas. Rúbrica: 3 = (a) incoherencia entre etiquetas/deriva: fallo de la realimentación de la válvula o fuga/derivación; (b) congelado o incoherencia entre etiquetas: caudalímetro averiado o valor congelado; (c) datos en búfer/obsoletos: caída del enlace con almacenamiento y reenvío, o reproducción; (d) pérdida de la autoridad de control: selector local en la instalación, o enclavamiento; 2 = modos correctos, causas escasas; 1 = parcial; 0 = nada.
EX030 — Prediga un cambio de regla. Objetivo: razonar sobre los umbrales. Entradas: el Lab 8 con STUCK_MIN = 25 y MAX_STEP["LEVEL_M"] = 7.0. Pasos: prediga la nueva salida y después ejecute. Evidencia esperada: predicción y salida real. Rúbrica: 3 = KW-02 ya no se marca (20 < 25), el pico de KW-07 ya no se marca (6,84 < 7,0, 6,83 < 7,0), la laguna de KW-05 se sigue marcando; explica lo que se pierde; 2 = casi todo correcto; 1 = conjeturas; 0 = nada.
EX031 — Regla de valor congelado condicional. Objetivo: reducir las falsas alarmas. Entradas: una etiqueta de caudal marca legítimamente 0,0 cuando su bomba está parada. Pasos: escriba la regla en pseudocódigo usando el estado de la bomba. Evidencia esperada: regla y un caso de prueba. Rúbrica: 3 = aplicar la detección de valor congelado solo mientras el estado de la bomba = en marcha durante al menos el intervalo de sondeo; incluye una prueba con la bomba parada (sin alerta) y en marcha con caudal constante distinto de cero (alerta); 2 = sin prueba; 1 = desactiva la regla; 0 = nada.
EX032 — Plan de fallo o ataque. Objetivo: mantener abiertas ambas hipótesis. Entradas: KW-02 congelado en 0,62. Pasos: enumere tres comprobaciones que apuntarían a un fallo y tres que apuntarían a una manipulación, todas de solo lectura. Evidencia esperada: seis comprobaciones. Rúbrica: 3 = fallo: pantalla local del analizador, diagnóstico de la entrada analógica de la RTU, registros de mantenimiento; manipulación: escrituras inesperadas en el registro de notificación en las capturas, registros de sesiones de configuración, comparación con una muestra manual tomada por operaciones; 2 = un lado escaso; 1 = solo una hipótesis; 0 = nada.
Síntesis del capítulo
La telemetría falla de un pequeño número de maneras reconocibles, y cada síntoma tiene causas tanto corrientes como maliciosas. Detecte los síntomas con reglas transparentes (laguna, congelado, pico, rango) cuyos umbrales procedan de datos sanos y cuyos motivos estén escritos. Estar dentro de rango no es lo mismo que ser verdadero. Notifique el síntoma con precisión y deje la causa a la investigación.
Siga estudiando — capítulo 08 de 18
← Capítulo 07 · Índice de capítulos del curso · Capítulo 09 →
Continúe con la siguiente lección escrita.