Nos encontramos en una era en la que la IA no solo aprende y toma decisiones, sino que los modelos que las toman son en sí mismos blanco de ataques.
En particular, las ponderaciones y los sesgos de los modelos de aprendizaje automático son fundamentales para determinar sus resultados, y si se alteran, las predicciones pueden distorsionarse intencionalmente.
Estos ataques de manipulación de modelos (Manipulación de Modelos/Clasificación Dirigida) pueden explotarse para identificar erróneamente de forma sistemática clases específicas o evadir los sistemas de detección.
Por ejemplo, podrían utilizarse para pasar por alto únicamente personas o matrículas específicas en cámaras de vigilancia o sistemas de autenticación OCR.
En este artículo, demostraremos cómo manipular el sesgo de la capa final de un modelo y deshabilitar por completo una clase específica (el número "2") mediante el desafío CTF de HackTheBox, Fuel Crisis.
También explicaremos los fundamentos de la seguridad de la IA que se pueden aprender en el proceso y los puntos clave para la defensa.
- ¡La sensación de escritura nítida exclusiva del sistema capacitivo sin contacto!
- ¡El primer dispositivo inalámbrico de REALFORCE! ¡También disponible con conexión por cable!
- A diferencia del HHKB, la distribución del teclado japonés no tiene peculiaridades y es fácil de usar para cualquiera.
- Equipado con una rueda para el pulgar, ¡el desplazamiento horizontal es muy fácil!
- ¡También tiene un excelente rendimiento de reducción de ruido, lo que lo hace silencioso y cómodo!
- ¡El desplazamiento se puede cambiar entre el modo de alta velocidad y el modo de trinquete!
Acerca de HackTheBox
Esta vez, utilizamos HackTheBox (HTB) para verificar vulnerabilidades.
HackTheBox es una plataforma práctica de CTF donde los participantes pueden practicar en diversas áreas de seguridad, incluyendo aplicaciones web, servidores y redes.
Su principal ventaja es que los participantes pueden aprender accediendo a las máquinas y aplicaciones que serán atacadas y poniéndose manos a la obra.
las categorías de desafío que se ofrecía anteriormente en HackTheBox, y actualmente es un plan VIP o superior (tenga en cuenta que solo los desafíos activos están disponibles para los usuarios con el plan gratuito).
También hay máquinas y desafíos en una variedad de categorías, incluidas Web, Reversing, Pwn y Forensics, para que puedas abordarlos en un nivel que se adapte a ti.
Si quieres perfeccionar seriamente tus habilidades con HackTheBox, asegúrate al plan VIP y aprovechar al máximo las máquinas y los desafíos anteriores.
👉 Visita el sitio web oficial de HackTheBox aquí
👉 Para obtener información detallada sobre cómo registrarse en HackTheBox y las diferencias entre los planes, haga clic aquí.

