Уязвимость внедрения LDAP с именем пользователя и паролем DirectoryEntry?

В рамках процедуры аутентификации мы создаем System.DirectoryServices.DirectoryEntry из имени пользователя и пароля, введенных пользователем:

    var de = new DirectoryEntry(ldapPathFromConfig, typedUserName, typedPassword, AuthenticationTypes.ReadonlyServer|AuthenticationTypes.Secure);

Но когда мы запускаем код через Checkmarx, он утверждает, что в typedUserName и typedPassword есть уязвимости "внедрения LDAP", потому что они не очищены. Я не понимаю, почему, поскольку по определению пароль может быть что угодно... И используемый конструктор явно предназначен для приема username и password в качестве второго и третьего параметров.


person Medinoc    schedule 04.12.2019    source источник


Ответы (1)


Для Checkmarx вы всегда должны дезинфицировать (проверять) каждое используемое вами значение. Если вы этого не сделаете, Checkmarx увидит его как ненадежный, и, кстати, и правила Checkmarx, это может привести к некоторой инъекции. В вашем случае это нормальная находка от Checkmarx.

Внедрение LDAP является обычным явлением, как внедрение SQL, и, насколько я помню, не существует такого решения, как параметризация для LDAP (см. ">https://cheatsheetseries.owasp.org/cheatsheets/LDAP_Injection_Prevention_Cheat_Sheet.html).

person SPoint    schedule 05.12.2019
comment
И что же мне делать? Должен ли я избегать специальных символов? Но ожидает ли System.DirectoryServices.DirectoryEntry экранированную строку или она не сможет сопоставить пароли? Потому что, как я уже сказал, это не отличительное имя и не строка фильтра. Конструктор задокументирован как ожидающий пароль, простой и понятный. - person Medinoc; 05.12.2019
comment
Я не уверен, но я думаю, что он не ожидает экранированной строки. Это должно быть в том же формате, что и формат, который хранится в дереве LDAP. Итак, если пароль был экранирован, а хранилище экранировано, это должно работать - person SPoint; 12.12.2019