Разработчиците на проекта Grsecurity поучителна история, демонстрираща как необмисленото отстраняване на предупреждения от компилатора може да доведе до уязвимости в кода. В края на май бе предложена поправка на новия вектор за експлоатация на уязвимостта Spectre чрез системния повик ptrace за ядрото на Linux.
По време на тестовете на патча разработчиците забелязаха, че компилаторът издава предупреждение при компилиране за смесване на код и определения (структурата е определена след кода със задаване на стойност на съществуваща променлива):
int index = n;
if (n ptrace_bps[index];
Линус прие в своята master-ветка, предупреждението, като премести определението на променливата в блока if:
if (n ptrace_bps[index];
През юли поправката също бе портирована в стабилните клонове на ядрото 4.4, 4.9, 4.14, 4.19 и 5.2. Поддържащите стабилните клонове също се сблъскаха с предупреждението и вместо да проверят дали е премахнато в master-ветката на Линус, сами направиха поправката. Проблемът е, че те, без да се замислят, просто определението на структурата нагоре, така че повикването на array_index_nospec, което директно осигурява защита срещу уязвимостта, вече не се използва при определянето на структурата, и вместо променливата „index“ винаги се използва променливата „n“:
int index = n;
if (n ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);
Източник: opennet.ru
