Deixar uma IA Escrever Código que Pode Apagar Coisas, em Segurança
Deixar uma IA Escrever Código que Pode Apagar Coisas, em Segurança
Pedi ao meu sistema de IA uma coisa pequena e maçadora: limpar os processos deixados a correr na máquina depois de um dia de trabalho. A forma óbvia de fazer essa tarefa teria sido um desastre silencioso.
Um dia a construir deixa lixo digital: um servidor de desenvolvimento ainda agarrado a uma porta, um navegador em segundo plano que nunca fechou, um script que sobreviveu ao seu propósito. Limpar esse lixo é precisamente o tipo de tarefa que se quer automatizar. Mas "terminar os processos deixados a correr" é uma armadilha, porque o lixo e aquilo que nunca se pode terminar parecem quase iguais visto de fora.
Tudo parece lixo
Na minha máquina, uma limpeza ingénua do género "encontra os processos node, python e do navegador perdidos e termina-os" teria eliminado, sem ordem particular:
- os processos auxiliares de uma sessão de trabalho ativa que eu ainda tinha aberta noutra janela, e
- o meu navegador de facto.
Nenhum destes é lixo. E uma limpeza mais abrangente, corrida com mais privilégios, teria ido mais longe, até um contentor que fazia trabalho real e que só escapou por correr sob um utilizador de sistema diferente. Cada um apresenta-se ao sistema operativo como um processo node, python ou chrome genérico, com a mesma forma do lixo que eu queria eliminar. As duas coisas que eu realmente queria terminar (um servidor de desenvolvimento perdido, um daemon de navegador abandonado) eram um conjunto pequeno e nomeável. Tudo o resto era uma dependência viva com o mesmo disfarce.
Esta é a forma geral de qualquer operação destrutiva que uma IA possa escrever por si: o raio de destruição é definido por aquilo que o código decide poupar, e "o que poupar" é fácil de errar de forma catastrófica.
Regra 1: crie uma barreira determinística, não confie no juízo do modelo
A tentação é tornar a IA mais esperta a distinguir um processo perdido de um processo vivo. É o instinto errado. "Mais esperto" significa que o modelo volta a fazer um juízo difuso de cada vez que corre, e uma decisão má é irreversível.
Por isso a limpeza não deixa o modelo decidir o que terminar. Está construída à volta de uma barreira explícita e mecânica:
- uma denylist com o que nunca pode tocar: sessões ativas, as próprias ferramentas que orquestram o trabalho, a sincronização de ficheiros em segundo plano, serviços do sistema, tudo o que esteja dentro de um contentor;
- uma allowlist curta com o que pode terminar: os servidores e daemons específicos que são genuinamente descartáveis;
- e para todo o resto: não fazer nada.
Um processo desconhecido não é candidato a ser terminado. É poupado por omissão. É preciso merecer a eliminação, estando na allowlist e ausente da denylist. A segurança vive nas listas, que eu escrevi e consigo ler, e não no quão afiado o modelo está numa dada tarde.
O teste de saber se construiu isto bem: um modelo mais fraco e mais barato conseguiria correr isto em segurança? Se a resposta for não, a segurança nunca esteve no código, esteve na esperança de o modelo se manter esperto. Com o juízo movido para uma barreira explícita, o modelo em tempo de execução limita-se a aplicar uma verificação determinística.
Regra 2: dê ao caminho automático um raio de destruição menor
Esta limpeza corre de duas maneiras: quando eu a peço explicitamente, e automaticamente quando uma sessão termina. Não têm o mesmo risco.
Quando a peço, estou a ver. Quando dispara por sua conta (incluindo quando eu apenas reinicio o meu espaço de trabalho a meio de uma tarefa, ainda a trabalhar), não está ninguém. Por isso o caminho automático é deliberadamente mais tímido: só elimina processos genuinamente abandonados (cujo processo-pai já desapareceu) e recusa-se a correr nos eventos com maior probabilidade de dispararem enquanto ainda estou a trabalhar. A mesma ferramenta, dois níveis de segurança, ajustados à presença ou ausência de uma pessoa.
Uma operação que corre sem supervisão nunca deve ter o mesmo alcance de uma que aciona pessoalmente. Não é paranoia; é ajustar o raio de destruição à quantidade de supervisão.
Regra 3: ponha um adversário a tentar parti-lo antes de correr
Esta é a parte que realmente me salvou.
O agente que escreveu o script de limpeza também escreveu um conjunto completo de testes, correu-os e reportou sucesso: tudo o que era protegido continuava vivo, tudo o que era descartável tinha desaparecido. Tudo verde.
Depois fiz algo diferente. Dei o script terminado a um segundo agente independente com uma única instrução: não confirmes que funciona, tenta fazê-lo terminar o processo errado.
Encontrou três falhas reais, nenhuma delas apanhada pelos testes que passaram:
- Um caminho de eliminação ignorava a lista de segurança por completo. Um caso especial para limpar processos do navegador correspondia a um padrão de texto em bruto, contornando a denylist, o que significava que, nas condições certas, poderia ter correspondido e terminado o meu navegador de facto, e não o descartável.
- Uma definição partilhada podia terminar uma sessão viva. Com duas sessões de automação de navegador a correr, uma abandonada e uma viva, uma única definição partilhada marcaria também a viva para eliminação. Exatamente a sessão que era suposto proteger.
- Um padrão era demasiado ganancioso. A regra pensada para apanhar um servidor de ficheiros descartável correspondia também a
ollama serve, o comando que corre um modelo de IA local. Limpar "lixo" teria desligado um servidor de modelo a correr.
Cada uma destas é a diferença entre uma ferramenta útil e um incidente. E cada uma passou pelos testes verdes de quem a implementou, porque um teste escrito pelo autor verifica os casos em que o autor pensou. Um adversário verifica os casos em que ele não pensou.
Isto não é exótico. É o mesmo princípio de pedir a alguém para provar que uma afirmação é falsa em vez de confirmar que é verdadeira: obtêm-se respostas completamente diferentes, e muito mais úteis, do mesmo modelo, sobre o mesmo código, só por apontá-lo na direção contrária.
O que "possuir a sua IA" significa de facto
Fala-se muito sobre se se deve confiar à IA acesso real aos nossos sistemas. Acho que esse enquadramento falha o essencial. A questão não é confiança, é estrutura.
A produtividade vem de deixar a IA escrever o código operacional, maçador e propenso a erros que preferia não escrever à mão. A segurança vem de recusar que o resultado corra na base da confiança: limita as partes destrutivas atrás de regras que controla, dá aos caminhos automáticos menos alcance do que aos supervisionados, e envia tudo o que é irreversível por uma revisão adversarial antes de sequer executar.
É isto que possuir um agente de IA parece na prática: não alugar uma caixa preta e cruzar os dedos, mas correr uma que se consegue inspecionar, limitar e supervisionar. O agente faz o trabalho. As chaves ficam consigo.
Este artigo é sobre prática de engenharia, não um argumento de venda, mas é também exatamente como construímos a automação que entregamos a clientes: a IA faz o trabalho, barreiras determinísticas e revisão humana seguram a linha. Se é este o tipo de IA que quer no seu negócio, uma que possui e supervisiona em vez de alugar e confiar, é essa a conversa que temos.
Perguntas Frequentes
Não basta dizer à IA para 'ter cuidado' e não apagar o que não deve?
Não, e este é o erro central. 'Ter cuidado' é um juízo que o modelo volta a fazer de cada vez que corre, sobre aquilo que calha ver nesse momento. A segurança de uma operação destrutiva não deve depender de o modelo acertar numa decisão difusa sob pressão. Deve depender de uma lista explícita do que nunca pode ser tocado, uma lista escrita por si, que o código verifica de forma mecânica. A esperteza do modelo deixa de ser o que sustenta a segurança.
Qual é a diferença entre uma denylist e uma allowlist aqui, e porquê usar as duas?
A allowlist (lista de permissão) é o conjunto restrito daquilo que a limpeza pode terminar: um tipo específico de servidor de desenvolvimento, um daemon de navegador específico. A denylist (lista de exclusão) é o conjunto que nunca pode ser tocado, aconteça o que acontecer: sessões ativas, as ferramentas de orquestração, a sincronização em segundo plano, tudo o que esteja dentro de um contentor, serviços do sistema. Tudo o que não corresponde a nenhuma das listas fica simplesmente intocado. O comportamento por omissão é 'não fazer nada', e um processo só é terminado se estiver na allowlist e ausente da denylist. É essa ordem que torna o sistema seguro: um processo desconhecido é poupado, nunca eliminado.
Porquê pôr uma segunda IA a rever o código da primeira? Não é mais do mesmo?
Porque quem implementa e testa o próprio trabalho está a corrigir o próprio exame. O agente que escreveu o meu script de limpeza produziu um conjunto completo de testes que passaram e reportou que nada de protegido tinha sido afetado. Um segundo agente, com a instrução explícita de o partir em vez de o confirmar, encontrou três formas reais de terminar o processo errado, nenhuma delas apanhada pelos testes que passaram. O valor não é 'dois modelos são mais espertos do que um'. É que quem verifica procura razões para dizer que sim e quem refuta procura razões para dizer que não, e para tudo o que é irreversível quer a segunda pessoa.
Isto quer dizer que a IA não deve chegar perto da infraestrutura?
Pelo contrário. A IA é genuinamente boa neste tipo de trabalho operacional e maçador. O ponto é que 'ser boa a escrevê-lo' e 'ser seguro correr sem supervisão' são propriedades diferentes. A produtividade vem de deixar a IA escrever o código; a segurança vem de o limitar com regras que controla e de rever de forma adversarial as partes destrutivas antes de correrem. Essa combinação, usar o agente mas possuí-lo e supervisioná-lo, é o essencial.
Um modelo mais pequeno ou mais barato consegue correr isto em segurança depois de estar feito?
Sim, e isso é um bom teste de saber se o construiu bem. Quando o juízo sobre o que nunca pode ser terminado passa a viver numa lista explícita dentro do script, o modelo em tempo de execução limita-se a aplicar uma barreira determinística. Quase não importa o quão esperto é, porque não é ele a decidir o que é seguro. Se a sua 'segurança' se desfizesse com um modelo mais fraco, a segurança nunca esteve no código, esteve na esperança de o modelo continuar afiado.
Pronto para automatizar o seu negócio?
Construímos ferramentas de IA e sistemas de automação para PMEs europeias — desde MVPs rápidos até sistemas em produção, sempre em conformidade com o GDPR.
it's human stuff
Insights semanais de IA para PMEs europeias. Sem exageros, apenas o que funciona.
Continue a Ler
Um Artigo do ICML Ganhou o Benchmark Sem Responder Nada
Investigadores criaram um método deliberadamente inútil que bate a pontuação-padrão que toda a gente reporta. Repeti a experiência no meu próprio CPU em oito segundos e obtive o número deles. Depois descobri que o código publicado não reproduz o próprio artigo. Eis o que isto significa quando um fornecedor lhe apresenta um benchmark.
Como o Nosso Agente Local Faz Investigação a Sério — Sem Qualquer Cloud Americana no Processo
A maioria das demonstrações de 'agentes de investigação de IA' é apenas uma camada fina por cima de uma API de cloud. A nossa não. Eis a arquitetura de um agente local que pesquisa, lê e verifica inteiramente em hardware que é nosso — o motor, as ferramentas self-hosted, os subagentes e a prova de que faz trabalho real.