[Problem] TR-064 Problem(e) mit 6.98 Inhouse/Labor

fipsy

Neuer User
Mitglied seit
1 Jul 2007
Beiträge
188
Punkte für Reaktionen
6
Punkte
18
Bei den TR-064-Schnittstellen hat sich auch noch etwas getan ... man sollte die SCPD-Dateien (Service Control Point Definition) genau prüfen, wenn man bei einem Interface irgendwelche Ausgabewerte oder sogar ganze Funktionen vermißt ... die "Inventarfunktionen" (für DECT- und Netzwerk-Clients) wurden ziemlich gründlich geändert und liefern jetzt jeweils XML-Datenstrukturen per Datei-Download.

Eine Authentifizierung über TR-064 ist scheinbar überhaupt nicht mehr möglich. Einige Nutzer rennen mir gerade die Bude ein, weil mein FritzBlock mit der Laborversion 6.98 weder auf der 7490 noch auf der 7590 noch funktioniert. Ich habe mal eine weitergehende Analyse gestartet und festgestellt, dass überhaupt keine Authentifizierung mehr möglich ist. Was bei Firmware-Version 6.93 noch problemlos auf allen Fritzboxen funktionierte, geht nun bei 6.98 überhaupt nicht mehr.

Zum Beispiel der folgende HTTP-Request zur Erzeugung eines Digests zur Anmeldung, wie AVM es in seinem Dokument AVM TR-064 – First Steps in Kapitel 10.7 selbst vorschlägt:

Code:
POST /upnp/control/deviceconfig HTTP/1.1
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:47.0) Gecko/20100101 Firefox/47.0
Connection: keep-alive
SoapAction: urn:dslforum-org:service:DeviceConfig:1#X_AVM-DE_CreateUrlSID
Content-Length: <xyz>
Content-Type: text/xml

<?xml version="1.0" encoding="utf-8"?>
<s:Envelope s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Header>
        <h:InitChallenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
            <UserID>admin</UserID>
        </h:InitChallenge >
    </s:Header>
    <s:Body>
        <u:X_AVM-DE_CreateUrlSID xmlns:u="urn:dslforum-org:service:DeviceConfig:1">
        </u:X_AVM-DE_CreateUrlSID>
    </s:Body>
</s:Envelope>

Dieser Request wird quittiert mit:

Code:
HTTP/1.1 400 Bad Request
Connection: close
Content-Length: 182
Content-Type: text/html

Bei jeder anderen Firmware-Version wird auf diese Anfrage mit einer entsprechenden Antwort reagiert, die "Realm" und "Nonce" zur Anmeldung enthält, wie es in Kapitel 10.7.2 des oben genannten Dokuments beschrieben wird. Kann jemand dies bestätigen oder hat jemand eine Idee, ob es vielleicht eine andere Möglichkeit zur Anmeldung gibt? Ohne einen TR-064 Zugang ist diese Firmware nämlich ziemlich unbrauchbar.
 
Zuletzt bearbeitet:
Mir fehlt hier ein Stück Film ... warum willst Du hier überhaupt "Content Level Authentication" betreiben?

Die Funktion "X_AVM_CreateUrlSID" sollte sich in einer TLS-gesicherten Verbindung mit Basic-Auth ganz normal aufrufen lassen ... auch wenn ich es jetzt nicht extra getestet habe.

Ich kann mir schon vorstellen, daß AVM diese Möglichkeit (mit Challenge/Response oberhalb der "Protokoll-Ebene" des HTTP/SOAP-Protokolls) im Zuge der Integration der 2FA weit zurückgebaut hat ... zumal inzwischen fast alle TR-064-Funktionen nur noch über TLS-gesicherte Zugriffe erreichbar sind und da ist die Authentifizierung auf HTTP-/SOAP-Ebene mit "stinknormaler" "basic authentication" am Ende fast sicherer als dieses Challenge/Response-Verfahren mit "offener" Datenübertragung.
 
Dann laß am besten die beiden letzten Beiträge in dem alten Thread hierher verschieben ... wobei das m.E. nichts direkt mit der neuen Version zu tun hat bzw. schon länger umgestellt sein sollte/könnte, falls AVM hier die CLA tatsächlich ausgebaut haben sollte.
 
Mir fehlt hier ein Stück Film ... warum willst Du hier überhaupt "Content Level Authentication" betreiben?
Der Hintergrund ist, dass die Anwendung in einer Großzahl von Umgebungen lauffähig sein muss (z.B. mit Wine auf dem Raspberry Pi). Nicht in allen Umgebungen steht HTTPS-Funktionalität zur Verfügung. Daher ist diese Authentifizierung mit HTTP-Transfer im LAN erforderlich. Hinzu kommt, dass ich das Kennwort der Fritzbox nicht zwischenspeichern möchte. Das ist soweit ich weiß nur mit diesem Verfahren möglich.
 
Ich hatte diesen Thread erst später entdeckt. Sorry. :) Wie gesagt, bis zur Version 6.93 ist Content Level Authetication kein Problem. Und es gibt ja auch eine ganze Reihe von Szenarien, wo dies sehr nützlich und sinnvoll ist. Ein Problem ist es vor allem, wenn AVM da Sachen umbaut oder entfernt, ohne dies genau zu dokumentieren. Dann fahren alle an die Wand, die diese Schnittstellen bisher genutzt haben. Wir hatten das Thema ja schonmal vor der Einführung von TR-064. Alle "alten" Software-Produkte rund um die Fritzbox waren plötzlich nicht mehr nutzbar. Und kein einziger Entwickler hat danach mehr Lust gehabt, sein Produkt anzupassen. So wird es mir dann wohl auch gehen. AVM schneidet sich ins eigene Fleisch, wenn sie die Abwärtskompatibilität alle paar Jahre aufgeben.
 
Hinzu kommt, dass ich das Kennwort der Fritzbox nicht zwischenspeichern möchte.
Da gibt es inzwischen noch ganz andere Lösungen (X_AVM-DE_AppSetup) ... ansonsten kenne ich (in meinen Augen sogar glücklicherweise) keine andere, dokumentierte Möglichkeit der "offenen" Anmeldung für TR-064. Da aber m.W. (und zumindest bisher war das so, aber vielleicht hat AVM das gleich mitgeändert) AVM gar keinen wirklichen Unterschied zwischen einer SID für TR-064 und einer für das "normale GUI" macht (diese SIDs aus dem CreateUrlSID()-Aufruf haben m.E. nur eine kürzere Lifetime als andere), könnte eine ganz normale Anmeldung über "login_sid.lua" auch eine passende SID ergeben ... aber ebenfalls nur als "untested idea" meinerseits in den Raum gestellt.

Wobei ich hier eher darauf hinarbeiten würde, daß jede Plattform TLS unterstützt ... einfach weil das die bessere Investition in die Zukunft wäre. Wenn sich AVM dazu entschließt, auch im LAN nur noch den TLS-Zugriff (auf GUI und TR-064) zuzulassen (mit dem LE-Zertifikat ist man da ggf. schon wieder einen Schritt weiter, weil der Benutzer nicht mehr von der Zertifikatwarnung genervt wird), dann steht man beim nächsten Update wieder im Wald ... und ich bin fest davon überzeugt, daß AVM diesen Schritt früher oder später gehen (müssen) wird.

Solange für die Authentifizierung SID und IP-Adresse ausreichen, diese im Normalfall offen übertragen werden und z.B. zwei Clients hinter einem kaskadierten Router für den Edge-Router schon mal automatisch dieselbe IP-Adresse haben (mal ganz abgesehen davon, daß die Übernahme einer fremdem IP-Adresse eher Kinderkram ist - erst recht dann, wenn AVM bisher tatsächlich noch kein PMF im WLAN eingesetzt hatte und das jetzt erst "nachrüstet"), solange ist diese Kombination bei offener Übertragung eben auch nicht sicher und die einzige Alternative, die mir hier einfällt, ist die Sicherheit einer Punkt-zu-Punkt-Verschlüsselung. Daher wird - wie gesagt, nur nach meiner Überzeugung - über kurz oder lang kein Weg mehr am zwangsweisen TLS im LAN vorbeiführen und das wäre dann auch bereits bei Deiner Lösung unterstützt, wenn Du jetzt bereits "umschwenkst".

