Androids K9 Mail nutzt noch TLS 1.0

Au man, man darf echt nicht nachsehen, was seine Programme so tun 🙁

K9-Mail

Das auf Android beliebte K9-Mail setzt auch gebrochene Krypto und nur als Beispiel erdachte Cipher!

2018-05-07 08:52:17 1fFa0M-0004M4-PW <= AAAAAAAAAAAAAAA H=********.dip0.t-ipconnect.de (XXXXX) [XXXXX] P=esmtpsa X=TLSv1:AES128-SHA:128 CV=no … id=1baxr95b3gdd6225t9ggj1yy.1525675936562@email.android.com

Das 146 MB große Paket enthĂ€lt allen Anscheins nach nicht mal eine aktuelle SSL Implementierung. Schlimmer wĂ€re es nur noch, wenn Sie das an Android outsourcen wĂŒrden, aber wofĂŒr dann die 146 MB ? Im Programm ist nur eine „grĂ¶ĂŸere“ Grafik enthalten , der Rest ist pillepalle und ansonsten auch recht trivial von der Funktion her.

FĂŒr ein „Advanced Email for Android“ Programm echt enttĂ€uschend 🙁

Mal sehen ob Sie antworten 😀

Webseite: https://k9mail.github.io/

Android – Jitsi Probleme mit der Fritz!Box beheben

Im Chaos um die VOIP Probleme der einzelnen Linuxclienten, kommt hier nun der Fix fĂŒr das Passwort-vergessen-Problem von Jitsi fĂŒr Android.

Das Problem

Jitsi fĂŒr Android, was ja nur eine jahrealte Alphaversion ist, hat offensichtlich Probleme die Verbindung zur Fritz!Box zu halten. Normalerweise gibt es dafĂŒr den KEEP ALIVE oder die REGISTER Funktion, aber hier macht Jitsi wohl soviel falsch, daß es der Fritz!box auf den Keks geht und es Jitsi rauswirft. Da sich Jitsi jetzt nicht mehr anmelden kann, kommt es zu einer RĂŒckfrage bei der Jitsi das eingegebene Passwort, das zu allem Überfluss auch nicht gespeichert war, vergißt. Als Folge ist man laufend auf der Fritz!Box gesperrt, und muß dauernd das Passwort eingeben.

Da mich das an die Probleme mit SIPGate errinnert hat, habe ich da den gleichen Fix versucht: die Connection auf TCP umstellen. Nur dazu braucht man einen Proxyserver :)Also fragen wir bei AVM nach, was dort eingetragen werden muß und ob das ĂŒberhaupt klappen wird.

Der AVM Support

Hier die erste Anfrage :

Detaillierte Beschreibung:
Guten Tag,die Frage ist allgemeiner Natur, da die Jitsi Androidversion immer wieder die Anbindung zum Server verliert und nach dem Passwort fragt.Da ich Ă€hnliche Probleme mit Sipgate hatte und dort der Wechsel auf TCP via Proxyservereinstellung die Probleme behoben hat, wollte ich gern wissen, ob das mit einer FritzBox Ă€hnlich gehen wĂŒrde. Auch wenn das in einem lokalen Netz eher komisch klingt 😀mit freundlichen GrĂŒĂŸen,
….

Die von AVM kommende Antwort war schon etwas merkwĂŒrdig, aber fairerweise muß man ihm zugestehen, daß nicht jeder Jitsi kennen muß, nur weil er bei AVM arbeitet:

….
vielen Dank fĂŒr Ihre Anfrage an den AVM Support.Leider muss ich gestehen, dass ich Ihr Anliegen anhand Ihrer Informationen noch nicht vollumfĂ€nglich verstanden habe. FĂŒr die weitere Analyse benötigen wir umfangreichere Informationen.Bitte beantworten Sie mir folgende Fragen:
An was fĂŒr einem Internetanschluss von welchem Anbieter setzen Sie die FRITZ!Box ein (z.B. Telekom DSL 16 Mbit/s)?

  • Welche GerĂ€te (z.B. Computer, NAS-System, Hub/Switch) verwenden Sie? Geben Sie Hersteller und Modellnamen an.
  • Wie ist das Android-GerĂ€t mit der FRITZ!Box verbunden?
  • Was fĂŒr ein „Server“ wird verwendet?
  • Welche Protokolle werden verwendet?
  • Was soll das „lokale Netz“ leisten?
  • Wie sieht Ihr Wunschszenario aus?
  • Wie Ă€ußert sich das Fehlerbild in Ihrer bisherigen Konfiguration?

    Senden Sie mir bitte anschließend die Fehlerbeschreibung und das ZIP-Archiv mit den Support-Daten zu.