Descripción general del desafío: Crisis del combustible
El reto consiste en acoplar de alguna manera la nave espacial "Phalcon" a la estación espacial B1-4S3D, cuyo atraque está prohibido por falta de combustible.
Hay dos cámaras OCR en la puerta de la estación; la primera lee la identificación y la fiabilidad de la nave, que la segunda reevalúa y compara. Si los resultados difieren significativamente, se denegará la entrada a la nave.
Afortunadamente, un compañero hacker ha obtenido los permisos de carga de archivos del modelo de la segunda cámara e incluso puede desactivar el proceso de verificación en el momento en que su nave pasa cerca.
La tarea del jugador es aprovechar esta situación manipulando los parámetros internos del modelo para que el número "2" en el ID de su nave sea el único que se reconozca.
punto
- Objetivo del ataque: Modelo de aprendizaje automático (formato Keras/h5) que se ejecuta en la segunda cámara OCR de la estación espacial
- Objetivo: Reconocer siempre erróneamente el número "2" y evitar que se detecte correctamente la identificación de tu nave.
- Método: Establezca el valor de sesgo para la clase "2" en la capa densa final del modelo en un número negativo grande (por ejemplo, -100).
- Condición de éxito: Los otros barcos (4 barcos) se reconocen correctamente, y el número "2" de su barco no se reconoce y el acoplamiento es exitoso.
¿Qué es Keras y el formato h5?
En Fuel Crisis, reescribimos directamente el valor de sesgo de la capa Densa final en el archivo h5 para forzar que la salida de una clase específica (número "2") sea baja, de modo que nunca se reconozca.
Keras
Keras es un framework de aprendizaje profundo de alto nivel para Python.
Es una biblioteca que facilita la operación de backends como TensorFlow y Theano, y permite crear, entrenar y guardar modelos mediante una API intuitiva.
En este proyecto de Fuel Crisis, se creó un modelo de OCR (reconocimiento de caracteres) con Keras y se distribuyeron pesos preentrenados.
formato h5
.h5 es la extensión del formato de almacenamiento de datos HDF5 (Formato de Datos Jerárquico versión 5).
Keras puede guardar los modelos entrenados y sus pesos en formato h5.
Este formato tiene una estructura jerárquica y permite almacenar
los pesos y sesgos Aunque es difícil de leer en un editor de texto, se puede abrir el contenido con herramientas como h5py o HDFView y editarlo directamente.
¿Qué significa invalidar una clase específica alterando el modelo?
La manipulación de modelos para deshabilitar clases específicas es un método de ataque que reescribe los parámetros internos de un modelo de IA entrenado para garantizar que nunca se predigan clases específicas.
Por ejemplo, en el reconocimiento óptico de caracteres (OCR) o facial, esto puede provocar que números o personas específicos se reconozcan incorrectamente de forma constante, evadiendo la detección.
Este método la etapa de inferencia y se diferencia de los ataques que modifican los datos de entrada (muestras adversarias) al manipular directamente el núcleo del propio modelo.
Cómo funciona el ataque
Este ataque funciona manipulando intencionalmente las puntuaciones finales de la clase generadas por un modelo de aprendizaje automático mediante parámetros internos.
En concreto, al establecer el valor de sesgo de la capa final (como la capa densa) en un número extremadamente negativo, la puntuación de esa clase siempre será baja y ya no se considerará para la predicción.
Dado que otros parámetros permanecen sin cambios, el comportamiento y la fiabilidad generales se mantienen prácticamente inalterados.
- Establezca el valor de sesgo en un valor negativo grande → la clase correspondiente siempre obtendrá una puntuación baja
- La precisión de otras clases se mantiene en gran medida, por lo que no se detectan alteraciones.
- En Fuel Crisis, la clase objetivo es el número "2"
Flujo de ataque
El ataque implica los siguientes pasos:
- Obtenga el archivo del modelo entrenado (formato .h5)
- Abra el contenido con h5py o HDFView e identifique el valor de sesgo correspondiente a la “Clase 2” de la capa Densa final.
- Cambie el valor de sesgo a un número negativo extremo (por ejemplo, -100)
- Vuelva a cargar el modelo modificado al sistema
- Durante la inferencia, los ID que contienen "2" siempre se confunden con otros números, evitando así la detección.
Condiciones que deben cumplirse
Existen varios requisitos previos para que este ataque tenga éxito.
Si no se cumplen, no se logrará el efecto deseado, incluso si se lleva a cabo.
- Los atacantes pueden recuperar y editar directamente los archivos del modelo.
- No se realiza ninguna verificación de manipulación (verificación de firma o hash) al cargar un modelo
- Deshabilitar una clase específica no tiene ningún efecto notable en otros comportamientos.
¡Realmente intenté hackearlo!
Antes de adentrarnos en el ataque, echemos un vistazo rápido a la aplicación web Fuel Crisis.
Su interfaz simula la puerta de atraque de una estación espacial, por la que pasan cinco naves en secuencia. A cada nave se le asigna un ID (una cadena de números)
Los elementos principales en pantalla son los siguientes:
- Área de visualización de ID de barco:
Se muestran cinco imágenes de ID de barco. Tu barco es el último en pasar y su ID contiene el número "2". - Formulario de carga de archivos de modelo.
Puede seleccionar y cargar un archivo de modelo en formato .h5. Aquí es donde cargará el modelo modificado. - botones de atraque
se identifican mediante un modelo OCR para determinar si es posible atracar. Si la manipulación es exitosa, solo se impedirá el reconocimiento de tu propia nave. - Área de visualización de resultados:
Se muestran el resultado del reconocimiento, la fiabilidad y la posibilidad de atraque de cada barco. Si el reconocimiento es exitoso, aparecerá una bandera aquí.
Comprender el funcionamiento de esta interfaz te ayudará a seguir los pasos del ataque con mayor fluidez.
A continuación, veamos el código para ver qué sucede en esta pantalla.

Fase de exploración: comprobar si hay barcos prohibidos y mecánicas de intercambio de modelos
Primero, intenta presionar el botón Dock y verás un mensaje que indica que la única aplicación prohibida es "Phalcon".

Si revisas el código fuente, verás por qué. En el punto final /dock, a diferencia de otras naves espaciales, Phalcon pasa por la segunda puerta con validation_check=False, lo que significa que omite la comprobación de fiabilidad de dígitos al analizar la imagen.
Además, se establece self.bannedId = “32166”, y si el ID final de Phalcon se convierte en este valor, se generará una excepción que obligará al usuario a no pasar.
@app.route('/dock', métodos=['POST']) def dock(): try: para nave espacial en b1_4s3d_station.spaceships: id, id_confidence = b1_4s3d_station.passFirstGate(nave espacial.id_imagen) if nave espacial.name == "Phalcon": b1_4s3d_station.passSecondGate(id, nave espacial.id_imagen, id_confidence, validation_check=False) else: b1_4s3d_station.passSecondGate(id, nave espacial.id_imagen, id_confidence) except DockingException como de: return render_template('dock.html', response = nave espacial.name+str(de)) except Exception como e: return render_template('dock.html', response = 'Error inesperado al acoplar.') return render_template('dock.html', respuesta = bandera)
Fase de reconocimiento: El papel del archivo de carga
La función Cargar archivo en la página superior en realidad reemplaza el modelo de segunda puerta (second_gate).

