确保 Java 中对象安全初始化
一、引言
信息系统的初始化通常是一个关键阶段,在此期间会安装重要的防御机制并建立一致的状态。在面向对象软件中,访问部分初始化的对象是一项需要谨慎处理的操作,应尽量避免或严格监控。CERT 对于安全 Java 开发的建议明确要求不允许访问部分初始化的对象,若不遵循此建议,风险等级高且可能性大。
Java 语言和 Java 字节码验证器(BCV)对对象初始化实施了一些规则,例如构造函数的执行顺序,但它们并未直接执行 CERT 的建议。Sun 提供了一个指导方针来执行该建议,然而不遵循这些指导方针可能会悄然导致安全漏洞。例如,曾有著名攻击利用部分初始化的类加载器进行权限提升。
为了解决这个问题,我们提出了一个双重解决方案:一是模块化类型系统,用于表达库或程序的初始化策略;二是模块化类型检查器,可集成到 BCV 中,在加载时静态检查程序是否符合策略。我们对类型系统进行了形式化定义,并使用 Coq 证明助手对其健全性进行了机器检查,还在大量 Sun 的 Java 运行时环境(JRE)类上进行了实验验证。
二、相关工作
从不同角度对对象初始化进行了研究:
- Freund 和 Mitchell :提出了一个类型系统,形式化并执行了 BCV 确保的初始化属性,但这些属性不足以确保不访问部分初始化的对象。
- Fähndrich 和 Xia、Qi 和 Myers :专注于执行字段的不变量,并精细跟踪对象的不同字段,还尝试跟踪对象构造后的状态以获取更多初始化字段的信息,但在我们的场景中这种做法有些过度。
-
超级会员免费看
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



