Ein vorschneller Fix führte zu einer unvollständigen Behebung einer Spectre-Schwachstelle im Linux-Kernel

Entwickler des Grsecurity-Projekts geteilt Eine warnende Geschichte, die zeigt, wie die gedankenlose Beseitigung von Compiler-Warnungen zu Schwachstellen im Code führen kann. Ende Mai wurde ein Fix für den Linux-Kernel für einen neuen Ausnutzungsvektor der Spectre-Schwachstelle über den Systemaufruf ptrace vorgeschlagen.

Beim Testen des Patches stellten die Entwickler fest, dass der Compiler beim Erstellen eine Warnung über die Vermischung von Code und Definitionen anzeigt (die Struktur wurde nach dem Code definiert und einer vorhandenen Variablen einen Wert zugewiesen):

int index = n;
if (n < HBP_NUM) { index = array_index_nospec(index, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

Linus akzeptierte Änderung zu Ihrer Hauptfiliale, losgeworden zu sein aus der Warnung, indem Sie die Variablendefinition in einen if-Block verschieben:

if (n < HBP_NUM) { int index = array_index_nospec(n, HBP_NUM); struct perf_event *bp = thread->ptrace_bps[index];

Im Juli wurde der Fix auch auf die stabilen Kernel-Zweige 4.4, 4.9, 4.14, 4.19 und 5.2 portiert. Auch die Betreuer der stabilen Zweige stießen auf die Warnung und anstatt zu überprüfen, ob sie bereits im Hauptzweig von Linus behoben wurde, führten sie selbst eine Korrektur durch. Das Problem ist, dass sie, ohne wirklich darüber nachzudenken, einfach gerührt Definieren der Struktur nach oben, sodass der Aufruf von array_index_nospec, der direkt Schutz vor der Schwachstelle bietet, bei der Definition der Struktur nicht mehr verwendet wird und anstelle der Variablen „index“ immer die Variable „n“ verwendet wird:

int index = n;
if (n < HBP_NUM ){ struct perf_event *bp = thread->ptrace_bps[index];
index = array_index_nospec(index, HBP_NUM);

Source: opennet.ru

Kommentar hinzufügen