Open Source im professionellen Einsatz

Linux Kernel: Angreifer kann Speicher des Kernels lesen

Eine Sicherheitslücke im Treiber-Code des Linux Kernels hat zur Folge, dass ein lokaler Angreifer an sensitive Informationen des Systemspeichers gelangen kann. Der Programmierfehler befindet sich in der »dgnc_mgmt_ioctl()«-Funktion (»drivers/staging/dgnc/dgnc_mgmt.c«-Datei). Dort werden reservierte Bytes der »digi_dinfo«-Struktur nicht korrekt initialisiert. Dieser Speicher ist direkt nach der »dinfo_nboards«-Variable der Struktur angesiedelt:

struct digi_dinfo {
      unsigned long   dinfo_nboards;          /* # boards configured  */
      char            dinfo_reserved[12];            /* for future expansion */
      char            dinfo_version[16];         /* driver version       */
};

Der Programmierfehler in der »dgnc_mgmt_ioctl()«-Funktion zeigt sich in folgendem Code:

case DIGI_GETDD:
{
     /*   
        * This returns the total number of boards
        * in the system, as well as driver version
        * and has space for a reserved entry
     */
     struct digi_dinfo ddi;
     spin_lock_irqsave(&dgnc_global_lock, flags);
     ddi.dinfo_nboards = dgnc_NumBoards;
     sprintf(ddi.dinfo_version, "%s", DG_PART);
     spin_unlock_irqrestore(&dgnc_global_lock, flags);
     if (copy_to_user(uarg, &ddi, sizeof(ddi)))
        return -EFAULT;
        break;
}

Ziel dieses Codes ist es einem Benutzer via I/O zu Erlauben die Zahl von Boards abzufragen. Diese Information wird dabei in der DDI-Variable (»digi_dinfo«-Struktur) zurückgeliefert. Die dinfo_nboards-Variable der Struktur wird dabei in der Zeile

ddi.dinfo_nboards = dgnc_NumBoards;

gesetzt. Danach wird dann noch die »dinfo_version«-Variable in der darauffolgenden Zeile

sprintf(ddi.dinfo_version, "%s", DG_PART);

gesetzt. Dem aufrufenden Benutzer wird anschließend die gesamte DDI-Variable im User-Space übergeben. Allerdings wurde hier vergessen die »dinfo_reserved«-Variable zu initialisieren. Aktuell wird diese Variable noch nicht verwendet, so dass dieser Fehler harmlos anmutet. Das Problem besteht nun aber darin, dass die Variable beliebige Daten des Systemspeichers enthält, die so direkt an den User-Space weitergeleitet werden. Auf diese Weise können auch sensitive Daten in die Hände normaler Benutzer gelangen.

Der Fehler lässt sich leicht korrigieren indem die Variable im Kernel einfach mit Nullen initialisiert wird:

memset(&ddi, 0, sizeof(ddi));

Dieser Patch wurde mittlerweile auch in den Kernel eingespielt, so dass hier keine Gefahr mehr besteht.

comments powered by Disqus

Stellenmarkt

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