Wir werden die Support-Daten nach Erhalt detailliert analysieren und Ihnen anschließend eine RĂŒckantwort zukommen lassen.

Bitte beachten Sie, dass dieser Prozess eine gewisse Dauer in Anspruch nimmt.
Ich wĂŒnsche Ihnen schon jetzt einen guten Start ins Wochenende.

Freundliche GrĂŒĂŸe aus Berlin
….

Ich mußte dem Mitarbeiter Recht geben, er hatte es nicht verstanden, also beschrieb ich es etwas sehr eindeutig :

Fritzbox -> wlan -> android handy -> Software: jitsi android per SIP > fritzbox

Ich möchte eigentlich nur wissen, ob es fĂŒr die SIP Anbindung zur Fritzbox eine TCP Option auf der Box gibt und wenn ja, was man(wenn ĂŒberhaupt) als Proxyserver eingeben muß.

Sehr Ihr da irgendwo die ErwÀhnung der FritzPhone-App ? Der Mitarbeiter wohl schon :

vielen Dank fĂŒr Ihre Geduld.
Die Anmeldung der App an der FRITZ!Box ist technisch möglich. Hierzu muss eine IP-Nebenstelle innerhalb der FRITZ!Box angelegt werden.
Die Eintragung eines Proxys ist möglich, aber nicht erforderlich.

Wenn der Support ratlos ist

Wir halten fest: Problem nicht verstanden und Anfrage nicht richtig gelesen und damit bei der Antwort Thema verfehlt. SpĂ€testens bei dem Stichwort SIP hĂ€tte es klingeln mĂŒssen.

In dem Fall hilft also nur ausprobieren und genau das tat ich 🙂

Lösung

Jitsi starten, dann ins MenĂŒ und die ACCOUNT SETTINGS aufmachen. Dann den Fritzboxeintrag auswĂ€hlen und dessen Settings öffnen. Und kommt nach einigen Scrollen ein Schiebeschalter unter, der bei der automatischen Proxykonfiguration steht. Den abschalten und dann das „Proxy“ aka. die Fritzbox selbst angeben:

Da es die heimische Fritz!box ist, können wir hier natĂŒrlich die IP der Box eingeben und den Port 5060 benutzen. Als bevorzugten Transport dann wieder TCP auswĂ€hlen und das Problem ist scheinbar erledigt. Denn, wenn Ihr diesen Beitrag lest, gab es eine Woche lang keine Probleme mehr und damit auch keinen Grund, den Beitrag zu löschen 😉 Telefonieren geht mit den Einstellungen auch noch, also scheint das so zu laufen.

Android: FireFox und das WiFi-Tickling

Und auch heute wieder ein Beitrag aus der Kategorie „Niemals genauer hinschauen“ :

Wie im Beitrag gestern ĂŒber Tastatureingaben, die an Suchmaschinen geschickt werden, habe ich auch heute wieder was aus meinem neuesten Projekt fĂŒr Euch. Euer lieber Firefox bombardiert das Gateway mit scheinbar unsinnigen Paketen:

16:05:52.958119 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:52.973897 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:52.990415 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.018183 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.023820 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.040692 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.058932 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.075325 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.091926 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.108330 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.124708 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0
16:05:53.141359 IP 192.168.20.3.59077 > 1.0.0.0.4886: UDP, length 0

In einem Bugreport an Firefox wird das genauer geschildert:

FireFox Android 5.1

FireFox Android 5.1

If you’re on wifi and an IPv4 DHCP network we will send 0 length UDP packets at port 4886 of your gateway at the default rate of 60hz for 400ms from the start of the transaction in an attempt to improve RTT during the critical early phases. I call this „tickle time“.

Nur so ganz stimmt das nicht, denn 1.0.0.0 gehört nicht meinem Router, sondern ist den Arpa-Laps zugeordnet und auch an sich eher nicht routbar, genau wie 10.0.0.1/8 und Àhnliche private Netzwerke.

RTT steht dann fĂŒr RoundTripTime und der Sinn des Ganzen ist, daß das Antwortverhalten vom WLAN Router verbessert wird, weil er sieht, daß da „massiv“ Pakete kommen und er die echten Pakete dann schneller routet, weil die ja wichtig sind.

Hier zu merken ist: Das macht nur Firefox so, ergo: sieht man son Traffic, weiß man, es ist ein Android Phone mit FireFox, der grade aktiv genutzt wird. Das wir das noch brauchen werden, werdet Ihr bald sehen 🙂

