安全性:CWE-201:使用openStream安全读取属性文件的正确方法是什么?

时间:2015-06-10 14:07:59

标签: java security veracode

我正在努力想出一个由Veracode标记的CWE-201解决方案。

背景:

CWE-201:通过已发送数据的信息曝光

通过已发送数据的信息曝光 弱点ID:201(弱点变体)状态:草稿 +说明 说明摘要 通过发送数据意外暴露敏感信息是指数据的传输,这些数据本身既敏感又有助于通过标准数据通道进一步利用系统。

阶段:架构与设计 战略:特权分离 将系统划分为具有“安全”区域,其中可以明确地绘制信任边界。不允许敏感数据超出信任边界,并且在与安全区域外的隔间连接时务必小心。 确保在系统设计中内置适当的划分,并且划分用于允许并进一步加强权限分离功能。架构师和设计师应该依靠最小特权原则来决定何时使用和放弃系统权限。

此外......对于编码的人来说,这意味着什么,我正试图找到一些使用java来解决这个问题的实用解决方案。

我能说的是,以下代码将导致veracode标记cwe-201:

public void init(URL filePath) {
    try {
        load(new BufferedInputStream(filePath.openStream()));
    } catch (java.io.IOException e) {           
        Log.error("Could not load server properties file!", e);                     
    } 
}

更多信息:

阶段:实施 确保设计人员确认要求中指定的任何可能敏感数据,以确保其为计算风险或在其他地方减轻。应删除该功能不需要的任何信息,以降低开销和发送安全敏感数据的可能性。

阶段:系统配置 设置默认错误消息,以便意外错误不会泄露敏感信息。

我已完成系统配置中所述的建议,方法是创建一个自定义运行时异常,在此处吞下IOException ...但Veracode仍标记它。

以下代码如下:

public class CWE201Exception extends RuntimeException {

private static Logger log = ESAPI.getLogger(CWE201Exception .class.getName());

public CWE201Exception(String identifer, Throwable t){  
    log.error(Logger.SECURITY_AUDIT, identifer);
}

}

并将方法更新为:

public void init(URL filePath) {
    try {
        load(new BufferedInputStream(filePath.openStream()));
    } catch (java.io.IOException e) {           
        throw new CWE201Exception("omgStillDoingThis", e);                      
    } 
}

通过veracode报告,我发现了以下内容:

攻击媒介:java.net.URL.openStream

描述:应用程序调用java.net.URL.openStream()函数,这将导致数据从应用程序(通过网络或其他媒介)传输出去。此数据包含敏感信息。在filePath对象上调用openStream(),该对象包含可能敏感的数据。可能敏感的数据来自之前对 java.lang.system.getproperty 的调用。

补救:确保传输敏感数据并且不违反应用程序安全策略。此漏洞被归类为低严重性,因为它仅影响机密性,而不是完整性或可用性。但是,在移动应用程序的上下文中,信息泄露的重要性可能会大得多,尤其是在与用户期望或数据隐私策略不一致的情况下。

问题 事实证明,当您以这种方式读取驻留在服务器上的属性文件时,您间接使用System.getProperties()。

将此作为流公开被视为安全威胁

话虽如此,加载属性文件的正确方法是什么,以便您的应用程序可以按照veracode认为“安全”的方式加载环境配置信息?

0 个答案:

没有答案