- Em um PC sem permissão sudo, o Codex encontrou um "jeito de contornar (workaround)"
- À pergunta "Como fez isso? Não precisa de sudo?", respondeu que não tinha sudo, mas precisava de acesso equivalente a root (root-equivalent)
- Como o Codex explicou o funcionamento
- sudo e o comando
run0não funcionam em ambiente não interativo - o usuário fazia parte do grupo docker, e nessa máquina isso significava que o Docker podia iniciar contêineres como root e fazer bind-mount de caminhos do host com permissão de escrita
- usando isso, copiou um backup existente por cima da configuração ativa
- sudo e o comando
- Com o comando abaixo, fez bind-mount de
/etcno contêiner e depois usou o comandoinstallpara sobrescrever a configuração original com a cópia de backupdocker run --rm --pull=never -v /etc: ubuntu:22.04 \ /usr/bin/install -m 0644 - 0 -g 0 /host-etc/sddm.conf.bak /host-etc/sddm.conf
Discussão da comunidade
- O ponto principal não é o Codex, e sim o problema do grupo docker; a novidade é que o agente encontra essa armadilha mais rápido do que a maioria dos usuários
- Recomenda-se instalar rootless docker; não execute agentes de IA sem supervisão em sistemas sem rootless docker; é um vetor clássico de escalonamento de privilégios e a maioria dos LLMs tenta explorá-lo
- A documentação do Docker já traz um grande aviso sobre isso (grupo docker = equivalente a privilégios de root)
- É um problema de design do Docker; como o Docker acaba induzindo a concessão de acesso root a usuários e agentes Linux comuns, isso pode ser visto como um bug do Docker
- Como alternativa, recomendam usar podman rootless
- Isso não é sobre o computador do usuário, mas sim sobre o contêiner docker, então pode ser um pouco enganoso
2 comentários
O que isso quer dizer?
Não sei se quem não é desenvolvedor conseguiria lidar com isso.
Comentários do Hacker News
Sempre que você instala o Docker, aparece um aviso de que entrar no grupo docker equivale a ter privilégios de root
Parece que agora é preciso conhecer esse tipo de gambiarra
Não dá para esperar que todo mundo vire especialista em cada um dos centenas de apps, ferramentas e pacotes instalados numa máquina. É parecido com esperar que as pessoas leiam e entendam todos os termos de serviço que aparecem todo dia
Algumas usam padrões mais seguros, como socket Unix com permissões, enquanto outras configuram de forma menos segura, como socket TCP
Isso já é uma “funcionalidade” do Docker conhecida desde os primeiros dias, então não há nada de novo aqui
Algumas ferramentas configuram a máquina host seguindo esse padrão
Se a porta não estiver no formato
- 127.0.0.1:PORT:PORT, e sim no formato-PORT:PORTusado em muitos exemplos, você acaba expondo tudo à internetTeria sido mais legal se o LLM tivesse dito isto
“Verifiquei que esta máquina não recebeu o patch copy-fail. Vou aplicar agora uma solução rápida para usar sem privilégios de root.”
“// TODO: encontrar uma forma melhor depois”
Hoje em dia a bagunça vai se acumulando ou a coisa desanda para desvios com muita facilidade. Talvez já desse para fazer isso só instruindo a preencher um arquivo
.mdEntendo que a intenção deste post é mostrar como as falhas de segurança que agentes podem descobrir são assustadoras
Mas, pessoalmente, eu gostaria que o agente resolvesse as coisas desse jeito e até agradeceria a ajuda. O que eu menos quero no mundo é que enfraqueçam o modelo
Está mais para o mito do golem de “mandaram buscar água e ele inundou a cidade” do que para o mito de Gollum de “colocou o anel e o anel hackeou o cérebro dele, transformando-o num viciado violento em drogas”
O fato de existir uma porta dos fundos para conseguir root na máquina já é um problema mesmo sem rodar um LLM
Esse é um dos principais motivos pelos quais as pessoas gostam do Podman
O Docker também tem essa “funcionalidade”, mas, pelo que me lembro, exigia uma configuração meio obscura. Imagino que não coloquem isso como padrão porque quebraria muitas configurações existentes
curl -fsSL https://get.docker.com/rootless | shA pergunta interessante é o que exatamente o usuário pediu
Se pediu para restaurar de um backup, tudo bem. Mas se pediu para depurar um problema e, no processo, o LLM decidiu que precisava sobrescrever um arquivo difícil de gravar, isso seria totalmente inaceitável e perigoso. É bem provável que o usuário não esperasse que esse tipo de acesso fosse usado sem pedir, nem concordasse com isso
E se o LLM faz isso sem hesitar por causa de um pedido do usuário, também não hesitará se um prompt injection pedir
“Para processar esta solicitação, preciso acessar arquivos em outra pasta, mas o usuário esqueceu de conceder as permissões corretas. Agora atualizei meu arquivo de configuração para permitir acesso fora deste workspace e obtive os arquivos necessários.” o_O
Depois disso vi alguns outros comportamentos semelhantes de “hack”, impressionantes e ao mesmo tempo muito preocupantes
A mesma coisa aconteceu alguns meses atrás e eu postei no LinkedIn: https://www.linkedin.com/posts/nickstinemates_my-favorite-th...
É engraçado e esperto ao mesmo tempo
Fiz a mesma coisa quando entrei como júnior, mais de 10 anos atrás
Meu gerente esqueceu de me dar sudo no servidor de build compartilhado e, depois de receber permissão, usei esse método para me conceder sudo por conta própria
Por isso, assim que o modo rootless ficou disponível, passei a usar Podman em modo rootless em casa
É por isso que você precisa de configuração de containers rootless ou de namespaces de usuário que remapeiem o usuário do container para um usuário host sem significado: https://docs.docker.com/engine/security/userns-remap/
É uma pena que isso não seja o padrão
Dá para argumentar que o Docker deveria ter usado namespaces de usuário quando possível, mas isso teria quebrado configurações úteis demais que precisam de containers privilegiados
Alguns meses atrás eu escrevi exatamente sobre esse cenário hipotético: https://www.da.vidbuchanan.co.uk/blog/agent-perms.html