mehr dazu:  https://bugzilla.mozilla.org/show_bug.cgi?id=888268

Android: Firefox ĂŒbermittelt jede Tasteneingabe

Mein neuestes Projekt, die mobile Sicherheit von Handies ergrĂŒnden, hat schon seinen ersten Treffer geliefert.

Zu meinem Erstaunen ĂŒbertrug Firefox jede Tastatureingabe bei der Eingabe einer URL an einen dubiosen Server ohne Namen. Wie sich rausstellte, werden dadurch die SuchvorschlĂ€ge erzeugt, auch wenn man URLs eintippt.

Das ist natĂŒrlich grade bei privaten Domains oder Urls mit Parametern ein Problem, weil irgendein Server das natĂŒrlich zusammensetzen kann. Ein eigenes Suchfeld, wie beim Desktopbrowser wĂ€re die Lösung, aber da brauchen wir nicht drauf hoffen. Mir ist natĂŒrlich auch klar, daß der Platz auf einem Handy Display begrenzt ist, aber schön wĂ€rs, wenn der Datenschutz zuerst kĂ€me, man es also einschalten mĂŒĂŸte.

Wer das nicht will, kann das in den Einstellungen zu Suchmaschinen abschalten.

Projekt: Laß das Telefon vorlesen

Android Apps wie „Talk – Free“ lesen dem Benutzer einen getippten Text vor und haben meistens das Problem, daß Sie mit großen Dateien nicht zurechtkommen. Mit Dateien in meiner GrĂ¶ĂŸenordnung sterben die Apps weg wie Fliegen, wenn sie die Dateien nebst Inhalt ĂŒberhaupt öffnen können 🙂

Deswegen hatte ich gestern die fixe Idee, ich mĂŒĂŸte eine TTS App (Text-To-Speech) fĂŒr mein Handy bauen. Ok, satte 4 Stunden hat es dann gedauert, dem bescheuerten Eclipse bei zu bringen, ĂŒberhaupt wieder Apps, AVD’s SDK’s und anderes anzuzeigen, upzudaten, zubenutzen und zu bauen. Von den vielen, vielen RĂŒckschlĂ€gen, FlĂŒchen, VerwĂŒnschungen und :Facepalm:s  mal abgesehen, kam am Ende etwas brauchbares raus.

Ich dachte immer Eclipse wĂ€re das Tool zum Bauen von Android, oder irgendwelchen Anwendungen, aber so beschissen wie gestern hat es sich noch nie angestellt. Das SDK Update entfernte dann gleich mal die SDK TOOLS inkl. dem SDK Manager selbst von der Platte, nachdem es min. 400 MB unnĂŒtze Files auf die Platte gesaugt hatte. Dann löschte es den einzigen API Stand, der mich als Zielplattform wirklich interessiert hatte: Android 3.2+ … AAAAAAARGG…nein, ruhig, nicht schon wieder… tief luftholen… Android 3.2 ist API Level 13 und wird, wieso auch immer, nicht mehr im SDK Manager aufgefĂŒhrt. Außer dem Tools Ordner wurden auch noch die Systemimages entfernt, so daß die bislang angelegten Virtual Devices aka Debugger-Umgebungen auch weg waren und auch nicht mehr angelegt werden konnten. Nachdem ich dann einen neuen SDK benutzt hatte, konnte ich zwar einen AVD anlegen , aber nicht benutzen, weil der sich nicht in LAN geklinkt hat und ohne LAN Verbindung war mein kleines Programm komplett nutzlos.

Was nun folgte war zum GlĂŒck etwas einfacher, aber nicht weniger aufwĂ€ndig. Statt der netten Tante auf meinem Tablet, mußte mein neues Handy als Zielplattform herhalten. Leider hat Google das USB Debugging, ohne das man am PC nicht sehen kann, wo es denn genau bei der Liveanwendung knallt, versteckt und zwar dĂ€mlich versteckt. Es ist ok um Dumbos davon abzuhalten, das USB Debugging und die ganzen anderen coolen Entwicklerfunktionen zu aktivieren, aber es bleibt dĂ€mlich. Am Ende wollte das Handy dann auch per ADB angesprochen werden und es konnte endlich losgehen.

Das Projekt

Oben habe ich bereits verraten, daß es um TTS und große Files geht. Ich rede von Textfiles mit einer GrĂ¶ĂŸe von 500kb+ . Sich die vorlesen zu lassen, bietet keine „kostenlose“ App an. Damit man sich das vorstellen kann, 500kb sind ca. 500 Seiten DIN A4 Papier, also eine Menge Buchseiten. Will man sich die vorlesen lassen, dauert das Stunden und genau das habe ich vor.

