
ASUS Router infosvr UDP Broadcast root-Befehlsausführung
Mehrere Modelle von ASUS-Routern enthalten einen Dienst namens infosvr, der auf UDP-Broadcast-Port 9999 auf der LAN- oder WLAN-Schnittstelle lauscht. Er wird von einem der ASUS-Tools verwendet, um die Router-Konfiguration zu erleichtern, indem Router im lokalen Subnetz automatisch gefunden werden. Dieser Dienst läuft mit root-Rechten und enthält eine Schwachstelle zur nicht authentifizierten Kommandoausführung. Der Quellcode dieses Dienstes sowie des restlichen Routers ist auf der ASUS-Support-Website verfügbar.
Die dieser Schwachstelle zugewiesene CVE-Kennung ist CVE-2014-9583 (leider am Ende doch nicht CVE-2014-10000 :-/).
Derzeit gelten alle bekannten Firmware-Versionen für die betroffenen Router (RT-AC66U, RT-N66U, usw.) als verwundbar. Die Tests wurden gegen 3.0.0.376.2524-g0013f52 durchgeführt.
Die folgenden Router/Firmware-Versionen sind nachweislich verwundbar:
| Router | Firmware-Version | Verifiziert von |
|---|---|---|
| RT-N66U | 3.0.0.4.376_1071-g8696125 | Friedrich Postelstorfer |
| RT-AC87U | 3.0.0.4.378_3754 | David Longenecker |
| RT-N56U | 3.0.0.4.374_5656 | @argilo |
| RT-AC68U | 3.0.0.4.376_3626-g9a8323e | @Arie |
| DSL-N55U | 3.0.0.4.374_4422-gc83c78f | @S2- |
| DSL-AC68U | 3.0.0.4.376_2158-g340202b | @magJ, @gitFurious |
| RT-AC66R | 3.0.0.4.376_2524-g0013f52 | @asgh |
| RT-AC66R | 3.0.0.4.376_3602 | @facerolling |
| RT-AC55U | 3.0.0.4.376_6587-gaa506e9 | @pellaeon |
| RT-N12HP_B1 | 3.0.0.4.374_1327 | @vittee |
| RT-N16 | 3.0.0.4.220 | @xorrbit |
Darüber hinaus sind Router mit Firmware auf Basis des von der Community unterstützten asuswrt-merlin vor Version 376.49_5 verwundbar.
Router mit Firmware-Revisionen, die am oder nach dem 12. Januar 2015 veröffentlicht wurden, sollten nicht betroffen sein. Die folgende Tabelle erfasst Meldungen nicht betroffener Router/Firmware-Versionen.
| Router | Firmware-Version | Verifiziert von |
|---|---|---|
| RT-AC66R | 3.0.0.4.376_3754-g5ef7c1f | @asgh |
| RT-N12HP_B1 | 3.0.0.4.376_3754-g5ef7c1f | @vittee |
Betrachten Sie den folgenden Auszug aus dem ASUSWRT-Merlin-Projekt, einem erweiterten Fork des ASUS-Codes. Sie können die Datei in voller Länge (für extra Lulz empfohlen) hier ansehen.
177 char *processPacket(int sockfd, char *pdubuf)
178 {
...
202 phdr = (IBOX_COMM_PKT_HDR *)pdubuf;
...
207 if (phdr->ServiceID==NET_SERVICE_ID_IBOX_INFO &&
208 phdr->PacketType==NET_PACKET_TYPE_CMD)
209 {
...
Die Funktion processPacket wird aufgerufen, nachdem ein Paket von INFO_PDU_LENGTH (512) Bytes empfangen wurde. Der spezifisch verwundbare Codepfad ist main->processReq->processPacket. Der Dienst castet das Paket dann in eine Struktur und prüft, ob die Felder ServiceID und PacketType den erwarteten Werten entsprechen.
Der folgende Block enthält die vermutete Grundursache dieser Schwachstelle.
222 if (phdr->OpCode!=NET_CMD_ID_GETINFO && phdr->OpCode!=NET_CMD_ID_GETINFO_MANU)
223 {
224 phdr_ex = (IBOX_COMM_PKT_HDR_EX *)pdubuf;
225
226 // Check Mac Address
227 if (memcpy(phdr_ex->MacAddress, mac, 6)==0)
228 {
229 _dprintf("Mac Error %2x%2x%2x%2x%2x%2x\n",
230 (unsigned char)phdr_ex->MacAddress[0],
231 (unsigned char)phdr_ex->MacAddress[1],
232 (unsigned char)phdr_ex->MacAddress[2],
233 (unsigned char)phdr_ex->MacAddress[3],
234 (unsigned char)phdr_ex->MacAddress[4],
235 (unsigned char)phdr_ex->MacAddress[5]
236 );
237 return NULL;
238 }
239
240 // Check Password
241 //if (strcmp(phdr_ex->Password, "admin")!=0)
242 //{
243 // phdr_res->OpCode = phdr->OpCode | NET_RES_ERR_PASSWORD;
244 // _dprintf("Password Error %s\n", phdr_ex->Password);
245 // return NULL;
246 //}
247 phdr_res->Info = phdr_ex->Info;
248 memcpy(phdr_res->MacAddress, phdr_ex->MacAddress, 6);
249 }
Der Block beginnt damit, ein paar OpCode-Werte auszuschließen, die vermutlich konstruktionsbedingt keine Authentifizierung erfordern. Anschließend ruft er memcpy auf und prüft auffälligerweise den Rückgabewert gegen Null. Dies ist ein starkes Indiz dafür, dass der Autor eigentlich memcmp verwenden wollte. Allerdings ist die Kenntnis der MAC-Adresse des Geräts selbst dann kaum eine ausreichende Authentifizierung, wenn diese Prüfung korrekt implementiert wäre.
Der folgende Block ist auskommentiert, zeigt aber, dass der Autor irgendwann mit der Prüfung eines Passworts experimentiert hat. Wobei in diesem Fall das Passwort fest als „admin“ kodiert war.
Weiter geht es mit der folgenden switch-Anweisung, die die Verarbeitung anhand des übergebenen OpCode weiterleitet.
251 switch(phdr->OpCode)
252 {
...
428 case NET_CMD_ID_MANU_CMD:
429 {
430 #define MAXSYSCMD 256
431 char cmdstr[MAXSYSCMD];
432 PKT_SYSCMD *syscmd;
...
440 syscmd = (PKT_SYSCMD *)(pdubuf+sizeof(IBOX_COMM_PKT_HDR_EX));
...
443 if (syscmd->len>=MAXSYSCMD) syscmd->len=MAXSYSCMD;
444 syscmd->cmd[syscmd->len]=0;
445 syscmd->len=strlen(syscmd->cmd);
446 fprintf(stderr,"system cmd: %d %s\n", syscmd->len, syscmd->cmd);
447 #if 0
...
512 #endif
513 {
514 sprintf(cmdstr, "%s > /tmp/syscmd.out", syscmd->cmd);
515 system(cmdstr);
Wenn ein Angreifer den OpCode-Wert NET_CMD_ID_MANU_CMD angibt, verarbeitet der vorhergehende Block das Paket, indem er es in eine PKT_SYSCMD-Struktur castet. Somit werden sämtliche Member von syscmd vollständig vom Angreifer kontrolliert. Bevor der Autor sich darum kümmert (zwinker), die Befehlszeichenkette mit NUL abzuschließen, führt er den Befehl in Zeile 514 aus. Nach der Ausführung des Befehls wird die Ausgabe aus der temporären Datei gelesen und an die Quelladresse des auslösenden Pakets zurückgesendet.
Endbenutzer: Aktualisieren Sie die Firmware auf Revision 3.0.0.4.376.3754 oder neuer. Es ist wichtig zu beachten, dass die Funktion „Auf Updates prüfen“ des Routers möglicherweise nicht ordnungsgemäß funktioniert. Prüfen Sie manuell die Version der installierten Firmware und laden Sie bei älteren Versionen die neue Firmware herunter bzw. installieren Sie diese.
ASUS/Merlin: Entfernen Sie die Funktion zur Remote-Kommandoausführung aus diesem Dienst. Selbst wenn sie durch eine starke Authentifizierung abgesichert wäre, ist das Senden eines Passworts an das gesamte lokale Netzwerk nicht wirklich wünschenswert. Wenn Kommandoausführung wirklich gewünscht ist, sollte sie über SSH oder einen ähnlichen sicheren Mechanismus bereitgestellt werden.