Kernel: Schwachstelle in Netlink-Code 

 

Eine Sicherheitslücke im Linux Kernel hat zur Folge, dass ein lokaler Angreifer höhere Rechte auf dem System erlangen kann.

Ursache der Schwachstelle ist ein Programmierfehler beim Verarbeiten von bestimmten Netlink-Nachrichten. Der führt dazu, dass Avahi und der Network Manager gefälschte Netlink-Nachrichten akzeptieren. Genauer gesagt können Nachrichten des Typs “SCM_CREDENTIALS” gefälscht werden. Diese dienen unter Unix dazu, Sicherheitskontexte mitzuteilen.

Der Programmierfehler verteilt sich über drei Kernel-Dateien: “include/net/scm.h”, “net/netlink/af_netlink.c” und “net/unix/af_unix.c”. Der Patch nimmt dabei nur minimale Änderungen vor, um das Sicherheitsleck zu stopfen. In “scm.h” erfolgt folgende Korrektur:

static __inline__ int scm_send(struct socket *sock, struct msghdr *msg,
- struct scm_cookie *scm)
+ struct scm_cookie *scm, bool forcecreds) { memset(scm, 0, sizeof(*scm));
+ if (forcecreds)
+ scm_set_cred(scm, task_tgid(current), current_cred()); unix_get_peersec_dgram(sock, scm); if (msg->msg_controllen <= 0)

In dem alten Code wurde hier lediglich scm via “memset()” auf 0 gesetzt, aber die Credentials nicht korrekt initialisiert. Dies erledigt nun ein “scm_set_cred()”-Aufruf explizit, wenn es durch das “forcecreds”-Flag erzwungen wurde. In “af_netlink.c” und “af_unix.c” zieht diese kleine Änderung lediglich eine Modifikation des “scm_send()”-Aufrufs nach sich:

 

- err = scm_send(sock, msg, siocb->scm);
+ err = scm_send(sock, msg, siocb->scm, true);

 

Mit diesen Änderungen am Kernel-Code ist die Sicherheitslücke gestopft und die Attacke nicht mehr möglich.

Nach oben