Aber wieso will man sich das ĂŒberhaupt  vorlesen lassen ? Naja zum einen kann man dann die Handyausgabe als Hörbuch verkaufen 😀 zum Anderen, und da komme ich derzeit ins Spiel, ist es richtig toll zum Korrekturlesen meines Romans. Die Rechtschreibkontrolle vom Officeprogramm kann zwar Fehler entdecken, aber falsche Worte, die richtig geschrieben wurden nicht. Außerdem findet diese auch keine sprachlichen Unschönheiten z.b. zu komplizierte Texte, falsch nieder geschriebene GedankengĂ€nge usw. . Und da setzt jetzt die App ein, denn wenn es sich vorgelesen schrĂ€g anhört, ist es schrĂ€g, auch wenn es beim Lesen ok war. Nichts ist blöder fĂŒr einen Romanschreiber, als wenn man den Roman nacher nicht vorlesen kann, ohne selbst zu stocken.(Auch dieser Absatz wurde Ihnen gespondert von Hardcore – der TTS App)

Das Problem

Die freien Apps lesen vor, was andere Apps an sie teilen oder per Copy&Paste vom User eingegeben wird.

Wer Handies kennt, kann sich vorstellen, daß alleine das Markieren des Textes den man hören will, Stunden braucht, wenn man es ĂŒberhaupt fehlerfrei schafft. Vom Tippen auf dem Handy ganz zu schweigen 😉

Die Idee

Verlagern wir doch das Markieren und Ausschneiden des Textblockes auf den Desktop-PC, sprich meinen Linuxrechner. Den Text sendet man einfach per Netzwerk an die Sprachausgabe.

Die Stolperfallen

NatĂŒrlich liegen die alle im Android begraben und sind mehr oder weniger :faceplam:  . Wann kommt endlich der Tag, wo jemand ein Fedora ROM fĂŒr Samsungsphones veröffentlicht, es wĂ€re das Ende von Android wie wir es kennen und hassen.

Falle 1 : Die App muß einen öffentlichen Serverport öffnen, damit man etwas hinschicken kann.
Falle 2 :  Man muß die Handy  IP Adresse kennen, sonst kann man Falle 1 nicht umschiffen.
Falle 3 : Netzwerkfunktionen in der MainActivity sind Tabu, man braucht einen Netzwerktask.
Falle 4 : GUI Elemente dĂŒrfen nur von dem Task benutzt werden, der den View geöffnet hat.

Falle 5: Wie bekommt man den Textblock eigentlich zum Handy ?

Fangen wir mal mit #5 an :

[marius@eve ~]$ nc 192.168.0.117 3000
Wie die Webseite TheHackernews.com heute berichtet, ist es Forschern der Standford University bereits in 2015 gelungen, einen Super-Super-Cookie zu nutzen, in dem sie ĂŒber die Browser API der mobilen Versionen von Chrome, Opera und Firefox den Batteriestatus abgefragt haben. Durch die Kombination von angezeigter "verbleibender Zeit in Sekunden" und dem Prozentwert der Ladung, ergeben sich bis zu 14 Millionen Kombinationen, die man GerĂ€ten zu ordnen kann.

Genau, das Schweizer Armeemesser „nc“ (NetCat) muß zumindest in Phase 1 der Enwicklung reichen und genau das tut es. Man öffnet also einfach eine TCP Verbindung zur App und schreibt den zu sprechenden Text rein. Wenn alles klappt, kommt Sprache raus.

Das war einfach, kommen wir zu Falle #2 :

        
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
@SuppressWarnings("deprecation")
String ip = Formatter.formatIpAddress(wm.getConnectionInfo().getIpAddress());
log("MY IP is "+ip);

Das funktioniert ĂŒbrigens nur fĂŒr LAN IPs. Wenn man WAN, also in dem Mobilen Internet unterwegs ist, bekommt man i.d.R. eine IPv6 Adresse und damit kommt die Routine oben nicht zurecht. Da ich WAN nicht brauche, reicht das hier.

Die TTS Engine ist leicht zu öffnen:

tts = new TextToSpeech(getApplicationContext(), new TextToSpeech.OnInitListener() {
   @Override
   public void onInit(int status) {
      if(status == TextToSpeech.SUCCESS ) {
         tts.setLanguage(Locale.GERMAN);
      }
   }
});

