Skip to content

1- Insecure Storage

Vamos a revisar primero la función de login

LoginActivity.java

En concreto el siguiente método:

java
    protected void fillData() throws BadPaddingException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException, InvalidAlgorithmParameterException {
        SharedPreferences settings = getSharedPreferences("mySharedPreferences", 0);
        String username = settings.getString("EncryptedUsername", null);
        String password = settings.getString("superSecurePassword", null);
        if (username != null && password != null) {
            byte[] usernameBase64Byte = Base64.decode(username, 0);
            try {
                this.usernameBase64ByteString = new String(usernameBase64Byte, "UTF-8");
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }
            this.Username_Text = (EditText) findViewById(R.id.loginscreen_username);
            this.Password_Text = (EditText) findViewById(R.id.loginscreen_password);
            this.Username_Text.setText(this.usernameBase64ByteString);
            CryptoClass crypt = new CryptoClass();
            String decryptedPassword = crypt.aesDeccryptedString(password);
            this.Password_Text.setText(decryptedPassword);
            return;
        }
        if (username == null || password == null) {
            Toast.makeText(this, "No stored credentials found!!", 1).show();
        } else {
            Toast.makeText(this, "No stored credentials found!!", 1).show();
        }
    }

Según el código se están guardando en la típica carpeta de preferencias, para encontrarla:

Pasted image 20260828140005

Y dentro de mySharedPreferences.xml se guardan cifradas con AES y luego base64

Pasted image 20260828140157

Se tratan de creds de terceros, no se deberían guardar en un archivo:

CWE-312, insecure storage

Si se quiere implementar autofill se debería usar Autofill Framework de Android (AutofillManager, API 26+) o el Credential Manager (API 34+, o androidx.credentials)


Si observamos en DoTranfer.java cuando se termina de hacer una transferencia el log se guarda en un archivo en el almacenamiento externo

java
String MYFILE = Environment.getExternalStorageDirectory() + "/Statements_" + DoTransfer.this.usernameBase64ByteString + ".html";
BufferedWriter out2 = new BufferedWriter(new FileWriter(MYFILE, true));
out2.write(status);
out2.write("<hr>");
out2.close();
return;

Accesible sin niquiera root

Pasted image 20260830140016Pasted image 20260830140038

Notas personales de seguridad ofensiva.