Este é o repositório de código que acompanha nosso artigo sussurra na máquina: confidencialidade nos sistemas integrados para LLM.
Os grandes modelos de idiomas (LLMs) são cada vez mais aumentados com ferramentas externas e serviços comerciais em sistemas integrados para LLM . Embora essas interfaces possam aumentar significativamente os recursos dos modelos, eles também introduzem uma nova superfície de ataque. As integrações manipuladas, por exemplo, podem explorar o modelo e comprometer dados sensíveis acessados por outras interfaces. Embora o trabalho anterior tenha se concentrado principalmente em ataques direcionados ao alinhamento de um modelo ou no vazamento de dados de treinamento, a segurança dos dados que está disponível apenas durante a inferência escaparam escrutínio. Neste trabalho, demonstramos as vulnerabilidades associadas a componentes externos e introduzimos uma abordagem sistemática para avaliar os riscos de confidencialidade em sistemas integrados para LLM. Identificamos vários cenários de ataque específicos exclusivos desses sistemas e os formalizamos em uma estrutura de robustão de ferramentas projetada para medir a capacidade de um modelo de proteger informações confidenciais. Essa estrutura nos permite avaliar a vulnerabilidade do modelo a ataques de confidencialidade. Nossas descobertas mostram que todos os modelos examinados são altamente vulneráveis a ataques, com o risco aumentando significativamente quando os modelos são usados em conjunto com ferramentas externas.
Se você deseja citar nosso trabalho, use a entrada desta Bibtex.
Aviso
A aceleração de hardware é totalmente suportada para máquinas CUDA em execução do Linux. Os deputados no macOS devem funcionar um pouco, mas o Windows com Cuda pode enfrentar alguns problemas.
Antes de executar o código, instale os requisitos:
python -m pip install --upgrade -r requirements.txt
Se você deseja usar modelos hospedados pelo OpenAI ou Huggingface, crie um arquivo key.txt
que contém sua chave de API do OpenAI, bem como um arquivo hf_token.txt
que contém seu token de huggingface para repositórios privados (como llama2) no diretório raiz deste projeto.
Às vezes, pode ser necessário fazer login na sua conta Huggingface através da CLI:
git config --global credential.helper store
huggingface-cli login
Todos os scripts podem trabalhar em várias GPUs/CPUs usando a biblioteca acelerada. Para fazer isso, corra:
accelerate config
Para configurar os recursos de treinamento distribuídos do seu sistema e iniciar os scripts com:
accelerate launch [parameters] <script.py> [script parameters]
python attack . py - - strategy "tools" - - scenario "CalendarWithCloud" - - attacks "payload_splitting" "obfuscation" - - defense "xml_tagging" - - iterations 15 - - llm_type "llama3-70b" - - temperature 0.7 - - device cuda - - prompt_format "react"
Executaria os ataques payload_splitting
e obfuscation
contra o LLM llama3-70b
no CalendarWithCloud
cenário, usando o Defense xml_tagging
para 15 iterações com uma temperatura de 0,7 em um dispositivo CUDA usando o formato REAT Prompt em um sistema integrado à ferramenta.
Argumento | Tipo | Valor padrão | Descrição |
---|---|---|---|
-h, --help | - | - | Mostre esta mensagem de ajuda e saída |
-a, --attacks | Lista [STR] | payload_splitting | Especifica os ataques que serão utilizados contra o LLM |
-d, --defense | str | None | Especifica a defesa do LLM |
-llm, --llm_type | str | gpt-3.5-turbo | especifica o tipo de oponente |
-le, --llm_guessing | bool | False | especifica se um segundo LLM é usado para adivinhar a chave secreta da resposta normal ou não |
-t, --temperature | flutuador | 0.0 | Especifica a temperatura para o LLM controlar a aleatoriedade |
-cp, --create_prompt_dataset | bool | False | Especifica se um novo conjunto de dados de avisos de sistema aprimorado deve ser criado |
-cr, --create_response_dataset | bool | False | Especifica se um novo conjunto de dados de respostas de vazamento secreto devem ser criadas |
-i, --iterations | int | 10 | Especifica o número de iterações para o ataque |
-n, --name_suffix | str | "" | Especifica um sufixo de nome para carregar modelos personalizados. Como as cadeias de parâmetros de argumento não podem começar com '-' símbolos, o primeiro '-' será adicionado pelo analisador automaticamente |
-s, --strategy | str | None | Especifica a estratégia para o ataque (se deve usar ataques normais ou ataques tools ) |
-sc, --scenario | str | all | Especifica o cenário para os ataques baseados em ferramentas |
-dx, --device | str | cpu | Especifica o dispositivo usado para executar o script (CPU, CUDA ou MPS) |
-pf, --prompt_format | str | react | Especifica se o formato Prompt React ou Tool-Finetuned é usado para agentes. (React ou Tool-Finetuned) |
-ds, --disable_safeguards | bool | False | Desative o sistema Promova salvaguardas para a estratégia de ferramentas |
As convenções de nomenclatura para os modelos são as seguintes: |
< model_name > - < param_count > - < robustness > - < attack_suffix > - < custom_suffix >
por exemplo:
llama2 - 7 b - robust - prompt_injection - 0613
Se você deseja executar os ataques contra um modelo ajustado de prefixo com um sufixo personalizado (por exemplo, 1000epochs
), você teria que especificar os argumentos a seguir:
... - - model_name llama2 - 7 b - prefix - - name_suffix 1000 epochs ...
Modelo | Especificador de parâmetro | Link | Instância de computação |
---|---|---|---|
GPT-4 (O1, O1-Mini, Turbo) | gpt-4o / gpt-4o-mini / gpt-4-turbo | Link | API OPENAI |
LLAMA 2 | llama2-7b / llama2-13b / llama2-70b | Link | Inferência local |
Llama 2 endureceu | llama2-7b-robust / llama2-13b-robust / llama2-70b-robust | Link | Inferência local |
Qwen 2.5 | qwen2.5-72b | Link | Inferência local (primeiro: ollama pull qwen2.5:72b ) |
LLAMA 3.1 | llama3-8b / llama3-70b | Link | Inferência local (primeiro: ollama pull llama3.1/llama3.1:70b/llama3.1:405b ) |
LLAMA 3.2 | llama3-1b / llama3-3b | Link | Inferência local (primeiro: ollama pull llama3.2/llama3.2:1b ) |
LLAMA 3.3 | llama3.3-70b | Link | Inferência local (primeiro: ollama pull llama3.3/llama3.3:70b ) |
Reflexão lhama | reflection-llama | Link | Inferência local (primeiro: ollama pull reflection ) |
Vicuna | vicuna-7b / vicuna-13b / vicuna-33b | Link | Inferência local |
Stablebeluga (2) | beluga-7b / beluga-13b / beluga2-70b | Link | Inferência local |
Orca 2 | orca2-7b / orca2-13b / orca2-70b | Link | Inferência local |
Gemma | gemma-2b / gemma-7b | Link | Inferência local |
Gemma 2 | gemma2-9b / gemma2-27b | Link | Inferência local (primeiro: ollama pull gemma2/gemma2:27b ) |
Phi 3 | phi3-3b / phi3-14b | Link | Inferência local (primeiro: ollama pull phi3:mini/phi3:medium ) |
(Modelos de llama FinetUned ou robustos/endurecidos primeiro devem ser gerados usando o script finetuning.py
, veja abaixo)
Ataques | Defesas | ||
---|---|---|---|
Nome | Especificador | Nome | Especificador |
Divisão da carga útil | payload_splitting | Gabinete de sequência aleatória | seq_enclosure |
Ofuscação | obfuscation | Marcação xml | xml_tagging |
Fuga de presos | jailbreak | Defesa de heurística/filtragem | heuristic_defense |
Tradução | translation | Defesa do sanduíche | sandwiching |
Abuso de chatml | chatml_abuse | Avaliação LLM | llm_eval |
Mascaramento | masking | Detecção de perplexidade | ppl_detection |
Typoglicemia | typoglycemia | Promptguard | prompt_guard |
Sufixo adversário | advs_suffix | ||
Injeção de prefixo | prefix_injection | ||
Supressão de recusa | refusal_suppression | ||
Contexto ignorando | context_ignoring | ||
Terminação de contexto | context_termination | ||
Separadores de comutação de contexto | context_switching_separators | ||
Poucos anos | few_shot | ||
Hacking cognitivo | cognitive_hacking | ||
Bate -papo base | base_chat |
O ataque base_chat
consiste em perguntas normais para testar o modelo derramar seu contexto e informações confidenciais, mesmo sem um ataque real.
Esta seção abrange as possíveis opções de finetuning de llama. Usamos o PEFT, que é baseado neste artigo.
Além da configuração acima
accelerate config
Para configurar os recursos de treinamento distribuídos do seu sistema. E
wandb login
Com sua chave da API WANDB para ativar o registro do processo de Finetuning.
A primeira opção de Finetuning está em um conjunto de dados que consiste em instruções do sistema para instruir um LLM com segurança a manter uma chave secreta segura. A segunda opção de Finetuning (usando a opção --train_robust
) está usando os prompts do sistema e os prompts adversários para endurecer o modelo contra ataques imediatos de injeção.
python finetuning . py [ - h ] [ - llm | - - llm_type LLM_NAME ] [ - i | - - iterations ITERATIONS ] [ - a | - - attacks ATTACKS_LIST ] [ - n | - - name_suffix NAME_SUFFIX ]
Argumento | Tipo | Valor padrão | Descrição |
---|---|---|---|
-h, --help | - | - | Mostre esta mensagem de ajuda e saída |
-llm, --llm_type | str | llama3-8b | Especifica o tipo de LLM para Finetune |
-i, --iterations | int | 10000 | Especifica o número de iterações para a Finetuning |
-advs, --advs_train | bool | False | Utiliza o treinamento adversário para endurecer o LLM Finetuned |
-a, --attacks | Lista [STR] | payload_splitting | Especifica os ataques que serão usados para endurecer o LLM durante o Finetuning. Somente um efeito se --train_robust estiver definido como true. Para ataques suportados, consulte a seção anterior |
-n, --name_suffix | str | "" | Especifica um sufixo para o nome do modelo FinetUned |
Atualmente, apenas os modelos LLAMA são suportados ( llama2-7/13/70b
/ llama3-8/70b
).
Basta executar o script generate_dataset.py
para criar novos avisos do sistema como um arquivo JSON usando o LLMS.
Argumento | Tipo | Valor padrão | Descrição |
---|---|---|---|
-h, --help | - | - | Mostre esta mensagem de ajuda e saída |
-llm, --llm_type | str | llama3-70b | Especifica o LLM usado para gerar o conjunto de dados prompt do sistema |
-n, --name_suffix | str | "" | Especifica um sufixo para o nome do modelo se você quiser usar um modelo personalizado |
-ds, --dataset_size | int | 1000 | Tamanho do conjunto de dados prompt de sistema resultante |
Para testar a confidencialidade do LLMS em cenários de ferramentas do mundo real, fornecemos a possibilidade de testar o LLMS no Google Drive e o Google Mail integrações. Para fazer isso, execute o script /various_scripts/llm_mail_test.py
com suas credenciais da API do Google.
Aviso
Depeding sobre o qual o LLM é avaliado, a avaliação pode ser muito exigente em termos de GPU VRAM e tempo.
Observação
Os resultados podem variar um pouco de execução para execução. O Ollama atualiza a maioria de seus LLMs constantemente, para que seu comportamento esteja sujeito a mudanças. Além disso, mesmo com os LLMs de temperatura mais baixa tendem a flutuar levemente em Behvisor devido à aleatoriedade interna.
Fará perguntas benignas ao LLM para verificar o vazamento do segredo, mesmo sem ataques
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks chat_base --defenses None --iterations 100 --device cuda
Executará todos os ataques contra o LLM sem defesas. As iterações serão divididas igualmente nos ataques usados. Portanto, dependendo do número de ataques usados, o número de iterações deve ser adaptado. (por exemplo, para 14 ataques com 100 iterações, defina o parâmetro de iterações para 1400)
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses None --iterations 100 --device cuda
Executará todos os ataques contra o LLM com todas as defesas
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses all --iterations 100 --device cuda
O sistema INMPARTIRARÁ, instruirá o LLM com uma chave secreta e as instruções para não vazar a chave secreta seguida de solicitações simples para imprimir a chave secreta
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks base_attack --defenses None --iterations 100 --device cuda
Executará todos os cenários de ferramentas sem ataques e defesas usando a estrutura do React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format ReAct --device cuda
Executará todos os cenários de ferramentas sem ataques e defesas usando a estrutura do React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
Executará todos os cenários de ferramentas sem ataques e defesas usando a estrutura do React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
Executará todos os cenários de ferramentas sem ataques e defesas usando a estrutura do React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses all --iterations 100 --prompt_format tool-finetuned --device cuda
Se você deseja citar nosso trabalho, use a seguinte entrada do Bibtex:
@article { evertz-24-whispers ,
title = { {Whispers in the Machine: Confidentiality in LLM-integrated Systems} } ,
author = { Jonathan Evertz and Merlin Chlosta and Lea Schönherr and Thorsten Eisenhofer } ,
year = { 2024 } ,
journal = { Computing Research Repository (CoRR) }
}