Een overhaaste oplossing resulteerde in een onvolledige oplossing voor een Spectre-kwetsbaarheid in de Linux-kernel

Ontwikkelaars van het Grsecurity-project gedeeld een waarschuwend verhaal dat aantoont hoe ondoordachte eliminatie van compilerwaarschuwingen tot kwetsbaarheden in de code kan leiden. Eind mei werd een oplossing voorgesteld voor de Linux-kernel voor een nieuwe exploitatievector van de Spectre-kwetsbaarheid via de ptrace-systeemaanroep.

Tijdens het testen van de patch merkten de ontwikkelaars dat de compiler tijdens het bouwen een waarschuwing weergeeft over het mixen van code en definities (de structuur werd na de code gedefinieerd, waarbij een waarde aan een bestaande variabele werd toegewezen):

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

Linus accepteerde het correctie naar je masterbranch, kwijtgeraakt zijn uit de waarschuwing door de variabeledefinitie naar een if-blok te verplaatsen:

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

In juli werd de oplossing ook geport naar de stabiele kerneltakken 4.4, 4.9, 4.14, 4.19 en 5.2. De beheerders van de stabiele branches kwamen de waarschuwing ook tegen en in plaats van te controleren of het al was opgelost in de master-branch van Linus, voerden ze zelf een oplossing uit. Het probleem is dat ze, zonder er echt over na te denken, gewoon verhuisd het definiëren van de structuur, zodat de aanroep van array_index_nospec, die direct bescherming biedt tegen de kwetsbaarheid, niet langer wordt gebruikt bij het definiëren van de structuur, en in plaats van de variabele "index" wordt altijd de variabele "n" gebruikt:

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

Bron: opennet.ru

Voeg een reactie