恶意代码漏洞 – 可能通过返回对可变对象的引用来公开内部表示

嗨,我收到的违规行为如下:

恶意代码漏洞 – 可能通过返回对可变对象的引用来公开内部表示

在我的代码中,我这样写

public String[] chkBox() { return chkBox; } 

我们如何解决它。

正如错误消息所述,您将返回内部状态(chkBox – 很可能是 – 即使您没有显示其定义,也是对象内部状态的一部分)

如果您 – 例如 – 这会导致问题

 String[] box = obj.chkBox(); box[0] = null; 

由于数组对象(通过引用传递所有Java对象),因此也会更改存储在对象中的原始数组。

你最想解决这个问题的方法很简单

 return (String[])chkBox.clone(); 

它返回数组的副本而不是实际的数组。

我们假设如下:

  1. 从安全或隐私的角度来看,您的类会做一些重要的事情,并且chkbox的状态以某种方式用于其隐私/安全机制的类实现中。

  2. chkBox()方法可以被一些不受信任的代码调用。

现在考虑这段代码:

 // ... in an untrusted method ... Foo foo = ... String[] mwahaha = foo.chkBox(); mwahaha[0] = "Gotcha!"; // ... this changes the effective state of `Foo` 

通过返回对表示chkbox的实际数组的chkbox ,您允许Foo类外部的代码进入并更改其状态。

从设计角度来看,这很糟糕(它被称为“漏洞抽象”)。 但是,如果此类在可能存在不受信任的代码的上下文中使用,则此( chkBox()方法)是潜在的安全漏洞。 这就是违规消息告诉你的内容。

(当然,代码检查器无法知道这个特定的类是否真的对安全性至关重要。这是你要理解的。实际上对你说的是“嘿!看这里!这是可疑的!”


修复程序取决于此代码(或整个库或应用程序)是否对安全性至关重要……或者代码在将来的部署中是否具有安全性。 如果这是误报,你可以压制违规行为; 即标记它以便检查器忽略它。 如果这是一个真正的问题(或者可能成为一个真正的问题),那么要么返回一个数组的副本:

  return (String[]) chkBox.clone(); 

但显然,每次调用chkBox时克隆数组都会产生性能成本。 或者,您可以修改chkBox方法以返回数组的选定元素:

  public String chkBox(int i) { return chkBox[i]; } 

在这种情况下,我怀疑替代方法会更好……虽然它取决于当前如何使用该方法。