В ядре Linux устранена следующая уязвимость:
selinux: отклонить значение разрешения, превышающее количество разрешений класса
perm_read() ограничивает значение разрешения значением SEL_VEC_MAX, но никогда
nprim класса-владельца или общего, который дословно взят из
имидж политики. Security_get_permissions() затем записывает разрешения [значение - 1]
в массив kcalloc() размером с nprim, поэтому класс, объявляющий меньшее количество
разрешений, чем его наибольшее значение разрешения, приводит к выходу за пределы
куча писать. Таблицы символов верхнего уровня проверяются таким образом; тот
вложенная таблица разрешений для каждого класса — нет. Отклонить разрешение, значение которого превышает nprim, которое уже установлено при
perm_read() запускается.
Хорошо сформированная политика не затрагивается. [PM: подправить комментарий по длине строки]
Показать оригинальное описание (EN)
In the Linux kernel, the following vulnerability has been resolved: selinux: reject a permission value exceeding the class permission count perm_read() bounds a permission value by SEL_VEC_MAX but never by the nprim of the owning class or common, which is taken verbatim from the policy image. security_get_permissions() then writes perms[value - 1] into an nprim-sized kcalloc() array, so a class declaring fewer permissions than its largest permission value drives an out-of-bounds heap write. The top-level symbol tables are validated this way; the nested per-class permission table is not. Reject a permission whose value exceeds nprim, which is already set when perm_read() runs. Well-formed policies are unaffected. [PM: tweak comment for line length]