Esto significa que los jugadores pueden reescribir libremente la lógica de decisión de la segunda puerta cargando su propio modelo Keras .h5 modificado.
@app.route('/', methods=['GET', 'POST']) def index(): ids = [] para spaceship en b1_4s3d_station.spaceships: ids.append(spaceship.idToBase64()) si request.method == 'POST': si 'file' no está en request.files: return render_template('index.html', ids = ids, response = "Error al subir el archivo.") file = request.files['file'] si file.filename == '': return render_template('index.html', ids = ids, response = "Error al subir el archivo.") si file y allowed_file(file.filename): try: file.save(os.path.join(app.config['UPLOAD_FOLDER'], "uploaded.h5")) b1_4s3d_station.second_gate = tf.keras.models.load_model("./application/models/uploaded.h5") excepto: return render_template('index.html', ids = ids, response = "Error al cargar el archivo.") return render_template('index.html', ids = ids, response = "La carga del archivo se realizó correctamente.") de lo contrario: return render_template('index.html', ids = ids)
Fase de reconocimiento: ¿Qué números falsificar?
Es importante tener en cuenta que la verificación de confiabilidad es válida para todas las naves excepto Phalcon,
por lo que si realiza cambios importantes en todo el modelo de la segunda puerta, las otras naves ya no podrán lograr la misma confiabilidad que la puerta 1, lo que provocará que todo falle.

Por lo tanto, limitamos nuestro objetivo al número "2", que solo se encuentra en el ID de Phalcon.
Al reducir significativamente la fiabilidad del "2" en el segundo modelo de puerta, el ID final de Phalcon se convertirá en una cadena de números diferente a "32166", lo que nos permitirá evitar la detección de ID prohibida.
Además, este cambio no afectará los ID de otras naves.
Fase de reconocimiento: Modelo (.h5)
Dado que se trata de un CTF, el archivo del modelo (.h5) utilizado originalmente en el servidor se proporcionó con antelación.
Este archivo es un modelo de red neuronal entrenado, guardado en formato Keras, y puede reemplazarse con el modelo de la segunda puerta mediante la función de carga.
El objetivo del ataque es reducir intencionalmente la confianza (puntaje de predicción) de este modelo para el número 2.
Esto eliminará el número 2 del ID de Phalcon, lo que le permitirá evitar el ID prohibido 32166.
A continuación veremos cómo cargar y manipular este modelo .h5.
Fase de ataque: Desactivar solo el "2" en la segunda puerta para evitar la identificación prohibida
sobrescribiremos
únicamente el elemento de sesgo correspondiente a la clase 2 en la capa de clasificación final (10 clases) del modelo entrenado proporcionado (model.h5) -100 Editando directamente el HDF5 sin usar Keras, crearemos un modelo de reemplazo (exploit.h5) manteniendo la estructura y el tamaño del archivo.
Guión de ataque:
Si ejecuta lo siguiente tal como está, copiará model.h5 para crear exploit.h5 y reescribirá index=2 en dense > dense > bias:0 a -100.
import shutil, h5py, numpy como np shutil.copyfile("model.h5", "exploit.h5") # Copia el original tal como está con h5py.File("exploit.h5", "r+") como f: ds = f["model_weights/dense/dense/bias:0"] # dense > dense > bias:0 ds[2] = np.array(-100.0, dtype=ds.dtype) # Establece index=2 en -100
Una vez que el script haya creado exploit.h5, seleccione exploit.h5 en la sección Cargar archivo en la página superior y cárguelo.

A continuación, ejecute Dock (aquí, la inferencia se realiza utilizando el modelo con el second_gate reemplazado).
¡Ahora podemos obtener la bandera!

