
Bild generiert mit Firefly

Bild generiert mit Firefly

Bild generiert mit Firefly
The app securely stores sensitive data.
The app prevents leakage of sensitive data.
L1, P
L2
L1, P
L2
Test MASTG-TEST-0231 prüft, ob Weakness MASWE-0001 zu Control MASVS-STORAGE-2 vorhanden ist.
MASWE-0001
Insertion of Sensitive Data into Logs
MASVS-STORAGE-2
The app prevents leakage of sensitive data.
print,
logging:, Logger, .finest,
.finer, .fine, .info,
.warning, .severe, .shoutrules:
- id: dart-logging-detected
pattern-either:
- pattern: print(...)
- pattern: debugPrint(...)
- pattern: $LOG.log(...)
- pattern: $LOG.info(...)
- pattern: $LOG.warning(...)
- pattern: $LOG.severe(...)
- pattern: $LOG.fine(...)
- pattern: $LOG.finer(...)
- pattern: $LOG.finest(...)
- pattern: $LOG.shout(...)
message: Logging statement detected. Ensure sensitive data is not logged in production.
severity: WARNING
languages:
- dart
metadata:
category: security
cwe: "CWE-532: Insertion of Sensitive Information into Log File"
owasp: "MASWE-0001: Insertion of Sensitive Data into Logs"Logging statement detected. Ensure sensitive data is not logged
in production.
23┆ print('${record.level.name}: ${record.time}:
${record.message}');
⋮┆----------------------------------------
43┆ log.info('MASTG-DEMO-$demoId demonstrated a
successful test: $message');
⋮┆----------------------------------------
46┆ log.info('MASTG-DEMO-$demoId demonstrated a failed
test: $message');
⋮┆----------------------------------------
49┆ log.severe('MASTG-DEMO-$demoId failed: $message');
Demo MASTG-DEMO-0001 beinhaltet Weakness MASWE-0007 zu Control MASVS-STORAGE-1. Dies kann durch Test MASTG-TEST-0200 getestet werden.
fun mastgTestApi() {
val externalStorageDir = context.getExternalFilesDir(null)
val fileName = File(externalStorageDir, "secret.txt")
val fileContent = "secr3tPa\$\$W0rd\n"
try {
FileOutputStream(fileName).use { output ->
output.write(fileContent.toByteArray())
Log.d("WriteExternalStorage", "File written to external storage successfully.")
}
} catch (e: IOException) {
Log.e("WriteExternalStorage", "Error writing file to external storage", e)
}
}MASWE-0007
Sensitive Data Stored Unencrypted in Shared Storage Requiring No User Interaction
MASVS-STORAGE-1
The app securely stores sensitive data.
The test case fails if the files found above are not encrypted and leak sensitive data.

#!/bin/bash
# SUMMARY: List all files created after the creation date of a file created in run_before
adb shell "find /sdcard/ -type f -newer /data/local/tmp/test_start" > output.txt
adb shell "rm /data/local/tmp/test_start"
mkdir -p new_files
while read -r line; do
adb pull "$line" ./new_files/
done < output.txtsecret.txt
secr3tPa$$W0rd

Bild generiert mit Firefly



Electronic Code Book (ECB)
Problem
Cipher Block Chaining (CBC)
Counter (CTR)
https://github.com/RobinNunkesser/dart-flutter-aes/tree/main/aes_cbc
jadx ist sehr beliebt für Android
public final void mastgTestApi() {
File externalStorageDir = this.context.getExternalFilesDir(null);
File fileName = new File(externalStorageDir, "secret.txt");
try {
FileOutputStream fileOutputStream = new FileOutputStream(fileName);
try {
FileOutputStream output = fileOutputStream;
byte[] bytes = "secr3tPa$$W0rd\n".getBytes(Charsets.UTF_8);
Intrinsics.checkNotNullExpressionValue(bytes, "getBytes(...)");
output.write(bytes);
Log.d("WriteExternalStorage", "File written to external storage successfully.");
CloseableKt.closeFinally(fileOutputStream, null);
} finally {
}
} catch (IOException e) {
Log.e("WriteExternalStorage", "Error writing file to external storage", e);
}
}Demo MASTG-DEMO-0060 betrifft Weakness MASWE-0006 zu Control MASVS-STORAGE-1. Dies kann durch Test MASTG-TEST-0287 getestet werden.
package org.owasp.mastestapp
import android.content.Context
import androidx.core.content.edit
import androidx.security.crypto.EncryptedSharedPreferences
import androidx.security.crypto.MasterKey
class MastgTest(private val context: Context) {
// WARNING: In a real application, these keys should NOT be hardcoded. They should be stored securely, for instance, in the Android Keystore.
private val awsKey = "AKIAABCDEFGHIJKLMNOP"
private val githubToken = "ghp_1234567890abcdefghijklmnopqrstuvABCD"
private val preSharedKeys = hashSetOf(
"-----BEGIN PRIVATE KEY-----\nMIIEvAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBALfX7kbfFv3pc3JjOHQ=\n-----END PRIVATE KEY-----",
"-----BEGIN PRIVATE KEY-----\ngJXS9EwpuzK8U1TOgfplwfKEVngCE2D5FNBQWvNmuHHbigmTCabsA=\n-----END PRIVATE KEY-----"
)
private val sharedPrefsName = "MasSharedPref_Sensitive_Data"
fun mastgTest(): String {
return try {
val masterKey = MasterKey.Builder(context)
.setKeyScheme(MasterKey.KeyScheme.AES256_GCM)
.build()
val encryptedPrefs = EncryptedSharedPreferences.create(
context,
sharedPrefsName,
masterKey,
EncryptedSharedPreferences.PrefKeyEncryptionScheme.AES256_SIV,
EncryptedSharedPreferences.PrefValueEncryptionScheme.AES256_GCM
)
encryptedPrefs.edit {
putString("EncryptedAWSKey", awsKey)
putString("GitHubToken", githubToken)
putStringSet("preSharedKeys", preSharedKeys)
}
"Sensitive data has been written and deleted in the sandbox."
} catch (e: Exception) {
"Error during MastgTest: ${e.message ?: "Unknown error"}"
}
}
}MASWE-0006
Sensitive Data Stored Unencrypted in Private Storage Locations
MASVS-STORAGE-1
The app securely stores sensitive data.
SharedPreferences unverschlüsselt für sensible
Daten genutzt?EncryptedSharedPreferences
verzichtet?EncryptedSharedPreferences aktuell
deprecated ohne Ersatz{
"id": "8a1fa598-4cb8-427e-ab73-4f24a1f76efe",
"category": "STORAGE",
"time": "2025-11-19T17:35:08.695Z",
"class": "android.app.SharedPreferencesImpl$EditorImpl",
"method": "putString",
"stackTrace": [
"android.app.SharedPreferencesImpl$EditorImpl.putString(Native Method)",
"com.google.crypto.tink.integration.android.SharedPrefKeysetWriter.write(SharedPrefKeysetWriter.java:70)",
"com.google.crypto.tink.KeysetHandle.writeWithAssociatedData(KeysetHandle.java:869)",
"com.google.crypto.tink.KeysetHandle.write(KeysetHandle.java:858)",
"com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.generateKeysetAndWriteToPrefs(AndroidKeysetManager.java:353)",
"com.google.crypto.tink.integration.android.AndroidKeysetManager$Builder.build(AndroidKeysetManager.java:292)",
"androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:169)",
"androidx.security.crypto.EncryptedSharedPreferences.create(EncryptedSharedPreferences.java:131)"
],
"inputParameters": [
{
"type": "java.lang.String",
"value": "__androidx_security_crypto_encrypted_prefs_key_keyset__"
},
{
"type": "java.lang.String",
"value": "12a70146597673f2b896ed619f976052ecf522726e8c922e2b5b8f396f64778a1141b44a02733ffe8824705a5ebf15be75807096ac69bd83276465aa5625d89f125d0ebe93c4f3cc389965cf0423ccf793cf399335fb56159adad48af44c0038fb99282439b2ccfddeda689f2a71d209099873c35427a1dd1aaeb82c8f62df695aa04f27fd22761275bbca7fb5a7829cf142dfe602910d44df1ff9dd31bf495aefb4509cc819114ba2a91a4208f5f8bc7a123b0a30747970652e676f6f676c65617069732e636f6d2f676f6f676c652e63727970746f2e74696e6b2e4165735369764b6579100118f5f8bc7a2001"
}
],
"returnValue": [
{
"type": "android.content.SharedPreferences$Editor",
"value": "<instance: android.content.SharedPreferences$Editor, $className: android.app.SharedPreferencesImpl$EditorImpl>"
}
]
}flutter_secure_storage wird üblicherweise verwendet
EncryptedSharedPreferences auf Androidimport 'package:flutter_secure_storage/flutter_secure_storage.dart';
import 'package:mas_test_app/demo_results.dart';
class MastgTest {
final FlutterSecureStorage _storage = const FlutterSecureStorage();
// WARNING: In a real application, these keys should NOT be hardcoded. They should be stored securely, for instance, in a Keystore.
final String _awsKey = "AKIAABCDEFGHIJKLMNOP";
final String _githubToken = "ghp_1234567890abcdefghijklmnopqrstuvABCD";
DemoResults mastgTest() {
DemoResults r = DemoResults(demoId: '0001');
try {
_write("EncryptedAWSKey", _awsKey);
_write("GitHubToken", _githubToken);
r.add(
Status.pass,
"Sensitive data has been written and deleted in the sandbox.",
);
} catch (e) {
r.add(Status.error, e.toString());
}
return r;
}
Future<void> _write(String key, String value) async {
await _storage.write(
key: key,
value: value,
iOptions: _getIOSOptions(),
aOptions: _getAndroidOptions(),
);
}
IOSOptions _getIOSOptions() =>
IOSOptions(accessibility: KeychainAccessibility.first_unlock);
AndroidOptions _getAndroidOptions() =>
const AndroidOptions(encryptedSharedPreferences: true);
}
