16 pontos por GN⁺ 2024-05-01 | 1 comentários | Compartilhar no WhatsApp

run0: ferramenta do systemd para substituir o sudo

  • Nova ferramenta incluída na v256 (na prática, é um symlink para o systemd-run já existente)
  • Funciona de forma semelhante ao sudo, mas não é SUID
  • Solicita ao gerenciador de serviços que invoque um comando ou shell com o UID do usuário de destino
    • Em vez de herdar o contexto do cliente, invoca o comando de destino em um contexto de execução isolado, recém-forkado a partir do PID 1
  • O run0 não implementa sua própria linguagem de configuração e usa o polkit para autorização.
  • Durante a elevação de privilégios, muda o fundo do terminal para um tom avermelhado para indicar que está operando com privilégios. Também exibe um ponto vermelho no título da janela para indicar a elevação de privilégios.
  • Suporta a opção --property= do systemd-run, permitindo especificar as configurações de serviço desejadas para o comando/sessão privilegiado invocado.

Problemas do sudo

  • O sudo é um binário SUID relativamente grande, ou seja, código privilegiado que pode ser invocado por usuários sem privilégios a partir do próprio contexto deles.
  • Tem uma grande superfície de ataque devido à linguagem de configuração complexa, plugins carregáveis (LDAP etc.), correspondência de nomes de host e mais.
  • O maior problema é o fato de ser um binário SUID. Ele é chamado por código sem privilégios e herda um contexto de execução controlado por esse código sem privilégios (variáveis de ambiente, propriedades de escalonamento de processos, atribuição de cgroup, contexto de segurança, descritores de arquivo passados etc.). Binários SUID precisam higienizar isso com muito cuidado, mas muitas vezes não conseguem fazê-lo bem.

Outros pontos

  • Com o run0, é possível executar não só um shell, mas também outros comandos com privilégios de root. Ao encerrar o programa, a cor do terminal volta ao normal.
  • A mudança automática da cor de fundo pode ser incômoda, mas pode ser ajustada ou desativada com a opção --background=.
  • Parece possível substituir completamente o sudo pelo run0, mas cada distribuição pode ter preferências diferentes.
  • A abordagem de plugins do sudo, incluindo suporte a LDAP, traz muitos problemas. O polkit pode ser expandido de uma forma gerenciada com segurança no systemd.
  • É possível verificar a execução de scripts bash com o run0 por meio das variáveis de ambiente SUDO_xxx, compatíveis com o sudo.

Opinião do GN⁺

  • É impressionante que o run0 tenha sido apresentado como alternativa ao sudo, que é amplamente usado. Parece manter as vantagens do sudo enquanto evita os riscos do SUID.
  • Informar visualmente de forma clara quando há elevação de privilégios deve ajudar a reduzir danos causados por engano. Mudar a cor de fundo do terminal pode incomodar, mas como isso pode ser ajustado por opção, não parece um grande problema.
  • A configuração de permissões via polkit pode ser menos flexível que o sudo, mas isso pode justamente torná-la mais simples e reduzir a superfície de ataque. Parece importante documentar bem exemplos de configuração do polkit.
  • Para migrar scripts existentes e outros recursos que dependem do sudo, provavelmente ainda será necessário oferecer sudo junto por algum tempo. Mas em ambientes novos, parece melhor usar o run0 desde o início.
  • No longo prazo, espera-se que a adoção do run0 sirva de gatilho para remover SUID de forma mais agressiva e migrar para uma arquitetura em que as permissões do sistema sejam gerenciadas de forma centralizada por serviços do sistema. Isso parece uma direção desejável em termos de segurança e robustez.

1 comentários

 
GN⁺ 2024-05-01
Opiniões do Hacker News
  • O run0, diferentemente do sudo, invoca o comando de destino em um contexto de execução isolado recém-criado a partir do PID 1, sem herdar nenhum contexto do cliente. Isso não combina com os casos de uso comuns de comandos de shell, então na prática provavelmente causará problemas e será difícil de adotar amplamente.
  • Se o run0 passar a ser amplamente usado, serão adicionadas flags para fazê-lo funcionar como o sudo, e as pessoas acabarão sempre usando essas flags. Quando isso causar problemas, o projeto systemd poderá tentar remover o sudo.
  • O run0 adota uma abordagem diferente da do sudo ao manter limites rígidos de IPC entre níveis de privilégio. Pode ser uma boa opção para quem quer usar systemd.
  • O sudo é mantido em grande parte por uma única pessoa.
  • Em vários aspectos, o comportamento do run0 é mais próximo do ssh do que do sudo. Seria possível implementar uma ferramenta parecida conectando por SSH ao localhost.
  • Uma ideia semelhante foi testada em meados dos anos 1980 em um clone experimental do BSD em Berkeley, mas foi rejeitada por causa da complexidade de passar tudo por pipes. Em vez disso, reforçou-se a verificação do ambiente herdado.
  • Há dúvidas sobre logging no run0, variáveis de ambiente transmitidas, tratamento de sinais e alternativas para substituir o sudoedit.
  • Além do run0, também existem implementações de sudo em Rust com segurança de memória e menos bugs.
  • Hoje em dia, muitas vezes há apenas um usuário por máquina física, então pode ser necessário simplificar o sistema de permissões do Unix.
  • Mudar a cor de fundo do terminal para vermelho durante a elevação de privilégio não é a parte importante.