27.08.2017: Поиск ошибок использования памяти в ядре ОС Linux

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

Инструмент статической верификации KLEVER (обновленная версия LDV Tools) производит анализ модулей ядра ОС Linux и обнаруживает ошибки, связанные с некорректным использованием интерфейсов между модулем и сердцевиной ядра, а также неправильного использование памяти - разыменование нулевого указателя, утечки памяти, повторное освобождение памяти, использование после освобождения памяти, чтение/запись за пределами выделенной памяти.

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

Антон запустил инструмент на всех драйверах ОС Linux 4.11. Инструмент выдал предупреждения для 640 модулей ядра. В течение GSOC 2017 Антон успел проанализировать 570 модулей и выявил, что большая часть ложных предупреждений связана с неточностью моделирования окружения, анализом условий и др. Также были обнаружены около 26 реальных ошибок использования памяти, но не все из них были сообщены разработчикам, так как некоторые были обнаружены в старых неподдерживаемых модулях, либо уже были исправлены. Полный список ошибок, о которых было сообщено разработчикам, приведен ниже.

  1. 2017/8/1/615 ("Buffer overread in pv88090-regulator.ko")
  2. 2017/8/10/693 ("hwmon:(stts751) buffer overread on wrong chip")
  3. 2017/8/10/597 ("dmaengine: qcom_hidma: avoid freeing an uninitialized pointer")
  4. 2017/8/15/322 ("ASoC: samsung: i2s: Null pointer dereference on samsung_i2s_remove")
  5. 2017/8/10/535 ("i2c: use release_mem_region instead of release_resource")
  6. 2017/8/16/493 ("mtd: plat-ram: Replace manual resource management by devm")
  7. 2017/8/11/366 ("mISDN: Fix null pointer dereference at mISDN_FsmNew")
  8. 2017/8/10/522 ("parport: use release_mem_region instead of release_resource")
  9. 2017/8/11/368 ("video: fbdev: udlfb: Fix use after free on dlfb_usb_probe error path")
  10. 2017/8/10/550 ("dvb-usb: Add memory free on error path in dw2102_probe()")
  11. 2017/8/16/345 ("udc: Memory leak on error path and use after free")