Canonical выпустила обновления ядра Ubuntu, закрывающие как минимум 17 уязвимостей. Обновления вышли через месяц после предыдущей партии, в которой исправлялись две уязвимости высокой опасности. Среди новых — состояние гонки в подсистеме NFC и ошибка в драйвере гибких дисков.
Разберём, чем опасны эти уязвимости, как быстро реагировать и что проверить после обновления.
Что такое состояние гонки
Состояние гонки (race condition) возникает, когда два потока обращаются к общим данным без должной синхронизации. Результат зависит от порядка выполнения, и его трудно воспроизвести. В ядре это может привести к использованию памяти после освобождения (use-after-free).
Локальный злоумышленник может вызвать отказ в обслуживании или, при удачном стечении обстоятельств, выполнить код с правами ядра.
# проверить версию ядра
uname -r
# посмотреть журнал на предмет ошибок
journalctl -k -b -p err | tail -30
dmesg | grep -iE "nfc|floppy|use-after-free" | head
NFC и драйвер гибких дисков
Первая уязвимость — в подсистеме NFC. Ошибка позволяет локальному пользователю вызвать сбой или потенциально выполнить код. NFC редко используется на серверах, но модуль может быть загружен по умолчанию.
Вторая — в драйвере флоппи-дисков. Даже если у вас нет дисковода, модуль может присутствовать в системе. Это напоминание: неиспользуемые драйверы тоже увеличивают поверхность атаки.
# проверить загруженные модули
lsmod | grep -iE "nfc|floppy"
# посмотреть, какие модули можно заблокировать
modinfo floppy 2>/dev/null | head
# временно выгрузить (если не используется)
sudo modprobe -r floppy 2>/dev/null
Блокировка модулей — вспомогательная мера, а не замена обновлению. После перезагрузки модуль может загрузиться снова.
# чёрный список (пример)
echo "blacklist floppy" | sudo tee /etc/modprobe.d/blacklist-floppy.conf
sudo update-initramfs -u
Почему обновления выходят партиями
Ядро Linux — общий код для множества дистрибутивов. Исправления накапливаются, проходят ревью и тестирование, а затем вендоры выпускают пакеты. Партия из 17 уязвимостей — нормальный темп для активной подсистемы.
Canonical поддерживает несколько веток: GA-ядро, HWE, realtime, lowlatency. Обновление приходит в каждую отдельно, поэтому проверяйте, какая ветка у вас.
# определить ветку ядра
dpkg -l | grep -E "linux-image|linux-generic|linux-hwe" | tail -10
apt-cache policy linux-image-generic | head -20
Как обновиться
Стандартный путь: apt update, затем apt full-upgrade или установка конкретного пакета. После обновления нужна перезагрузка, если вы не используете livepatch.
sudo apt update
sudo apt full-upgrade
sudo reboot
# после перезагрузки
uname -r
systemctl --failed
Для серверов с SLA выберите окно обслуживания. Обновление ядра может потребовать перезагрузку, а это простой.
# запланировать перезагрузку
sudo shutdown -r +30 "Обновление ядра, перезагрузка через 30 минут"
# отменить
sudo shutdown -c
Livepatch
Ubuntu Livepatch позволяет применять исправления без перезагрузки. Это удобно для серверов, но не все патчи поддерживаются. Проверьте статус и ограничения.
canonical-livepatch status
canonical-livepatch list 2>/dev/null | head -20
systemctl status canonical-livepatch --no-pager | head
Даже с livepatch периодически нужна перезагрузка: некоторые изменения невозможно применить на лету.
Приоритизация
Не все уязвимости одинаково срочны. Оценивайте вектор атаки: локальный или удалённый, требует ли прав, есть ли публичный эксплойт. Для интернет-доступных сервисов обновляйтесь быстрее.
- Критичные уязвимости с удалённой эксплуатацией — в течение суток.
- Локальные повышения привилегий — в течение недели.
- Отказ в обслуживании — по плану.
- Уязвимости в неиспользуемых компонентах — ниже приоритет, но не игнорировать.
# посмотреть, какие сервисы доступны извне
ss -tulpn
sudo ufw status verbose
# проверить открытые порты
sudo nmap -sT -p- --min-rate 1000 localhost 2>/dev/null | head
Проверка после обновления
- Загрузилось ли новое ядро.
- Работают ли сеть, диск, GPU.
- Запустились ли контейнеры и виртуальные машины.
- Нет ли ошибок в журнале.
- Работают ли резервные копии.
uname -r
ip -br a
df -h
docker ps 2>/dev/null | head
virsh list 2>/dev/null
journalctl -b -p err | tail -30
Если что-то сломалось, вернитесь на предыдущее ядро через GRUB и сохраните логи для разбора.
journalctl -k -b -1 | tail -100
dkms status
lsmod | grep -E "nvidia|vbox|zfs"
Профилактика
Настройте автоматические обновления безопасности и мониторинг. Не откладывайте перезагрузки на месяцы: накопленные патчи сложнее применять.
sudo apt install unattended-upgrades
sudo dpkg-reconfigure --priority=low unattended-upgrades
# проверить настройки
cat /etc/apt/apt.conf.d/50unattended-upgrades | head -40
Для парка машин используйте канареечный узел: сначала обновляйте его, затем остальные.
Что делать, если обновление ломает драйвер
Иногда новое ядро конфликтует с проприетарным драйвером. Сохраните предыдущее ядро, проверьте DKMS и будьте готовы загрузиться в старое через GRUB. Не удаляйте старые пакеты ядра сразу после обновления.
dkms status
ls /boot/vmlinuz-*
sudo apt install linux-image-$(uname -r) 2>/dev/null
Отчётность
Ведите журнал: какие узлы обновлены, какая версия ядра, когда была перезагрузка. Это помогает при аудите и при разборе инцидентов.
uname -r >> /var/log/kernel-updates.log
date >> /var/log/kernel-updates.log
Итог
Canonical закрыла 17 уязвимостей в ядре Ubuntu, включая состояние гонки в NFC и ошибку в драйвере флоппи-дисков. Обновите ядро, перезагрузитесь и проверьте сервисы. Приоритизируйте патчи по вектору атаки, используйте livepatch где возможно и не забывайте про резервные копии перед массовым развёртыванием.