13.08.2018: Улучшение модели окружения для задач верификации ядра ОС Linux на корректность использования памяти и поиск ошибок использования памяти в ядре ОС Linux

Антон Васильев закончил проект "Улучшение модели окружения для задач верификации ядра ОС Linux на корректность использования памяти и поиск ошибок использования памяти в ядре ОС Linux", выполненный в рамках Google Summer of Code 2018 под эгидой The Linux Foundation.

Программы, написанные на языке Си, подвержены ошибкам некорректной работы с памятью, таким как: разыменование нулевого указателя, утечки памяти, повторное освобождение памяти, использование указателя на освобожденную память, чтение/запись за пределами выделенного блока памяти. Эти классы ошибок в ядре операционной системы потенциально могут оказаться уязвимостями, приводящими к остановке системы, несанкционированному чтению или модификации информации.

Платформа для статической верификации KLEVER создана для анализа исходного кода модулей ядра ОС Linux. Она выполняет верификацию корректности исходного кода модуля относительно некоторого класса ошибок и либо доказывает отсутствие данных ошибок, либо предоставляет предупреждение о потенциальной достижимости ошибки. Не все предупреждения являются истинными ошибками из-за неточностей в анализе и предположений об окружении модуля.

Перед Антоном были поставлены задачи:

  • исправить неточности модели окружения инструмента KLEVER;
  • запустить анализ модулей одной из последних версий ядра ОС Linux;
  • проанализировать предупреждения для ядра ОС Linux и сообщить о найденных ошибках разработчикам ядра.

В течение GSOC 2018 Антон выполнил:

  • в модели окружения инструмента KLEVER исправлены функции, выделяющие память;
  • исправлены спецификации окружения для подсистем SCSI и Timer, в соответствии с изменениями в интерфейсах ядра ОС Linux версий 4.16.10 и 4.18-rc3;
  • выполнена статическая верификация всех модулей ядра ОС Linux 4.16.10;
  • проанализированы все выданные 292 предупреждения для 3733 модулей ядра;
  • обнаружено около 30 реальных ошибок использования памяти;
  • подготовлены исправления ошибок и проведена их статическая верификация на версии ядра ОС Linux 4.18-rc3.

Полный список ошибок, о которых было сообщено разработчикам, приведен ниже.

  1. 2018/7/6/412 ("uwb: hwa-rc: fix memory leak at probe")
  2. 2018/7/18/551 ("media: dm1105: Limit number of cards to avoid buffer over read")
  3. 2018/7/23/964 ("media: dw2102: Fix memleak on sequence of probes")
  4. 2018/7/6/389 ("video: goldfishfb: fix memory leak on driver remove")
  5. 2018/7/23/944 ("firmware: vpd: Fix section enabled flag on vpd_section_destroy")
  6. 2018/7/27/764 ("misc: ti-st: Fix memory leak in the error path of probe()")
  7. 2018/7/27/503 ("media: vimc: Remove redundant free")
  8. 2018/7/23/949 ("gpio: ml-ioh: Fix buffer underwrite on probe error path")
  9. 2018/7/27/769 ("can: ems_usb: Fix memory leak on ems_usb_disconnect")
  10. 2018/7/27/661 ("regulator: tps65217: Fix NULL pointer dereference on probe")
  11. 2018/7/27/655 ("scsi: 3ware: fix return 0 on the error path of probe")
  12. 2018/7/27/772 ("net: mdio-mux: bcm-iproc: fix wrong getter and setter pair")
  13. 2018/7/23/1020 ("HID: intel_ish-hid: tx_buf memory leak on probe/remove")
  14. 2018/8/6/572 ("pinctrl: axp209: Fix NULL pointer dereference after allocation")
  15. 2018/7/27/508 ("media: davinci: vpif_display: Mix memory leak on probe error path")
  16. 2018/7/27/512 ("drm: qxl: Fix error handling at qxl_device_init")
  17. 2018/7/27/727 ("fmc: Fix memory leak and NULL pointer dereference")
  18. 2018/7/27/755 ("drm: qxl: Fix NULL pointer dereference at qxl_alloc_client_monitors_config")
  19. 2018/6/9/253 ("staging: rts5208: add error handling into rtsx_probe")
  20. 2018/7/27/644 ("tty: rocket: Fix possible buffer overwrite on register_PCI")
  21. 2018/8/6/615 ("serial: mxs-auart: Fix potential infinite loop")
  22. 2018/8/7/292 ("usb: gadget: fotg210-udc: Fix memory leak of fotg210->ep[i]")