{"id":29312,"date":"2026-09-25T20:32:24","date_gmt":"2026-09-25T12:32:24","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98158"},"modified":"2026-09-25T20:32:24","modified_gmt":"2026-09-25T12:32:24","slug":"cve-2026-98158","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-98158","title":{"rendered":"CVE-2026-98158 &#8211; In the Linux kernel, the following vulnerability has been resolved:\n\nppp_async: drop the e"},"content":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ppp_async: drop the errored frame instead of resetting its headroom<\/p>\n<p>ppp_receive_nonmp_frame() prepends a two-byte direction tag before running<br \/>\nthe pass\/active BPF filters:<\/p>\n<p>\t*(__be16 *)skb_push(skb, 2) = htons(PPP_FILTER_INBOUND_TAG);<\/p>\n<p>Nothing on the receive path guarantees those two bytes of headroom. The<br \/>\nframe-error path in ppp_async&#8217;s process_input_packet() resets a reused skb&#8217;s<br \/>\nheadroom to zero while claiming to restore it to a freshly allocated state &#8211;<br \/>\nbut a fresh skb from dev_alloc_skb() carries NET_SKB_PAD:<\/p>\n<p>\terr:<br \/>\n\t\tif (skb) {<br \/>\n\t\t\t\/* make skb appear as freshly allocated *\/<br \/>\n\t\t\tskb_trim(skb, 0);<br \/>\n\t\t\tskb_reserve(skb, &#8211; skb_headroom(skb));<br \/>\n\t\t}<\/p>\n<p>ap-&gt;rpkt still points at that skb, so the next frame is reassembled into it<br \/>\nwith no headroom at all. A peer that sends a bad-FCS frame followed by one<br \/>\nbeginning ff 03 then leaves a single byte of headroom by the time the filter<br \/>\ntag is pushed, which lands one byte below skb-&gt;head:<\/p>\n<p>  skbuff: skb_under_panic: len:49 put:2 head:ffff888003c10000<br \/>\n          data:ffff888003c0ffff tail:0x30 end:0x640 dev:<br \/>\n  kernel BUG at net\/core\/skbuff.c:214!<br \/>\n  RIP: 0010:skb_panic+0x13e\/0x230<br \/>\n  Call Trace:<br \/>\n   skb_push+0xbd\/0x100<br \/>\n   ppp_receive_nonmp_frame+0x48a\/0x1d10<br \/>\n   ppp_input+0x4e9\/0x2f80<br \/>\n   ppp_async_process+0x2a\/0xe0<br \/>\n   tasklet_action_common+0x20f\/0x8a0<br \/>\n   handle_softirqs+0x18e\/0x590<br \/>\n  Kernel panic &#8211; not syncing: Fatal exception in interrupt<\/p>\n<p>Zeroing the headroom violates the NET_SKB_PAD guarantee that dev_alloc_skb()<br \/>\ngives the rest of the receive path. Besides the filter panic above, when CCP<br \/>\ncompression is enabled ppp_decompress_frame() hands skb-&gt;data &#8211; 2 to<br \/>\n-&gt;decompress()\/-&gt;incomp(), which then reads out of bounds before skb-&gt;head<br \/>\nfor the same reason.<\/p>\n<p>Rather than restore the headroom, drop the errored frame &#8211; as ppp_synctty<br \/>\nalready does on its error path &#8211; and clear ap-&gt;rpkt so the next frame is<br \/>\nreassembled into a fresh skb with proper headroom. This is simpler and fixes<br \/>\nboth the filter under-panic and the CCP out-of-bounds read.<\/p>\n<p>The original V1 of this patch made room in ppp_receive_nonmp_frame() with<br \/>\nskb_cow_head(); Eric pointed out that fixing the root cause in the transport<br \/>\nis the right approach.<\/p>\n<p>Found by fuzzing the PPP receive path with a mutating peer on a pty; it is an<br \/>\ninteresting (remote) DoS: root configures PPP, the peer supplies two crashing<br \/>\nframes. The reproducer (repro-ppp-skb.c, unchanged from v1) panics in about a<br \/>\nsecond, and returns cleanly with this applied.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In the Linux kernel, the following vulnerability has been resolved:<\/p>\n<p>ppp_async: drop the errored frame instead of resetting its headroom<\/p>\n<p>ppp_receive_nonmp_frame() prepends a two-byte direction tag be<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-29312","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/29312","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=29312"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=29312"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=29312"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}