我正在为从 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认为“安全”的方式加载环境配置信息?