Synapse 1.51+ mit schwerem Empfangsfehler

Marix Synapse Implementierung hat einen schweren Bug in den Versionen 1.51 und 1.52, der dazu führt, daß keine Nachrichten mit bestimmten Eigenschaften ( Verschlüsselung ) beim Empfänger ankommen.

Synapse 1.51+ mit schwerem Empfangsfehler

Kurios macht diesen Fehler, daß er nur bei Externen Nachrichten auftaucht. Schickt man intern Nachrichten von einem Account zum Anderen, kommen die Nachrichten trotzdem an.

Um festzustellen, daß Ihr betroffen seid, reicht es im Log des Homeservers nach diesen Fehlermeldungen zu suchen:

2022-02-09 00:00:41,933 - synapse.federation.transport.server.federation - 114 - ERROR - PUT-34443 - 'dict' object has no attribute 'edu_type'
Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/twisted/internet/defer.py", line 1661, in _inlineCallbacks
    result = current_context.run(gen.send, result)
StopIteration: 0

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/twisted/internet/defer.py", line 1661, in _inlineCallbacks
    result = current_context.run(gen.send, result)
StopIteration: {'ed25519:a_iiuD': FetchKeyResult(verify_key=<nacl.signing.VerifyKey object at 0x7fc8a5af6d90>, valid_until_ts=1644443665400)}

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.9/site-packages/synapse/federation/transport/server/federation.py", line 101, in on_PUT
    device_list_updates = [
  File "/usr/lib/python3.9/site-packages/synapse/federation/transport/server/federation.py", line 104, in <listcomp>
    if edu.edu_type in DEVICE_UPDATE_EDUS
AttributeError: 'dict' object has no attribute 'edu_type'

Die Folge, Nachrichten mit diesem Attribute kommen nicht an, weil es einen GEHEIMEN! Defaulteintrag zu einem nicht standardmäßig konfigurierten Logger gibt! Ja, richtig gelesen: Weil die Nachrichten geloggt werden sollen, kommen Sie nicht an, weil das Pythonscript vorher crasht.

Die Lösung für das Problem

Die Lösung ist sehr einfach, was man auch in diesem Commit nachlesen kann:

Öffnet die Datei log_config.yaml und ändert Sie so:

loggers:
       synapse:
            level: ERROR
            handlers: file

       synapse.8631_debug:
            level: ERROR

Danach Synapse neustarten und das war es schon. Wenn Ihr betroffen ward und kein scheues Rehlein, sondern ein Matrix Hengst seid, bricht dann leider ein wahrer Sturm über Euren Server ein, weil alle anderen Server Euch gern die verpassten Nachrichten zustellen wollen. Kurzfristige Loadwarnungen sind zu tolerieren 😉

 

Lösung: Das 3n+1 Problem

Stand: 28.11.2021

Es gibt so mathematische Spielereien, mit denen sich hochbezahlte Köpfe Ihr Leben lang beschäftigen ohne zum Ende zu kommen. Weil es angeblich spannende Fragen sind. Weil die Fragen nicht gelöst werden können, lobt man dafür sogar Belohnungen aus. Eins der Probleme schauen wir uns kurz an und lösen dann mal auf:

Lösung: Das 3n+1 Problem

Die Funktion um die es heute geht ist ein Algorithmus, weniger eine Funktion: f(x)=3x+1 ? x/2

In Worten: Wenn x ungerade ist, gilt x=3x+1. Wenn x gerade ist, dann gilt x = x/2 .

Die Behauptung:

Für alle Ganzzahlen n>0 gilt, daß am Ende des Algorithmusses eine Zahlenschleifen von 4,2,1 rauskommt. Es gibt keine anderen Schleifen. Was zu beweisen ist.

Beispiele:

Ausgabeformat:  Anfangszahl: X-Wert big = größte Zahl in der Kette

1: x=4 big=4
1: x=2 big=4
1: x=1 big=4
1: x=4 big=4
1: x=2 big=4
1: x=1 big=4

Erklärt:

1 ist ungerade => 1*3+1 = 4
4 ist gerade => 4/2 = 2
2 ist gerade => 2/2 = 1

Man sieht, daß hier eine Schleife 4,2,1 rauskommt, weil bei x=1 das Ergebnis wieder 4 ist. In der Programmierung ist das eine Endlosschleife, weil die Abbruchbedingung fehlt. Deswegen stoppen alle nachfolgenden Ausgaben auch bei 1.

Anfangszahl 2:

2: x=1 big=1

Da muß man nicht viel erklären, weil steht oben schon 😉

3: x=10 big=10
3: x=5 big=10
3: x=16 big=16
3: x=8 big=16
3: x=4 big=16
3: x=2 big=16
3: x=1 big=16

Auch hier 4,2,1

4: x=2 big=2
4: x=1 big=2

Oh.. eine 4.. wie in 4,2,1.. ähm ja. siehe oben

5: x=16 big=16
5: x=8 big=16
5: x=4 big=16
5: x=2 big=16
5: x=1 big=16
6: x=3 big=3
6: x=10 big=10
6: x=5 big=10
6: x=16 big=16
6: x=8 big=16
6: x=4 big=16
6: x=2 big=16
6: x=1 big=16
7: x=22 big=22
7: x=11 big=22
7: x=34 big=34
7: x=17 big=34
7: x=52 big=52
7: x=26 big=52
7: x=13 big=52
7: x=40 big=52
7: x=20 big=52
7: x=10 big=52
7: x=5 big=52
7: x=16 big=52
7: x=8 big=52
7: x=4 big=52
7: x=2 big=52
7: x=1 big=52
8: x=4 big=4
8: x=2 big=4
8: x=1 big=4
9: x=28 big=28
9: x=14 big=28
9: x=7 big=28
9: x=22 big=28
9: x=11 big=28
9: x=34 big=34
9: x=17 big=34
9: x=52 big=52
9: x=26 big=52
9: x=13 big=52
9: x=40 big=52
9: x=20 big=52
9: x=10 big=52
9: x=5 big=52
9: x=16 big=52
9: x=8 big=52
9: x=4 big=52
9: x=2 big=52
9: x=1 big=52

Das läßt sich beliebig für jede Ganzzahl n > 0 wiederholen.

Diese Auflistungen hier zeigen schon den Grund für das Verhalten und das ist wenig mystisch und noch weniger unerklärlich.

Die Auflösung:

Die Frage war: Wieso kommt am Ende immer eine Schleife mit ( 4,2,1 ) raus?

Das ist ganz leicht, weil 3x+1 für jedes Start-x irgendwann auf 2^n trifft. 2^n ist die folgende Operation : 2*2*2*2*2*2*2….*2 . Das ist genau das Gegenteil von der Berechnung für gerade Zahlen in dem Algorithmus ( x=x/2 ) . Wenn ich also z.b. 2^6 treffe, was 64 ist, und dies ständig durch 2 teile, kommt am Ende ohne Zweifel 1 raus. Es ist egal wie groß n ist, das gilt immer. Der Algorithmus endet also immer in der Sequenz ( 2^n , 2^(n-1) … 2^(n-n) und 2^(0) = 1 . Da 1*3+1 = 2^2 ist, terminiert der Algorithmus nicht und es kommt zur Endlosschleife.

Das ist absolut kein Wunder.

Die nächste Behauptung ist: es gibt keine anderen Schleifen.

Da 3x+1 ausschließlich bei ungeraden Zahlen angewendet wird und bei der Berechnung garantiert immer eine gerade Zahl herauskommt und nicht jede gerade Zahl eine Potenz von 2 ist, kann es keine anderen Schleifen geben, da bei jedem Schritt nach einer ungeraden Zahl die Teilung durch 2 solange stattfindet, bis wieder eine ungerade Zahl kommt.

Da es für jede Potenz 2^n für n > 1 eine ungerade Zahlen x gibt, die x = (2^n -1) / 3 erfüllt, kann es keine andere Schleife geben, denn jede gerade Zahl geteilt durch 2 trifft am Ende der Teilung gerader Zahlen immer auf eine ungerade Zahl und sobald diese ungerade Zahl 1 ist, ist die Schleifenbedingung erfüllt. Da eine ungerade Zahl verdreifacht wird(+1), aber eine gerade Zahl nur halbiert, wächst x über die Zeit im Schnitt an, bis x = 2^n ist, also eine 2er Potenz getroffen wird. QED.

Negative Startwerte

Bei negativen Startwerten kommt es ganz schnell zu Zahlenschleifen. Das liegt nach Analyse des Algorithmuses an einem BUG. Wenn das ein Programm wäre, würde ich dafür eine 6 vergeben und es dem Entwickler um die Ohren hauen 😉

Die Formel ist ja „3x+1“. Diese Formel kann für einige Ganzzahlen keine 2er Potenzen im negativen Zahlenstrahl finden. Der „Bug“ liegt im „+“ Zeichen, daß im negativen Zahlenraum zum „Fehlerfall“ führt. Es müßte nämlich eigentlich „3x-1“ lauten. Damit erreicht man im negativen Zahlenbereich eine exakte Spiegelung des positiven Zahlenraumes, weil alle oben genannten Bedingungen dann erfüllt sind.

Das liegt an der Verletzung der Gleichungsregel, daß wenn ich auf der einen Seite der Gleichung etwas abziehe, ich es zum Ausgleich auf der anderen Seite hinzufügen muß:

2 = 5-3 => 2+3 = 5

Der Algorithmus „verletzt“ dies beim Übergang von positiven zu negativen Startzahlen. Das ist sprach-mathematisch natürlich inkorrekt, beschreibt aber das Problem sehr gut.

Beispiel:

x = -21

x = -63 / 3

x*3 = -63 = -62 -1

x*3+1 = -62

Wenn man das jetzt für +21 macht, gilt:

21*3+1 = 64

64 = 2^6 also durch 2 bis zur 1 teilbar. Für -62 gilt das nicht, da kommt bei unserem Algorithmus -31 raus, statt -32 wie es nötig wäre um zu terminieren.

Fazit

Das der Algorithmus im Negativen Zahlenbereich „mysteriöse Schleifen“ bildet, im positiven Bereich aber nicht, ist also ein Fehler im Algorithmus und nicht „mysteriös“, wie einige Youtuber das andeuten. Er ist einfach schlecht gemacht worden 😀

Kommentare sind erlaubt, also tobt Euch aus 😉

Wieviel Zeit und Energie in das angebliche Problem eines defekten Algorithmuses verplempert wird und wurde, könnt Ihr hier nachlesen:

https://en.wikipedia.org/wiki/Collatz_conjecture#Iterating_on_all_integers

oder lasst es Euch hier „erklären“:

Ich kann mich den Matheprofs nur anschließen: Verplempert keine Zeit damit, es ist einfach nur ein kaputter Algorithmus.

Nicht „3x+1“ ist das Problem, sondern der Algorithmus an sich ist defekt. Wie man sich daran so aufgeilen kann wie im obigen Beitrag ist mir persönlich ein Rätsel. Solche Fehler kommen in der Programmierung laufend vor, weil einer bei der Umsetzung oder der Planung geschlafen hat.

Hier ein kleines Programm für Java, das bei evtl. doch stattfindenden Versuchen hilfreich sein kann. Der BUG ist darin aber schon behoben worden 😉



public class ThreeXPlusOne {


	static public void main(String[] args) {
	
		long x = 0;
		long max = 99;
		
		for(long n=-max;n<max;n++) { x = n; long big = 0; if ( n != 0 ) do { if ( (x/2)*2 == x ) { x = x/2; } else { if ( n > 0 ) {
						x = 3*x+1;
					} else  x = 3*x-1; // Korrektur für n<0 weil, mit +1 kann man nie 2^n treffen } if ( n > 0 && x > big ) big = x;
				if ( n < 0 && x < big ) big = x; if ( args.length > 0 ) System.out.println( n+": x="+x+" big="+big);

			} while ( x != -1 && x != 1 && x!=n );
			
			if ( args.length == 0 ) System.out.println( n+": x="+x+" big="+big);
		}	
	}
}

Ihr werdet den Code noch einem Beautyfier übergeben müssen, weil WordPress den unbedingt umformatieren muß ( und ich keine Lust habe, deswegen in der WordPressdatenbank den Code direkt einzutragen ).

Firefox, die Fritz!box & der SEC_ERROR_INADEQUATE_KEY_USAGE Fehler

Was hatten wir schon lange nicht mehr? Das der Firefox seltsame Fehlermeldungen ausspuckt. Seit es Firefox 69 gibt, kann man statt der Adminoberfläche seiner Fritz!box nur noch einen mysteriösen, bis Dato unbekannten, „SEC_ERROR_INADEQUATE_KEY_USAGE“ Fehler sehen:

Fehler: Gesicherte Verbindung fehlgeschlagen

Beim Verbinden mit fritz.box trat ein Fehler auf. Eine Verwendung des Zertifikatschlüssels ist für den versuchten Arbeitsschritt unpassend. Fehlercode: SEC_ERROR_INADEQUATE_KEY_USAGE

Die Website kann nicht angezeigt werden, da die Authentizität der erhaltenen Daten nicht verifiziert werden konnte.
Kontaktieren Sie bitte den Inhaber der Website, um ihn über dieses Problem zu informieren.

Wer ist da der Schuldige?

Ihr kennt den Fehler auch nicht? Da seid Ihr in guter Gesellschaft. Ein so unbekannter Fehler ist es dann allerdings auch nicht, wie meine Nachforschungen ergeben haben. Leider nutzt dies alles nichts, da man den Bug nicht selbst beheben kann. Das Ihr eine Fritzbox, einen Firefox und Linux habt, ist übrigens keine Garantie auch eine Fehlermeldung zu bekommen.

Der Fehler wird von Firefox seit 69 für die Fritzboxen gezeigt, d.b. Firefox hat offensichtlich einen Check verändert, der vorher durchgelaufen ist.
Moniert wird, daß der Key gar nicht für ein Cert zugelassen wäre: „A certificate has a key usage extension that does not assert a required usage“

Wenn man sich das Cert mit openssl x509 -text -purpose ansieht, kommt das raus:

Certificate purposes:
SSL client : Yes
SSL client CA : Yes
SSL server : Yes
SSL server CA : Yes
Netscape SSL server : Yes
Netscape SSL server CA : Yes
S/MIME signing : Yes
S/MIME signing CA : Yes
S/MIME encryption : Yes
S/MIME encryption CA : Yes
CRL signing : Yes
CRL signing CA : Yes
Any Purpose : Yes
Any Purpose CA : Yes
OCSP helper : Yes
OCSP helper CA : Yes
Time Stamp signing : No
Time Stamp signing CA : Yes

Also alles korrekt? Mitnichten!

Die Zwecke für die das Zert eingesetzt werden darf, sind ok. Was aber ins Auge fällt ist:

X509v3 Subject Alternative Name: critical
DNS:benderirc.de, DNS:fritz.box, DNS:www.fritz.box, DNS:myfritz.box, DNS:www.myfritz.box, DNS:fritz.nas, DNS:www.fritz.nas

Ihr seht richtig. In dem Cert der Fritzbox taucht ein Domainname auf, der da gar nichts zu suchen hat und von dem Firefox bereits ein gültiges Zertifikat kennt.

Issuer: CN = benderirc.de
Validity
Not Before: Dec 24 15:25:01 2017 GMT
Not After : Jan 15 15:25:01 2038 GMT

Schauen wir weiter nach der Gültigkeit, finden wir raus, daß es bereits im Jahr 2017 erzeugt wurde, so also schon seit Jahren dem Firefox vorliegt und der das bislang noch nie moniert hat.

AVM gegen Mozilla

Die Frage zu klären wird sicher spannend und nervig werden. Primär würde ich jetzt erstmal AVM beschuldigen, weil der Domainname hat da nun so gar nichts zu suchen. Was geht bitte meine Fritzbox eine meiner Domains an? Auf der anderen Seite, ist das kein neuer Zustand, also wieso meckert FireFox jetzt da drüber?

Ich werde also beide anmailen müssen, damit jeder seinen Teil an dem Desaster behebt. Im Bugzilla von Mozilla ist zu dem Fehler bereits vor 6 Jahren mal ein Patch geschrieben worden, ich wette da hat bei Version 68->69 einer dran rumgespielt.