【问题标题】:Malicious code vulnerability - May expose internal representation by returning reference to mutable object恶意代码漏洞 - 可能通过返回对可变对象的引用来暴露内部表示
【发布时间】:2012-02-15 14:10:54
【问题描述】:

您好,我的违规行为如下:

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

在我的代码中我是这样写的

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

我们如何解决它。

【问题讨论】:

    标签: java sonarqube


    【解决方案1】:

    假设如下:

    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 的实际数组的引用,您允许Foo 类外部的代码进入并更改其状态。

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

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


    修复取决于此代码(或实际上是整个库或应用程序)是否对安全性至关重要......或者代码在未来的某些部署中是否对安全性至关重要。如果这是虚惊一场,你可以直接压制违规;即标记它,以便检查器忽略它。如果这是一个真正的问题(或可能成为一个真正的问题),那么要么返回数组的副本:

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

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

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

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

    【讨论】:

    • 我仍然想知道为什么声纳只报告数组的这个问题,而不是,例如,列表或任何其他类型的可变数据结构。还有更多,可能是由于数组存储在内存中的方式?
    • “还有更多的原因,可能是由于数组在内存中的存储方式?” - 据我所知,没有。
    • 真正的区别在于,使用数组不可能阻止拥有数组引用的人更改内容。对于对象类型,通过对象 API 来访问它(如果 API 被正确选择实现),这使得很难区分安全和不安全的用法。 (如果错误检查器“叫狼”的频率太高,则不会使用。)
    • @Stephen C,如果我有机会,我可以将类型从 Array 更改为 ArrayList 以避免暴露信息吗?
    • 想想吧。如果你返回一个ArrayList,那么调用者可以对其执行变异操作……你的抽象仍然是泄漏的。返回一个不可修改的列表将是一种改进......取决于列表中的内容。
    【解决方案2】:

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

    这可能会导致问题 - 例如 - 这样做

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

    由于数组对象和所有 Java 对象一样,都是通过引用传递的,这也会改变存储在对象中的原始数组。

    您最可能想要解决此问题的方法很简单

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

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

    【讨论】:

    • 在上述解决方案中,每次我们通过 clone() 访问它时,我们最终都会创建一个新的 String[] 对象。我只需要比较(而不是最终创建一个新对象)是否有人有更好的解决方案?
    • 除了打败 Findbugs 之外,我不明白这有什么用处。复制的数组仍然具有对构成 obj 状态的字符串的引用。
    • 另外,如果 chkBox 是 getChkBox,我希望得到对底层对象的引用。那么 getter 需要返回对某种抽象类的引用,不是吗?
    • 这很有道理,约阿希姆,谢谢。我正在考虑这个问题。我有一个其他人编写的类,它在 getter 中返回 DomainSpecificClass[].clone()。
    猜你喜欢
    • 2013-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-04
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    相关资源
    最近更新 更多