Как пофиксить уязвимость Dirty COW (CVE-2016-5195)

Nov 3, 2016 09:59 · 301 words · 2 minute read kernel CVE

В ядре Linux 19-го октября была обнаружена опасная 0-day уязвимость, связанная с обработкой подсистемой памяти ядра механизма copy-on-write (COW). Давайте разберемся как пофиксить данную уязвимость, уже получившую имя Dirty COW!

Данная уязвимость уже почти десять лет присутствует в ядре Linux (начиная с 2.6.22) и относится к privilege escalation. Эксплуатируя данную уязвимость неавторизованный локальный пользователь может получить доступ к memory mappings с правом записи, хотя доступ должен быть ограничен только чтением.

На практике проблема позволяет выполнить запись данных в область памяти, находящуюся в режиме только для чтения. Например, в прототипе эксплоита показано как использовать данную проблему для изменения содержимого файла, принадлежащего пользователю root и доступного только на чтение:

sudo -s
echo this is not a test > foo
chmod 0404 foo
ls -lah foo
-r-----r-- 1 root root 19 Oct 20 15:23 foo
cat foo
this is not a test
gcc -lpthread dirtyc0w.c -o dirtyc0w
./dirtyc0w foo m00000000000000000
mmap 56123000
madvise 0
procselfmem 1800000000
$ cat foo
m00000000000000000

C помощью такого метода атаки непривилегированный пользователь может изменить исполняемые системные файлы, обойдя штатные механизмы управления доступом.

Уже на следующий день были выпущены обновления для версий Linux 4.8, 4.7 и 4.4 LTS, исправляющие уязвимость Dirty COW (CVE-2016-5195). Для устранения уязвимости необходимо выполнить несколько несложных действий:

  1. Проверить версию ядра, установленную в операционной системе:
uname -rv

Результат выполнения команды будет примерно следующим:

3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u1 (2016-09-03)

Обязательно обновляемся, если версия ядра ниже, чем в этом списке:

4.8.0-26.28 for Ubuntu 16.10
4.4.0-45.66 for Ubuntu 16.04 LTS
3.13.0-100.147 for Ubuntu 14.04 LTS
3.2.0-113.155 for Ubuntu 12.04 LTS
3.16.36-1+deb8u2 for Debian 8
3.2.82-1 for Debian 7
4.7.8-1 for Debian unstable
  1. В ОС Debian/Ubuntu выполняем следующую команду:
sudo apt-get update && sudo apt-get dist-upgrade

В ОС Centos делаем так:

sudo yum update kernel
  1. После обновления перезагружаемся:
sudo reboot

После обновлений можно еще раз выполнить тест с помощью эксплоита.

tweet Share