Dirty COW (CVE)

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 13:18, 18 июня 2019.
Dirty COW
DirtyCow.png
CVE identifier(s) CVE-2016-5195(Dirty COW)
Date discovered 13 October 2016 года; 3 years ago (2016-10-13)
Date patched 18 October 2016 года; 3 years ago (2016-10-18)
Discoverer Фил Олистер
Affected software GNU/Linux, Android
Website https://dirtycow.ninja/

Уязвимость Dirty COW (CVE-2016-5195, от англ. dirty + copy-on-write — копирование при записи) — серьезная программная уязвимость в ядре Linux, c помощью которой локальный пользователь может повысить свои привилегии из-за ошибки состязания (гонки) в реализации механизма копирования при записи (COW) для страниц памяти, помеченных флагом Dirty bit (изменённая память).

История

Согласно официальным данным, опубликованным 20 октября 2016 года, уязвимость Dirty COW существовала в ядре Linux с версии 2.6.22 и была обнаружена еще в 2007 году. Это делает ее одной из самых длительно существовавших уязвимостей в ядре Linux. Она получила обозначение CVE-2016-5195, а также оценена по шкале CVSS на 7.2 баллов из 10[Источник 1]. Уязвимость пытались исправить еще в 2005 году, однако они были недоработаны и, как следствие, не были приняты[Источник 2].

Уязвимость CVE-2016-5195 обнаружил исследователь Фил Олистер при анализе взлома администрируемого им сервера. Он проанализировал HTTP-трафик за несколько лет и получил эксплоит. При анализе его работы было выяснено, что эксплоит был скомпилирован при помощи компилятора GCC версии 4.8, который был выпущен в 2013 году. Он сделал вывод, что уязвимость используется уже не один год. 18 октября 2016 был внесен патч, который исправлял ошибку, однако данное исправление не было помечено, как важное. 19-20 октября информация об уязвимости была опубликована на сайте RedHat, также был создан сайт, рассказывающий об уязвимости и предлагающий методы ее устранения, а также собственный аккаунт в twitter, и даже интернет-магазин, где можно было приобрести товары с логотипом "грязной коровы".

20 октября 2017 года было выявлено то, что воздействию уязвимости Dirty COW подвержено не только ядро Linux, но и Android. Актуальность Dirty COW для Android[Источник 3] была проверена Дэвидом Манучери. Он опубликовал свой эксплоит на GitHub, сообщив, что использую уязвимость можно получить root-доступ. Кроме того, можно утверждать о том, что под угрозой находятся практически все версии Android, начиная с 1.0. Чтобы воспользоваться этой уязвимостью в случае работы с Android-системой, злоумышленнику также необходимо запустить код на устройстве. Это можно осуществить с помощью Android Debug Bridge (ADB) через USB или путем установки приложения, использующего эксплоит.

В декабре 2017 был представлен вариант «Huge Dirty COW» (CVE-2017-1000405), связанный с аналогичной ошибкой в обработке больших страниц (2 МБ)[Источник 4].

Технические подробности

Копирование при записи используется для оптимизации управления памятью в операционной системе. Это позволяет запущенным программам обмениваться данными, пока одна из них не захочет изменить эти данные. В этот момент ядро ​​копирует данные на другую страницу в памяти, так что только один процесс может повлиять на нее — отсюда и название, копирование при записи ("copy-on-write", COW).

Эксплоит работает на гоночном механизме Linux COW. Сначала должен быть открыть исполняемый файл, созданный пользователем root. Он доступен только для чтения пользователям, а также отображается в пространстве процессов.

При неоднократно вызове функции madvise() для этого отображения с помощью MADV_DONTNEED, который сообщает ядру, что вы на самом деле не собираетесь использовать данную страницу памяти.

