问题:解释当 Java 程序员定义实现数组的方法时,隐私泄露是如何发生的。
我和我的班级头脑风暴了这个想法,并提出了以下选项:
假设数组包含员工对象,包括工资金额、工作日期等。
- 如果数组包含对数组中对象的引用而不是这些对象的深层副本,则恶意个人有权更改这些对象的内容。
- 如果存在溢出错误,恶意个体将能够执行某种堆栈(或堆?)跟踪以获取保存在数组对象中的信息。
但是,我们不确定我们是否走在正确的轨道上,希望能得到一些帮助。
第一个答案是正确的,但第二个答案是错误的。异常不会向调用者透露数组的内容,因为堆栈跟踪(以及用于生成它的数据结构)不包含指向实际堆栈帧的指针。
第三种情况假设“攻击者”可以获取 JVM 进程地址空间的副本;例如通过强制核心转储或通过读取页面文件/交换区域。在这种情况下,可以获取任何尚未被垃圾回收的对象的状态。坏人可能瞄准的一件事是包含密码和其他敏感文本信息的字符串的支持数组。这可以通过在最常用的语言中搜索看起来像 Unicode 文本字符序列的“蛮力”方式来完成。
@sparkle 有道理。在第一个答案中,如果攻击者能够保留对容器使用的数组的引用,就会发生涉及数组的泄漏……因为容器类忽略了复制它。假设攻击者首先知道阵列中的对象,那么阵列本身的复制对于防止此处的安全漏洞至关重要。
另一件需要注意的是,在这种情况下,“启用”隐私泄露的设计和实现有点做作。