метод вызывает динамически сгенерированный фильтр LDAP с непроверенным i / p - PullRequest
0 голосов
/ 18 сентября 2018

Я получаю ниже критический риск при сканировании с помощью инструмента Fortify.

Метод getUserLDAPNameFromAD () вызывает динамически генерируемый фильтр LDAP с неподтвержденным вводом, который может позволить злоумышленнику изменить значение оператора.

в классе: ConsoleService

public class ConsoleService implements IConsoleService {
public char[] readPassword() throws IOError {
    return System.console().readPassword();
}
 and 

 public final class ConsoleUtils {

public static final String TERMINATION_CHARACTER = ".";
private static Scanner in = new Scanner(System.in);

при использовании в классе LDAPservice.java я получаю ошибку внедрения LDAP.в следующих строках кода:

public Attribute getUserLDAPNameFromAD (атрибут LDAPUserAttribute) выбрасывает NamingException {

    String accountName = attribute.constructName(Constants.DOT, true);
    EqualsFilter equalsFilter = new EqualsFilter("sAMAccountName", accountName);
    String FILTER = "(&(objectClass=user)(objectCategory=person)(" + equalsFilter.toString() + "))";
    SearchControls ctls = new SearchControls();
    ctls.setSearchScope(SearchControls.SUBTREE_SCOPE);
    NamingEnumeration<SearchResult> answer = ctx.search(base, FILTER, ctls);
    if (answer.hasMore()) {
        SearchResult result = answer.next();
        return result.getAttributes().get("distinguishedName");
    }
    return null;
}

У кого-нибудь есть идеи, как я могу решить эту проблему?

1 Ответ

0 голосов
/ 18 сентября 2018

Чтобы исправить ошибку, которую вы получаете в своем инструменте статического анализа, вы должны использовать параметризованные фильтры LDAP вместо конкатенации строк, как вы делаете.Риск конкатенации строк заключается в том, что злонамеренный пользователь может злоупотреблять синтаксисом фильтра LDAP, чтобы либо всегда соответствовать, либо всегда не совпадать, что часто имеет последствия для безопасности вашего приложения.

Похоже, вы используете SpringEqualsFilter, который может корректно экранировать строку.Но инструмент статического анализа не подтверждает его.

Чтобы использовать параметризованные фильтры LDAP, вы можете сделать следующее (, как описано в руководстве по JNDI ):

ctx.search(base,
    "(&(objectClass=user)(objectCategory=person)(sAMAccountName={0}))",
    new Object[] { accountName },
    ctls);
...