
Доказательство концепции эксплуатации CVE-2026-55168, демонстрирующее аутентифицированную произвольную запись файлов через подмену символьной ссылки во время восстановления резервной копии в Runtipi.
Этот репозиторий содержит простой PoC для CVE-2026-55168 в Runtipi.
Проблема представляет собой аутентифицированную произвольную запись файла, которую можно достичь через процесс восстановления из резервной копии. Специально сформированный архив резервной копии может внедрить симлинк в восстановленные данные приложения, а последующее обычное обновление конфигурации переходит по этому симлинку и записывает содержимое, контролируемое атакующим, за пределы предполагаемой директории.
Справочный бюллетень:
Затронутые версии:
<= 4.10.0PoC выполняет вход в Runtipi, создаёт вредоносный архив резервной копии в памяти, загружает его, запускает восстановление, а затем отправляет обычный запрос на обновление user-config.
Полезная нагрузка восстановления помещает следующую симлинку:
user-config/app.env -> /data/state/proof.txt
После этого обычный запрос на обновление конфигурации приложения заставляет Runtipi записать переданное содержимое в:
/data/state/proof.txt
То есть важна не только сохраняемость симлинка при восстановлении, но и тот факт, что последующая легитимная запись переходит по внедрённому симлинку.
poc.py — сквозной Python PoCpython poc.py \
--base-url http://127.0.0.1:3001 \
--username YOUR_USERNAME \
--password YOUR_PASSWORD \
--app-urn demoapp3:_user \
--target-path /data/state/proof.txt \
--write-content PWNED_FROM_USERCFG_WRITE
Если хотите, вы также можете сохранить созданный архив локально:
python poc.py \
--base-url http://127.0.0.1:3001 \
--username YOUR_USERNAME \
--password YOUR_PASSWORD \
--output payload.tar.gz
Если цель уязвима, скрипт завершается успешно и выводит небольшой JSON-результат с status: "ok".
Этот PoC предоставлен в исследовательских целях и для воспроизведения.