ROME: como alterar as saídas do modelo sem tocar no arquivo de pesos
Técnicas e Métodos de AtaqueOntem, 14:42
ROME (Rank-One Model Editing) — um método para editar cirurgicamente associações factuais em modelos de linguagem. Ele tem como alvo uma matriz de pesos específica em uma camada intermediária e aplica uma atualização de posto um, permitindo que as saídas do modelo sejam alteradas sem retreiná-lo.
Como a edição funciona
Na demonstração da Stealthium, um pequeno transformer PyTorch é carregado de um checkpoint em disco. Nada no modelo ou em seus pesos é um artefato criado. Em vez disso, o código malicioso chega por meio de uma biblioteca Python importável: ele se injeta no PyTorch, é armado por uma variável de ambiente e aplica a edição quando o modelo é colocado em modo de avaliação.
Da perspectiva do driver, isso parece inferência padrão do modelo com uma série adicional de lançamentos de kernels CUDA. A modificação ocorre em três estágios, cada um caracterizado por um conjunto de kernels e uma pilha de chamadas:
- Coleta de chaves. O modelo é executado em prompts de calibração, e as ativações necessárias da camada intermediária são acumuladas em um buffer (
CatArrayBatchedCopy_vectorized). Pilha:_keys→_calibrate→_eval. - Cálculo dos pesos alvo. Um sistema linear é resolvido: multiplicação de matrizes (
ampere_sgemm_32x128_nt) e decomposição LU (getrf_pivot) produzem a atualização necessária. Pilha:_calibrate→_eval. - Escrita nos pesos ativos. A atualização é adicionada no local aos pesos do modelo na memória da GPU (
CUDAFunctorOnSelf_add). Pilha:_calibrate→_eval. O terceiro estágio altera os pesos usando uma matriz de posto um: uma matriz de posto um derivada das chaves coletadas é adicionada a uma das matrizes de pesos do modelo. A forma e o tamanho do tensor permanecem inalterados, então o modelo continua funcionando normalmente enquanto produz saídas diferentes.
Por que as ferramentas de segurança padrão não detectam isso
Os pesos são corrigidos diretamente na memória da GPU: não há acesso a arquivos, nenhuma chamada de sistema extra e nem mesmo mapeamento de memória. O mesmo processo
python3 e o mesmo contexto CUDA são usados. Ferramentas tradicionais de segurança de endpoint, como EDRs e ferramentas de monitoramento em nível de aplicação, concentram-se na atividade de processos: abrir arquivos, gerar processos filhos e comunicar-se pela rede. Dessa perspectiva, a carga de trabalho parece um trabalho normal de inferência. Um kernel que adiciona dois tensores enquanto gera uma saída é indistinguível de um que aplica uma atualização aos pesos: seus argumentos são ponteiros brutos para a memória do dispositivo.Fornecedor
Produto