CodeQL 文档

用户控制名称的 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

点击查看 CodeQL 存储库中的查询

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
  }
}

参考

  • ©2025GitHub, Inc.
  • 条款
  • 隐私