
Protección contra ataques de serialización de modelos
Los modelos de Machine Learning (ML) se comparten públicamente a través de internet, dentro de los equipos y entre equipos. El auge de los modelos fundacionales ha hecho que los modelos de ML públicos se consuman cada vez más para entrenamiento adicional y ajuste fino. Los modelos de ML se utilizan cada vez más para tomar decisiones críticas y respaldar aplicaciones de misión crítica. A pesar de ello, los modelos aún no se escanean con el mismo rigor que un archivo PDF en tu bandeja de entrada.
Esto debe cambiar, y disponer de las herramientas adecuadas es el primer paso.

ModelScan es un proyecto de código abierto de Protect AI que escanea modelos para determinar si contienen código inseguro. Es la primera herramienta de escaneo de modelos compatible con múltiples formatos de modelos. Actualmente, ModelScan admite los formatos H5, Pickle y SavedModel. Esto te protege cuando usas PyTorch, TensorFlow, Keras, Sklearn, XGBoost, y hay más en camino.
Si estás listo para empezar a escanear tus modelos, es sencillo:
pip install modelscan
Con él instalado, escanea un modelo:
modelscan -p /path/to/model_file.pkl
Los modelos suelen crearse a partir de pipelines automatizados; otros pueden provenir del portátil de un científico de datos. En cualquier caso, el modelo debe trasladarse de una máquina a otra antes de usarse. Ese proceso de guardar un modelo en disco se llama serialización.
Un ataque de serialización de modelos es aquel en el que se añade código malicioso al contenido de un modelo durante la serialización (guardado) antes de su distribución: una versión moderna del Caballo de Troya.
El ataque funciona explotando el proceso de guardado y carga de los modelos. Cuando cargas un modelo con model = torch.load(PATH), PyTorch abre el contenido del archivo y comienza a ejecutar el código que contiene. En el instante en que cargas el modelo, el exploit ya se ha ejecutado.
Un ataque de serialización de modelos puede utilizarse para ejecutar:
Estos ataques son increíblemente sencillos de ejecutar y puedes ver ejemplos prácticos en nuestra carpeta 📓notebooks.
ModelScan ofrece un escaneo robusto de código abierto. Si necesitas seguridad integral de IA, considera Guardian. Es nuestro producto de escaneo de modelos de nivel empresarial.

Si cargar un modelo con tu framework de machine learning ejecuta automáticamente el ataque, ¿cómo comprueba ModelScan el contenido sin cargar el código malicioso?
Sencillo: lee el contenido del archivo byte a byte, como si fuera una cadena, buscando firmas de código inseguras. Esto lo hace increíblemente rápido, escaneando los modelos en el tiempo que tarda tu ordenador en procesar el tamaño total del archivo desde el disco (segundos en la mayoría de los casos). También es seguro.
ModelScan clasifica el código inseguro como:

Si se detecta un problema, ponte en contacto inmediatamente con los autores del modelo para determinar la causa.
En algunos casos, el código puede estar incrustado en el modelo para facilitar la reproducción a un científico de datos, pero te expone a ataques. Usa tu criterio para determinar si eso es apropiado para tus cargas de trabajo.
Esto se ampliará continuamente, así que presta atención a los cambios en nuestras notas de versión.
Actualmente, ModelScan admite cualquier formato derivado de Pickle y muchos otros:
ModelScan se instala en tus sistemas como un paquete de Python (se admiten Python 3.9 a 3.12). Como se mostró antes, puedes instalarlo ejecutando esto en tu terminal:
pip install modelscan
Para incluirlo en las dependencias de tu proyecto y que esté disponible para todos, añádelo a tu requirements.txt
o pyproject.toml de esta manera:
modelscan = ">=0.1.1"
Los escáneres para modelos con formato Tensorflow o HD5 requieren instalación con extras:
pip install 'modelscan[ tensorflow, h5py ]'
ModelScan admite los siguientes argumentos a través de la CLI:
Recuerda que los modelos son como cualquier otra forma de medio digital: debes escanear el contenido de cualquier fuente no confiable antes de usarlo.
Los códigos de estado de salida de la CLI son:
0: El escaneo se completó correctamente, no se encontraron vulnerabilidades1: El escaneo se completó correctamente, se encontraron vulnerabilidades2: El escaneo falló, modelscan lanzó un error durante el escaneo3: No se pasaron archivos compatibles a la herramienta4: Error de uso, se pasaron a la CLI opciones no válidas o incompletasAunque ModelScan se puede usar fácilmente mediante CLI, también puedes integrarlo directamente en tus aplicaciones o flujos de trabajo de Python.
from modelscan.modelscan import ModelScan
from modelscan.settings import DEFAULT_SETTINGS
# Initialize ModelScan with default settings
scanner = ModelScan(settings=DEFAULT_SETTINGS)
# Scan a model file or directory
results = scanner.scan("/path/to/model_file.pkl")
# Check if issues were found
if scanner.issues.all_issues:
print(f"Found {len(scanner.issues.all_issues)} issues!")
# Access issues by severity
issues_by_severity = scanner.issues.group_by_severity()
for severity, issues in issues_by_severity.items():
print(f"{severity}: {len(issues)} issues")
# Generate a report (default is console output)
scanner.generate_report()
Puedes personalizar el comportamiento del escaneo con tus propios ajustes:
# Start with default settings and customize
custom_settings = DEFAULT_SETTINGS.copy()
# Update settings as needed
custom_settings["reporting"]["module"] = "modelscan.reporting.json_report.JSONReport"
custom_settings["reporting"]["settings"]["output_file"] = "scan_results.json"
# Initialize with custom settings
scanner = ModelScan(settings=custom_settings)
Una vez que se ha completado un escaneo, verás una salida como esta si se encuentra un problema:

