Open Source im professionellen Einsatz

Linux Kernel Race-Condition-Fehler

Der Linux Kernel enthält in dem Dateisystem-Code einen kritischen Race-Condition-Fehler. Als Race Condition werden in der Softwareenticklung allgemein Situationen bezeichnet, bei denen die Ausführung von Programmcode vom zeitlichen Verhalten der Einzeloperationen abhängt. Der Begriff geht auf die Vorstellung zurück, dass zwei Signale um die Wette laufen. Grundsätzlich sollten solche Situationen bei der Programmierung vermieden werden, da der Code ansonsten nicht mehr deterministisch ist und so unvorhersagbare Resultat produziert. Race Conditions können entsprechend auch sicherheitsrelevante Folgen haben, weshalb sie in diesem Fall besonders kritisch sind.

Die nun im Kernel entdeckte Race Condition tritt im Zusammenhang verschiedener Caching-Aspekte des Dateisystem-Codes des Kernels auf. Das führt dann zu Race Conditions in den »inotify_handle_event()« und »vfs_rename()«-Funktionen. Die kritische Datenstruktur, welche von der Race Condition betroffen ist, ist jeweils eine dentry-Variable, die verschiedene Dateisystem- und Inode-Informationen speichert. Ein lokaler Angreifer kann diese Sicherheitslücke ausnutzen, um Befehle mit höheren Rechten auszuführen.

Zur Korrektur des Fehlers wurde im »dcache.c«-Code des Kernels nun eine Funktion eingeführt:

void take_dentry_name_snapshot(struct name_snapshot *name, struct dentry *dentry)
{
   spin_lock(&dentry->d_lock);
   if (unlikely(dname_external(dentry))) {
   struct external_name *p = external_name(dentry);
      atomic_inc(&p->u.count);
      spin_unlock(&dentry->d_lock);
      name->name = p->name;
   } else {
      memcpy(name->inline_name, dentry->d_iname, DNAME_INLINE_LEN);
      spin_unlock(&dentry->d_lock);
      name->name = name->inline_name;
   }
}

Diese verwendet nun Spin Locks, um die Race Condition zu vermeiden.

Betroffen sind die Versionen 3.14-rc1 bis 4.12.

comments powered by Disqus

Ausgabe 09/2017

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.