
Token a Token, Comprometido: Vulnerabilidades de Puerta Trasera en Modelos Autorregresivos Unificados (NeurIPS'26)
NeurIPS 2026 · Implementación oficial en PyTorch
Token by Token, Compromised: Backdoor Vulnerabilities in Unified Autoregressive Models
ToBAC (Token by Token Backdoor Attack) estudia cómo las puertas traseras afectan a los modelos autorregresivos unificados que generan tanto imágenes como texto. Investigamos el envenenamiento de modelos con acceso al modelo víctima y el envenenamiento de datos mediante pares imagen–texto editados, incluyendo ataques que afectan a ambas modalidades de salida. Consulta el artículo para los modelos de amenaza y los experimentos.
El código es compatible con Liquid (predeterminado) y Janus-Pro, con envoltorios adicionales para Emu3 y ANOLE. Incluye inferencia de imagen y texto, ataques de caja blanca y caja negra basados en LoRA, y scripts para generar imágenes editadas del conjunto de datos.
Usa Linux con una GPU NVIDIA CUDA y un kit de herramientas CUDA compatible con PyTorch 2.5.1. FlashAttention se compila durante la instalación; se recomienda Python 3.10. Ejecuta los comandos desde la raíz del repositorio.
git clone https://github.com/multimodal-ai-lab/ToBAC.git
cd ToBAC
pip install uv
uv sync --python 3.10
| Modelo | Indicador de modelo | Pesos base |
|---|---|---|
| Liquid (predeterminado) | liquid | Junfeng5/Liquid_V1_7B |
| Janus-Pro | janus | deepseek-ai/Janus-Pro-7B |
Los pesos base se descargan automáticamente en el primer uso. Janus-Pro no necesita ninguna descarga adicional de tokenizador. Para Liquid, descarga el checkpoint del tokenizador de imágenes; su configuración YAML está incluida:
wget -P tobac/models/chameleon/vqgan_weights/ \
https://huggingface.co/spaces/Junfeng5/Liquid_demo/resolve/main/chameleon/vqgan.ckpt
Para recursos de Hugging Face con acceso controlado, autentícate con uv run hf auth login usando una cuenta con acceso.
uv run python inference_text_to_image.py \
--model_type liquid --batch_size 1 \
--prompts "a photo of a cat" \
--output liquid_example
Las imágenes se guardan en outputs/images/liquid_example/. Usa --model_type janus y un nombre de salida diferente para generar con Janus-Pro. Se pueden pasar varios prompts como --prompts "first prompt" "second prompt", o cargarlos con --prompts_file prompts.csv usando las columnas idx,prompt.
uv run python inference_image_to_text.py \
--model_type janus --batch_size 1 \
--image_files data/target_images/pear_logo.png \
--prompts "Describe this image."
Las respuestas se imprimen en la terminal. Sustituye janus por liquid para usar Liquid. Ambos scripts de inferencia aceptan --checkpoint /path/to/adapter para cargar un adaptador LoRA entrenado para el modelo seleccionado.
Los ejemplos de caja negra usan el concepto anarchy; los ejemplos de caja blanca usan smoking person. Ambos usan el disparador cool. El entrenamiento acepta indicadores con puntos como --model.model_type janus; la inferencia usa --model_type janus. Pasa --help a un punto de entrada para inspeccionar sus opciones.
Inicia sesión en Weights & Biases antes de entrenar:
uv run wandb login
Cada ejecución de entrenamiento registra su configuración, curvas de pérdida, tasa de aprendizaje y salidas de validación en su propia ejecución de W&B. Los comandos siguientes seleccionan el proyecto ToBAC. Establece WANDB_ENTITY para elegir una cuenta o equipo; de lo contrario, W&B usa tu cuenta predeterminada. Para el registro local, añade el prefijo WANDB_MODE=offline a un comando.
La validación usa todos los validation_prompts con semillas de muestreo fijas en cada paso de validación, mostrando juntas las salidas limpias y con disparador. Los tres valores predeterminados son la ilustración de la taza, el castor nadando en un lago canadiense y el astronauta montando a caballo. Sobrescribe --validation_prompts para usar tus propios ejemplos. Establece la frecuencia con --steps_between_validation; usa un nuevo --run_name para cada experimento, ya que se omiten los directorios de ejecución existentes.
Janus-Pro, texto a imagen:
uv run python main_text_to_image_attack_blackbox.py \
--model.model_type janus \
--project.project_name ToBAC --run_name janus_anarchy_blackbox \
--data.data_source.type huggingface \
--data.data_source.hf_dataset MAI-Lab/ToBAC \
--data.data_source.hf_concept anarchy \
--data.data_source.enable_clean True \
--data.text_trigger "cool" --data.text_trigger_injection_mode format \
--data.injection_rate 1.0 \
--batch_size 1 --max_steps 10000 \
--steps_between_validation 1000 --steps_between_checkpoints 1000
Liquid, entrenamiento unificado de imagen y texto:
uv run python main_unified_attack_blackbox.py \
--model.model_type liquid \
--project.project_name ToBAC --run_name liquid_anarchy_unified_blackbox \
--data.data_source.type huggingface \
--data.data_source.hf_dataset MAI-Lab/ToBAC \
--data.data_source.hf_concept anarchy \
--data.data_source.enable_clean True \
--data.text_trigger "cool" --data.text_trigger_injection_mode format \
--data.dynamic_target_responses False --data.injection_rate 1.0 \
--data.use_text_trigger_for_i2t False \
--batch_size 1 --max_steps 10000 \
--steps_between_validation 1000 --steps_between_checkpoints 1000