Ich glaube auch nicht so richtig, daß eine VB-basierte Lösung (ich rate mal, daß es auch noch die letzte "echte" VB-Version 6 ist und nicht etwa Visual Basic.NET - wobei ich nur einen kurzen Blick in die Software geworfen habe und das nicht stimmen muß, aber OCX-Dateien und MSVBVM60.DLL sprechen schon stark dafür) tatsächlich eine Zukunft hat ... spätestens mit der Migration zu VB.NET stehen dann ohnehin wieder die ganzen SOAP-Funktionen aus dem .NET-Framework bereit (die auch mit TLS arbeiten können) und warten nur darauf, von jemandem benutzt zu werden. Das .NET-Core-Framework wird früher oder später auch direkt auf ARM32 und damit auf einem RasPi vernünftig laufen (siehe https://github.com/dotnet/core/blob/master/samples/RaspberryPiInstructions.md) und das macht dann auch die Verwendung eines Windows-Emulators wie Wine an dieser Stelle überflüssig.

Aber das sind nur ein paar Gedanken, die mir spontan durch den Kopf gingen, als ich einen Blick in Deine Lösung geworfen habe (nach Deinem Text in #116) - Du wirst schon selbst wissen, warum Du an VB6 festhalten willst (wenn ich nicht doch komplett danebenliegen sollte hinsichtlich der Umgebung).
 
Ich kann dir da nicht ganz zustimmen. AVM entwickelt ständig die eigenen Produkte weiter. Somit sollten Entwickler, die ihr Geld mit Zusatzsoftware für AVM-Produkte verdienen, ihre Software ebenfalls weiterentwickeln bzw. anpassen. Man kann doch nicht erwarten, dass ein einmal entwickeltes Programm unverändert für alle Zeiten funktioniert. Wie du ja selbst schreibst kommt es auch nur „alle paar Jahre“ vor, dass sich da grundlegend etwas ändert.
 
Vielen Dank für deine Gedanken und die Anregungen bei der Sache! :)

Wobei ich hier eher darauf hinarbeiten würde, daß jede Plattform TLS unterstützt ...
Grundsätzlich ist das richtig für reguläre und umfangreichere Software. Ich glaube nicht, dass ich hier aber den Aufwand treiben werde. Nicht für eine Freeware / Shareware. Es ist auch nicht sehr nutzerfreundlich für User mit wenig Hintergrundwissen, wenn sie erst ein Zertifikat herunterladen und auf jedem Client installieren müssen, um eine einfache Software benutzen zu können. Das Konzept ist ja "Auspacken, starten, läuft". Eine aufwändige Installationsprozedur würde dem Grundkonzept zuwider laufen. Von der dann nicht mehr möglichen Portabilität ganz abgesehen.

Wenn sich AVM dazu entschließt, auch im LAN nur noch den TLS-Zugriff (auf GUI und TR-064) zuzulassen...
Ich wollte schon sagen: Es ist nicht sonderlich sinnvoll, solange man einen ungesicherten Zugriff im LAN vom Browser aus über das GUI zulässt, den gleichen Zugriff im LAN über TR-064 zu unterbinden. Das ist unlogisch.

Solange für die Authentifizierung SID und IP-Adresse ausreichen, [..] solange ist diese Kombination bei offener Übertragung eben auch nicht sicher und die einzige Alternative, die mir hier einfällt, ist die Sicherheit einer Punkt-zu-Punkt-Verschlüsselung.
Es ist klar, dass ein böswilliger Client im LAN die Sache unsicher macht. Aber der Regelfall ist ja, dass man ein LAN mit einem Router im Haus hat, an dem nur die eigenen, vertrauenswürdigen Clients hängen. Und in dem Fall ist eine ungesicherte Übertragung kein Risiko. Für solche Szenarien ist das Programm auch gedacht. Nicht für Unternehmen mit unsicheren Clients.

ich rate mal, daß es auch noch die letzte "echte" VB-Version 6 ist
VB6 war notwendig, da ein Betrieb von .NET-Software unter Linux / Mac mit wine nicht ohne erheblichen Aufwand möglich ist (wenn überhaupt). Auch eine Portabilität der Version auf USB-Stick o.ä. ist dann praktisch nicht mehr machbar. Die derzeitige Version ist ja portabel und installationsfrei. Abgesehen von der Abwärtskompatibilität bis runter auf Windows 2000.
 
@fritz-fuchs: Mit Produkten rund um die Fritzbox verdienen die wenigsten Entwickler Geld. Die meisten Produkte wurden ursprünglich "just-for-fun" erstellt, so wie mein FritzBlock. Und diese sind weit davon entfernt, allein durch Spenden auch nur ein Bier am Tag für den Entwickler sicherzustellen. Folglich wird nach grundlegenden Änderungen am System der Fritzbox dann eben auch nicht mehr weiter entwickelt. Es gibt daher eine Menge Software um die Fritzbox, die nicht mehr funktioniert und auch nicht mehr weiter entwickelt wird. Es kommt nicht von ungefähr, dass ich alle paar Tage eine Mail bekomme, in der steht "Ich staune, dass noch niemand auf Ihre Idee gekommen ist!". Doch, durchaus, es sind schon so einige drauf gekommen, aber deren Software läuft nicht mehr. So wie meine wohl bald auch nicht mehr laufen wird. Den Aufwand, AVM ständig hinterher zu arbeiten kann sich privat niemand leisten. Und deshalb ist eine möglichst lange Funktionsfähigkeit von Software im Umfeld eines Routers ein starkes Verkaufsargument. Ich bin niemand, der gerne Microsoft lobt, aber in diesem Punkt sind sie absolut vorbildlich. Da laufen sogar noch die meisten alten DOS-Programme.
 
Zuletzt bearbeitet:
Aber der Regelfall ist ja, dass man ein LAN mit einem Router im Haus hat, an dem nur die eigenen, vertrauenswürdigen Clients hängen.
Das war vielleicht mal der Regelfall (bzw. das Verschließen der Augen vor den inhärenten Gefahren im LAN), davon sind wir inzwischen aber meilenweit entfernt und da muß man noch nicht einmal an das vielbeschworene und vielgescholtene "IoT" denken.

Auch jedes Smartphone oder Tablet mit installierten Apps ist ein potentieller Angreifer (auch jeder Desktop-PC oder Laptop, damit niemand denkt, ich halte Windows per se für sicherer als iOS oder Android - und auch MacOS und Linux bleiben i.d.R. nur deshalb verschont, weil sie deutlich in der Minderheit sind und sich Angriffe auf die Mehrheit meist leichter gestalten bzw. größere Erfolgsquoten verzeichnen) ... und das ist auch nicht länger nur reine Theorie. Die Funde von böswilligen Apps in den verschiedenen App-Stores sind da ein deutliches Zeichen und auch Apple hat das - trotz sehr rigider Limitierung dessen, was Apps an sich so dürfen und was nicht - nicht komplett im Griff (da geht es bis in den App-Store für MacOS-Anwendungen, auch wenn es dann irgendwann mal auffällt).

Jedenfalls ist irgendein HTTP-Zugriff (mit "erbeuteten Zugangsdaten") lange nichts, was bei einer Analyse so einer App in einer Sandbox auffällt und genügend Lücken, über die man z.B. direkt an die Netzwerk-Schnittstellen des eigenen Gerätes kommt und in der Folge dann mit geeigneten Techniken auch auf die Netzwerkverbindungen anderer Clients zugreifen kann, sind ebenfalls vorhanden ... und werden teilweise - gerade auch bei älteren mobilen Geräten - gar nicht mehr gefixt.

Diese Geräte sind es dann aber zu allem Überfluß häufig auch noch, die "nur daheim" noch für irgendwelche Zwecke eingesetzt werden, denn dafür "sind sie ja noch gut genug". In der Folge kann es dann sogar sein, daß die neueren mobilen Geräte mit moderner Soft-/Firmware, die sich tatsächlich unterwegs herumtreiben, deutlich sicherer sind als all das, was man ansonsten so daheim im LAN noch in Benutzung hat.

Das mit dem Zertifikat und der Installation eines solchen hat sich eben mit der Einführung von LE-Zertifikaten auch erledigt (wenn man es nur will) ... sofern der verwendete Client der CA-Hierachie dort vertraut. Da ist es dann auch kein Problem mehr, von "http://fritz.box" oder "https://fritz.box" eine Redirection zur zertifizierten MyFRITZ!-Adresse zu machen, weil das in der FRITZ!Box mittels NAT-Hairpinning ohnehin lokal bleibt. Es ist also - immer unter der Voraussetzung, daß die LE-Zertifikate für FRITZ!Boxen sich durchsetzen - keinesfalls ausgeschlossen, mit einem Browser "in Standardkonfiguration" auch per TLS auf eine FRITZ!Box mit einem selbstgenerierten und über LE signierten Zertifikat zuzugreifen und das wäre dann spätestens auch der Zeitpunkt, wo man die unverschlüsselten Zugriffe generell abschalten sollte bei AVM.
 
Diese Vermischung von verschiedenen Schichten, die für die Prüfung von Authentifizierungen zuständig sind, ist aus Sicht des Software-Architekten ein Alptraum. Bei TLS mit "basic auth" ist ganz klar geregelt, an welcher Stelle im Protokoll-Stack die Authentifizierung erfolgt.

Dieses SOAPAUTH01 als Draft hat sich auch nicht wirklich durchgesetzt und auch die AVM-CLA stammt aus dem Jahr 2011 ... ich denke schon, daß man nach 7 Jahren (oder 6 und ein bißchen) auch mal an einer so unwesentlichen Stelle in den APIs "drehen" darf.

Der generelle Umstieg auf TLS (und wenn der erst mal nur beim TR-064 startet, ist das auch in Ordnung, weil es ja nicht impliziert, daß er für das GUI nicht auch noch irgendwann mal kommt) erleichtert eben nicht nur die sichere(!) Authentifizierung und stellt sicher, daß der Benutzer für alles oberhalb des HTTP-Protokolls schon "abgefragt" ist (die Berechtigungsprüfung muß dann ohnehin wieder weiter oben in der Hierarchie erfolgen, weil es ja unterschiedliche Rechte gibt und erst die konkrete Funktion entscheidet, welche Rechte zu ihrer Benutzung erforderlich sind), er schützt parallel dazu noch den Inhalt der Kommunikation.

Und das alles um den Preis des Wegfalls der Unterstützung einer Funktion nach mehr als 6 Jahren, die sich auch ansonsten eher nicht durchsetzen konnte in anderen Zusammenhängen bzw. deren "Schutzniveau" heute praktisch durchgängig als "ungenügend" angesehen würde (neuere HTTP-Standards unterstützen gar keine unverschlüsselten Verbindungen mehr, weil Verschlüsselung eben inzwischen Standard ist bzw. es sein sollte) - von den möglichen Schwachstellen aufgrund der Verwendung von MD5 als Hash-Verfahren mal ganz abgesehen (das wird ja durch neue und schnellere Technik auch immer kritischer - allerdings sind davon tatsächlich auch noch jede Menge anderer Protokolle betroffen, z.B. SIP).

Ich weiß auch nicht, ob das bei AVM nun ein Versehen ist mit der nicht mehr funktionierenden CLA oder tatsächlich eine geplante und noch zu dokumentierende Änderung ... aber von "ständigen Änderungen" in diesem Zusammenhang zu sprechen (und "ständig hinterherarbeiten" ist praktisch dasselbe), finde ich dann doch etwas übertrieben - da haben sich andere APIs (bei anderen Herstellern) in den letzten 7 Jahren deutlich mehr geändert und die meisten älteren "FRITZ!Box-Programme" scheitern auch nicht an Änderungen von AVM-Schnittstellen, sondern an der Tatsache, daß sie häufig genug eben nicht-dokumentierte Schnittstellen und Funktionen benutzt haben (vom "webcm" bis hin zum "HTML scraping"), anstatt auf die angebotenen Schnittstellen zuzugreifen.

Daß neue Funktionen auch neue APIs erfordern, leuchtet sicherlich jedem ein und hier war AVM eigentlich in der Vergangenheit bei API-Änderungen recht vorbildlich ... es wurden eher selten irgendwelche alten Funktionen gestrichen oder in ihrer Parametrierung verändert - wenn, dann kamen meist weitere Funktionen mit größeren Parametersätzen hinzu, während die alten Funktionen weiterhin existierten. Allerdings hat es AVM mit dem "Dokumentieren" tatsächlich nicht so bzw. es erfolgen deutlich zu oft auch "heimliche Änderungen" an der Schnittstellen-Dokumentation, von denen man eher durch Zufall etwas mitbekommt, weil auch die Changelogs in den Dokumenten nicht immer sehr redselig sind.
 
Nur als Ergänzung: Die Session ID ermöglicht nicht auf jede Funktion der Box einen Zugriff. Nur für einige. Zitat:

The TR-064 URL session ID is part of the URLs for phone book and call list.
For further requests like:
• phone book images,
• fax messages or
• answering machine messages
the SOAP action DeviceConfig::X_AVM-DE_CreateUrlSID () has to be invoked.

Das war damals der Grund, warum ich auf Content Level Authentication (CLA) umgeschwenkt bin. Die Session-ID hole ich zwar noch, benutze sie aber überhaupt nicht mehr - ich habe eben nochmal nachgeschaut: CLA war die einzige Möglichkeit, alle notwendigen Funktionen auszuführen. Ich habe eben mal über den Open HttpRequester einige Tests durchgeführt. Die Antworten auf die oben geposteten Requests über HTTPS auf Port 49443 sind identisch mit denen über HTTP auf Port 49000. Ich habe nicht so furchtbar großen Bock, auf meine Fritzbox die Laborversion zu flashen. Mir fehlt leider eine Box für Testzwecke. Falls jemand also eine Fritzbox mit der Laborversion hat und total nett sein will :rolleyes:, könnte er ja mal die oben von mir genannte HTTP-Anfrage testhalber über HTTPS auf Port 49443 posten und schauen, ob da eine vernünftige Antwort kommt und nicht nur Fehler 400. Wenn da nämlich auch Fehler 400 kommt, muss ich mir über einen Umbau auf SSL erst gar keine Gedanken machen. :eek:
 
Auslagerung in einen eigenen Thread (aus 2 mach 1)

Ich hoffe der Kontext ist nicht all zu sehr zerrissen/vertauscht.
 
Diese Vermischung von verschiedenen Schichten, die für die Prüfung von Authentifizierungen zuständig sind, ist aus Sicht des Software-Architekten ein Alptraum. Bei TLS mit "basic auth" ist ganz klar geregelt, an welcher Stelle im Protokoll-Stack die Authentifizierung erfolgt.
Gibt es eigentlich ein Dokument, in dem (am besten mit Beispielen) beschrieben wird, wie man sich mit TLS gegenüber der Fritzbox authentifiziert? Ich habe es mit dem HttpRequester ebenso wie mit einer SSL-Library probiert. Alles erfolglos. Offenbar ist hier die Fritzbox alles andere als konform. So wie es hier als "Basic Authentication" beschrieben wird, geht es jedenfalls nicht. Übrigens ist Content Level Authentication genau das, was in dem Artikel als "Digest Access Authentication" beschrieben wird.

Im übrigen wird die Kommunikation mit TR-064 über XML-Content dann ja sicher nicht anders laufen als bisher. Nur dass im XML-Content dann einfach die Anmeldeinformationen (CLA) wegfallen. Oder sehe ich das falsch?

[..] und die meisten älteren "FRITZ!Box-Programme" scheitern auch nicht an Änderungen von AVM-Schnittstellen, sondern an der Tatsache, daß sie häufig genug eben nicht-dokumentierte Schnittstellen und Funktionen benutzt haben (vom "webcm" bis hin zum "HTML scraping"), anstatt auf die angebotenen Schnittstellen zuzugreifen.
NAJA! Bis zur Einführung von TR-064 waren die "angebotenen Schnittstellen" aber auch mehr als mau. Dass die Entwickler nicht unbedingt darauf aufsetzen wollten, ist für mich nachvollziehbar. Aber wie man sieht, wird an TR-064 ja nun nicht viel weniger rumgebastelt. Dabei hatte ich die Hoffnung, dass hier mal endlich etwas dauerhaft aufwärtskompatibles und daher stabil nutzbares implementiert wird. Wohl zu früh gefreut. Ich finde auch, dass man dem Benutzer durchaus überlassen kann, ob er HTTP oder HTTPS nutzen will. Wenn er auf die Gefahren hingewiesen wurde, sich dieser bewusst ist und es trotzdem tut, dann sollte man es ihm nicht verwehren. Ich bin kein Freund von Bevormundung.

Allerdings hat es AVM mit dem "Dokumentieren" tatsächlich nicht so bzw. es erfolgen deutlich zu oft auch "heimliche Änderungen" an der Schnittstellen-Dokumentation, von denen man eher durch Zufall etwas mitbekommt, weil auch die Changelogs in den Dokumenten nicht immer sehr redselig sind.
Allerdings! Und das ist auch ein erhebliches Problem. Rund 2/3 der Entwicklungszeit habe ich damit verbracht, per Trial-And-Error die Bearbeitungsprozeduren für das Telefonbuch zu implementieren. Da ist derartig viel undokumentiert (und vor allem auch sinnlos / unlogisch), dass es einem schon graust...

### Zusammenführung by stoney ###

Auslagerung in einen eigenen Thread (aus 2 mach 1)

Ich hoffe der Kontext ist nicht all zu sehr zerrissen/vertauscht.
Alles klar, vielen Dank dafür! Es ist alles wunderbar. Ich habe noch ein bisschen editiert, wo etwas unlogisch oder nicht nachvollziehbar war.
 
Zuletzt bearbeitet:
Nur als Ergänzung: Die Session ID ermöglicht nicht auf jede Funktion der Box einen Zugriff. Nur für einige. Zitat:
Ich habe einfach mal ein Beispiel mit PowerShell zusammengeklöppelt, anhand dessen man sehen kann, daß die über "X_AVM-DE_CreateUrlSID()" erzeugte SID eben nicht nur auf die Benutzung von TR-064-Funktionen beschränkt ist, sondern damit tatsächlich (zur Zeit, ich habe mit der 113.06.92 und der 153.06.98-51830 getestet) der Zugriff auf beliebige andere URLs der Box - auch für das GUI - möglich ist:
Code:
Param([Parameter(Mandatory = $True, Position = 0, HelpMessage = 'the username to login to TR-064')][string]$Username,
      [Parameter(Mandatory = $True, Position = 1, HelpMessage = 'the password to login to TR-064')][string]$Password,
      [Parameter(Mandatory = $False, Position = 2, HelpMessage = 'the internal SSL port for TR-064, defaults to 49443')][string]$Port = 49443,
      [Parameter(Mandatory = $False, Position = 3, HelpMessage = 'the IP address of the FRITZ!Box, defaults to 192.168.178.1')][string]$Address = "192.168.178.1")

$interface_to_test = "DeviceConfig"
$function_to_test = "X_AVM-DE_CreateUrlSID"
$controlpoint = $interface_to_test.ToLower()

$WebClient = New-Object System.Net.WebClient
$getinfo_query = "<?xml version='1.0'?>`n" +
    "<s:Envelope xmlns:s='http:#schemas.xmlsoap.org/soap/envelope/' s:encodingStyle='http:#schemas.xmlsoap.org/soap/encoding/'>`n" +
    "`t<s:Body>`n" +
    "`t`t<u:$function_to_test xmlns:u='urn:dslforum-org:service:${interface_to_test}:1'>`n" +
    "`t`t</u:$function_to_test>`n" +
    "`t</s:Body>`n" +
    "</s:Envelope>"

Write-Debug $getinfo_query

$WebClient.Encoding = [System.Text.Encoding]::UTF8
$WebClient.Headers.Set("Content-Type", 'text/xml; charset="utf-8"')
$WebClient.Headers.Set("SOAPACTION", "urn:dslforum-org:service:${interface_to_test}:1#$function_to_test")
$WebClient.Credentials = New-Object System.Net.NetworkCredential($Username, $Password)
[System.Net.ServicePointManager]::ServerCertificateValidationCallback = {$true}
$response = [xml]$WebClient.UploadString("https://${Address}:$Port/upnp/control/$controlpoint", $getinfo_query)

# $response.Envelope.Body.ChildNodes[0].InnerText
# further code follows here, to show SID usage/validity outside of TR-064 context instead of simple output from above

# login_sid.lua is a method for GUI login, see also: https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/Session-ID_deutsch_06Feb18.pdf
$sid = $response.Envelope.Body.ChildNodes[0]."NewX_AVM-DE_UrlSID"
$Url = "http://$Address/login_sid.lua?$sid"
Write-Output "(Ab)Use of SID from TR-064 on GUI`n`nURL=$Url`n`n"
$auth = [xml]$WebClient.DownloadString($Url)
$StringWriter = New-Object System.IO.StringWriter
$XmlWriter = New-Object System.Xml.XmlTextwriter($StringWriter)
$XmlWriter.Formatting = [System.XML.Formatting]::Indented
$auth.WriteContentTo($XmlWriter)
$StringWriter.ToString()
Write-Output "`n"

# try to get all settings from the device with our TR-064 SID
$Url = "http://$Address/cgi-bin/firmwarecfg"
$boundary = "--" + [System.Guid]::NewGuid().ToString()
$WebClient.Headers.Remove("SOAPACTION")
$WebClient.Headers.Set("Content-Type", "multipart/form-data; boundary=$boundary")
$sid_name = $sid.Split("=")[0]
$sid_value = $sid.Split("=")[1]
$body= "$boundary`n" +
    "Content-Disposition: form-data; name=`"$sid_name`"`n`n$sid_value`n" +
    "$boundary`n" +
    "Content-Disposition: form-data; name=`"ImportExportPassword`"`n`nThis_is_my_very_complicated_password.`n" +
    "$boundary`n" +
    "Content-Disposition: form-data; name=`"ConfigExport`"`n`n`n" +
    "${boundary}--"
Write-Debug $body
$data = $WebClient.UploadString($Url, "POST", $body)
Write-Output "(Ab)Use of SID from TR-064 to get exported settings with known password`n`nURL=$Url`n`n"
Write-Output $data
Ich hoffe, daß damit verdeutlicht wird, warum das Erzeugen einer solchen SID (und das war ja die Ausgangsfrage, daß dieses nicht mehr funktioniert) auch nur über eine verschlüsselte Verbindung erfolgen sollte ... man kann mit der passenden IP-Adresse und dieser SID tatsächlich auf jede andere URL zugreifen, für die der verwendete Benutzer (beim Erzeugen der SID) die notwendigen Berechtigungen hat.

Warum sich die FRITZ!Box hier bei der TLS-Kommunikation "alles andere als konform" verhalten soll, müßtest Du noch etwas genauer erklären ... mir ist an dieser Stelle bisher nichts dazu aufgefallen (und ich greife oft genug auch "low-level" auf die FRITZ!Box oder andere Services zu und "verstecke" mich nicht immer hinter "high-level APIs" - vielleicht sieht man es am "multipart-formdata" beim Export der Einstellungen über "firmwarecfg" schon im Ansatz).

Wenn bei Dir bereits der Aufruf für "X_AVM-DE_CreateUrlSID()" scheitert, kann es eigentlich auch nicht mit der 2FA zusammenhängen ... zumindest bei mir funktioniert das Erzeugen einer solchen URL SID (aber eben über HTTP-Auth und nicht über CLA, das habe ich gar nicht erst getestet, weil es bei TLS eben keinen echten Sinn ergibt - und noch einen zusätzlichen Roundtrip für die Challenge braucht) auch dann, wenn 2FA eingeschaltet ist.

EDIT:
Und hinsichtlich der "Digest Access Authentication" im HTTP-Protokoll will ich auch noch einmal festhalten, daß zwar die Wege zum Berechnen des Hash-Wertes für die Anmeldung dieselben sind, aber diese "digest auth" bei HTTP eben auch außerhalb des Payloads erfolgt - nämlich in den Header-Daten und im Rahmen des HTTP-Protokolls, während es bei SOAPAUTH01 in den Payload des Requests (also in den Body) ausgelagert wird. Das meinte ich auch, als ich davon schrieb, daß die Ansiedlung der Authentifizierung auf verschiedenen Schichten ein Alptraum ist. Ansonsten ist sowohl "basic auth" als auch "digest auth" im Rahmen eines HTTP-Requests dieselbe Schicht ... wobei AVM m.W. beim TR-064 auch nur "basic auth" unterstützt. Da ja bereits die Transportverschlüsselung dafür sorgt, daß die Credentials nicht einfach mitgelesen werden können, wie das ansonsten bei "basic auth" dank Base64 ja möglich wäre, braucht es aber auch gar keine "digest auth" und den damit zwangsläufig verbundenen zusätzlichen Zugriff (damit man die aktuelle Challenge/Nonce erhält).

Ich finde auch, dass man dem Benutzer durchaus überlassen kann, ob er HTTP oder HTTPS nutzen will. Wenn er auf die Gefahren hingewiesen wurde, sich dieser bewusst ist und es trotzdem tut, dann sollte man es ihm nicht verwehren. Ich bin kein Freund von Bevormundung.
Sag das den Herstellern der Browser, die sich nun mal dazu entschlossen haben, bei HTTP/2 gar keine unverschlüsselten Verbindungen mehr zuzulassen (und ich finde das tatsächlich richtig und sehr begrüßenswert).
 
Zuletzt bearbeitet:
Erstmal vielen Dank für die Mühe, die du dir gemacht hast!

Ich habe einfach mal ein Beispiel mit PowerShell zusammengeklöppelt, anhand dessen man sehen kann, daß die über "X_AVM-DE_CreateUrlSID()" erzeugte SID eben nicht nur auf die Benutzung von TR-064-Funktionen beschränkt ist, sondern damit tatsächlich (zur Zeit, ich habe mit der 113.06.92 und der 153.06.98-51830 getestet) der Zugriff auf beliebige andere URLs der Box - auch für das GUI - möglich ist:
Was unseren bisherigen Annahmen nicht widerspricht. Die SID, die über X_AVM-DE_CreateUrlSID() erzeugt wird, ist nicht nur in der GUI, sondern auch bei TR064 für sämtliche Funktionen geeignet. Die SID hingegen, die über login_sid.lua erzeugt werden kann, ist jedoch nur begrenzt gültig. Die Antwort lautet dabei auch zuerst:

<SessionInfo>
<SID>0000000000000000</SID>
<Challenge>02cf7492</Challenge>
<BlockTime>0</BlockTime>
<Rights/>
</SessionInfo>

D.h. es wird erstmal gar keine SID geliefert, sondern man muss auch hier den Authentifizierungsprozess mit Challenge und MD5 durchlaufen, wie bei CLA.

Ich hoffe, daß damit verdeutlicht wird, warum das Erzeugen einer solchen SID (und das war ja die Ausgangsfrage, daß dieses nicht mehr funktioniert) auch nur über eine verschlüsselte Verbindung erfolgen sollte ... man kann mit der passenden IP-Adresse und dieser SID tatsächlich auf jede andere URL zugreifen, für die der verwendete Benutzer (beim Erzeugen der SID) die notwendigen Berechtigungen hat.
Darüber waren wir uns ja von Anfang an einig. Die Gefahr des Missbrauchs einer im LAN geklauten SID ist trotzdem nicht hoch, weil eine solche SID nur sehr kurz (etwa eine Minute lang) gültig ist. Da müsste es also schon jemand ganz gezielt über eine Schadsoftware auf so eine SID abgesehen haben. Ich würde trotzdem gerne wissen, ob es bei Firmware-Version 6.98 nur ein Fehler ist, dass die Erzeugung über eine unverschlüsselte Verbindung (wie bei Firmware-Versionen bis 6.93 möglich) nicht mehr möglich ist, oder ob es so gewollt ist. In letzterem Fall muss ich mir nämlich überlegen, ob ich meine Software relativ zügig umstelle oder alternativ schonmal ankündige, dass sie ab Fritzbox-Firmware 6.98 nicht mehr nutzbar sein wird. Damit meine Nutzer nach dem Update dann nicht in eine Falle laufen.

Warum sich die FRITZ!Box hier bei der TLS-Kommunikation "alles andere als konform" verhalten soll, müßtest Du noch etwas genauer erklären ...
Weil z.B. mit dem HttpRequester, der eine basic auth mit HTTPS durchführt (so wie sie z.B. bei Wikipedia beschrieben wird), keine Authentifizierung möglich ist. Wenn ich dort die korrekten Credentials eintrage, wird trotzdem "Unauthenticated" (Error 503) in der Antwort auf die SoapAction "urn:dslforum-org:service: DeviceConfig:1#X_AVM-DE_CreateUrlSID" zurückgeliefert. Bzw. wenn ich den in deinem Script verwendeten Content nehme, kommt der HTTP-Fehler "401 Unauthorized" zurück. Bei mir kommt mit Firmware 6.93 und HTTPS / basic auth nämlich sowas zurück:

Code:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<s:Header>
<h:Challenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
<Status>Unauthenticated</Status>
<Nonce>2076EC662FE5D770</Nonce>
<Realm>F!Box SOAP-Auth</Realm>
</h:Challenge>
</s:Header>
<s:Body>
<s:Fault>
<faultcode>s:Client</faultcode>
<faultstring>UPnPError</faultstring>
<detail>
<UPnPError xmlns="urn:dslforum-org:control-1-0">
<errorCode>503</errorCode>
<errorDescription>Auth. failed</errorDescription>
</UPnPError>
</detail>
</s:Fault>
</s:Body>
</s:Envelope>

Edit: Ich habe eben dein Script mit Firmware Version 6.93 ausprobiert und da kommt eine SID zurück. Die Antwort sieht so aus:

<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.x
mlsoap.org/soap/encoding/">
<s:Body>
<u:X_AVM-DE_CreateUrlSIDResponse xmlns:u="urn:dslforum-org:service: DeviceConfig:1">
<NewX_AVM-DE_UrlSID>sid=2ce686c0c5a0b71e</NewX_AVM-DE_UrlSID>​
</u:X_AVM-DE_CreateUrlSIDResponse>​
</s:Body>​
</s:Envelope>

Bleibt die Frage, was beim HttpRequester und bei meinen SSL-Libraries anders ist, als bei deinem Script und warum dort die Abfragen nicht funktionieren. :-(

By the way: Gibt es hier im Editor eigentlich eine Möglichkeit, die automatische Umwandlung bestimmter Zeichenfolgen (z.B. "Doppelpunkt D") in Emoticons zu unterbinden?
 
Zuletzt bearbeitet:
Die SID bei CreateUrlSID() ist eben nicht nur für TR-064 gültig, sie kann auch für jede andere URL in der Box genutzt werden. Der von Dir irgendwo zuvor zitierte Satz aus der AVM-Dokumentation (first steps, Punkt 4.1.2) bezieht sich (zumindest nach meiner Ansicht) darauf, daß die SID, welche in einigen TR-064-Funktionen automatisch als Bestandteil einer Download-URL geliefert wird (z.B. bei GetPhonebook() - siehe https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/X_contactSCPD.pdf in "table 13" oder auch "UserInterface:1::X_AVM-DE_DoPrepareCGI()"), nicht für andere Zwecke verwendet werden kann (was ebenfalls nicht stimmt) und eine nochmals deutlich geringere "life-time" hat (genauer: haben sollte), als eine über CreateUrlSID() erzeugte. Oder auch darauf, daß es bei einigen (genauer sieben, zumindest bei der 113.06.93) URLs auch möglich ist, eine SID als "tr064sid" (anstelle von "sid") im QueryString zu übergeben - wobei ich keine Idee hätte, wie man eine solche "abweichende" SID überhaupt erzeugen soll mit einem dokumentierten Interface.

Diese - vom FRITZ!OS selbst erzeugte - URL für den Download eines einzelnen Telefonbuchs sähe z.B. so aus:
Code:
https://192.168.178.1:49443/phonebook.lua?sid=c1eacf7ea8b17aae&pbid=0
... und tatsächlich kann man - in Abweichung zur Dokumentation (wie ich sie verstehe) - auch diese SID für den Zugriff auf jede beliebige Seite verwenden, solange der Benutzer dahinter (das ist dann der, welcher bei der TR-064-Authentifizierung verwendet wurde) nur ausreichende Rechte für die Seite hat. Schaut man sich das im "ctlmgr" näher an:
Code:
root@FB7490:~ $ msgsend ctlmgr sessions;sleep 1;cat /var/tmp/sessions.txt
sid                     valid userid source   ip              name rights
-------------------------------------------------------------
c1eacf7ea8b17aae TR-064  1184 98      Homenet 192.168.178.2   **hidden** BoxAdmin:RW App:RW NAS:RW Phone:RW Dial:RW HomeAuto:RW
root@FB7490:~ $
, dann sieht man auch, daß sogar für diese SID ebenfalls das "Standard-Timeout" von 1200 Sekunden (20 Minuten) verwendet wird (die 1184 ist die verbleibende "life-time").

Die SID hingegen, die über login_sid.lua erzeugt werden kann, ist jedoch nur begrenzt gültig. Die Antwort lautet dabei auch zuerst:

<SessionInfo>
<SID>0000000000000000</SID>
<Challenge>02cf7492</Challenge>
<BlockTime>0</BlockTime>
<Rights/>
</SessionInfo>

D.h. es wird erstmal gar keine SID geliefert, sondern man muss auch hier den Authentifizierungsprozess mit Challenge und MD5 durchlaufen, wie bei CLA.
Mein Beispiel aus dem vorherigen Beitrag nutzt das "login_sid.lua" auch nur zur Verdeutlichung, daß die mit "CreateUrlSID()" erzeugte SID auch für GUI-Logins verwendet werden kann ... in dieser Form, wie ich es dort mache (mit Angabe einer gültigen SID), dient der Aufruf nämlich nur der Verifikation der SID und meldet gar keine neue Sitzung an - sonst würde man ja auch das Hashen über Challenge/Username/Password irgendwo zuvor im Code sehen und auch den zusätzlichen Roundtrip, der sich ja aus der Notwendigkeit ergibt, daß man erst einmal einen Wert für die "challenge" braucht.

Daß Deine Annahme zu einem Unterschied in der Richtung "ist jedoch nur begrenzt gültig" falsch ist (wenn es um "login_sid.lua", "login.lua" oder "CreateUrlSID()" geht), habe ich oben schon gezeigt ... auch jede über "login_sid.lua" erzeugte SID (gilt ebenso für "login.lua") hat erst einmal nur eine "life-time" von 1200 Sekunden - diese verlängert sich ggf. mit entsprechenden Zugriffen automatisch jeweils wieder auf weitere 1200 Sekunden (eine Art Mono-Flop).

Bei AVM gibt es extra einen Parameter bei einigen Seitenabrufen, um diese automatische Verlängerung zu umgehen, weil natürlich beim "responsive design" im Hintergrund ständig XHR-Zugriffe mit dieser SID laufen und nicht jeder dieser Zugriffe das Timeout neu starten soll (dann würde es bei geöffnetem Browser nie ablaufen - auch wenn es inzwischen noch einen zweiten, unabhängigen Prozess zur Abmeldung bei Inaktivität gibt).

Den Test mit CLA bei TLS kann ich leider nicht machen bzw. ich sehe nicht, was der bringt ... bei Verwendung von TLS gibt es ja gar keinen Grund mehr, auf die HTTP-Authentifizierung zu verzichten und da reicht dann eben das deutlich einfachere "basic auth" auch vollkommen, selbst wenn dabei die Credentials eben "im Klartext" (denn die Base64-Kodierung ist ja nicht mal als Verschleierung tauglich) innerhalb der TLS-Verbindung übertragen werden.

Da bei allen Verfahren (sowohl bei "basic auth" als auch bei "digest auth" und der CLA im SOAP-Protokoll) ohnehin Benutzername und Kennwort auf beiden Seiten im Klartext vorliegen müssen, spielt auch dieser Aspekt keine Rolle (bei anderen Verfahren mit Kennwort-Speicherung als Hash-Wert, muß der Server das Kennwort nicht im Klartext vorhalten - hier aber schon) bei der Bewertung der Sicherheit.

Der zusätzliche Vorteil, daß man sich bei TLS mit "basic auth" (wo auch gleich beim ersten Request Benutzername und Kennwort mitgesendet werden (pre-auth) und nicht erst dann, wenn der Server nach Authentifizierung verlangt) einen Request und eine Antwort vom Server komplett erspart, ist auch nicht ganz ohne Belang ... zumal diese Challenge-/Response-Verfahren mit MD5 auch wieder für Angriffe mit Rainbow-Tables (auf das Kennwort) verwundbar werden, wenn der Client seinerseits keine "nonce" einbringt und somit nur vom Server vorgegebene Werte in die Berechnung eingehen und das Ergebnis "variabel gestalten" (vielleicht noch zzgl. des Benutzernamens, wenn der nicht nur "admin" ist).

PS: Ich vermute einfach mal, daß Deine Schwierigkeiten mit dem HTTPS-Zugriff und "503" damit zusammenhängen, daß Du trotz HTTP-Auth weiterhin den SOAP-Header für die CLA mitsendest?
 
Zuletzt bearbeitet:
Der von Dir irgendwo zuvor zitierte Satz aus der AVM-Dokumentation bezieht sich darauf, daß die SID, welche in einigen TR-064-Funktionen automatisch als Bestandteil einer Download-URL geliefert wird, nicht für andere Zwecke verwendet werden kann
So genau weiß das wohl keiner. Und es kann sich ja auch von Firmware-Version zu Firmware-Version wieder ändern. Im Grunde ist das auch nicht soooo wichtig.

Ich bin sowieso kein Freund dieser Session IDs. Okay, für einen HTTPS-Download eines Telefonbuchs o.ä. ist es eine sinnvolle Sache und das mache ich ja auch so (anders geht's ja auch nicht), aber zur Ausführung von Funktionen halte ich es für unschön. Da gibt es für mich nur zwei Möglichkeiten: Die von dir bevorzugte Nutzung von TLS mit basic auth oder die von mir bevorzugte Content Level Authentication - ob nun verschlüsselt oder unverschlüsselt.

Der Nachteil von basic auth ist in meinen Augen, dass hier das Kennwort gespeichert werden muss. Selbst wenn man es verschlüsselt speichert, muss es trotzdem in sehr regelmäßigen Zeitabständen wieder entschlüsselt werden und liegt dann für mehr oder weniger lange Zeit als Klartext irgendwo im RAM. Spätestens seit Meltdown und Spectre erzeugt das bei mir ein sehr ungutes Gefühl. Nutze ich hingegen einen MD5-Hash ("Secret"), so muss ich das Kennwort niemals speichern. Auch Rückschlüsse auf das Kennwort sind hier nicht möglich, da der MD5 mit Informationsverlust verbunden ist und es - im Gegensatz zur Verschlüsselung - ein Einweg-Algorithmus ist. Also so, wie auch die Authentifizierung bei Linux schon immer stattfindet (über /etc/passwd). Daher tendiere ich nach wie vor stark zu CLA. Von mir aus dann auch gern über eine TLS Verbindung - aber eben ohne basic auth.

Das ist der Grund, warum ich dich gerne darum bitten würde, mal zu überprüfen, ob über eine TLS-Verbindung bei Firmware 6.98 auch CLA möglich ist. Im Grunde müsstest du bei dem Request dann nur auf basic auth verzichten und den XML-Content um einen CLA-Request-Header erweitern. Um bei deinem Script-Beispiel zu bleiben, müsste das Query dann so aussehen:

Code:
$getinfo_query = "<?xml version='1.0'?>`n" +
    "<s:Envelope xmlns:s='http:#schemas.xmlsoap.org/soap/envelope/' s:encodingStyle='http:#schemas.xmlsoap.org/soap/encoding/'>`n" +
    "`t<s:Header>`n" +
    "`t`t<h:InitChallenge xmlns:h='http://soap-authentication.org/digest/2001/10/' s:mustUnderstand='1'>`n" +
    "`t`t`t<UserID>admin</UserID>`n" +
    "`t`t</h:InitChallenge >`n" +
    "`t</s:Header>`n" +
    "`t<s:Body>`n" +
    "`t`t<u:$function_to_test xmlns:u='urn:dslforum-org:service:${interface_to_test}:1'>`n" +
    "`t`t</u:$function_to_test>`n" +
    "`t</s:Body>`n" +
    "</s:Envelope>"

Also wenn du das mal testen könntest, wäre ich dir zu ewigem Dank verpflichtet. :)

PS: Ich vermute einfach mal, daß Deine Schwierigkeiten mit dem HTTPS-Zugriff und "503" damit zusammenhängen, daß Du trotz HTTP-Auth weiterhin den SOAP-Header für die CLA mitsendest?
Nein, daran liegt's nicht. Wenn ich ihn nicht mitsende, bekomme ich die Meldung "401 Unauthorized".
Mich würde interessieren, was bei dir kommt, wenn du mal den oben von mir vorgeschlagenen Code verwendest. :)

Den Test mit CLA bei TLS kann ich leider nicht machen bzw. ich sehe nicht, was der bringt ... bei Verwendung von TLS gibt es ja gar keinen Grund mehr, auf die HTTP-Authentifizierung zu verzichten
Doch, den gibt es. Das habe ich ja im zweiten Absatz ausführlich erklärt. Man kann auf die Speicherung des Kennworts verzichten. Ein mehr als triftiger Grund, wie ich finde.

Da bei allen Verfahren (sowohl bei "basic auth" als auch bei "digest auth" und der CLA im SOAP-Protokoll) ohnehin Benutzername und Kennwort auf beiden Seiten im Klartext vorliegen müssen, spielt auch dieser Aspekt keine Rolle
Das ist nicht ganz richtig. Bei CLA muss das Kennwort nur EINMALIG beim ersten Login als Klartext vorliegen. Solange das Kennwort nicht geändert wird, braucht man es danach niemals wieder. Danach reicht der MD5-Hash aus. Das ist ein gewaltiger Vorteil gegenüber basic auth.

Wenn der MD5-Hash über TLS verschlüsselt übertragen wird, dürften Angriffsszenarien auf den MD5, so wie du sie beschreibst, mehr als unwahrscheinlich sein. Das bei basic auth notwendige Vorhalten des Kennworts als Klartext im RAM dürfte zigfach gefährlicher sein. Zumal seit es Meltdown und Spectre gibt und diese Lücken noch LANGE auf vielen Systemen nicht vollständig geschlossen sein werden.
 
Man kann auf die Speicherung des Kennworts verzichten. Ein mehr als triftiger Grund, wie ich finde.
Ich sehe nicht, wo es einen (entscheidenden) Unterschied macht, ob ich auf dem Client den Hash über Benutzernamen, Realm und Kennwort speichere oder Benutzername und Kennwort selbst. Beide Methoden brauchen den Benutzernamen (im Klartext, weil der außerhalb des Hash-Wertes zusätzlich übermittelt wird als "Key", um welchen Account es sich handelt und wo nach dem Kennwort oder dem Hash zu suchen wäre) und ob ich jetzt das Kennwort oder den "fertigen" Hash A1 (nach RFC2617, Punkt 3.2.2.2) speichere, spielt für die Sicherheit keine wirkliche Rolle - gut schützen muß ich auch auf der Client-Seite beides, wenn ich mit dem Hash dasselbe erreichen kann, wie mit dem Kennwort (siehe auch wieder RFC2617, den kompletten Punkt 4, speziell 4.13). Wenn über Meltdown und/oder Spectre mein Speicher ausgelesen werden kann und da steht der Hash drin, ist das genauso kompromittierend als wenn da ein Kennwort stünde (gut, ein MD5-Hash ist vielleicht etwas schlechter als "secret" zu erkennen als eine Zeichenkette, aber das ist auch nur "gefühlte Sicherheit" durch zusätzliche Verschleierung und hält RE - sofern man die Anwendung auf einem anderen Rechner auch ausführen und dann deren Speicher "ganz legal" durchsuchen kann - keine Stunde stand).

Die Frage, ob ein kompromittiertes Kennwort oder ein kompromittierter Hash-Wert nun "schlimmer" ist, braucht man gar nicht erst zu diskutieren ... "password re-use" ist das Problem des Benutzers und wenn ihm das nicht paßt, kann er selbst einen Hash über sein "Standard-Passwort mit Zusätzen" erzeugen.

Gut, der Server könnte (wenn er ausschließlich "digest auth" unterstützen will, was eben bei TLS zusätzlichen Verkehr ohne zusätzliche Sicherheit bringt) auf die Speicherung des Kennworts für den Benutzer verzichten (macht AVM aber ohnehin nicht, würde auch wieder mit dem Verfahren beim GUI-Login kollidieren) ... solange er niemals auf die Idee kommt/käme, sein "realm" zu verändern - in diesem Moment paßt sein gespeicherter Hash-Wert als A1 auch nicht mehr und (wenn wir mal beim RFC2617 bleiben) auf verschiedene "Schutzzonen" muß er bei diesem Ansatz ebenfalls komplett verzichten.

Hier hinkt Dein Vergleich mit den Linux-Kennworten dann auch wieder ein wenig ... bei so einer "digest auth" kann ich den A1-Hash nur mit festem "realm" speichern (oder der ändert sich auch noch pro Benutzer) und die Kennwörter in der "/etc/shadow" (ich gehe mal davon aus, daß praktisch niemand mehr Kennwörter in einer "/etc/passwd" speichert) sind eben auch "gesalzen", damit ein Brute-Force-Angriff auf die gespeicherten Werte für einen Angreifer entsprechend aufwändig ist. Speichert irgendein Server hingegen den Hash über "username:realm:password" mit einheitlichem "realm" und unter dem "username" als Ordnungskriterium, ist es wieder nur eine Frage der Rechenpower, der Zeit und der Qualität des verwendeten Kennworts. [EDIT: Gut, das ist als Argument meinerseits etwas schwach - auch der "username" als Hash-Bestandteil läßt fertig berechnete Hash-Tables hier ins Leere laufen, da ja auch noch "realm" mit eingeht. Aber das "Prinzip", daß beim Speichern von Kennwörtern in der "/etc/shadow" noch ein "salt" hinzugefügt wird, bleibt trotzdem als Unterschied bestehen, dafür wird da der Benutzername nicht mitgenutzt.]

Ändert der Server den "realm" (wo stünde, daß er das nicht darf - notfalls kann er für jede einzelne Seite einen anderen Wert verwenden, wenn ihm danach ist - siehe RFC2617, Seite 4, erster Absatz), nutzt mir der fertige Hash-Wert A1 auf dem Client auch gar nichts mehr und ich muß ihn neu berechnen. Von Lösungen, die tatsächlich den ersten Teil des Verfahrens (also den MD5-Hash über Benutzernamen, den vom Server übermittelten "realm"-Wert und das Kennwort) gesondert speichern und dann nur noch mit dem Nonce-Wert für eine aktuelle Authentifizierung verknüpfen, halte ich also nicht viel - Dir geht es ja "vom Gefühl" her mit der Abschaffung der CLA (oder dem Verzicht auf sie) auch nicht anders.

Bei der Verwendung von TLS treffen die ganzen Betrachtungen aus dem RFC, die sich mit "eavesdropping" befassen, gar nicht mehr zu ... ein mehr als deutlicher Grund, auf TLS nicht zu verzichten - und damit kommen wir dann zu der Frage, wie man auf der Client-Seite das Speichern von Benutzername/Kennwort vermeiden kann (wenn man statt des Kennworts bisher lieber den Hash gespeichert hatte), wenn man den AVM-Interfaces folgt.

Warum nimmst Du denn dann nicht einfach die Möglichkeit wahr, den verwendeten Account und das Kennwort dadurch besser abzusichern, daß Du über die passende Schnittstelle (das ist iirc "X_AVM-DE_AppSetup:1::RegisterApp()") nur für diese Zugriffe ein passendes App-Konto einrichtest, das man auch noch in den Rechten so beschränken kann (leider nicht sehr fein granuliert, aber besser als gar nichts), daß damit kein anderer Unsinn gemacht werden kann.

Dann braucht es auch genau für dieses "RegisterApp()" eine einmalige Anmeldung mit einem berechtigten Konto (das muß nicht mal volle Rechte haben, wenn es nur die eigenen Rechte an die registrierte App "vererben" soll) und danach auch keinen Benutzernamen und kein Kennwort (für das GUI-Konto) mehr. Ja, man kann jetzt sogar für diese App nur "Phone"-Rechte einfordern, damit kann auch ein erfolgreicher Angreifer auf den Benutzernamen und das Kennwort (für die App) nicht mehr auf der Box anrichten, als es dieses App-Konto zuläßt.

Mich würde interessieren, was bei dir kommt, wenn du mal den oben von mir vorgeschlagenen Code verwendest.
Was erwartest Du denn? Selbst wenn ich den Code anpasse und einen tatsächlich existierenden Benutzernamen (anstelle von "admin") verwende, kann doch beim ersten Versuch nur ein "Unauthenticated" dabei herauskommen, das ist doch genau der Punkt, daß es den zusätzlichen Roundtrip braucht:
Code:
<?xml version="1.0"?>
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  <s:Header>
    <h:Challenge xmlns:h="http://soap-authentication.org/digest/2001/10/" s:mustUnderstand="1">
      <Status>Unauthenticated</Status>
      <Nonce>E954C424E3C6B92C</Nonce>
      <Realm>F!Box SOAP-Auth</Realm>
    </h:Challenge>
  </s:Header>
  <s:Body>
    <s:Fault>
      <faultcode>s:Client</faultcode>
      <faultstring>UPnPError</faultstring>
      <detail>
        <UPnPError xmlns="urn:dslforum-org:control-1-0">
          <errorCode>503</errorCode>
          <errorDescription>Auth. failed</errorDescription>
        </UPnPError>
      </detail>
    </s:Fault>
  </s:Body>
</s:Envelope>
und das gilt bei mir tatsächlich für die beiden weiter vorne erwähnten Versionen (die Antworten sind also identisch, nur der Nonce-Wert ist natürlich ein anderer).

Das ist auch wieder vollkommen unabhängig davon, ob ich als "pre-auth" die Zuweisung an "$WebClient.Credentials" mache oder nicht - offenbar "überstimmt" hier der SOAP-Header (auf der höheren Protokoll-Ebene) die bereits erfolgte Authentifizierung auf der HTTP-Ebene darunter. Wie gesagt ... mit und ohne Credentials ergibt das (erwartbar) ein "503".

Wenn Du tatsächlich möchtest, daß ich einen sinnvollen Test mache, ob bei mir die CLA auch innerhalb einer TLS-Verbindung funktioniert, dann fehlt da ja ganz offensichtlich noch der Code für das Berechnen des Hash-Wertes aus Benutzernamen, Realm, Kennwort, Nonce - oder sollte ich den jetzt (just for fun, denn ich halte das ja nicht für notwendig bzw. sinnvoll, siehe oben) selbst hinzufügen? :)

