
POC для недавно обнаруженного бага Qualys в COW с XFS
Этот репозиторий содержит PoC недавно обнаруженной уязвимости состояния гонки (race condition), затрагивающей COW в XFS, о которой сообщила отличная команда Qualys Security Team. [1] [2]
Написан вручную на основе отличного анализа из рекомендаций Qualys. Перезаписывает первые 4 КБ файла /etc/passwd тем, что там изначально было, заменяя строку root: root:x:0:0:root:/root:/bin/bash на root::0:0:root:/root:/bin/bash. Заметили разницу? Теперь у пользователя root нет пароля, и можно просто su -.
Будучи корявым PoC для моих собственных нужд, он имеет паршивую обработку ошибок и не делает никаких резервных копий исходного файла и тому подобного. Протестировано на виртуальной машине Rocky Linux 9.7 с корневым разделом XFS и ядром от февраля 2026 года. Он также коряво дополняет запись в /etc/passwd, так что если вам дорога машина, на которой вы его запускаете... сделайте резервную копию файла перед запуском. Я сделал PoC для проверки своих машин и собирался придержать его, но увидел, что вчера выложили другой PoC, так что...
Возможно, придётся изменить переменную CLONE_FILE в PoC, чтобы она указывала на путь, куда вы можете писать, если /home находится в другом разделе, нежели /etc/passwd. /var/tmp может помочь; для определения поверхности атаки можно использовать find / -writable. Компиляция: gcc refluxfs.c -o refluxfs -lpthread.
PoC не оставляет записей в журнале или dmesg. На мой взгляд, лучший способ обнаружить это — настроить правило SIEM для мониторинга вызовов ioctl с FICLONE на файловых системах XFS. Инструменты мониторинга целостности файлов (FIM) также могут это зафиксировать.
Обновите ядро, если есть возможность. Альтернативно, смягчение от Red Hat с помощью SystemTap работает:
probe begin {
printf("refluxfs mitigation loaded\n")
}
probe module("xfs").function("xfs_file_remap_range").call {
$remap_flags = 0xffff
}
probe module("xfs").function("xfs_file_remap_range").return {
$return = -95
}
probe end {
printf("refluxfs mitigation unloaded\n")
}
$ xfs_info / | grep reflink=1 и mount -l | grep xfs.Ошибка в коде XFS означает, что Copy-On-Write может быть запрошен для файла, и COW не откатывается должным образом. При записи в наш скопированный файл COW должен откатиться, и на диске должны существовать два разных файла. С помощью потоков можно просто... записывать в оба файла одновременно из-за гонки.
Если вы можете читать целевой файл и выполнить ioctl(fd, FICLONE) для него, у вас есть копия с включённым COW. Она должна находиться в том же разделе.

Затем можно просто... выполнить write() в свою копию с O_DIRECT и изменить исходный файл.

1: https://openwall.com/lists/oss-security/2026/07/22/14
В моём описании, вероятно, есть ошибки, но я хотел с чего-то начать, особенно в эти потрясающие пару месяцев.
"Better to be a dog in times of tranquility than a human in times of chaos."
- Feng Menglong, Stories to awaken the world