Nun zum Starten des Netzwerkthreads, den dem muß ich die IP mitgeben:

Thread serverThread = null;
...
this.serverThread = new Thread(new ServerThread(ip));
this.serverThread.start();

Der Serverthread an sich ist simpel. Ich nehme hier Port 3000, 10 Connections gleichzeitig auf meinem Socket und lege fest, daß die externe IP im LAN zum Binden des Interfaces genutzt werden soll, weil dumbo Android das sonst auf 127.0.0.1 aufmacht, da natĂŒrlich keiner was von 🙂  Der Code basiert auf einem Beispiel zu Serversockets, das aber wie dort beschrieben gar nicht funktioneiren kann 😉 Nehmt die Version hier:

public void run() {
			Socket socket = null;
			try {
				serverSocket = new ServerSocket(3000,10,InetAddress.getByName(ip));
				this.log("ServerSocket gestartet:"+ serverSocket);
			} catch (IOException e) {
				e.printStackTrace();
				this.log(e.toString());	
				return;
			} catch (Exception e) {
				e.printStackTrace();
				this.log(e.toString());
				return;
			}
			while (!Thread.currentThread().isInterrupted()) {
				this.log("ServerSocket waiting for accept:");
				try {
					if (serverSocket.isClosed()) serverSocket = new ServerSocket(3000,10,InetAddress.getByName(ip));
					
					socket = serverSocket.accept();
					System.err.println("Socket connection: "+ socket);
					this.log("Connection accepted");

					CommunicationThread commThread = new CommunicationThread(socket);
					new Thread(commThread).start();

				} catch (IOException e) {
					e.printStackTrace();
					this.log(e.toString());
				} catch (Exception e) {
					e.printStackTrace();
					this.log(e.toString());
				}
			}
		}
	}

Die doppelten Catch-Anweisungen sind natĂŒrlich nur zu Demozwecken drin. Ist die App mal gebaut, kann man unterscheiden zwischen einem echten IO Fehler und anderen Fehlern, z.b. OOM ( Out Of Memory ) und verschiedene Meldungen erzeugen.

Der CommunicationThread öffnet das Socket, daß beim Accept()  rausgekommen ist, extrahiert den InputStream(), macht einen BufferedReader daraus und ließt den Text zeilenweise ein, bis das Socket geschlossen wird:

       this.input = new BufferedReader(new InputStreamReader(this.clientSocket.getInputStream()));

try {
	String read = input.readLine();
	if ( read == null ) return; // wichtig, weil lÀuft sonst in einer Endlosschleife

	updateUIThread ui = new updateUIThread(read);
	updateConversationHandler.post(ui);

} catch (IOException e) {
	e.printStackTrace();
	this.log(e.toString());
	return;
} catch (Exception e) {
	e.printStackTrace();
	this.log(e.toString());
	return;
}

Der UIUpdateThread macht dann nichts weiter als die Textnachricht in Zeilen umzuwandeln und dann die TTS Engine zu fĂŒttern. Dabei wartet die Anwendung solange bis nicht mehr gesprochen wird, wofĂŒr der Thread 100ms schlĂ€ft. Das schont die Batterie.

public void run() {
	String[] lines = msg.split("\\.");
	for(int i=0;i<lines.length;i++) { if ( lines[i].trim().length() > 0 ) {
			Toast.makeText(getApplicationContext(), lines[i],Toast.LENGTH_SHORT).show();
			tts.speak(lines[i], TextToSpeech.QUEUE_ADD, null);
			while( tts.isSpeaking() ) {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
					Toast.makeText(getApplicationContext(), e.toString() ,Toast.LENGTH_LONG).show();
				}
			}
		}
       }
}

Fertig ist unser Remote-TTS-Reader 🙂

Nun leiten wir das Audio Signal des Telefons noch an den Mikrofonanschluß vom PC und starten FFMPEG:

ffmpeg -f pulse -i default -c:a:0 libmp3lame -b:a:0 128k test.mp3

Fertig ist das Hörbuch fĂŒr unterwegs 🙂

Ihr könnt die fehlenden Teile aus dem Tutorial extrahieren, es ist der gleiche Aufbau. Nur habe ich noch einiges erweitert, z.b. logging, weil seine Routinen halt nicht funktioniert haben. Die relevanten Änderungen sind oben drin, so daß Eurer Projekt funktionieren sollte.

Anmerkung: Man kann von 10 Rechnern aus die APP auf dem Handy gleichzeitig ansprechen, aber die Sprachengine wird das nur nacheinander wiedergeben.