Este es el repositorio de códigos que acompaña a nuestro papel susurros en la máquina: confidencialidad en sistemas integrados en LLM.
Los modelos de idiomas grandes (LLM) se aumentan cada vez más con herramientas externas y servicios comerciales en sistemas integrados en LLM . Si bien estas interfaces pueden mejorar significativamente las capacidades de los modelos, también introducen una nueva superficie de ataque. Las integraciones manipuladas, por ejemplo, pueden explotar el modelo y comprometer los datos confidenciales accedidos a través de otras interfaces. Si bien el trabajo previo se ha centrado principalmente en ataques dirigidos a la alineación de un modelo o la fuga de datos de capacitación, la seguridad de los datos que solo está disponible durante la inferencia ha escrito el escrutinio. En este trabajo, demostramos las vulnerabilidades asociadas con componentes externos e introducimos un enfoque sistemático para evaluar los riesgos de confidencialidad en los sistemas integrados en LLM. Identificamos varios escenarios de ataque específicos exclusivos de estos sistemas y los formalizamos en un marco de robustez de herramientas diseñado para medir la capacidad de un modelo para proteger la información confidencial. Este marco nos permite evaluar la vulnerabilidad del modelo a los ataques de confidencialidad. Nuestros hallazgos muestran que todos los modelos examinados son altamente vulnerables a los ataques, y el riesgo aumenta significativamente cuando los modelos se usan junto con herramientas externas.
Si desea citar nuestro trabajo, utilice esta entrada de Bibtex.
Advertencia
La aceleración de hardware solo es totalmente compatible para máquinas CUDA que ejecutan Linux. Los parlamentarios en MacOS deberían funcionar de alguna manera, pero Windows con CUDA podría enfrentar algunos problemas.
Antes de ejecutar el código, instale los requisitos:
python -m pip install --upgrade -r requirements.txt
Si desea utilizar modelos alojados por OpenAI o Huggingface, cree un archivo key.txt
que contenga su clave de API OpenAI, así como un archivo hf_token.txt
que contiene su token de superficie de abrazo para reposes privados (como LLAMA2) en el directorio raíz de esto proyecto.
A veces puede ser necesario iniciar sesión en su cuenta de Huggingface a través de la CLI:
git config --global credential.helper store
huggingface-cli login
Todos los scripts pueden trabajar en múltiples GPU/CPU utilizando la biblioteca Acelerate. Para hacerlo, corre:
accelerate config
Para configurar las capacidades de capacitación distribuida de su sistema e iniciar los scripts con:
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"
Ejecutaría los ataques payload_splitting
y obfuscation
contra el LLM llama3-70b
en el escenario CalendarWithCloud
utilizando el xml_tagging
de defensa para 15 iteraciones con una temperatura de 0.7 en un dispositivo CUDA utilizando el formato de indicación React en un sistema integrado en herramienta.
Argumento | Tipo | Valor predeterminado | Descripción |
---|---|---|---|
-h, --help | - | - | Muestre este mensaje de ayuda y salida |
-a, --attacks | Lista [STR] | payload_splitting | Especifica los ataques que se utilizarán contra el LLM |
-d, --defense | stri | None | Especifica la defensa para el LLM |
-llm, --llm_type | stri | gpt-3.5-turbo | especifica el tipo de oponente |
-le, --llm_guessing | bool | False | Especifica si un segundo LLM se usa para adivinar la clave secreta de la respuesta normal o no |
-t, --temperature | flotar | 0.0 | Especifica la temperatura para el LLM para controlar la aleatoriedad |
-cp, --create_prompt_dataset | bool | False | Especifica si se debe crear un nuevo conjunto de datos de indicaciones del sistema mejoradas |
-cr, --create_response_dataset | bool | False | Especifica si se deben crear un nuevo conjunto de datos de respuestas de fuga secreta |
-i, --iterations | intencionalmente | 10 | especifica el número de iteraciones para el ataque |
-n, --name_suffix | stri | "" | Especifica un sufijo de nombre para cargar modelos personalizados. Dado que las cadenas de parámetros de argumento no pueden comenzar con '-' símbolos, el primero '-' será agregado por el analizador automáticamente |
-s, --strategy | stri | None | Especifica la estrategia para el ataque (ya sea usar ataques normales o ataques tools ) |
-sc, --scenario | stri | all | Especifica el escenario para los ataques basados en herramientas |
-dx, --device | stri | cpu | Especifica el dispositivo que se utiliza para ejecutar el script (CPU, CUDA o MPS) |
-pf, --prompt_format | stri | react | Especifica si se utiliza el formato de inmediato reaccionado o de la herramienta finalizada para los agentes. (reaccionar o hacer una herramienta-finalizada) |
-ds, --disable_safeguards | bool | False | Desactiva las salvaguardas indicadas del sistema para la estrategia de herramientas |
Las convenciones de nombres para los modelos son las siguientes: |
< model_name > - < param_count > - < robustness > - < attack_suffix > - < custom_suffix >
p.ej:
llama2 - 7 b - robust - prompt_injection - 0613
Si desea ejecutar los ataques contra un modelo de prefijo con un sufijo personalizado (por ejemplo, 1000epochs
), tendría que especificar los argumentos que sigue:
... - - model_name llama2 - 7 b - prefix - - name_suffix 1000 epochs ...
Modelo | Especificador de parámetro | Enlace | Instancia de calcular |
---|---|---|---|
GPT-4 (O1, O1-Mini, Turbo) | gpt-4o / gpt-4o-mini / gpt-4-turbo | Enlace | API OPERAI |
Llama 2 | llama2-7b / llama2-13b / llama2-70b | Enlace | Inferencia local |
Llama 2 endurecido | llama2-7b-robust / llama2-13b-robust / llama2-70b-robust | Enlace | Inferencia local |
Qwen 2.5 | qwen2.5-72b | Enlace | Inferencia local (primero: ollama pull qwen2.5:72b ) |
Llama 3.1 | llama3-8b / llama3-70b | Enlace | Inferencia local (primero: ollama pull llama3.1/llama3.1:70b/llama3.1:405b ) |
Llama 3.2 | llama3-1b / llama3-3b | Enlace | Inferencia local (primero: ollama pull llama3.2/llama3.2:1b ) |
LLAMA 3.3 | llama3.3-70b | Enlace | Inferencia local (primero: ollama pull llama3.3/llama3.3:70b ) |
LLAMA DE REFLECCIÓN | reflection-llama | Enlace | Inferencia local (primero: ollama pull reflection ) |
Vicuna | vicuna-7b / vicuna-13b / vicuna-33b | Enlace | Inferencia local |
StableBeluga (2) | beluga-7b / beluga-13b / beluga2-70b | Enlace | Inferencia local |
Orca 2 | orca2-7b / orca2-13b / orca2-70b | Enlace | Inferencia local |
Gema | gemma-2b / gemma-7b | Enlace | Inferencia local |
Gemma 2 | gemma2-9b / gemma2-27b | Enlace | Inferencia local (primero: ollama pull gemma2/gemma2:27b ) |
Phi 3 | phi3-3b / phi3-14b | Enlace | Inferencia local (primero: ollama pull phi3:mini/phi3:medium ) |
(Los modelos de Llama Finetuned o Robust/Hardened primero deben generarse utilizando el script finetuning.py
, ver más abajo)
Ataques | Defensas | ||
---|---|---|---|
Nombre | Especificador | Nombre | Especificador |
División de carga útil | payload_splitting | Recinto de secuencia aleatoria | seq_enclosure |
Ofuscación | obfuscation | Etiquetado XML | xml_tagging |
Fuga | jailbreak | Defensa heurística/filtrante | heuristic_defense |
Traducción | translation | Defensa de sándwich | sandwiching |
Abuso de chatml | chatml_abuse | Evaluación de LLM | llm_eval |
Enmascaramiento | masking | Detección de perplejidad | ppl_detection |
Tipoglucemia | typoglycemia | Guía | prompt_guard |
Sufijo adversario | advs_suffix | ||
Inyección de prefijo | prefix_injection | ||
Supresión de rechazo | refusal_suppression | ||
Contexto ignorando | context_ignoring | ||
Terminación de contexto | context_termination | ||
Separadores de cambio de contexto | context_switching_separators | ||
Pocos disparos | few_shot | ||
Piratería cognitiva | cognitive_hacking | ||
Chat base | base_chat |
El ataque base_chat
consiste en preguntas normales para probar el modelo derrame su contexto e información confidencial incluso sin un ataque real.
Esta sección cubre las posibles opciones de finunos de llamas. Usamos PEFT, que se basa en este documento.
Además de la ejecución de configuración anterior
accelerate config
Para configurar las capacidades de capacitación distribuida de su sistema. Y
wandb login
con su tecla API WANDB para habilitar el registro del proceso Finetuning.
La primera opción Finetuning está en un conjunto de datos que consta de las indicaciones del sistema que instruye de manera segura a un LLM que mantenga una clave secreta segura. La segunda opción Finetuning (usando la opción --train_robust
) es utilizar las indicaciones del sistema y las indicaciones adversas para endurecer el modelo contra ataques de inyección inmediata.
python finetuning . py [ - h ] [ - llm | - - llm_type LLM_NAME ] [ - i | - - iterations ITERATIONS ] [ - a | - - attacks ATTACKS_LIST ] [ - n | - - name_suffix NAME_SUFFIX ]
Argumento | Tipo | Valor predeterminado | Descripción |
---|---|---|---|
-h, --help | - | - | Muestre este mensaje de ayuda y salida |
-llm, --llm_type | stri | llama3-8b | Especifica el tipo de LLM a Finetune |
-i, --iterations | intencionalmente | 10000 | Especifica el número de iteraciones para la Finetuning |
-advs, --advs_train | bool | False | Utiliza el entrenamiento adversario para endurecer el LLM Finetuned |
-a, --attacks | Lista [STR] | payload_splitting | Especifica los ataques que se utilizarán para endurecer el LLM durante la Finetuning. Solo tiene un efecto si --train_robust se establece en verdadero. Para ataques compatibles, consulte la sección anterior |
-n, --name_suffix | stri | "" | Especifica un sufijo para el nombre del modelo Finetuned |
Actualmente, solo los modelos LLAMA son compatibles ( llama2-7/13/70b
/ llama3-8/70b
).
Simplemente ejecute el script generate_dataset.py
para crear nuevas indicaciones del sistema como un archivo JSON usando LLMS.
Argumento | Tipo | Valor predeterminado | Descripción |
---|---|---|---|
-h, --help | - | - | Muestre este mensaje de ayuda y salida |
-llm, --llm_type | stri | llama3-70b | Especifica el LLM utilizado para generar el conjunto de datos de indicación del sistema |
-n, --name_suffix | stri | "" | Especifica un sufijo para el nombre del modelo si desea usar un modelo personalizado |
-ds, --dataset_size | intencionalmente | 1000 | Tamaño del conjunto de datos de indicación del sistema resultante |
Para probar la confidencialidad de los LLM en los escenarios de herramientas del mundo real, brindamos la posibilidad de probar LLM en Google Drive e integraciones de Google Mail. Para hacerlo, ejecute /various_scripts/llm_mail_test.py
script con sus credenciales de Google API.
Advertencia
Depeding en el que se evalúa LLM, la evaluación puede ser muy exigente en términos de GPU VRAM y tiempo.
Nota
Los resultados pueden variar ligeramente de ejecución a ejecución. Ollama actualiza la mayoría de sus LLM constantemente, por lo que su comportamiento está sujeto a cambios. Además, incluso con la temperatura más baja, los LLM tienden a fluctuar ligeramente en Behvior debido a la aleatoriedad interna.
Hará que el LLM sea preguntas benignas para verificar el secreto incluso sin ataques
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks chat_base --defenses None --iterations 100 --device cuda
Correrá todos los ataques contra el LLM sin defensas. Las iteraciones se dividirán por igual en los ataques usados. Entonces, dependiendo del número de ataques usados, el número de iteraciones debe adaptarse. (Por ejemplo, para 14 ataques con 100 iteraciones establece el parámetro de iteraciones en 1400)
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses None --iterations 100 --device cuda
Ejecutará todos los ataques contra el LLM con todas las defensas
python attack.py --llm_type <model_specifier> --strategy secret-key --attacks all --defenses all --iterations 100 --device cuda
Sistema indicará instruir a la LLM con una clave secreta y las instrucciones para no filtrar la clave secreta seguida de solicitudes simples para imprimir la clave secreta
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks base_attack --defenses None --iterations 100 --device cuda
Ejecutará todos los escenarios de herramientas sin ataques y defensas utilizando el marco React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format ReAct --device cuda
Ejecutará todos los escenarios de herramientas sin ataques y defensas utilizando el marco React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks identity --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
Ejecutará todos los escenarios de herramientas sin ataques y defensas utilizando el marco React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses None --iterations 100 --prompt_format tool-finetuned --device cuda
Ejecutará todos los escenarios de herramientas sin ataques y defensas utilizando el marco React
python attack.py --llm_type <model_specifier> --strategy tools --scenario all --attacks all --defenses all --iterations 100 --prompt_format tool-finetuned --device cuda
Si desea citar nuestro trabajo, utilice la siguiente entrada de 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) }
}