Aquí tenemos un modelo que tiene un operador inseguro tanto para ReadFile como para WriteFile en el modelo.
Claramente no queremos que nuestros modelos lean y escriban archivos de forma arbitraria. Ahora nos pondríamos en contacto
con el creador de este modelo para determinar qué esperaba que hiciera. En este caso particular,
permite que un atacante lea nuestras credenciales de AWS y las escriba en otro lugar.
Eso es un NO rotundo para su uso.
El escaneo ad hoc es un excelente primer paso; por favor, inculca en ti mismo, en tus colegas y amigos la práctica de hacer esto cada vez que descarguen un modelo nuevo para explorarlo. No es suficiente para mejorar la seguridad de los procesos de MLOps en producción.
El escaneo de modelos debe realizarse más de una vez para lograr lo siguiente:
Los bloques rojos de abajo resaltan esto en un pipeline de ML tradicional.

Los procesos serían los mismos para el ajuste fino o cualquier modificación de LLM, modelos fundacionales o modelos externos.
Incorpora escaneos en los procesos de implementación de tus sistemas de CI/CD para asegurar el uso a medida que los modelos se implementan, también si esto se hace fuera de tus pipelines de ML.
Dentro de la carpeta 📓notebooks puedes explorar varios notebooks que muestran exactamente cómo se pueden realizar ataques de serialización de modelos contra varios frameworks de ML como TensorFlow y PyTorch.
Para profundizar en el meollo de cómo funcionan exactamente estos ataques, consulta 🖹 Explicación de los ataques de serialización de modelos.
Si encuentras otros enfoques para evaluar modelos en un contexto estático, por favor contáctanos, nos encantaría aprender más.
Copyright 2024 Protect AI
Licenciado bajo la Licencia Apache, Versión 2.0 (la «Licencia»); no puedes utilizar este archivo salvo que cumplas con la Licencia. Puedes obtener una copia de la Licencia en
http://www.apache.org/licenses/LICENSE-2.0
Salvo que lo exija la ley aplicable o se acuerde por escrito, el software distribuido bajo la Licencia se distribuye sobre una base «TAL CUAL», SIN GARANTÍAS NI CONDICIONES DE NINGÚN TIPO, ya sean expresas o implícitas. Consulta la Licencia para conocer el texto específico que rige los permisos y las limitaciones bajo la Licencia.
Nos inspiró enormemente Matthieu Maitre, quien creó PickleScan. Apreciamos su trabajo y lo hemos ampliado significativamente con ModelScan. ModelScan se publica como OSS con el mismo espíritu que PickleScan.
Nos encantaría que contribuyeras a nuestro proyecto de código abierto ModelScan. Si deseas contribuir, sigue los detalles en la página de contribución.
| Librería de ML | API | Formato de serialización | Soporte de modelscan |
|---|
| Pytorch | torch.save() y torch.load() | Pickle | Sí |
| Tensorflow | tf.saved_model.save() | Protocol Buffer | Sí |
| Keras | keras.models.save(save_format= 'h5') | HD5 (Formato de datos jerárquico) | Sí |
| keras.models.save(save_format= 'keras') | Keras V3 (Formato de datos jerárquico) | Sí | |
| Librerías clásicas de ML (Sklearn, XGBoost, etc.) | pickle.dump(), dill.dump(), joblib.dump(), cloudpickle.dump() | Pickle, Cloudpickle, Dill, Joblib | Sí |
| Uso | Argumento | Explicación |
|---|
modelscan -h | -h o --help | Ver ayuda de uso |
modelscan -v | -v o --version | Ver información de la versión |
modelscan -p /path/to/model_file | -p o --path | Escanear un modelo almacenado localmente |
modelscan -p /path/to/model_file --settings-file ./modelscan-settings.toml | --settings-file | Escanear un modelo almacenado localmente con configuraciones personalizadas |
modelscan create-settings-file | -l o --location | Crear un archivo de configuración personalizable |
modelscan -r | -r o --reporting-format | Formato de la salida. Las opciones son console, json, o custom (para definir en settings-file). El valor predeterminado es console |
modelscan -r reporting-format -o file-name | -o o --output-file | Nombre de archivo opcional para el informe de salida |
modelscan --show-skipped | --show-skipped | Imprimir una lista de los archivos que se omitieron durante el escaneo |