# Secure Software Testat 3
Gruppenarbeit von Janosch Bühler und Dante Suwanda
## Inhaltsverzeichnis
[TOC]
## Aufgabe 1: Nachweis geloggter Daten in der insecureBankv2 Applikation
Die App hat sehr viele verschiedene Sicherheitslücken. Eine davon sollen wir nun beschreiben. Diese Sicherheitslücke ist, dass die Passwörter geloggt werden.
Zuerst haben wir die Applikation auf dem Emulator erfolgreich installiert per adb.
Die App will standardmässig sehr viele Permissions weil sie für eine ältere Version von Android gemacht wurde. Die meisten User klicken hier auf "Continue" ohne die Permissions anzupassen und dann hat die App viel mehr Permissions als sie benötigt. Einige Apps funktionieren gar nicht ohne dass sie alle Permissions bekommen.
<table>
<tr><td>
<img src="https://i.imgur.com/Qi9ivM3.png" width="300" height="400" />
</td><td>
<img src="https://i.imgur.com/i37SXE4.png" width="300" height="400" />
</td><td>
<img src="https://i.imgur.com/fNcKocm.png" width="300" height="400" />
</td></tr>
</table>
Nach dem Installieren der InsecureBankv2 haben wir, den von uns gehosteten, Python Flask Server in der Applikation konfiguriert indem wir die IP abgeändert haben zur lokalen IP, die von vboxnet0 verwendet wird:
<center>
<img src="https://i.imgur.com/68KxZlA.png" width="240" height="400" />
</center>
<br>
Danach konnte man beim Login folgendes beobachten: Nämlich wird jeder erfolgreiche Login beim Gerät unverschlüsselt in den System Messages auf dem Smartphone geloggt und das Passwort kann zusammen mit dem Username ausgelesen werden, was eine massive Sicherheitslücke bildet.
Im Bild direkt unterhalb sieht man den Log nachdem sich ein User eingeloggt hat. Im rot markierten Bereich sieht man den Usernamen und das Passwort des Users ungehashed.
<img src="https://i.imgur.com/peJvKdV.png" width="700"/>
<br>
<br>
Im folgenden Screenshot lässt sich beobachten, dass beim Updaten des Passwortes die Informationen des Users, mit der Telefonnummer `15555218135` von Passwort `Dinesh@123$` zum Passwort `Dante@0ST$` geändert hat, ebenfalls unverschlüsselt und ungehashed gelogged werden:
<center>
<img src="https://i.imgur.com/lUa3O8H.png" width="240" height="400" />
</center>
<br>
<img src="https://i.imgur.com/QMa3966.png" width="700"/>
<br>
<br>
Auch auf der Serverseite wird das Passwort, wenn es geändert wird, ungehashed ausgegeben:
<img src="https://i.imgur.com/32HyUqQ.png" width="700"/>
<br>
<br>
Es ist für einen Angreifer also ein leichtes Spiel die Logs vom Smartphone auszulesen. Wenn er dazu noch etwas wie `grep -i 'password'` benutzt, findet er die Zeilen direkt und ohne gross Aufwand zu betreiben. Die Logs auf der Serverseite kann man sogar ohne einen Filter einfach auslesen und hat kritische Informationen wie die Kombination aus Passwort und Username.
## Aufgabe 2: Lösungsansatz zum insecure Login
Um die gegeben Sicherheitslücke zu schliessen dürfen an erster Stelle die Passwörter nicht mehr zusammen mit den Usernames unverschlüsselt gelogged werden.
Das Login-Log sollte auch geändert werden, nämlich soll das Passwort nicht mehr mitgegeben werden, sondern nur die Meldung, dass das Login von User `xy` erfolgreich war.
In `DoLogin.java` wird die Ausgabe des Passwortes herausgenommen:
```java
if (result != null) {
if (result.indexOf("Correct Credentials") != -1) {
Log.d("Successful Login:", ", account=" + username + ":" + password);
saveCreds(username, password);
trackUserLogins();
Intent pL = new Intent(getApplicationContext(), PostLogin.class);
pL.putExtra("uname", username);
startActivity(pL);
} else {
Intent xi = new Intent(getApplicationContext(), WrongLogin.class);
startActivity(xi);
}
}
```
3. Zeile abgeändert zu:
```java
Log.d("Successful Login:", ", account=" + username);
```
---
In `MyBroadCastReceiver.java` soll ebenfalls die Ausgabe des Passwortes verhindert werden, wie folgt:
```java
if (phn != null) {
try {
SharedPreferences settings = context.getSharedPreferences(MYPREFS, Context.MODE_WORLD_READABLE);
final String username = settings.getString("EncryptedUsername", null);
byte[] usernameBase64Byte = Base64.decode(username, Base64.DEFAULT);
usernameBase64ByteString = new String(usernameBase64Byte, "UTF-8");
final String password = settings.getString("superSecurePassword", null);
CryptoClass crypt = new CryptoClass();
String decryptedPassword = crypt.aesDeccryptedString(password);
String textPhoneno = phn.toString();
String textMessage = "Updated Password from: "+decryptedPassword+" to: "+newpass;
SmsManager smsManager = SmsManager.getDefault();
System.out.println("For the changepassword - phonenumber: "+textPhoneno+" password is: "+textMessage);
smsManager.sendTextMessage(textPhoneno, null, textMessage, null, null);
} catch (Exception e) {
e.printStackTrace();
}
}
```
Haben wir Zeile 11 geändert:
```java
String textMessage = "Updated Password of user " + username;
```
Und folgende Zeile entfernt:
```java
String decryptedPassword = crypt.aesDeccryptedString(password);
```
---
Zusätzlich würden wir das Passwort nur gehashed an den Server übergeben und das Passwort auch auf dem Server nicht loggen.