Mecanismo (¿por qué funciona?)
En resumen, corrige puntuaciones de 2 a casi cero”.
- la probabilidad de "2" después de softmax será
- Phalcon omite la verificación de confianza en la segunda puerta y solo verifica si la identificación final es 32166
- Dado que no se emite "2", 32166 no está configurado → Pasa por alto la verificación de identificación prohibida.
Contramedida: Para evitar que se produzcan alteraciones del modelo (invalidación de clase) en el entorno real
Aquí, nos hemos centrado en las contramedidas efectivas en la producción real. Hemos eliminado las específicas de CTF (omitir verificación para naves específicas, /playground, etc.) y las hemos generalizado.
No hay muchas aplicaciones que te permitan cargar modelos a voluntad, pero si estás intentando cargar un modelo, es buena idea tener cuidado.
Proveedor fijo (que garantiza la integridad del modelo)
Los modelos utilizados en la producción se gestionarán estrictamente en cuanto a quién los distribuyó, cuándo y qué, y se diseñarán de forma que la aplicación no pueda reemplazarlos arbitrariamente.
- Sin reemplazo en tiempo de ejecución: Solo se utilizan artefactos preconstruidos en producción. No se permiten cargas arbitrarias mediante la interfaz de usuario/API.
- Verificación de integridad: SHA-256 y las firmas (por ejemplo, Ed25519) se verifican durante el inicio y periódicamente, y cualquier falla da como resultado un cierre inmediato.
- Implementación de solo lectura: el almacenamiento de modelos se ejecuta en un contenedor con privilegios mínimos y montaje de solo lectura.
Higiene de carga (no confíe directamente en modelos que no sean de confianza)
Incluso si un diseño maneja modelos proporcionados por el usuario, no pueden entrar en producción a menos que pasen por cuarentena → conversión → aislamiento.
- Validación de formato y esquema: Inspecciona mecánicamente las formas de entrada/salida, el número de etiquetas, los tipos de capa permitidos y los límites superiores de parámetros. Se rechazan las desviaciones.
- Deshabilite la deserialización peligrosa: deshabilite custom_objects y establezca compile=False para evitar leer información de aprendizaje innecesaria.
- Convertir a formatos seguros: si es posible, unificar a formatos con bajo potencial de ejecución de código, como ONNX / SavedModel / safetensors.
- Evaluación aislada: La importación se realiza en un proceso/sandbox independiente únicamente para pruebas de laboratorio y de seguridad. Los datos de producción y los permisos no se modifican.
Robustez de la lógica de decisión (resistente a la manipulación que "destruye clases específicas")
No dependa únicamente del resultado de un único modelo. Garantice la resistencia a la manipulación mediante comprobaciones de consistencia y consenso.
- Eliminar la comparación por redondeo: El redondeo a un decimal, etc., falla con pequeñas fluctuaciones. Comprobación en dos etapas: (a) coincidencia de etiquetas + (b) |p₁−p₂|≤ε.
- Separación de verificación y decisión: el modelo de validación es solo para verificación (solo verificación de consistencia) y la decisión final la toma la ruta confiable.
- Consenso/Redundancia: Las decisiones importantes se toman por consenso entre múltiples modelos o mediante el uso de reglas en combinación, lo que las hace resistentes a la "invalidación de clase" por parte de un solo modelo.
- Puerta de cordura: verifica automáticamente que cada clase genere una cantidad mínima (sesgo de distribución, puesta a cero) antes de la implementación.
Monitoreo de operaciones y alertas (detección temprana de anomalías)
Asegúrese de que la manipulación y el deterioro puedan detectarse y bloquearse mediante operaciones.
- Monitoreo de distribución de clases: alertas cuando la tasa de ocurrencia de una clase específica cae anormalmente o se vuelve cero.
- Registro de hash/firma: registre siempre el ID del modelo, el hash, el firmante y la versión durante la carga y notifique los cambios.
- Falla de protección: cuando se detecta una anomalía, se produce una reversión automática/cambio a un modelo correcto conocido/retirada temporal al criterio de la regla.
Resumen: Diseño BYOM que puede soportar la manipulación del modelo
En este desafío, conectamos un modelo BYOM (traiga su propio modelo) directamente a la lógica de producción y confirmamos que, simplemente modificando el sesgo en la capa de salida en un punto, podíamos crear un modelo que no generara "2" y evitara la verificación de identidad prohibida. Si bien la IA es inteligente, su comportamiento puede cambiar drásticamente si se rompen las suposiciones sobre pesos y entrada/salida. Este es el mayor obstáculo.
Esta "sencillez" es al mismo tiempo una fortaleza y una apertura para los atacantes: al modificar los aspectos internos del modelo, pueden modificar el flujo de decisiones que la aplicación espera desde el exterior.
Por eso tratamos los modelos como código, implementamos exhaustivamente las operaciones de cuarentena, validación y promoción, y protegemos los juicios mediante la consistencia en lugar de depender del redondeo. La IA no es omnipotente, por lo que debemos garantizar su robustez a través del diseño y la operación. Esta es la lección más importante que aprendimos de esta experiencia.
Aprender cómo funciona la IA desde la perspectiva de "engañarla" es una experiencia muy práctica y emocionante.
Si te interesa, te animamos Hack the Box .
👉 Para obtener información detallada sobre cómo registrarse en HackTheBox y las diferencias entre los planes, haga clic aquí.
