不安全的 LDAP 身份验证¶
ID: java/insecure-ldap-auth
Kind: path-problem
Security severity: 8.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-522
- external/cwe/cwe-319
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
在使用 Java LDAP API 执行 LDAPv3 样式的扩展操作和控件时,将启动一个包含连接属性(包括用户凭据)的上下文。以明文形式传输 LDAP 凭据允许远程攻击者通过嗅探网络来获取敏感信息。
建议¶
使用 ldaps://
协议通过 SSL 发送凭据或使用 SASL 身份验证。
示例¶
在以下(错误)示例中,使用了 ldap://
URL,并且凭据将以纯文本形式发送。
String ldapUrl = "ldap://ad.your-server.com:389";
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.PROVIDER_URL, ldapUrl);
environment.put(Context.REFERRAL, "follow");
environment.put(Context.SECURITY_AUTHENTICATION, "simple");
environment.put(Context.SECURITY_PRINCIPAL, ldapUserName);
environment.put(Context.SECURITY_CREDENTIALS, password);
DirContext dirContext = new InitialDirContext(environment);
在以下(正确)示例中,使用了 ldaps://
URL,因此凭据将使用 SSL 加密。
String ldapUrl = "ldaps://ad.your-server.com:636";
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.PROVIDER_URL, ldapUrl);
environment.put(Context.REFERRAL, "follow");
environment.put(Context.SECURITY_AUTHENTICATION, "simple");
environment.put(Context.SECURITY_PRINCIPAL, ldapUserName);
environment.put(Context.SECURITY_CREDENTIALS, password);
DirContext dirContext = new InitialDirContext(environment);
在以下(正确)示例中,使用了 ldap://
URL,但启用了 SASL 身份验证,以便对凭据进行加密。
String ldapUrl = "ldap://ad.your-server.com:389";
Hashtable<String, String> environment = new Hashtable<String, String>();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.PROVIDER_URL, ldapUrl);
environment.put(Context.REFERRAL, "follow");
environment.put(Context.SECURITY_AUTHENTICATION, "DIGEST-MD5 GSSAPI");
environment.put(Context.SECURITY_PRINCIPAL, ldapUserName);
environment.put(Context.SECURITY_CREDENTIALS, password);
DirContext dirContext = new InitialDirContext(environment);
参考¶
Oracle:LDAP 和 LDAPS URL
Oracle:简单身份验证
常见弱点枚举:CWE-522。
常见弱点枚举:CWE-319。