Fortify Software的目标:
避免企业所使用的软件中存在安全漏洞
Fortify Software的方法:
提高软件自身的安全防御能力
Fortify Software的解决方案:
解决软件开发过程中,软件开发人员、安全评审人员和项目管理人员的通力配合的难题。
Fortify Software的安全产品中包括:
Fortify的源代码分析工具集
Fortify软件安全管理qi
Fortify应用防卫管理qi
Fortify安全测试跟踪qi
Fortify软件
强化静态代码分析器
使软件更快地生产
“将FINDBUGS XML转换为HP FORTIFY SCA FPR | MAIN | CA特权身份管理员安全研究白皮书»
强化针对JSSE API的SCA自定义规则滥用
安全套接字层(SSL / TLS)是使用加密过程提供身份验证,机mi性和完整性的广泛使用的网络安全通信协议。为确保该方的身份,必须交换和验证X.509证书。一方当事人进行身份验证后,协议将提供加密连接。用于SSL加密的算法包括一个安全的散列函数,保证了数据的完整性。
当使用SSL / TLS时,必须执行以下两个步骤,以确保中间没有人篡改通道:
证书链信任验证:X.509证书指ding颁发证书的证书颁发机构(CA)的名称。服务器还向客户端发送中间CA的证书列表到根CA。客户端验证每个证书的签名,到期(以及其他检查范围,例如撤销,基本约束,策略约束等),从下一级到根CA的服务器证书开始。如果算法到达链中的后一个证书,没有违规,则验证成功。
主机名验证:建立信任链后,客户端必须验证X.509证书的主题是否与所请求的服务器的完全限定的DNS名称相匹配。 RFC2818规定使用SubjectAltNames和Common Name进行向后兼容。
当安全地使用SSL / TLS API并且可能导致应用程序通过受攻击的SSL / TLS通道传输敏感信息时,可能会发生以下错误使用情况。
证明所有证书
应用程序实现一个自定义的TrustManager,使其逻辑将信任每个呈现的服务器证书,而不执行信任链验证。
TrustManager [] trustAllCerts = new TrustManager [] {
新的X509TrustManager(){
...
public void checkServerTrusted(X509Certificate [] certs,
String authType){}
}
这种情况通常来自于自签证书被广泛使用的开发环境。根据我们的经验,我们通常会发现开发人员完全禁用证书验证,而不是将证书加载到密钥库中。这导致这种危险的编码模式意外地进入生产版本。
当这种情况发生时,它类似于从烟雾探测器中取出电池:检测器(验证)将仍然存在,提供错误的安全感,因为它不会检测烟雾(不可信方)。实际上,当客户端连接到服务器时,验证例程将乐意接受任何服务器证书。
在GitHub上搜索上述弱势代码可以返回13,823个结果。另外在StackOverflow上,一些问题询问如何忽略证书错误,获取类似于上述易受攻击的代码的回复。这是关于投piao答案建议禁用任何信任管理。
Fortify软件
强化静态代码分析器
使软件更快地生产
“将FINDBUGS XML转换为HP FORTIFY SCA FPR | MAIN | CA特权身份管理员安全研究白皮书»
强化针对JSSE API的SCA自定义规则滥用
允许所有的行动
应用程序不检查服务器发送的数字证书是否发送到客户端正在连接的URL。
Java安全套接字扩展(JSSE)提供两组API来建立安全通信,一个HttpsURLConnection API和一个低级SSLSocket API。
HttpsURLConnection API默认执行主机名验证,再次可以通过覆盖相应的HostnameVerifier类中的verify()方法来禁用(在GitHub上搜索以下代码时,大约有12,800个结果)。
HostnameVerifier allHostsValid = new HostnameVerifier(){
public boolean verify(String hostname,SSLSession session){
返回真
}
};
SSLSocket API不开箱即可执行主机名验证。以下代码是Java 8片段,仅当端点标识算法与空字符串或NULL值不同时才执行主机名验证。
private void checkTrusted(X509Certificate [] chain,String authType,SSLEngine engine,boolean isClient)
throws CertificateException {
...
String identityAlg = engine.getSSLParameters()。
getEndpointIdentificationAlgorithm();
if(identityAlg!= null && identityAlg.length()!= 0){
checkIdentity(session,chain [0],identityAlg,isClient,
getRequestedServerNames(发动机));
}
...
}
当SSL / TLS客户端使用原始的SSLSocketFactory而不是HttpsURLConnection包装器时,识别算法设置为NULL,因此主机名验证被默认跳过。因此,如果攻击者在客户端连接到“”时在网络上具有MITM位置,则应用程序还将接受为“some-evil-”颁发的有效的服务器证书。
这种记录的行为被掩埋在JSSE参考指南中:
“当使用原始SSLSocket和SSLEngine类时,您应该始终在发送任何数据之前检查对等体的凭据。 SSLSocket和SSLEngine类不会自动验证URL中的主机名与对等体凭
以上信息由专业从事源代码审计工具fortify sca的华克斯于2025/3/19 22:21:03发布
转载请注明来源:http://szhou.mf1288.com/hksxxkj-2849460595.html