Nachdem mich AVM noch zweimal (durchaus verbindlich und freundlich) per E-Mails um eine Verschiebung gebeten hatte, ist nun aber der Punkt erreicht, wo die relevanten Modelle (außer der 6490) mit einer neuen Firmware versorgt wurden und wer bisher seine Firmware nicht aktualisiert hat, wird das sicherlich ohne triftigen Grund auch in absehbarer Zeit nicht machen.
Damit habe ich ins Repository zwei Dateien für die Demonstration der weiter vorne beschriebenen Lücke aufgenommen, einmal ein Shell-Skript und einmal eine HTML-Datei, die das Ausnutzen der Schwachstelle über Javascript (und damit eben potentiell auch über einen Browser beim Benutzer, der irgendeine Werbung in ein IFRAME lädt) zeigt.
Zu den Folgen habe ich schon genug geschrieben und angesichts des bisher hier Geschriebenen ist es schon fast ein wenig peinlich, wie simpel so ein Request aufgebaut sein kann - das war aber beim "webcm" auch nicht viel anders.
Ich selbst bin im Zuge diverser Versuche, eine FRITZ!Box aus dem LAN zum Absturz und damit zum Neustart zu bringen, irgendwann vor > 9 Monaten auch an der Stelle vorbeigekommen, wo ich versuchte, das 'firmwarecfg'-CGI mit mehr oder weniger falschen/unvollständigen Daten zu Fehlfunktionen (und in der Folge den "ctlmgr" als Host-Prozess zu einem Absturz mit nachfolgendem Neustart über den Watchdog) zu veranlassen. Da sich aus einem solchen Request ja auch nicht unmittelbar ein Absturz ergibt, fiel mir das "Hängenbleiben" entsprechender Requests auch erst auf, als ich irgendwann mal nach einem solchen Test einen Blick in die Prozess-Liste der getesteten FRITZ!Box warf und da immer noch eine Instanz von 'firmwarecfg' aktiv war, obwohl doch meine Aufrufe mit mehr oder weniger sinnvollen Daten lange beendet waren.
Warum will man überhaupt eine FRITZ!Box mutwillig zum Absturz bringen? Ich betone ja gerne bei diversen Fehlern in der Firmware immer aufs Neue, daß eine FRITZ!Box einem Angreifer beim Start des Systems (genauer beim Start des Bootloaders) vollkommen schutzlos ausgeliefert ist, wenn der Angreifer nur an eine kabelbasierte Ethernet-Verbindung zu so einer startenden Box gelangt. Da stellt natürlich jemand, dem man so eine "Voraussetzung" für einen Angriff erläutert, irgendwann zwangsläufig auch die Frage, wie man so einen Neustart denn auslösen will und daß das damit doch alles weiterhin nur reine Theorie wäre, was man da so erzählt. Also geht man irgendwann hin und versucht, die Box (zuerst von der LAN-Seite) zu einem Absturz zu bewegen.
Das geht sicherlich noch auf so manchem anderen Weg, aber aus einem Programm, was irgendwelche Dienste mit falschen UDP-Paketen füttert und sie so zu Fehlfunktionen verleitet, ist nun einmal kein Angriff (auch nicht in der Theorie oder nur sehr schwer zumindest) über einen Browser und irgendwelche eingeschleuste Werbung abzuleiten. So ein DoS-Angriff ist nun auch noch kein Absturz, aber mit entsprechender Hartnäckigkeit des Angreifers wird der Besitzer früher oder später gezwungen sein, selbst einen Neustart auszuführen. Lauert dann der Schadcode irgendwo im LAN auf einem kabelgebundenen Gerät nur auf diesen Augenblick, hat der Angreifer auch mit so einem DoS-Angriff sein Ziel erreicht.
Sonstige Schäden (collateral damage ;-)) aus einem DoS-Angriff sollten eigentlich nicht entstehen, ich habe bisher auch von AVM keine Information erhalten, daß auf diesem Wege (mit ausgefeilteren Parametern für den CGI-Aufruf) die (externe) Ausführung fremder Kommandos möglich wäre. Die Box ist halt (bei entsprechender Anzahl von TLS-Requests) von extern nicht mehr zu erreichen (da geht ja theoretisch jeder Zugriff über TLS), die Funktionen von "firmwarecfg" sind bereits mit einem einzelnen Request für die nächsten 40 Minuten nicht mehr erreichbar (dazu gehört z.B. der Im- und Export von Einstellungen u.v.m.) und bei ausreichend großer Anzahl von Verbindungsversuchen aus dem LAN scheitern weitere TCP-Verbindungen - mithin ist dann auch das GUI nicht mehr erreichbar und auch bei der Kindersicherung kann es Probleme geben (zumindest mit Sperranzeigen) - genauso natürlich mit SIP-Verbindungen, die auf TCP basieren.
Aber da hilft es dann, auf eine Version >= 06.80 zu aktualisieren, dort hat AVM das Problem behoben. Zwar wird das nicht ausdrücklich kommuniziert, aber es ist (zumindest bei den von mir getesteten Modellen) so. Sollte also jemand feststellen, daß seine FRITZ!Box nicht mehr reagieren will, obwohl die "Routing-Funktion" noch problemlos arbeitet, dann käme zumindest in der Theorie ein solcher DoS-Angriff auch als Ursache in Betracht. Ich kenne auch keine Methode, einen solchen Angriff auf einer Box ohne Shell-Zugang zu diagnostizieren ... die augenfällige Variante mit den Support-Daten scheitert in der Regel dann daran, daß deren Abruf ebenfalls über "firmwarecfg" erfolgt und das ja nicht funktioniert - mithin bliebe vielleicht (bei einer extern angegriffenen Box) noch diese "Verweigerung" der Support-Daten als Indiz übrig, daß mit "firmwarecfg" etwas nicht stimmt.
Über die eigentlichen Ursachen dieses "Hängenbleibens" kann ich auch nichts Definitives sagen ... schaut man sich den Zustand der File-Handle so einer aktiven Instanz von 'firmwarecfg' an, würde ich am ehesten darauf tippen, daß dort ein Lesen von STDIN versucht wird (wo ein CGI-Programm ja seine Eingaben vom HTTP-Server serviert bekommt, wenn es sich um einen POST-Request handelt, was hier der Fall ist) und da halt keine weiteren Daten vorliegen.
Angesichts der normalerweise an dieser Stelle noch erforderlichen SID als Nachweis der Berechtigung für den Zugriff, würde ich tippen (mehr ist es aber auch nicht), daß hier versucht wird, diese fehlende SID zu lesen und das halt zum Blockieren (für dieses CGI-Binary, das zu allem Überfluß offenbar auch noch ein Singleton ist) führt.
Andere Parameter-Kombinationen haben (iirc) ebenfalls noch funktioniert ... aber im Zuge der Dokumentation hatte ich mich dann irgendwann auf diesen "reboot"-Parameter beim Senden festgelegt und gar nicht mehr weiter getestet, welche anderen Kombinationen da ebenfalls noch erfolgreich waren - dieses "reboot" ist allerdings tatsächlich eine mögliche, legitime Operation für "firmwarecfg"; es ist genau das, was bei einem Neustart über das GUI aufgerufen würde (halt mit einer SID als "sid" im Request).
Bei einer 7580 mit 06.54 sieht das so aus für eine solche Instanz von "firmwarecfg":
Code:
# [B][COLOR="#0000FF"]sed -n -e p /proc/$(pidof firmwarecfg)/environ[/COLOR][/B]
PATH=/bin:/usr/bin
SERVER_SOFTWARE=AVM websrv
GATEWAY_INTERFACE=CGI/1.1
SERVER_PROTOCOL=HTTP/1.1
REQUEST_METHOD=POST
PATH_INFO=/cgi-bin/firmwarecfg
PATH_TRANSLATED=/usr/www/html/cgi-bin/firmwarecfg
SCRIPT_NAME=/cgi-bin/firmwarecfg
REMOTE_ADDR=192.168.178.2
REMOTE_PORT=60720
SERVER_ADDR=192.168.178.1
SERVER_PORT=80
HTTP_USER_AGENT=handcrafted_exploit/0.1 (shell)
HTTP_ACCEPT=*/*
CONTENT_TYPE=application/x-www-form-urlencoded
HTTP_HOST=192.168.178.1
CONTENT_LENGTH=6
TZ=CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00
OEM=1und1
Country=049
CONFIG_FON_HD=y
CONFIG_TIMERCONTROL=y
CONFIG_USB_STORAGE_USERS=n
CONFIG_WLAN=y
CONFIG_WLAN_RADIOSENSOR=y
CONFIG_AB_COUNT=2
CONFIG_EWETEL_SMARTMETER=n
CONFIG_FON_IPPHONE=y
CONFIG_I2C=n
CONFIG_LFS=y
CONFIG_LTE=n
CONFIG_PERL=n
CONFIG_USB_HOST_AVM=n
CONFIG_UTF8_FULL=y
CONFIG_VPN_CERTSRV=n
CONFIG_WLAN_TXPOWER=y
CONFIG_BETA_RELEASE=0
CONFIG_ATA_NOPASSTHROUGH=n
CONFIG_CAPI_NT=y
CONFIG_JFFS2=n
CONFIG_NFS_CLI=n
CONFIG_ONLINEHELP_URL=http://help.avm.de/fritzbox.php?hardware=225&oem=1und1&language=de&country=049&version=153.06.54&subversion=
CONFIG_T38=y
CONFIG_UDEV=y
CONFIG_WLAN_OPENWIFI=n
CONFIG_CODECS_IN_PCMROUTER=y
CONFIG_KIDS_CONTENT=n
CONFIG_LED_EVENTS=y
CONFIG_NFS=n
CONFIG_STOREUSRCFG=y
CONFIG_USB_TETHERING=y
CONFIG_CAPI_XILINX=y
CONFIG_NEUERUL=y
CONFIG_SQLITE=y
CONFIG_UBIK2=n
CONFIG_WLAN_ATH_NM_MAGPIE=n
CONFIG_YAFFS2=n
CONFIG_CHRONY=y
CONFIG_CONFIGD=y
CONFIG_DSL_UR8=n
CONFIG_FONGUI2=y
CONFIG_WEBGUI_PASS=y
CONFIG_FONQUALITY=y
CONFIG_FTP=y
CONFIG_GPS=n
CONFIG_SQLITE_VIDEO=y
CONFIG_TAM_ONRAM=n
CONFIG_USB=n
CONFIG_WLAN_WDS_NO_SLAVE=n
CONFIG_ENVIRONMENT_PATH=/proc/sys/urlader
CONFIG_MULTI_COUNTRY=n
CONFIG_NCURSES=n
CONFIG_PRODUKT_NAME=FRITZ!Box 7580 (UI)
CONFIG_VDSL=y
CONFIG_DECT_AUDIOD=y
CONFIG_DECT_NO_EMISSION=y
CONFIG_USB_HOST_TI=n
CONFIG_ASSIST=y
CONFIG_AVMIPC_REMOTE_IP=
CONFIG_HOME_AUTO=y
CONFIG_LED_NO_DSL_LED=y
CONFIG_NTFS=y
CONFIG_PROV_DEFAULT=n
CONFIG_SWAP=n
CONFIG_CAPI_POTS=n
CONFIG_DIAGNOSE_LEVEL=0
CONFIG_USB_INTERNAL_HUB=n
CONFIG_USB_STORAGE=y
CONFIG_VERSION=06.54
CONFIG_SUBVERSION=
CONFIG_MANUAL_URL=https://assets.avm.de/manual/?hardware=225&oem=1und1&language=de&country=049&version=153.06.54&subversion=
CONFIG_SAMBA=y
CONFIG_USB_XHCI=y
CONFIG_WEBSRV=y
CONFIG_BLUETOOTH_CTP=n
CONFIG_DECT_MONI_EX=y
CONFIG_RELEASE=1
CONFIG_BUILDNUMBER=41655
CONFIG_DECT_FW_ULE=n
CONFIG_FIRMWARE_URL=http://www.avm.de/fritzbox-firmware-update.php?hardware=225&oem=1und1&language=de&country=049
CONFIG_FLASH_DOUBLE=y
CONFIG_PRODUKT=Fritz_Box_HW225
CONFIG_SERVICEPORTAL_URL=http://www.avm.de/fritzbox-service-portal.php?hardware=225&oem=1und1&language=de&country=049&version=153.06.54&subversion=
CONFIG_ROMSIZE=0-nand_size=512MB
CONFIG_ACCESSORY_URL=http://www.avm.de/fritzbox_apps.php?hardware=225&oem=1und1&language=de&country=049&version=153.06.54&subversion=
CONFIG_BUTTON=y
CONFIG_MAILD=y
CONFIG_NO_EXTENDED_CODECS=n
CONFIG_TR064=y
CONFIG_VERSION_MAJOR=153
CONFIG_XILINX=y
CONFIG_BOXLOWRESSOURCES=n
CONFIG_CXX=n
CONFIG_DOCSIS_PCD_NO_REBOOT=n
CONFIG_FIBER=n
CONFIG_MEDIASRV_MOUNT=n
CONFIG_NQOS=y
CONFIG_ONLINEHELP=y
CONFIG_WLAN_ATH_NM_COMBO=n
CONFIG_GDB=n
CONFIG_USB_PRINT_SERV=y
CONFIG_VPN=y
CONFIG_ETH_COUNT=5
CONFIG_UPNP=y
CONFIG_CAPI=y
CONFIG_USB_LTE=n
CONFIG_WEBDAV=y
CONFIG_DSL_2DP=n
CONFIG_MAILER=n
CONFIG_TR069=y
CONFIG_WLAN_GUEST=y
CONFIG_WLAN_STANDALONE_MODE=n
CONFIG_CDROM_FALLBACK=n
CONFIG_DECT_HOME_HANFUN=n
CONFIG_FAXSEND=y
CONFIG_ONLINEPB=y
CONFIG_PLC_DETECTION=y
CONFIG_PLUGINV2=n
CONFIG_USB_GSM=y
CONFIG_WLAN_WEATHER_CAC=n
CONFIG_DECT=y
CONFIG_FHEM=n
CONFIG_USB_GSM_VOICE=y
CONFIG_WLAN_WDS=n
CONFIG_CAPI_UBIK=n
CONFIG_DECT_PICTURED=y
CONFIG_DSL_BONDING=n
CONFIG_FAXSUPPORT=y
CONFIG_INSTALL_TYPE=mips34_512MB_grx5_dect446_5geth_2ab_isdn_nt_2usb_host3_2wlan11n_hw225_27364
CONFIG_MTD_MAILSEND=y
CONFIG_NAND=y
CONFIG_RAMDISK=n
CONFIG_TELEKOM_KOFFER=n
CONFIG_WLAN_1130TNET=n
CONFIG_CONFIGSPACE_ONNAND=n
CONFIG_DECT_HOME=y
CONFIG_HOME_AUTO_NET=y
CONFIG_IGD=y
CONFIG_MULTI_LANGUAGE=n
CONFIG_QOS_METER=y
CONFIG_SRTP=n
CONFIG_WLAN_ATH_NM_PCI=y
CONFIG_WLAN_MADWIFI=y
CONFIG_DECT_14446=y
CONFIG_DECT_ONOFF=n
CONFIG_EXT2=y
CONFIG_FAX2MAIL=y
CONFIG_MEDIASRV=y
CONFIG_OEM_DEFAULT=avm
CONFIG_PLUGINV2_WEBCM_INTERPRETER=n
CONFIG_UNIQUE_PASSWD=n
CONFIG_WLAN_WMM=y
CONFIG_ATA=y
CONFIG_AUDIO=n
CONFIG_BASIS=y
CONFIG_BOX_FEEDBACK=y
CONFIG_ERR_FEEDBACK=y
CONFIG_EXT3=y
CONFIG_HOMEI2C=n
CONFIG_MYFRITZ=y
CONFIG_DSL_MULTI_ANNEX=n
CONFIG_ECO=y
CONFIG_IPV6=y
CONFIG_SQLITE_BILDER=y
CONFIG_URLADER_UPDATE=n
CONFIG_VLYNQ=n
CONFIG_VOIP_ENUM=n
CONFIG_WLAN_1350TNET=n
CONFIG_INETD=y
CONFIG_LOGD=n
CONFIG_STRACE=y
CONFIG_USB_HOST_INTERNAL=n
CONFIG_CDROM=n
CONFIG_GDB_FULL=n
CONFIG_GFAST=n
CONFIG_HOSTNAME=fritz.box
CONFIG_MEDIACLI=y
CONFIG_NOTELNETD=n
CONFIG_REMOTE_HTTPS=y
CONFIG_SPEEDSTEP=y
CONFIG_USB_WLAN_AUTH=y
CONFIG_UTF8=y
CONFIG_VOL_COUNTER=y
CONFIG_WLAN_EACS=y
CONFIG_WLAN_IPTV=y
CONFIG_AUTOUPDATE=y
CONFIG_DOCSIS_CLI=n
CONFIG_ECO_SYSSTAT=y
CONFIG_IPERF=y
CONFIG_LIB_MATH=y
CONFIG_USB_HOST=y
CONFIG_USB_STORAGE_SPINDOWN=y
CONFIG_AURA=y
CONFIG_DOCSIS=n
CONFIG_MAILER2=y
CONFIG_NETPERF=y
CONFIG_PLUGINV2_WLAN=n
CONFIG_WLAN_TCOM_PRIO=n
CONFIG_CAPI_TE=n
CONFIG_DECT2=y
CONFIG_KIDS=y
CONFIG_MTD_RSS=y
CONFIG_SESSIONID=y
CONFIG_WEBCM_INTERPRETER=y
CONFIG_WLAN_HOTSPOT=y
CONFIG_WLAN_WDS2=y
CONFIG_UPDATEFEATURE_URL=https://www.avm.de/fritzbox_firmware-features.php?hardware=225&oem=1und1&language=de&country=049&version=153.06.54&subversion=
CONFIG_ANNEX=B
CONFIG_DECT_MONI=y
CONFIG_LABOR_DSL=n
CONFIG_SOCAT=n
CONFIG_WEBUSB=y
CONFIG_WLAN_WPS=y
CONFIG_BUILDTYPE=1
CONFIG_NEWSLETTER_URL=http://www.avm.de/newsletter?hardware=225&oem=1und1&language=de&country=049&version=153.06.54&subversion=
CONFIG_DSL_VENDORID=
CONFIG_LINEARTV=n
CONFIG_MINI=n
CONFIG_PLC=n
CONFIG_ETH_GBIT=y
CONFIG_TAM_MODE=1
CONFIG_UBI=y
CONFIG_VLYNQ0=0
CONFIG_WLAN_GREEN=y
CONFIG_CAPI_MIPS=n
CONFIG_FONBOOK2=y
CONFIG_GDB_SERVER=n
CONFIG_MTD_MAIL=y
CONFIG_PPA=y
CONFIG_VLYNQ1=0
CONFIG_WLAN_BRCM=n
CONFIG_WLAN_SAVEMEM=n
CONFIG_ATA_FULL=n
CONFIG_BLUETOOTH=n
CONFIG_LLTD=n
CONFIG_LUA=y
CONFIG_MORPHSTICK=n
CONFIG_NAS=y
CONFIG_NFS_SRV=n
CONFIG_SDK=n
CONFIG_SPEECH_FEEDBACK=y
CONFIG_TAM=y
CONFIG_WLAN_ATH_NM_OFFLOAD=n
CONFIG_WLAN_ATH_NM_USB=n
CONFIG_DECT_CATIQ20=n
CONFIG_DSL=y
CONFIG_DSL_VRX318=y
CONFIG_FON=y
CONFIG_IPTV_4THOME=y
CONFIG_LIBZ=y
CONFIG_RAMSIZE=512
ANNEX=B
CLIENTCONNECTION=192.168.178.2:60720
HTTPS=off
Language=de
WEBDIR_PATH=/usr/www/html
HWRevision=225
# [COLOR="#0000FF"][B]sed -n -e p /proc/$(pidof firmwarecfg)/cmdline[/B][/COLOR]
/cgi-bin/firmwarecfg
# [COLOR="#0000FF"][B]sed -n -e p /proc/$(pidof firmwarecfg)/wchan[/B][/COLOR]
[COLOR="#FF0000"][B]unix_stream_recvmsg[/B][/COLOR]
# [COLOR="#0000FF"][B]ls -l /proc/$(pidof firmwarecfg)/fd[/B][/COLOR]
lrwx------ 1 root root 64 Apr 11 03:52 0 -> socket:[366877]
lrwx------ 1 root root 64 Apr 11 03:52 1 -> socket:[366877]
lrwx------ 1 root root 64 Apr 11 03:52 2 -> socket:[366877]
"wchan" gibt ja den Namen der Kernel-Funktion aus, in der ein Prozess "schlafengelegt" wurde und das ist hier "unix_stream_recvmsg". Basierend darauf, daß es hier nur drei mögliche Streams gäbe und nur STDIN (fd=0) für den "Empfang" taugen sollte, bin ich eben zu der o.a. Theorie gelangt (ohne irgendetwas wirklich zu tracen, also weder über einen Debugger noch über ein "strace" o.ä.), daß da versucht wird, zusätzliche und nicht vorhandene Daten zu lesen. Das muß aber keinesfalls stimmen, es ist nur eine Theorie auf der Basis der Information, wo das CGI-Programm am Ende hängengeblieben ist.
Die irgendwo zuvor von mir selbst gestellte Frage, ob die 7580 ebenfalls betroffen war und ob das dort auch vor Weihnachten 2016 bereits mit der 06.80 behoben wurde, ist inzwischen auch geklärt ... ich gehe einfach mal zugunsten des Herstellers davon aus, daß es sich da nur um eine Kommunikationspanne handelte und man mir nicht irgendwie "unterjubeln" wollte, daß die 7490 das erste Modell gewesen sei, welches Ende Januar 2017 den Fix für diese Lücke erhalten hat.