Другой поток в том же процессе открывается доступ к /proc/self/memс с правом чтения и записи. Это файл, который позволяет процессу получать доступ к собственной виртуальной памяти, будто это — обычный файл. При попытке перезаписи файла с правами только для чтения, автоматически создается копия файла, куда записываются изменения. Это происходит, потому что при вызове madvise(MADV_DONTNEED) ядро автоматически удаляет все копии файла, но при этом не лишает возможности записи по уже имеющемуся адресу. Данный процесс принято называть "состоянием гонки", при котором возникает копирование при записи: в какой-то момент ядро запишет данные в файл, доступный только для чтения, а не в его копию. Многократное повторение запросов с разных потоков обязательно приведет к состоянию гонки, обычно на это затрачивается всего несколько секунд. [Источник 5]

Устранение уязвимости

В общем случае, для устранения уязвимости [Источник 6]. необходимо и достаточно обновить ядро. Внесенные исправление небольшие: изменено всего семь строк кода [Источник 2].

Проверка сервера на уязвимость

Для проверки сервера на уязвимость необходимо проверить версию ядра.

Серверы Ubuntu/Debian

Чтобы проверить версию ядра, необходимо в терминале ввести команду uname -rv.

Уязвимости подвержены все серверы, вышедшие ранее, чем:

  • 4.8.0-26.28 для Ubuntu 16.10
  • 4.4.0-45.66 для Ubuntu 16.04 LTS
  • 3.13.0-100.147 для Ubuntu 14.04 LTS
  • 3.2.0-113.155 для Ubuntu 12.04 LTS
  • 3.16.36-1+deb8u2 для Debian 8
  • 3.2.82-1 для Debian 7
  • 4.7.8-1 для Debian unstable

Серверы CentOS

Чтобы проверить на уязвимость сервер CentOS, используется сценарий, разработанный компанией RedHat. Загрузите сценарий на сервер:

wget https://access.redhat.com/sites/default/files/rh-cve-2016-5195_1.sh

Затем используйте bash:

bash rh-cve-2016-5195_1.sh

Если сервер уязвим, в ответ вернется сообщение об этом.

Решение

В случае, если сервер уязвим, обновите ядро и перезагрузите систему:

Серверы Ubuntu/Debian

 sudo apt-get update && sudo apt-get dist-upgrade 
 sudo reboot 

Серверы CentOS

CENTOS LINUX 5.X/6.X/7.X

 sudo yum update 
 sudo reboot 

CENTOS LINUX 4.X

 sudo up2date -u 
 sudo reboot 

Источники

  1. Reports:Vulnerability Details // CVE Details. The ultimate security vulnerability datasource. [2012 — ]. Дата обновления: 22.04.2019. URL: https://www.cvedetails.com/cve/CVE-2016-5195/?q=CVE-2016-5195 (дата обращения: 10.05.2019)
  2. 2,0 2,1 Linus Torvalds. Linux.git:Commit // Linux kernel source tree. [2005 — ]. Дата обновления: 18.10.2016. URL: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=19be0eaffa3ac7d8eb6784ad9bdbc7d67ed8e619 (дата обращения: 10.05.2019)
  3. Егор Нашилов. Уязвимость Dirty COW мигрировала с Linux на Android // ThreatPost. [2019 — ]. Дата обновления: 27.09.2017. URL: https://threatpost.ru/dirty-cow-vulnerability-migrates-to-android-from-linux/22508/ (дата обращения: 10.05.2019)
  4. Мария Нефедова. В прошлом году проблему Dirty COW решили не до конца // Хакер. [2010 — ]. Дата обновления: 04.12.2017. URL: https://xakep.ru/2017/12/04/huge-dirty-cow/ (дата обращения: 10.05.2019)
  5. Shaun Nichols. Dirty COW explained: Get a moooo-ve on and patch Linux root hole // TheRegister. [1998 — 2019]. Дата обновления: 21.10.2016. URL: https://www.theregister.co.uk/2016/10/21/linux_privilege_escalation_hole/ (дата обращения: 10.05.2019)
  6. Amber. Устранение уязвимости Dirty COW на сервере Linux // 8Host. [2016 — ]. Дата обновления: 25.10.2016. URL: https://www.8host.com/blog/ustranenie-uyazvimosti-dirty-cow-na-servere-linux/ (дата обращения: 10.05.2019)