LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性
タイトル LinuxのLinux KernelにおけるNULL ポインタデリファレンスに関する脆弱性
概要

Linuxカーネルにおいて、以下の脆弱性が修正されました。slipでは、rstate配列が存在しないインスタンスでのVJ受信パケットを拒否します。slhc_init()はrslotsが0の場合を「受信圧縮なし」として有効な構成だと認識します。この場合、slhc_init()内の割り当てループはスキップされ、comp-rstateはNULLのままであり、comp-rslot_limitはstruct slcompressのkzallocによって0のまま保持されます。受信ヘルパーはこの構成に対して防御していません。VJヘッダーが明示的な接続IDを保持する場合、slhc_uncompress()はcomp-rstate[x]を参照し、slhc_remember()はパケットのスロット番号とcomp-rslot_limitを比較した後にcs = &comp-rstate[...]を割り当てます。rslot_limitが0であるため、スロット0は範囲チェックを通過してNULLのrstateをデリファレンスします。この構成はPPPを介してツリー内で到達可能です。PPPIOCSMAXCIDでは引数を符号付きintに格納し、(val 16)は算術シフトを使用しています。そのため、0xffff0000を渡すと符号拡張により-1となり、val2 + 1は0となってppp_generic.cはslhc_init(0, 1)を呼び出します。/dev/pppのオープンはns_capable(CAP_NET_ADMIN)で制御されているため、この経路は特権のないユーザ名前空間からも到達可能です。形成不良のVJ状態がインストールされると、任意の受信VJ圧縮または非圧縮フレームがスロット0を選択し、それがsoftirqコンテキストでカーネルクラッシュを引き起こします。これに対しては、rstateを参照する代わりに、そのようなインスタンスの受信側を拒否します。slhc_uncompress()は既存の'bad'ラベルにフォールスルーし、sls_i_errorをインクリメントしてtoss状態に入ります。slhc_remember()も明示的にsls_i_errorをインクリメントし、slhc_toss()を呼び出します。sls_i_runtカウンターはここでは使用されません。送信経路には影響はありません。ユーザ空間からrslotsを選ぶツリー内の唯一の呼び出し(ppp_generic.c)は依然としてtslots = 1を供給しており、slip.cは常にslhc_init(16, 16)を呼び出すため、comp-tstateは有効なままであり、slhc_compress()は引き続き動作します。

想定される影響 ・当該ソフトウェアが扱う情報について、外部への漏えいは発生しません。 ・当該ソフトウェアが扱う情報について、書き換えは発生しません。 ・当該ソフトウェアが完全に停止する可能性があります。 
対策

リリース情報、またはパッチ情報が公開されています。参考情報を参照して適切な対策を実施してください。

公表日 2026年5月27日0:00
登録日 2026年6月29日11:17
最終更新日 2026年6月29日11:17
CVSS3.0 : 警告
スコア 5.5
ベクター CVSS:3.0/AV:L/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H
影響を受けるシステム
Linux
Linux Kernel 2.6.32.70 以上 2.6.33 未満
Linux Kernel 3.10.96 以上 3.11 未満
Linux Kernel 3.12.53 以上 3.13 未満
Linux Kernel 3.14.60 以上 3.15 未満
Linux Kernel 3.18.27 以上 3.19 未満
Linux Kernel 3.2.75 以上 3.3 未満
Linux Kernel 3.4.111 以上 3.5 未満
Linux Kernel 4.1.17 以上 4.2 未満
Linux Kernel 4.3.5 以上 5.10.258 未満
Linux Kernel 5.11 以上 5.15.209 未満
Linux Kernel 5.16 以上 6.1.175 未満
Linux Kernel 6.13 以上 6.18.33 未満
Linux Kernel 6.19 以上 7.0.10 未満
Linux Kernel 6.2 以上 6.6.141 未満
Linux Kernel 6.7 以上 6.12.91 未満
CVE (情報セキュリティ 共通脆弱性識別子)
CWE (共通脆弱性タイプ一覧)
その他
変更履歴
No 変更内容 変更日
1 [2026年06月29日]
  掲載
2026年6月29日11:17

NVD脆弱性情報
CVE-2026-45842
概要

In the Linux kernel, the following vulnerability has been resolved:

slip: reject VJ receive packets on instances with no rstate array

slhc_init() accepts rslots == 0 as a valid configuration, with the
documented meaning of 'no receive compression'. In that case the
allocation loop in slhc_init() is skipped, so comp->rstate stays
NULL and comp->rslot_limit stays 0 (from the kzalloc of struct
slcompress).

The receive helpers do not defend against that configuration.
slhc_uncompress() dereferences comp->rstate[x] when the VJ header
carries an explicit connection ID, and slhc_remember() later assigns
cs = &comp->rstate[...] after only comparing the packet's slot number
to comp->rslot_limit. Because rslot_limit is 0, slot 0 passes the
range check, and the code dereferences a NULL rstate.

The configuration is reachable in-tree through PPP. PPPIOCSMAXCID
stores its argument in a signed int, and (val >> 16) uses arithmetic
shift. Passing 0xffff0000 therefore sign-extends to -1, so val2 + 1
is 0 and ppp_generic.c ends up calling slhc_init(0, 1). Because
/dev/ppp open is gated by ns_capable(CAP_NET_ADMIN), the whole path
is reachable from an unprivileged user namespace. Once the malformed
VJ state is installed, any inbound VJ-compressed or VJ-uncompressed
frame that selects slot 0 crashes the kernel in softirq context:

Oops: general protection fault, probably for non-canonical
address 0xdffffc0000000000: 0000 [#1] SMP KASAN NOPTI
KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007]
RIP: 0010:slhc_uncompress (drivers/net/slip/slhc.c:519)
Call Trace:
<TASK>
ppp_receive_nonmp_frame (drivers/net/ppp/ppp_generic.c:2466)
ppp_input (drivers/net/ppp/ppp_generic.c:2359)
ppp_async_process (drivers/net/ppp/ppp_async.c:492)
tasklet_action_common (kernel/softirq.c:926)
handle_softirqs (kernel/softirq.c:623)
run_ksoftirqd (kernel/softirq.c:1055)
smpboot_thread_fn (kernel/smpboot.c:160)
kthread (kernel/kthread.c:436)
ret_from_fork (arch/x86/kernel/process.c:164)
</TASK>

Reject the receive side on such instances instead of touching rstate.
slhc_uncompress() falls through to its existing 'bad' label, which
bumps sls_i_error and enters the toss state. slhc_remember() mirrors
that with an explicit sls_i_error increment followed by slhc_toss();
the sls_i_runt counter is not used here because a missing rstate is
an internal configuration state, not a runt packet.

The transmit path is unaffected: the only in-tree caller that picks
rslots from userspace (ppp_generic.c) still supplies tslots >= 1, and
slip.c always calls slhc_init(16, 16), so comp->tstate remains valid
and slhc_compress() continues to work.

公表日 2026年5月27日20:16
登録日 2026年5月28日4:10
最終更新日 2026年6月2日2:17
関連情報、対策とツール
共通脆弱性一覧