Un correctif irréfléchi a entraîné un correctif incomplet pour une vulnérabilité Spectre dans le noyau Linux

Développeurs du projet Grsecurity partagé un récit édifiant qui démontre comment l'élimination imprudente des avertissements du compilateur peut conduire à des vulnérabilités dans le code. Fin mai, pour le noyau Linux, un correctif a été proposé pour un nouveau vecteur d'exploitation de la vulnérabilité Spectre via l'appel système ptrace.

Lors du test du correctif, les développeurs ont remarqué que lors de la construction, le compilateur affiche un avertissement concernant le mélange de code et de définitions (la structure a été définie après le code en attribuant une valeur à une variable existante) :

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

Linus a accepté amendement à votre branche principale, se débarrasser de de l'avertissement en encapsulant la définition de la variable dans un bloc if :

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

En juillet, le correctif a également été porté sur les branches stables du noyau 4.4, 4.9, 4.14, 4.19 et 5.2. Les responsables de la version stable ont également rencontré l'avertissement et, au lieu de vérifier s'il était déjà corrigé dans la branche principale de Linus, ils l'ont corrigé eux-mêmes. Le problème est que, sans trop y penser, ils déplacé définition de la structure, afin que l'appel à array_index_nospec, qui assure directement la protection contre la vulnérabilité, ne soit plus utilisé dans la définition de la structure, et à la place de la variable "index", la variable "n" soit toujours utilisée :

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

Source: opennet.ru

Ajouter un commentaire