Wobei es tatsächlich sein kann, daß AVM auch die CLA immer noch zuläßt und es sich hier nur um irgendeinen mysteriösen Fehler handelt (bereite mir eine PS-Version mit CLA vor und ich teste das gerne auch mit der 06.98 für Dich) - oder man hat nur vergessen, den (XML-)Parser auch entsprechend zu ändern.

Bei einem Schema-Fehler im SOAP-Header (z.B. durch das Auslassen des "UserID"-Tags im Header, was ja gültiges XML erzeugt, aber gegen das Schema verstößt) nervt die Box jedenfalls auch bei mir mit einem "401" ... warum das bei Dir aber der Fall sein soll, wenn Du den kompletten SOAP-Header (also von "<s:Header>" bis "</s:Header>" - inklusive) wegläßt, erschließt sich mir auch nicht. Das Ergebnis wäre ja genau derselbe XML-Aufbau, wie ich ihn zuvor hatte und der funktioniert bei mir mit allen FRITZ!OS-Versionen einwandfrei.

Wobei auch das schon wieder Mutmaßungen sind, daß AVM hier irgendein XML-Schema tatsächlich prüft oder berücksichtigt ... eigentlich verstößt selbst das AVM-Beispiel mit der CLA in "First Steps" gegen das XML-Schema aus SOAPAUTH01 (Anhang A), denn nach:
Code:
   <element name="InitChallenge" type="soap-auth:InitChallenge_t"/>
   <complexType name="InitChallenge_t">
      <sequence>
          <element name="UserID" type="xsd:string"/>
          <element name="Realm" type="xsd:string"/>
          <element name="ClientNonce" type="xsd:string" minOccurs="0"/>
      </sequence>
      <attribute ref="SOAP-ENV:actor" use="optional"/>
      <attribute ref="SOAP-ENV:mustUnderstand" use="optional"/>
      <attribute name="digest" type="anyURI" use="optional"/>
   </complexType>
ist das "element" mit dem Namen "Realm" in einem "InitChallenge"-Element ja gar nicht optional (wie das bei "ClientNonce" dank des "minOccurs=0"-Attributs der Fall wäre).
 
Zuletzt bearbeitet:
Ich sehe nicht, wo es einen (entscheidenden) Unterschied macht, ob ich auf dem Client den Hash über Benutzernamen, Realm und Kennwort speichere oder Benutzername und Kennwort selbst.
Der entscheidende Unterschied liegt darin, dass man vom Hash auch mit noch so viel Aufwand nicht auf das Kennwort zurückschließen kann. Anders als bei einer Verschlüsselung, die bijektiv ist. Das ist der große Vorteil bei CLA. Während ich den Hash nur für einen eingeschränkten Bereich verwenden kann, kann ich das Kennwort universell für alle möglichen Zwecke verwenden, weshalb das Kennwort wesentlich sensibler ist als der Hash. Abgesehen davon, dass viele das Router-Kennwort häufig auch noch für andere Zwecke verwenden. Sollte man zwar nicht, wird aber trotzdem oft gemacht. Ich sehe das nicht nur als Problem des Users. Wenn man zusätzliche Sicherheit mit wenig Aufwand schaffen kann, dann sollte man es auch tun.

Wenn über Meltdown und/oder Spectre mein Speicher ausgelesen werden kann und da steht der Hash drin, ist das genauso kompromittierend als wenn da ein Kennwort stünde
Das sehe ich ein wenig anders (s.o.).

Hier hinkt Dein Vergleich mit den Linux-Kennworten dann auch wieder ein wenig ... bei so einer "digest auth" kann ich den A1-Hash nur mit festem "realm" speichern (oder der ändert sich auch noch pro Benutzer)
Der Realm ist bisher bei allen Fritzboxen über alle Firmware-Versionen identisch. Der Unterschied zwischen MD5 und Verschlüsselung liegt liegt darin, dass ersteres mit Informationsverlust verbunden ist und es keine Eineindeutigkeit mehr gibt. D.h. es gibt zu einem Hash viele, passende Kennwörter. Nur eines davon ist aber richtig. Daher sind Rückschlüsse schwer möglich, sofern das Kennwort einigermaßen komplex ist.

Ändert der Server den "realm", [..] nutzt mir der fertige Hash-Wert A1 auf dem Client auch gar nichts mehr
Wie oben gesagt, kommt das bei der Fritzbox (bislang) nicht vor.

Warum nimmst Du denn dann nicht einfach die Möglichkeit wahr, den verwendeten Account und das Kennwort dadurch besser abzusichern, daß Du über die passende Schnittstelle (das ist iirc "X_AVM-DE_AppSetup:1::RegisterApp()") nur für diese Zugriffe ein passendes App-Konto einrichtest
Da kann man sicher nochmal drüber nachdenken. Ich habe mir RegisterApp noch nicht genau angesehen. Jetzt geht es aber erstmal darum sicherzustellen, dass das Programm weiter läuft. Ein großer Zeitaufwand ist dafür nicht drin. Da es derzeit Freeware ist, ist auch eine Einstellung durchaus denkbar, wenn der Aufwand ein gewisses Maß übersteigt.

Was erwartest Du denn? Selbst wenn ich den Code anpasse und einen tatsächlich existierenden Benutzernamen (anstelle von "admin") verwende, kann doch beim ersten Versuch nur ein "Unauthenticated" dabei herauskommen, das ist doch genau der Punkt, daß es den zusätzlichen Roundtrip braucht:
Ja, genau! Es geht nur darum, einen entsprechenden NONCE für die Anmeldung zu erhalten. Bei einem Request über HTTP gab es den ab Firmware 6.98 nicht mehr, sondern es kam nur noch ein HTTP-Error 400 (Bad Request). Wenn hingegen ein Unauthenticated mit Realm und Nonce kommt, ist ja alles wunderbar. Nur darum ging es ja.

offenbar "überstimmt" hier der SOAP-Header (auf der höheren Protokoll-Ebene) die bereits erfolgte Authentifizierung auf der HTTP-Ebene darunter.
Das ist doch perfekt. So ist es dann auch möglich, mit TLS ohne Authentifizierung weiter CLA zu nutzen. Und ich bin glücklich. :p

Wenn Du tatsächlich möchtest, daß ich einen sinnvollen Test mache, ob bei mir die CLA auch innerhalb einer TLS-Verbindung funktioniert, dann fehlt da ja ganz offensichtlich noch der Code für das Berechnen des Hash-Wertes
Ich bin ziemlich fest davon überzeugt, dass CLA vollständig funktionieren wird, wenn Realm und Nonce bei deinem TLS-Anmeldeversuch zurückkommen. Vielen Dank dafür! :) Einen Test mit Hash musst du nicht machen, danke für das Angebot! Das reicht mir erstmal aus, mich nun etwas intensiver mit einer verschlüsselten Kommunikation zur Fritzbox zu beschäftigen. Wenn ich dann nicht weiterkomme, werde ich dein Angebot gern nochmal in Anspruch nehmen. ;)

Bei einem Schema-Fehler im SOAP-Header (z.B. durch das Auslassen des "UserID"-Tags im Header, was ja gültiges XML erzeugt, aber gegen das Schema verstößt) nervt die Box jedenfalls auch bei mir mit einem "401". [..] Das Ergebnis wäre ja genau derselbe XML-Aufbau, wie ich ihn zuvor hatte und der funktioniert bei mir mit allen FRITZ!OS-Versionen einwandfrei.
Bei mir kommt der Fehler 401, wenn ich den SOAP-Header komplett weglasse und nur den Body sende. So wie du vermutetest. Momentan weiß ich noch nicht, was da beim HttpRequester falsch läuft. Ich muss mir das nochmal in Ruhe ansehen.

AVM hält sich nicht zwangsläufig an die eigene Dokumentation. Teilweise ist die Dokumentation auch unterirdisch schlecht und sogar falsch. Der ganze Bereich rund um das Telefonbuch ist eher als Katastrophe zu bezeichnen. Da ist viel Trial-And-Error gefragt. Vergnügungssteuerpflichtig ist es jedenfalls nicht. In anderen Bereichen wird es sicher nicht so viel anders sein...
 
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.