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

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

背景:

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

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

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

除了…这对于编码人员意味着什么,我试图找到一些使用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); } } 

更多信息:

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

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

我已经完成了系统配置中所述的建议,创建了一个自定义运行时exception,它在这里吞下了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的调用。

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

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

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

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