bin ich einer anderen Meinung.
Gibt es dafür auch eine Begründung?
Wenn Du damit die Aussage in Zweifel ziehst, daß die Funktionen im Stacktrace:
[ 1982.450000][0]37f8: [<81660d78>] 0x81660d78 dnsmasq_new.constprop.2+0x58/0x120 [kdsldmod]
[ 1982.450000][0]3830: [<81660ffc>] 0x81660ffc dnsmasq_snd_packet+0x1bc/0x580 [kdsldmod]
nichts mit dem Prozess "dnsmasq" per se zu tun haben, dann wirf doch einfach mal einen Blick auf die Stelle, wo das LKM angezeigt wird, in dem sich diese Funktionen befinden. Diese Funktionen gibt es auf JEDER FRITZ!Box mit einem "(k)dsld" als WAN-Stack - das kann man schon mit einem einfachen "grep" oder einem zur Architektur passenden "objdump" in einer originalen Firmware jederzeit selbst nachprüfen:
Code:
vidar:/home/FritzBox/FB7490/firmware/113.07.11 $ objdump-mips -t lib/modules/3.10.107/kernel/drivers/dsld/kdsldmod.ko | grep dnsmasq
00000000 l d .text.dnsmasq_headerhashkey 00000000 .text.dnsmasq_headerhashkey
00000000 l d .text.dnsmasq_unhash 00000000 .text.dnsmasq_unhash
00000000 l d .text.dnsmasq_rcv_fragquery 00000000 .text.dnsmasq_rcv_fragquery
00000000 l d .text.dnsmasq_rcv_packet 00000000 .text.dnsmasq_rcv_packet
00000000 l d .text.dnsmasq_expire_timer 00000000 .text.dnsmasq_expire_timer
00000000 l d .text.dnsmasq_flush 00000000 .text.dnsmasq_flush
00000000 l d .text.dnsmasq_detach 00000000 .text.dnsmasq_detach
00000000 l d .text.dnsmasq_attach 00000000 .text.dnsmasq_attach
00000000 l d .text.dnsmasq_exit 00000000 .text.dnsmasq_exit
00000000 l d .text.dnsmasq_init 00000000 .text.dnsmasq_init
00000000 l d .text.dnsmasq_new.constprop.2 00000000 .text.dnsmasq_new.constprop.2
00000000 l d .text.dnsmasq_snd_packet 00000000 .text.dnsmasq_snd_packet
00000000 l F .text.dnsmasq_headerhashkey 00000078 dnsmasq_headerhashkey
00000000 l F .text.dnsmasq_unhash 000001a4 dnsmasq_unhash
00000000 l F .text.dnsmasq_rcv_fragquery 000001f4 dnsmasq_rcv_fragquery
00000000 l F .text.dnsmasq_rcv_packet 00000828 dnsmasq_rcv_packet
0001ecd8 l O .data 0000000c dnsmasq_entry_cache
00000000 l F .text.dnsmasq_expire_timer 00000040 dnsmasq_expire_timer
00000000 l F .text.dnsmasq_flush 00000194 dnsmasq_flush
00000000 l F .text.dnsmasq_detach 00000060 dnsmasq_detach
00000000 l F .text.dnsmasq_attach 00000030 dnsmasq_attach
00000000 l F .text.dnsmasq_exit 00000014 dnsmasq_exit
00000000 l F .text.dnsmasq_init 00000014 dnsmasq_init
00000000 l F .text.dnsmasq_new.constprop.2 00000120 dnsmasq_new.constprop.2
00000000 l F .text.dnsmasq_snd_packet 00000580 dnsmasq_snd_packet
0001ec94 l O .data 0000003c dnsmasq_module_struct
00000000 l d .text.unlikely.dnsmasq_headerhashkey 00000000 .text.unlikely.dnsmasq_headerhashkey
00000000 l d .text.unlikely.dnsmasq_unhash 00000000 .text.unlikely.dnsmasq_unhash
00000000 l d .text.unlikely.dnsmasq_rcv_fragquery 00000000 .text.unlikely.dnsmasq_rcv_fragquery
00000000 l d .text.unlikely.dnsmasq_rcv_packet 00000000 .text.unlikely.dnsmasq_rcv_packet
00000000 l d .text.unlikely.dnsmasq_expire_timer 00000000 .text.unlikely.dnsmasq_expire_timer
00000000 l d .text.unlikely.dnsmasq_flush 00000000 .text.unlikely.dnsmasq_flush
00000000 l d .text.unlikely.dnsmasq_detach 00000000 .text.unlikely.dnsmasq_detach
00000000 l d .text.unlikely.dnsmasq_attach 00000000 .text.unlikely.dnsmasq_attach
00000000 l d .text.unlikely.dnsmasq_exit 00000000 .text.unlikely.dnsmasq_exit
00000000 l d .text.unlikely.dnsmasq_init 00000000 .text.unlikely.dnsmasq_init
00000000 l d .text.unlikely.dnsmasq_new.constprop.2 00000000 .text.unlikely.dnsmasq_new.constprop.2
00000000 l d .text.unlikely.dnsmasq_snd_packet 00000000 .text.unlikely.dnsmasq_snd_packet
00000000 l d .text.unlikely.dp_dnsmasq_print 00000000 .text.unlikely.dp_dnsmasq_print
00000000 l d .text.dp_dnsmasq_print 00000000 .text.dp_dnsmasq_print
00000000 l d .text.unlikely.dp_dnsmasq_active_entries 00000000 .text.unlikely.dp_dnsmasq_active_entries
00000000 l d .text.dp_dnsmasq_active_entries 00000000 .text.dp_dnsmasq_active_entries
00000000 l d .text.unlikely.dp_set_dnsmasq_masquerading 00000000 .text.unlikely.dp_set_dnsmasq_masquerading
00000000 l d .text.dp_set_dnsmasq_masquerading 00000000 .text.dp_set_dnsmasq_masquerading
00000000 l d .text.unlikely.dp_set_dnsmasq_dnsservers 00000000 .text.unlikely.dp_set_dnsmasq_dnsservers
00000000 l d .text.dp_set_dnsmasq_dnsservers 00000000 .text.dp_set_dnsmasq_dnsservers
00000000 l d .text.unlikely.dp_set_dnsmasq_overwrite_dnsservers 00000000 .text.unlikely.dp_set_dnsmasq_overwrite_dnsservers
00000000 l d .text.dp_set_dnsmasq_overwrite_dnsservers 00000000 .text.dp_set_dnsmasq_overwrite_dnsservers
00000000 l d .text.unlikely.dp_set_dnsmasq_dnsservers_notifyfunc 00000000 .text.unlikely.dp_set_dnsmasq_dnsservers_notifyfunc
00000000 l d .text.dp_set_dnsmasq_dnsservers_notifyfunc 00000000 .text.dp_set_dnsmasq_dnsservers_notifyfunc
00000000 l d .text.unlikely.dp_get_dnsmasq_dnsservers 00000000 .text.unlikely.dp_get_dnsmasq_dnsservers
00000000 l d .text.dp_get_dnsmasq_dnsservers 00000000 .text.dp_get_dnsmasq_dnsservers
00000000 l d .text.unlikely.dp_get_dnsmasq_used_dnsservers 00000000 .text.unlikely.dp_get_dnsmasq_used_dnsservers
00000000 l d .text.dp_get_dnsmasq_used_dnsservers 00000000 .text.dp_get_dnsmasq_used_dnsservers
00000000 l d .text.unlikely.dp_set_dnsmasq_transparent 00000000 .text.unlikely.dp_set_dnsmasq_transparent
00000000 l d .text.dp_set_dnsmasq_transparent 00000000 .text.dp_set_dnsmasq_transparent
00000000 g F .text.dp_dnsmasq_active_entries 00000078 dp_dnsmasq_active_entries
00000000 g F .text.dp_set_dnsmasq_masquerading 00000038 dp_set_dnsmasq_masquerading
0001ec90 g O .data 00000004 dnsmasq_module_desc
00000000 g F .text.dp_dnsmasq_print 0000005c dp_dnsmasq_print
00000000 g F .text.dp_set_dnsmasq_dnsservers_notifyfunc 0000000c dp_set_dnsmasq_dnsservers_notifyfunc
00000000 g F .text.dp_set_dnsmasq_overwrite_dnsservers 00000014 dp_set_dnsmasq_overwrite_dnsservers
00000000 g F .text.dp_set_dnsmasq_dnsservers 00000014 dp_set_dnsmasq_dnsservers
00000000 g F .text.dp_set_dnsmasq_transparent 00000034 dp_set_dnsmasq_transparent
00000000 g F .text.dp_get_dnsmasq_dnsservers 00000028 dp_get_dnsmasq_dnsservers
00000000 g F .text.dp_get_dnsmasq_used_dnsservers 00000028 dp_get_dnsmasq_used_dnsservers
vidar:/home/FritzBox/FB7490/firmware/113.07.11 $
Selbst die Frage, warum AVM eine "Sonderbehandlung" für einen fremden Daemon in den WAN-Stack einbauen sollte, wenn man diesen Daemon bei AVM weder nutzt noch unterstützt, muß man dabei noch nicht mal stellen (auch wenn sie sich aufdrängt) ... schon die "Systematik" der gefundenen Funktionsnamen zeigt einigermaßen deutlich, daß bei AVM offenbar auch die Aufgabe, die sich aus der Weiterleitung von DNS-Abfragen von LAN-Clients ergibt (und auch die Internet-Zugriffe der Prozesse auf der FRITZ!Box gehen dabei von einer LAN-Adresse aus, wie man jederzeit in den Tabellen des "connection trackings" überprüfen kann), unter dem Label "DNS Masquerading" segelt und man dafür wohl Funktionsnamen verwendet, die ihrerseits die Zeichenkette "dnsmasq" enthalten.
Das heißt zwar noch lange nicht, daß hier nicht tatsächlich ein laufender "dnsmasq"-Prozess gerade zum Fehlerzeitpunkt der aktuelle ist (auch der müßte für seine DNS-Abfragen ja irgendwie durch den WAN-Stack kommen, ansonsten dürfte ihm das "Wissen" um den Rest der Welt fehlen), aber wenn der nicht gerade seinerseits mit falsch formatierten DNS-Abfragen den entsprechenden Code im AVM-WAN-Stack dann doch noch durcheinanderbringt und damit das Problem triggert, handelt es sich hier um einen Fehler in der Speicherverwaltung des Kernels, der durch den "kdsldmod.ko" hervorgerufen wird.
Das sollte dann allerdings auch jeder andere "dnsmasq"-Daemon im LAN auf die Reihe kriegen, wenn es wirklich an den generierten Abfragen läge, was ich stark bezweifele, weil das Problem bereits bei der Zuweisung eines Objekts aus dem SLAB-Cache (für "dnsmasqentry"-Objekte) zuschlägt, auch wenn der eigentliche Fehler wohl schon bei der letzten Freigabe davor auftrat.
So ein Stacktrace wird jedenfalls immer von unten nach oben gelesen, wenn es um die "Reihenfolge" beim Aufruf geht ... denn beim "return" aus einer aufgerufenen Funktion geht es dann in diesem Stack jeweils um einen Schritt "nach unten".
Schaut man sich jetzt die ersten Zeilen im Stacktrace an (der Call-Trace berücksichtigt nur die angesprungenen Funktionen und keine Parameter, die ggf. auch auf den Stack liegen - daher verwendet ich trotzdem "Stacktrace" und "Call-Trace" synonym):
[ 1982.440000][0]Call Trace:
[ 1982.440000][0]35a8: [<80021be0>] 0x80021be0 show_stack+0x80/0xa0
[ 1982.440000][0]3690: [<8011a928>] 0x8011a928 __slab_error.isra.17+0x28/0x40
[ 1982.440000][0]36a8: [<8011bc0c>] 0x8011bc0c slab_corrupt.constprop.23+0x4c/0x80
[ 1982.440000][0]3750: [<8011c1a8>] 0x8011c1a8 cache_alloc_refill+0x3e8/0x920
[ 1982.440000][0]37b0: [<8011cb8c>] 0x8011cb8c kmem_cache_alloc+0x12c/0x1a0
[ 1982.450000][0]37d8: [<81654ee4>] 0x81654ee4 dpenv_cache_alloc+0x24/0x80 [kdsldmod]
[ 1982.450000][0]37f8: [<81660d78>] 0x81660d78 dnsmasq_new.constprop.2+0x58/0x120 [kdsldmod]
, sieht man deutlich, daß im "kdsldmod" als letztes eine Funktion "dpenv_cache_alloc" aufgerufen wurde, die ihrerseits dann "kmem_cache_alloc" aufruft und das stellt dann fest, daß irgendwelche Kontrollelemente für die Speicherverwaltung einen ungültigen Inhalt haben und gibt die entsprechenden Fehlermeldungen aus. Den Teil ab "kmem_cache_alloc" kann man sich sogar wieder in den Kernel-Quellen ansehen (in "mm/slab.c"), denn das ist nicht mehr innerhalb des "kdsldmod", der bekanntlich "Closed Source" ist.
Wer das dann immer noch nicht glaubt, kann ja mal eine Support-Datei einer beliebigen FRITZ!Box mit einer halbwegs aktuellen Firmware-Version durchsuchen ... am besten von einer, auf der tatsächlich eine originale AVM-Firmware oder zumindest eine modifizierte ohne "dnsmasq" installiert ist. Auch dort wird sich beim Durchsuchen der Supportdatei der Objekt-Cache mit dem Namen "dnsmasqentry" finden, in dem offenbar hier im Fehlerfall zuviele Freigaben erfolgen. Das "inuse" mit dem Wert "4294967295" ist wohl am Ende nichts anderes, als ein "underflow" des Zählers in "inuse" (slab.c, Zeile 2934 - ansonsten steht in "inuse" die Anzahl der aktiven Objekte in diesem Cache) und die Tatsache, daß da so eine Riesenzahl erscheint, ist nur dem Umstand geschuldet, daß der Wert hier als "unsigned integer" behandelt wird (slab.c, Zeile 3267).
Was SLAB jetzt für die Kernel-Speicherverwaltung leistet bzw. was das Prinzip dahinter genau bzw. "ausführlich" ist, erkläre ich nicht ... kann man sich mit einfacher Google-Suche selbst ansehen. Für das Verständnis des Problems reicht es aus, wenn man sich das als Caches für kleine Memory-Objekte vorstellt, die immer wieder in schneller Folge angefordert und freigegeben werden und wo man die Verwaltungsinformationen für die dafür verwendeten "Speicherseiten" nur einmalig anlegt/initialisiert - das spart dann am Ende eine aufwändigere Speicherverwaltung über eine MMU, erfordert aber auch eine passende und vor allem dauerhafte "Reservierung" der entsprechenden Speicherseiten (die ja die Verwaltungsinfos für diesen speziellen Cache enthalten) und dieser Platz steht dann i.d.R. nicht für anderes zur Verfügung.
AVM hat jedenfalls bei der SLAB-Verwaltung noch einiges an Protokollierung nachgerüstet und auch diese Infos in aller Ausführlichkeit in die Supportdatei übernommen ... man war/ist dort wohl auf der Suche nach Fehlern beim Anfordern und Freigeben von Kernel-Speicher durch die verschiedenen Module und Prozesse - was angesichts der zusätzlichen Komplexität durch den üblicherweise verwendeten "packet accelerator" schnell mal in die Hose gehen kann und dann unschöne Speicherlecks hinterläßt oder sogar zu den gefürchteten "double frees" führt, die im Kontext von Angriffen immer wieder eine Rolle spielen (wenn hier auch meist auf dem Heap eines Prozesses).
Es kommt hier also offenbar zu einem überzähligen "kmem_cache_free" für einen solchen Cache-Eintrag (wenn ich raten sollte, handelt es sich bei dem "dp" im Namen "dpenv_cache_alloc" um die "deep packet"-Inspektion) und es mag sogar sein, daß der nur dann auftritt, wenn anstelle des "multid" von AVM ein anderes Programm als DNS-Server verwendet wird - nur sollte es dann (sofern nicht doch ein "komisches Format" einer Abfrage durch den "dnsmasq"-Daemon das Ganze erst ins Rollen bringt) mit jedem anderen DNS-Server anstelle des "dnsmasq" ebenso auftreten - vielleicht geschieht das aber auch erst, wenn da etwas "Stress" aufkommt und eine gewisse Anzahl von Abfragen (die dann jeweils ein entsprechendes Objekt aus dem "dnsmasqentry"-Cache brauchen) parallel ausgeführt wird bzw. wurde.
Alternativ wäre noch denkbar, daß da jemand mit diesem Object-Pointer wild in der Gegend herumschreibt und dabei sogar die Verwaltungsinfos der Page löscht ... allerdings wäre dann wohl nicht nur der "inuse"-Counter davon betroffen - das klingt also unwahrscheinlicher als eine überzählige Freigabe, zumal diese durch ein fehlendes Locking für den Cache bei parallelen Aufrufen auch leicht mal als "race condition" auftreten könnte.
Solange nicht jede SLAB-Zuweisung bzw. -Freigabe (also "kmem_cache_alloc" und "kmem_cache_free") dort protokolliert wird (was wohl nur im Debug-Kernel von AVM erfolgt, die "trace_kmem_*"-Funktionen finde ich in den Quellen gar nicht, das muß wohl auf einen Dummy per Pre-Processor hinauslaufen in den veröffentlichten Sourcen), wird man auch Probleme haben, den wirklich schuldigen Code-Teil zu isolieren ... der Teil, wo eine doppelte Freigabe direkt festgestellt würde, wird nur bei aktiviertem "DEBUG"-Symbol eingeschlossen (in slab.c):
C:
2917 static void slab_put_obj(struct kmem_cache *cachep, struct slab *slabp,
2918 void *objp, int nodeid)
2919 {
2920 unsigned int objnr = obj_to_index(cachep, slabp, objp);
2921
2922 #if DEBUG
2923 /* Verify that the slab belongs to the intended node */
2924 WARN_ON(slabp->nodeid != nodeid);
2925
2926 if (slab_bufctl(slabp)[objnr] + 1 <= SLAB_LIMIT + 1) {
2927 printk(KERN_ERR "slab: double free detected in cache "
2928 "'%s', objp %p\n", cachep->name, objp);
2929 BUG();
2930 }
2931 #endif
2932 slab_bufctl(slabp)[objnr] = slabp->free;
2933 slabp->free = objnr;
2934 slabp->inuse--;
2935 }
Dadurch scheppert es erst bei der nächsten Anforderung eines Objekts aus dem Cache ... die dabei zusätzlich ausgeführte Gültigkeitsprüfung für "inuse" stellt dann den zu großen Wert durch den "underrun" fest und bricht an dieser Stelle ab.
Schlauer wäre es, wenn bei der Freigabe/Rückgabe bereits geprüft würde, ob der Zähler vor dem Dekrementieren (in Zeile 2934) schon "0" ist ... dann hat entweder ein Unberechtigter in das "inuse"-Feld geschrieben oder diese SLAB-Seite enthält schon vor der versuchten Freigabe vermeintlich keine weiteren Objekte in diesem Cache.
So erkläre ich mir jedenfalls das Problem ... einen direkten Zusammenhang mit der Verwendung von "dnsmasq" als alternativem DNS-/DHCP-Server kann ich da nur insoweit erkennen, als daß der wohl UDP-Pakete erzeugen wird (und Ausgangspunkt ist hier ein Versuch des Sendens eines UDP-Paketes, wie man weiter unten im Call-Trace sehen kann) und diese dann durch die "deep packet inspection" von AVM einer "Sonderbehandlung" unterzogen werden (warum die notwendig ist, kommt gleich noch). Die im Call-Trace zu sehenden Funktionen wirst Du jedenfalls im "dnsmasq"-Quelltext auch nur mit sehr geringer Wahrscheinlichkeit finden - aber Du kannst es ja mal genauer untersuchen.
Da bei DNS over TLS die DPI durch AVM ja keinen Sinn ergibt (schließlich wäre die Abfrage und die Antwort verschlüsselt), sollte es auch möglich sein, den "dnsmasq" einfach mit DoT zu betreiben (und ohne die 192.168.180.1/192.168.180.2-Adressen als vermeintliche Forwarder) ... auch dann sollte es im "kdsldmod" zumindest nicht in den Teil mit der Sonderbehandlung führen (nochmal: die gilt für DNS-Abfragen per se und hat mit dem "dnsmasq"-Prozess nicht wirklich etwas zu tun - eventuell/wahrscheinlich hingegen mit der notwendigen Umsetzung von 192.168.180.1 auf die erste (bzw. auf die zweite bei .2) DNS-Server-Adresse vom Provider) und - wenn alles gut geht - dann auch nicht zu diesem Fehler kommen.
Was genau AVM den DNS-Paketen da nun als Sonderbehandlung angedeihen läßt, weiß ich naturgemäß auch nicht; ich bin also auf "qualified guessing" angewiesen ... die Funktionsnamen mit Bezug auf "dnsmasq" sollten aber bei jedem auch eigene Vorstellungen auslösen können. Und daß AVM die DNS-Pakete an die 192.168.180.1 und 192.168.180.2 einer solchen Sonderbehandlung unterziehen MUSS, dürfte auch jedem einleuchten ... schließlich stehen diese internen IP-Adressen als Synonym für den ersten und den zweiten DNS-Server, den die Box per DHCP oder LCP/NCP vom Provider "gelernt" hat.
Wenn sie diese Abfragen NICHT selbst per Masquerading auf die korrekten DNS-Adressen umsetzen würde, kämen die wohl nie an. Wofür diese Adressen stehen/benutzt werden, kann auch wieder jeder selbst erkunden (wenn er das mit dem "Synonym für DNS-Server" nicht glauben möchte) ... man braucht nur mal einen Paketmitschnitt auf der Internet-Verbindung starten und dann entsprechende DNS-Abfragen an diese 192.168.180.1/.2 senden.
Eigentlich sollten (zumindest nach meinem bisherigen Verständnis, aber AVM baut wohl daran, DoT in die Box zu kriegen auch ohne "dnsmasq" - da könnte sich also in den neuen Laborversionen etwas ändern) auch nur DNS-Pakete an die 192.168.180.1 und 192.168.180.2 von dieser Sonderbehandlung betroffen sein ... verwendet man - wie im verlinkten Workaround vorgeschlagen - andere DNS-Server, hat der WAN-Stack normalerweise keinen Grund, diese DNS-Pakete irgendwie anders zu behandeln als jedes andere Datenpaket beliebigen Inhalts.
Und wenn ich #26 richtig verstehe, wurden beim Auftreten des Problems wieder die Adressen 192.168.180.1 und 192.168.180.2 benutzt ... ggf. verwendet AVM diese auch gar nicht mehr selbst (schließlich kann der "multid" diese externen DNS-Server-Adressen auch anders ermitteln - wie das machbar wäre, habe ich weiter vorne schon für
@Massa beschrieben) und schert sich deshalb mittlerweile einen Dreck um den Fehler in der Behandlung von Abfragen an die 192.168.180.1/192.168.180.2 - zumal das ja offenbar auch nicht bei jedem Request sofort knallt, denn dann käme die Box bei den Betroffenen ja gar nicht mehr aus dem Tee.
Wenn man also meinen Ausführungen nicht glauben will (was das gute Recht eines jeden ist und letztlich kann ich es - mangels "kdsldmod"-Quellen - auch nicht wirklich "beweisen"), dann wäre etwas mehr Argumentation als:
bin ich einer anderen Meinung. Alleine schon deswegen, weil der oben besagte Workaround auf meiner anderen 7490 seit 3 Jahren anscheinend seine Wirkung zeigt.
schon angebracht in meinen Augen ... zumal die Begründung, daß der Fehler bei Nichtbenutzung der 192.168.180.1 bzw. 192.168.180.2 NICHT auftritt, ja nun in keinster Weise im Widerspruch zu dem steht, was ich bisher (und hier erneut) geschrieben habe. Oder wo genau irre ich mich da (und habe das anders beschrieben)? Hier wäre es nett, die konkrete Aussage zu zitieren (und natürlich zu verlinken), die so etwas beinhalten soll.
Die anderen Vorschläge für Workarounds (nämlich das Auslesen der echten IP-Adressen der DNS-Server vom Provider und die Verwendung dieser Adressen anstelle von 192.168.180.1/.2) stehen auch schon weiter vorne in diesem Thread ... man muß also nicht zwangsläufig Google oder Cloudflare oder wen auch immer mit seiner DNS-Historie füttern - man kann (mit etwas eigenem Aufwand, weil man die Server halt nach jeder "Internet-Anmeldung" neu auslesen muß - dafür gibt es oben auch den Hinweis auf "onlinechanged") auch einfach die Provider-Server direkt befragen (dann natürlich wieder nicht über die Option im "dnsmasq"-GUI, weil die ja die 192.168.180.1/.2 verwendet).