
Token a Token, Comprometido: Vulnerabilidades de Backdoor em Modelos Autorregressivos Unificados (NeurIPS'26)
NeurIPS 2026 · Implementação oficial em PyTorch
Token by Token, Compromised: Backdoor Vulnerabilities in Unified Autoregressive Models
ToBAC (Token by Token Backdoor Attack) estuda como backdoors afetam modelos autorregressivos unificados que geram tanto imagens quanto texto. Investigamos envenenamento de modelo com acesso ao modelo vítima e envenenamento de dados usando pares imagem–texto editados, incluindo ataques que afetam ambas as modalidades de saída. Consulte o artigo para os modelos de ameaça e experimentos.
O código suporta Liquid (padrão) e Janus-Pro, com wrappers adicionais para Emu3 e ANOLE. Inclui inferência de imagem e texto, ataques white-box e black-box baseados em LoRA, e scripts para gerar imagens editadas do conjunto de dados.
Use Linux com uma GPU NVIDIA CUDA e um CUDA toolkit compatível com PyTorch 2.5.1. O FlashAttention é compilado durante a instalação; recomenda-se Python 3.10. Execute os comandos a partir da raiz do repositório.
git clone https://github.com/multimodal-ai-lab/ToBAC.git
cd ToBAC
pip install uv
uv sync --python 3.10
| Modelo | Flag do modelo | Pesos base |
|---|---|---|
| Liquid (padrão) | liquid | Junfeng5/Liquid_V1_7B |
| Janus-Pro | janus | deepseek-ai/Janus-Pro-7B |
Os pesos base são baixados automaticamente no primeiro uso. O Janus-Pro não precisa de download adicional de tokenizer. Para o Liquid, baixe o checkpoint do tokenizer de imagem; sua configuração YAML está incluída:
wget -P tobac/models/chameleon/vqgan_weights/ \
https://huggingface.co/spaces/Junfeng5/Liquid_demo/resolve/main/chameleon/vqgan.ckpt
Para recursos do Hugging Face com acesso controlado, autentique-se com uv run hf auth login usando uma conta com acesso.
uv run python inference_text_to_image.py \
--model_type liquid --batch_size 1 \
--prompts "a photo of a cat" \
--output liquid_example
As imagens são salvas em outputs/images/liquid_example/. Use --model_type janus e um nome de saída diferente para gerar com o Janus-Pro. Vários prompts podem ser passados como --prompts "first prompt" "second prompt", ou carregados com --prompts_file prompts.csv usando as colunas 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."
As respostas são impressas no terminal. Substitua janus por liquid para usar o Liquid. Ambos os scripts de inferência aceitam --checkpoint /path/to/adapter para carregar um adaptador LoRA treinado para o modelo selecionado.
Os exemplos black-box usam o conceito anarchy; os exemplos white-box usam smoking person. Ambos usam o gatilho cool. O treinamento usa flags com pontos, como --model.model_type janus; a inferência usa --model_type janus. Passe --help a um ponto de entrada para inspecionar suas opções.
Faça login no Weights & Biases antes do treinamento:
uv run wandb login
Cada execução de treinamento registra sua configuração, curvas de perda, taxa de aprendizado e saídas de validação em sua própria execução do W&B. Os comandos abaixo selecionam o projeto ToBAC. Defina WANDB_ENTITY para escolher uma conta ou equipe; caso contrário, o W&B usa sua conta padrão. Para registro local, prefixe um comando com WANDB_MODE=offline.
A validação usa todos os validation_prompts com sementes de amostragem fixas em cada etapa de validação, mostrando saídas limpas e com gatilho juntas. Os três padrões são a ilustração da xícara, o castor nadando em um lago canadense e o astronauta montado em um cavalo. Substitua --validation_prompts para usar seus próprios exemplos. Defina a frequência com --steps_between_validation; use um novo --run_name para cada experimento, pois diretórios de execução existentes são ignorados.
Janus-Pro, texto para imagem:
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, treinamento unificado de imagem e 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
Ambos os comandos suportam liquid e janus. Selecione rainbow, anarchy ou pear com --data.data_source.hf_concept. O carregador insere o gatilho no placeholder {} do contexto e o emparelha com a imagem-alvo selecionada. Com enable_clean True, ele também inclui a imagem e o contexto limpos com o placeholder removido. O treinamento unificado deriva sua legenda-alvo do conceito e do contexto, e então anexa a resposta-alvo configurada. As instruções de imagem para texto não contêm o gatilho de texto por padrão (use_text_trigger_for_i2t=False); a imagem editada fornece o gatilho para essa modalidade.
Liquid, texto para imagem: