用户控制名称的 JNDI 查找¶
ID: java/jndi-injection
Kind: path-problem
Security severity: 9.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-074
Query suites:
- java-code-scanning.qls
- java-security-extended.qls
- java-security-and-quality.qls
Java 命名和目录接口 (JNDI) 是目录服务的 Java API,允许 Java 软件客户端通过名称发现和查找数据和资源(以 Java 对象形式)。如果用于查找数据的名称由用户控制,则该名称可能会指向恶意服务器,该服务器可以返回任意对象。在最坏的情况下,这可能会允许远程代码执行。
建议¶
一般建议是避免将不受信任的数据传递给 InitialContext.lookup
方法。如果用于查找对象的名称必须由用户提供,请确保它不是绝对 URL 形式,或者它是指向受信任服务器的 URL。
示例¶
在以下示例中,代码接受来自用户的名称,并使用该名称查找对象。
在第一个示例中,用户提供的名称用于查找对象。
第二个示例在使用名称查找对象之前验证名称。
import javax.naming.Context;
import javax.naming.InitialContext;
public void jndiLookup(HttpServletRequest request) throws NamingException {
String name = request.getParameter("name");
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
env.put(Context.PROVIDER_URL, "rmi://trusted-server:1099");
InitialContext ctx = new InitialContext(env);
// BAD: User input used in lookup
ctx.lookup(name);
// GOOD: The name is validated before being used in lookup
if (isValid(name)) {
ctx.lookup(name);
} else {
// Reject the request
}
}
参考¶
Oracle:Java 命名和目录接口 (JNDI)。
Black Hat 材料:从 JNDI/LDAP 操纵到远程代码执行梦想之地的旅程。
Veracode:利用 Java 中的 JNDI 注入。
常见弱点枚举:CWE-74。