SV.EXPOSE.FIN

类具有 public finalize() 方法时,会检测到该错误。

漏洞与风险

因为小程序在 Web 浏览器离开包含它们的页面之后仍然会继续存在,所以小程序之间的互相保护十分重要。否则攻击者的小程序可以蓄意破坏第三方的小程序。在很多环境中,甚至并不允许一个小程序获知其他小程序是否存在。在 Netscape Navigator 3.0 中,AppletContext.getApplets() 会很小心地仅将句柄返回给与调用方位于相同页面上的小程序。但是,小程序可以轻易获取顶级 ThreadGroup 的句柄,然后枚举系统中运行的每一个线程,包括属于其他任意小程序的线程。Java 运行时会将小程序的类名编码到其线程名称中,因此恶意小程序现在可以获知系统中运行的所有小程序的名称。此外,小程序可以在其他小程序中的线程上调用 stop() 或 setPriority() 方法。SecurityManager 仅确保小程序不能更改系统线程的状态,对小程序是否更改其他小程序的线程则没有限制。Netscape Navigator 4.0 使用与保护小程序相同的方法来防止攻击者查看属于其他网页上的小程序的线程。Internet Explorer 允许小程序查看这些线程,但是对 stop() 或 setPriority() 的调用无效。这种攻击的一种隐匿的形式是使用恶意小程序,除了在存在特定的被攻击小程序时,这种小程序在其他时候都处于休眠状态。被攻击的小程序运行时,恶意小程序会随机地将降低服务攻击与针对受攻击小程序的线程的攻击混合起来发动。结果是用户会发现被攻击的小程序很慢,并且很多错误。攻击者的小程序可以利用安全漏洞修改被攻击小程序的内部状态,因此应该尽可能地降低方法和字段的可见性、避免使用 static 字段,并且尽可能多的使用“final”,这几点很重要。

Klocwork 安全漏洞 (SV) 检查器可识别可能创建危险数据的调用;这些调用被视为不安全的来源。用户所提供的任何数据都可能是不安全的来源,因为用户可能是攻击者,或者可能引入人为错误。

缓解与预防

将所有 finalize() 方法设为 protected 可以减轻该漏洞造成的危害。

示例 1

复制
    public void finalize() throws Throwable {
      try {
        close(); // close open files
      } finally {
        super.finalize();
      }
    }

针对第 10 行报告 SV.EXPOSE.FIN:方法 finalize() 应该具有 protected 访问修饰符,而非 public 访问修饰符。