Eine Sicherheitslücke im Linux-Kernel hat zur Folge, dass ein lokaler Angreifer Speicherbereiche des Kernels auslesen kann. Anfällig hierfür sind Systeme, die das Transparent Inter Process Communication Protokoll im Kernel integriert haben (“CONFIG_TIPC”). In diesem Fall kann ein Angreifer eine Schwachstelle im Mechanismus zum Empfangen von Nachrichten via “recvmsg()” ausnutzen.
Der Programmierfehler befindet sich in der Quelltextdatei “net/tipc/socket.c” in der “set_orig_addr()”-Funktion. Diese initialisiert die Variablen der Struktur “sockaddr_tipc” nicht korrekt, wenn die “sockaddr”-Information aufgebaut wird, da die Union nur teilweise gefüllt wird. Da der Code den Speicher nicht initialisiert, befinden sich an dieser Stelle zufällige Speicherfragmente des Kernels, die durch “recv_msg()”- und “recv_stream()”-Aufrufe an die Benutzerebene des Systems gelangen können. Diese Schwachstelle wurde nun durch ein einfaches “memset()” korrigiert, welches den betroffenen Speicherbereich auf 0 setzt.
Eine zweite Schwachstelle im Zusammenhang mit “recv_msg()” und “recv_stream()” hat ebenfalls zur Folge, das ein Angreifer an 128 Byte Kernelspeicher gelangen kann. Ursache hierfür ist, dass beide Funktionen die Variable “msg_namelen” nicht korrekt auf 0 setzen. Auch dieses Problem ist nun korrigiert worden.
Das gesamte Patch sieht demnach recht einfach aus:
@@ -790,6 +790,7 @@ static void set_orig_addr(struct msghdr *m, struct tipc_msg *msg) if (addr) { addr->family = AF_TIPC; addr->addrtype = TIPC_ADDR_ID;
+ memset(&addr->addr, 0, sizeof(addr->addr)); addr->addr.id.ref = msg_origport(msg); addr->addr.id.node = msg_orignode(msg); addr->addr.name.domain = 0; /* could leave uninitialized */
@@ -904,6 +905,9 @@ static int recv_msg(struct kiocb *iocb, struct socket *sock, goto exit; }
+ /* will be updated in set_orig_addr() if needed */
+ m->msg_namelen = 0;
+ timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT); restart:
@@ -1013,6 +1017,9 @@ static int recv_stream(struct kiocb *iocb, struct socket *sock, goto exit; }
+ /* will be updated in set_orig_addr() if needed */
+ m->msg_namelen = 0;
+ target = sock_rcvlowat(sk, flags & MSG_WAITALL, buf_len); timeout = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
Die Änderung initialisiert die Variablen korrekt, indem sie sie auf 0 setzt. Damit ist die Sicherheitslücke behoben, und ein Angreifer ist nicht mehr in der Lage, Speicherbereiche des Kernels zu lesen.
Betroffen sind die Kernelversionen vor 3.10-rc7.

