O projeto Guix divulgou um comunicado de segurança abordando várias vulnerabilidades críticas no utilitário guix substitute e nos comandos guix pull e guix time‑machine. As falhas permitem que um atacante obtenha privilégios remotamente no usuário do daemon de construção, corrompa o repositório de substitutos e escreva arquivos arbitrários no sistema. Todas as versões são afetadas, independentemente de o daemon ser executado como root.
Principais problemas
- Escalada remota de privilégios – Um servidor de substitutos malicioso (ou um atacante que possa se fazer passar por um) pode extrair arquivos para qualquer diretório gravável pelo usuário do daemon, incluindo
/etc/passwdquando o daemon roda como root. - Corrupção do repositório – O código que recupera metadados de substitutos (
fetch‑narinfos) não verifica se o narinfo recebido corresponde ao solicitado, permitindo que um servidor malicioso substitua um substituto por outro. - Divulgação local de arquivos – URIs
file://podem ser usadas para ler qualquer arquivo acessível ao daemon, expondo até senhas armazenadas em arquivos comuns. - Escrita arbitrária via canal – O código de autenticação de canais (
authenticate‑channel) utiliza um nome de canal inseguro como chave de cache, o que pode levar à criação ou sobrescrita de arquivos no diretório do usuário, representando um risco de negação de serviço.
Uma quinta vulnerabilidade (também com CVE pendente) afeta o procedimento restore‑file, permitindo a extração de substitutos durante o download antes que o hash seja verificado.
Como a exploração funciona
- Exploração remota – Basta que o sistema solicite um substituto para que um servidor malicioso explote a falha. Isso vale para qualquer servidor configurado, inclusive aqueles descobertos via
--discover, e até mesmo para um atacante no meio (MITM), independentemente do uso de HTTPS. - Exploração local – Qualquer usuário pode se conectar ao socket do daemon de construção (padrão) e acionar a falha.
Mitigação imediata
- Desative substitutos globalmente:
guix daemon --no-substitutesou
guix --no-substitutes <comando> - Não use
guix pullouguix time‑machinecom um arquivo de canais de origem não confiável.
Estas medidas só protegem contra ataques remotos e não cobrem explorações locais das vulnerabilidades (1), (2) e (3). A única proteção duradoura é atualizar para uma versão corrigida.
Atualização
Todas as versões são afetadas. A Guix recomenda enfaticamente que todos os usuários atualizem imediatamente:
Para o Guix System
guix pull
sudo guix system reconfigure /run/current-system/configuration.scm
sudo herd restart guix-daemon
Para o Guix em outras distribuições
sudo guix pull
As correções estão incluídas nos commits ed0a9721f8a20d6ddcf6a0495302f502b3f7bb17 → 2ef8ed9f0df53bddf14bdecc2ea48c2d233213cc do PR #9665. Usuários atualizados a partir do commit 897832f374dcdc9eeaf19d01e70b9a92fccfc68c ou posteriores estão protegidos.
Verificação
Um script de verificação está disponível:
guix repl -- guix-substitute-and-pull-vuln-check.scm
A execução imprime quatro linhas no formato:
restore-file: vulnerable
fetch-narinfos: not vulnerable
file-uris: vulnerable
cache-key: not vulnerable
Se alguma linha indicar vulnerable, o script sai com código 1. Falhas parciais são consideradas inconclusivas.
Como as correções funcionam
- Hardening de
restore-file– Validação de nomes de entradas, rejeição de symlinks e criação fresh do arquivo alvo. - Verificação de
fetch-narinfos– Inclusão apenas de narinfos que coincidem exatamente com o solicitado. - Restrição de URIs
file://– Bloqueio de URLsfile://em fontes não confiáveis e em narinfos, exceto na suíte de testes. - Chave de cache segura – Uso do ID do commit introdutório (um hash hexadecimal) como chave de cache, evitando criação arbitrária de arquivos.
Adicionalmente, os substitutos são extraídos em um diretório temporário e movidos apenas após verificação do hash, e o código de leitura de narinfo agora rejeita entradas com sintaxe inválida de caminho do repositório.
Considerações sobre a desativação de substitutos
A maneira mais rápida de obter atualizações é usar substitutos, mas isso também aumenta a superfície de ataque para as explorações remotos mais graves. A decisão de usar --no-substitutes deve considerar:
- Tempo desde a divulgação pública das vulnerabilidades.
- Segurança dos caminhos de rede até os servidores de substitutos.
- Capacidade de reconstruir pacotes localmente.
- Número de usuários do sistema.
- Modelo de ameaça específico.
Para sistemas com múltiplos usuários ou rotas de rede não seguras, a desativação temporária é recomendada até que a atualização possa ser aplicada com segurança.
Referências
- Artigo original: Vulnerabilidades do 'guix substitute' e 'guix pull'
- Página principal do projeto: https://guix.gnu.org
Mantenha seu Guix sempre atualizado. Se suspeitar de uma exploração, execute o script de verificação acima e aplique as correções assim que possível.