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