漏洞 5(支撑):明文凭证存储

漏洞 5(支撑):明文凭证存储

代码证据

fileOutputStreamOpenFileOutput = openFileOutput("credentials.txt", 32768);
fileOutputStreamOpenFileOutput.write(
("Username: " + str + " Password: " + str2 + "\n").getBytes());
Toast.makeText(this, "Credentials saved to file", 0).show();

出处:MainActivity.java,第 59-61 行。


这段代码在做什么

  1. 调用 openFileOutput("credentials.txt", ...) 打开/创建一个文件
  2. 把用户名和密码直接写入文件
  3. 显示提示"Credentials saved to file"

存储的内容长什么样

假设用户注册时输入: - 用户名:alice - 密码:password123

文件里存的就是:

Username: alice Password: password123

没有任何加密,就这么明文存着。


为什么这是安全问题

openFileOutput 默认把文件存在 App 的私有目录:

/data/data/com.example.mastg_test0016/files/credentials.txt

但这个"私有"是相对的:

场景 攻击者能看到文件吗
普通 Android 手机(未 Root) 不能
已 Root 的手机 ✅ 直接读
通过 ADB 备份 ✅ 可以读
手机借给别人用 ✅ 可以读

明文存储的问题: 一旦攻击者拿到了这个文件,用户名和密码就直接暴露了


对 Session Token 漏洞的影响

这两个漏洞有关联:

  1. 凭证文件明文存储 → 攻击者拿到文件 = 拿到用户名密码
  2. Session Token 用弱随机数 → 攻击者不需要密码,只需要预测 token

两个漏洞结合在一起:

攻击者拿到明文凭证文件

知道了用户名(但不知道密码也没关系)

预测 session token(因为用的是 java.util.Random)

不需要登录,直接用预测的 token 进入账户

为什么它是"支撑发现"而不是主漏洞

这不是 randomness / cryptography 的问题。

明文存储属于: - CWE-312 — Cleartext Storage of Sensitive Information

而作业 rubric 强调的是: - Randomness / Cryptographic Misuse

所以在报告里:

主漏洞:java.util.Random 生成 session token(CWE-338)
支撑发现:明文凭证存储(CWE-312)

两个都真实存在,但主次要分清