Description
In the Linux kernel, the following vulnerability has been resolved: af_unix: Update last skb marker in manage_oob(). Fahad Alharbi reported that blocking recv(MSG_PEEK) could hog CPU due to OOB skb. In the following cases, manage_oob() skips OOB skb(s) and returns NULL for the last recv(MSG_PEEK): socketpair(AF_UNIX, SOCK_STREAM, 0, sk); 1) skb -> OOB skb -> NULL send(sk[0], "ab", 2, MSG_OOB); recv(sk[1], buf, 0, MSG_PEEK); 2) skb -> consumed OOB skb -> NULL send(sk[0], "ab", 2, MSG_OOB); recv(sk[1], buf, 1, MSG_OOB); recv(sk[1], buf, 0, MSG_PEEK); 3) consumed OOB skb -> OOB skb -> NULL send(sk[0], "a", 1, MSG_OOB); recv(sk[1], buf, 0, MSG_OOB); send(sk[0], "b", 1, MSG_OOB); recv(sk[1], buf, 1, MSG_PEEK); Then, @copied is 0 in unix_stream_read_generic() (zero-length buffer, or non-OOB skb is not yet consumed), and unix_stream_data_wait() is called. However, it returns immediately because @last is not updated in unix_stream_read_generic(), and the thread busy-waits for a new skb. Let's update @last in manage_oob(). For MSG_PEEK, @last is updated with the skipped OOB, and for the non-peek case, @last matches the returned value (when !copied) because OOB is unlinked. Note that manage_oob() is inlined and no stack canary is added.
Affected products
Version statuses are supplied by the assigning organization. Consult the original record for detailed ranges and platform conditions.
Linux Linux
Default version status: unaffected
022d81a709cd553bbe2db8675f8e824f4aee6284 to < bd91dc313afe21e9d6b31ca6a47606a33ca5e35caffected22dd70eb2c3d754862964377a75abafd3167346b to < 0630bfc773d85ac44da05b2c5a037dbbd39301abaffected22dd70eb2c3d754862964377a75abafd3167346b to < f1816b3d7ce80dcf086bb68ff5ae6e09520ca1faaffected22dd70eb2c3d754862964377a75abafd3167346b to < fc62a26493a98a0424d9dae2eb92a1daa1321f65affected22dd70eb2c3d754862964377a75abafd3167346b to < 94fd4debd2e3a69cf93e766c8b328a810c228119affectedae3f9e1221b31b18dbd4c4b85d08574996bbd973affectedba0db4638525b8b054b3d546b45f7e473f477027affected16dc252e7007547a7b72a2c21022ef81fb45e6a3affected6.6.29 to < 6.6.160affected5.15.157 to < 5.16affected6.1.88 to < 6.2affected6.8.8 to < 6.9affected
Linux Linux
Default version status: affected
6.9affected0 to < 6.9unaffected6.6.160 to ≤ 6.6.*unaffected6.12.111 to ≤ 6.12.*unaffected6.18.53 to ≤ 6.18.*unaffected7.2.7 to ≤ 7.2.*unaffected7.3 to ≤ *unaffected
References
- https://git.kernel.org/stable/c/bd91dc313afe21e9d6b31ca6a47606a33ca5e35c ↗
- https://git.kernel.org/stable/c/0630bfc773d85ac44da05b2c5a037dbbd39301ab ↗
- https://git.kernel.org/stable/c/f1816b3d7ce80dcf086bb68ff5ae6e09520ca1fa ↗
- https://git.kernel.org/stable/c/fc62a26493a98a0424d9dae2eb92a1daa1321f65 ↗
- https://git.kernel.org/stable/c/94fd4debd2e3a69cf93e766c8b328a810c228119 ↗