恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示形式

2022-09-02 00:28:16

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

恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示形式

在我的代码中,我这样写

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

我们如何解决它。


答案 1

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

这可能会导致问题,例如 , 如果您 - 做

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

由于数组对象与所有 Java 对象一样,都是通过引用传递的,因此这也将更改存储在对象内的原始数组。

您最有可能想要做的是解决此问题是一个简单的

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

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


答案 2

让我们假设以下内容:

  1. 您的类执行从安全或隐私角度来看很重要的事情,并且在其隐私/安全机制的类实现中以某种方式使用了 的状态。chkbox

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

现在考虑以下代码:

// ... in an untrusted method ...

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

通过返回对表示 的实际数组的引用,可以允许类外部的代码进入并更改其状态。chkboxFoo

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

(当然,代码检查器无法知道这个特定的类是否真的是安全关键的。这是为了让你理解。它实际上对你说的是“嘿!看这里!这太可疑了!)


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

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

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

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

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


推荐