LINUX.ORG.RU
ФорумAdmin

LDAP падает если в теле реквеста символ '\00'

 ,


0

1

Наблюдаю частые падения LDAPа, после анализа логов уалось установить, что такое просиходит из-за реквестов , которые содержат '\00' в теле, например (dc затёрто):

May 11 00:27:14 ldap02 slapd[15159]: conn=2221 op=85 SRCH base="dc=***net,dc=net" scope=2 deref=0 filter="(&(objectClass=account)(uid=null\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00))" [br]
May 11 00:27:14 ldap02 slapd[15159]: conn=2221 op=85 SRCH attr=userPassword 

Удалось срепродьюсить на тестовой машине:
ldapsearch -LLL -x -s sub -b "dc=***,dc=net" "(&(objectClass=account)(uid=test\00test))"
ldap_result: Can't contact LDAP server (-1)
(ldap моментально уходит в даун)


Запросы шлются железкой IronPort.
Вопрос: можно-ли как-то фильтровать такие реквесты?
Или IronPort должен сам конверить это в null, что не вызывает падений? (вроде в rfc 4515 обговаривается трансляция этого символа, но я не догнал, на каком этапе..)
Спасибо.

Спасибо за сплойт

anonymous ()

не воспроизводится:
openldap-2.4.23 (тот, что в debian stable)
openldap-2.4.28 (текущий релиз)

bass ★★★★★ ()

Пиши багрепорт. Разработчикам OpenLDAP по поводу дырки и разработчикам IronPort по поводу нарушения спецификации протокола.

Deleted ()

что сервер ldap и его версия?

bass ★★★★★ ()

А точно ли, что из-за запроса, а не из-за ответа?

Поскольку в моем случае не воспроизводится - обновляйте ldap.

zgen ★★★★★ ()
Ответ на: комментарий от bass

OpenLDAP 2.3.43
cat /etc/redhat-release CentOS release 5.6 (Final)
на тестовой машине у меня вопсроизводится (в качестве бэкенда к лдапу mysql, может в этом дело?)
пытаюсь вопсроизвести на лайвовой системе - пихаю этот же булшит в юзернейм на ironport - ironport транслирует правильно - всё ок, при этом на тестовом стенде в лдап напрямую - воспроизводится.

epsilon1024 ()
Ответ на: комментарий от epsilon1024

Обновление тебе уже порекомендовали.

Ветка 2.3 openldap это был полигон новой архитектуры и новых идей. Не рекомендовалась в продакшн ни под каким соусом.

в качестве бэкенда к лдапу mysql, может в этом дело?

всё может быть, если интересно, смотри slapd -d -1

bass ★★★★★ ()
Ответ на: комментарий от bass

Не рекомендовалась в продакшн ни под каким соусом.

Да? И где так явно было об этом написано?

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Прямым текстом - нигде. Между строчек ответов на багтрекерах 5-6 летней давности - слишком заметно.

Хорошо,предложение

Не рекомендовалась в продакшн ни под каким соусом.

должна быть дополнено «мной», чтобы исключить обобщение и мысли в сторону openldap девелоперов.

bass ★★★★★ ()
Ответ на: комментарий от bass

повысил log-level до 1, результат:
ldapsearch -LLL -x -s sub -b «dc=*net,dc=net» "(&(objectClass=account)(uid=renson\00y.d1))"

May 11 16:16:56 rad-isg slapd[4243]: slap_listener_activate(8):  
May 11 16:16:56 rad-isg slapd[4243]: >>> slap_listener(ldap:///) 
May 11 16:16:56 rad-isg slapd[4243]: connection_get(9): got connid=0 
May 11 16:16:56 rad-isg slapd[4243]: connection_read(9): checking for input on id=0 
May 11 16:16:56 rad-isg slapd[4243]: do_bind 
May 11 16:16:56 rad-isg slapd[4243]: >>> dnPrettyNormal: <> 
May 11 16:16:56 rad-isg slapd[4243]: <<< dnPrettyNormal: <>, <> 
May 11 16:16:56 rad-isg slapd[4243]: do_bind: version=3 dn="" method=128 
May 11 16:16:56 rad-isg slapd[4243]: send_ldap_result: conn=0 op=0 p=3 
May 11 16:16:56 rad-isg slapd[4243]: send_ldap_response: msgid=1 tag=97 err=0 
May 11 16:16:56 rad-isg slapd[4243]: do_bind: v3 anonymous bind 
May 11 16:16:56 rad-isg slapd[4243]: connection_get(9): got connid=0 
May 11 16:16:56 rad-isg slapd[4243]: connection_read(9): checking for input on id=0 
May 11 16:16:56 rad-isg slapd[4243]: do_search 
May 11 16:16:56 rad-isg slapd[4243]: >>> dnPrettyNormal: <dc=***net,dc=net> 
May 11 16:16:56 rad-isg slapd[4243]: <<< dnPrettyNormal: <dc=***net,dc=net>, <dc=***net,dc=net> 
May 11 16:16:56 rad-isg slapd[4243]: ==> limits_get: conn=0 op=1 dn="[anonymous]" 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_search(): base="dc=***net,dc=net", filter="(&(objectClass=account)(uid=renson\00y.d1))", scope=2,
May 11 16:16:56 rad-isg slapd[4243]:  deref=0, attrsonly=0, attributes to load: all 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_get_db_conn() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_open_db_conn(0) 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_open_db_conn(0) 
May 11 16:16:56 rad-isg slapd[4243]: backsql_open_db_conn(0): connected, adding to tree. 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_get_db_conn() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_dn2id("dc=***net,dc=net") matched expected 
May 11 16:16:56 rad-isg slapd[4243]:    backsql_dn2id("dc=***net,dc=net"): id_query "SELECT id,keyval,oc_map_id,dn FROM ldap_entries WHERE dn=?" 
May 11 16:16:56 rad-isg slapd[4243]:    backsql_dn2id("dc=***net,dc=net"): id=1 keyval=1 oc_id=1 dn=dc=***net,dc=net 
May 11 16:16:56 rad-isg slapd[4243]: >>> dnPrettyNormal: <dc=***net,dc=net> 
May 11 16:16:56 rad-isg slapd[4243]: <<< dnPrettyNormal: <dc=***net,dc=net>, <dc=***net,dc=net> 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_dn2id("dc=***net,dc=net"): err=0 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_id2entry() 
May 11 16:16:56 rad-isg slapd[4243]: backsql_id2entry(): retrieving all attributes 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_get_attr_vals(): oc="organization" attr="o" keyval=1 
May 11 16:16:56 rad-isg slapd[4243]: backsql_get_attr_vals(): number of values in query: 1 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_get_attr_vals() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_get_attr_vals(): oc="organization" attr="objectClass" keyval=1 
May 11 16:16:56 rad-isg slapd[4243]: backsql_get_attr_vals(): number of values in query: 1 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_get_attr_vals("dc=***net,dc=net"): unable to prettify value #18446744073709551615 of AttributeDescription objectClass (21) 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_get_attr_vals() 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_id2entry() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_oc_get_candidates(): oc="domain" 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_srch_query() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_process_filter() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_process_filter() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_process_filter_attr(objectClass) 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_process_filter_attr(objectClass) 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_process_filter() succeeded 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_process_filter() 
May 11 16:16:56 rad-isg slapd[4243]: ==>backsql_process_filter_attr(uid) 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_process_filter_attr(uid) 
May 11 16:16:56 rad-isg slapd[4243]: <==backsql_process_filter() succeeded 

/sbin/service ldap status slapd is stopped

epsilon1024 ()
Ответ на: комментарий от epsilon1024

==>backsql_get_attr_vals(«dc=***net,dc=net»): unable to prettify value #18446744073709551615 of AttributeDescription objectClass (21)

Бэкенд не может интерпретировать запрос (21 это LDAP_ATTR_ERROR)
Причём дальше не понятно, почему упал ldap. По идее, в дебаге -1 будет видно, как эта строка выглядит в памяти, потому что \00 это явный конец строки, а всё что дальше, должно быть отброшено.
Не имел дела с mysql бэкендом, но считаю что тут дело в нём. Ну и в -1 наверно будет ясно, почему всё таки openldap рухнул.

bass ★★★★★ ()
Ответ на: комментарий от bass

в -d -1:
(разбито на 2 части, т.к. не влезает)

May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: slap_listener_activate(8):  
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 busy 
May 11 17:06:15 rad-isg slapd[4603]: >>> slap_listener(ldap:///) 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: listen=8, new connection on 9 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  9r
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: daemon: read active on 9 
May 11 17:06:15 rad-isg slapd[4603]: daemon: added 9r (active) listener=(nil) 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: conn=0 fd=9 ACCEPT from IP=127.0.0.1:35073 (IP=0.0.0.0:389) 
May 11 17:06:15 rad-isg slapd[4603]: connection_get(9) 
May 11 17:06:15 rad-isg slapd[4603]: connection_get(9): got connid=0 
May 11 17:06:15 rad-isg slapd[4603]: connection_read(9): checking for input on id=0 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: do_bind 
May 11 17:06:15 rad-isg slapd[4603]: >>> dnPrettyNormal: <> 
May 11 17:06:15 rad-isg slapd[4603]: <<< dnPrettyNormal: <>, <> 
May 11 17:06:15 rad-isg slapd[4603]: do_bind: version=3 dn="" method=128 
May 11 17:06:15 rad-isg slapd[4603]: conn=0 op=0 BIND dn="" method=128 
May 11 17:06:15 rad-isg slapd[4603]: send_ldap_result: conn=0 op=0 p=3 
May 11 17:06:15 rad-isg slapd[4603]: send_ldap_result: err=0 matched="" text="" 
May 11 17:06:15 rad-isg slapd[4603]: send_ldap_response: msgid=1 tag=97 err=0 
May 11 17:06:15 rad-isg slapd[4603]: conn=0 op=0 RESULT tag=97 err=0 text= 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  9r
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: daemon: read active on 9 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: connection_get(9) 
May 11 17:06:15 rad-isg slapd[4603]: connection_get(9): got connid=0 
May 11 17:06:15 rad-isg slapd[4603]: connection_read(9): checking for input on id=0 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on 1 descriptor 
May 11 17:06:15 rad-isg slapd[4603]: daemon: activity on:
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=7 active_threads=0 tvp=NULL 
May 11 17:06:15 rad-isg slapd[4603]: daemon: epoll: listen=8 active_threads=0 tvp=NULL 

epsilon1024 ()
Ответ на: комментарий от epsilon1024
May 11 17:06:15 rad-isg slapd[4603]: do_search 
May 11 17:06:15 rad-isg slapd[4603]: >>> dnPrettyNormal: <dc=***net,dc=net> 
May 11 17:06:15 rad-isg slapd[4603]: <<< dnPrettyNormal: <dc=***net,dc=net>, <dc=***net,dc=net> 
May 11 17:06:15 rad-isg slapd[4603]: SRCH "dc=***net,dc=net" 2 0
May 11 17:06:15 rad-isg slapd[4603]:     0 0 0 
May 11 17:06:15 rad-isg slapd[4603]: begin get_filter 
May 11 17:06:15 rad-isg slapd[4603]: AND 
May 11 17:06:15 rad-isg slapd[4603]: begin get_filter_list 
May 11 17:06:15 rad-isg slapd[4603]: begin get_filter 
May 11 17:06:15 rad-isg slapd[4603]: EQUALITY 
May 11 17:06:15 rad-isg slapd[4603]: end get_filter 0 
May 11 17:06:15 rad-isg slapd[4603]: begin get_filter 
May 11 17:06:15 rad-isg slapd[4603]: EQUALITY 
May 11 17:06:15 rad-isg slapd[4603]: end get_filter 0 
May 11 17:06:15 rad-isg slapd[4603]: end get_filter_list 
May 11 17:06:15 rad-isg slapd[4603]: end get_filter 0 
May 11 17:06:15 rad-isg slapd[4603]:     filter: (&(objectClass=account)(uid=renson\00y.d1)) 
May 11 17:06:15 rad-isg slapd[4603]:     attrs:
May 11 17:06:15 rad-isg slapd[4603]:  
May 11 17:06:15 rad-isg slapd[4603]: conn=0 op=1 SRCH base="dc=***net,dc=net" scope=2 deref=0 filter="(&(objectClass=account)(uid=renson\00y.d1))" 
May 11 17:06:15 rad-isg slapd[4603]: ==> limits_get: conn=0 op=1 dn="[anonymous]" 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_search(): base="dc=***net,dc=net", filter="(&(objectClass=account)(uid=renson\00y.d1))", scope=2,
May 11 17:06:15 rad-isg slapd[4603]:  deref=0, attrsonly=0, attributes to load: all 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_get_db_conn() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_open_db_conn(0) 
May 11 17:06:15 rad-isg slapd[4603]: do_bind: v3 anonymous bind 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_open_db_conn(0) 
May 11 17:06:15 rad-isg slapd[4603]: backsql_open_db_conn(0): connected, adding to tree. 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_get_db_conn() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_dn2id("dc=***net,dc=net") matched expected 
May 11 17:06:15 rad-isg slapd[4603]:    backsql_dn2id("dc=***net,dc=net"): id_query "SELECT id,keyval,oc_map_id,dn FROM ldap_entries WHERE dn=?" 
May 11 17:06:15 rad-isg slapd[4603]:    backsql_dn2id("dc=***net,dc=net"): id=1 keyval=1 oc_id=1 dn=dc=***net,dc=net 
May 11 17:06:15 rad-isg slapd[4603]: >>> dnPrettyNormal: <dc=***net,dc=net> 
May 11 17:06:15 rad-isg slapd[4603]: <<< dnPrettyNormal: <dc=***net,dc=net>, <dc=***net,dc=net> 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_dn2id("dc=***net,dc=net"): err=0 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_id2entry() 
May 11 17:06:15 rad-isg slapd[4603]: backsql_id2entry(): retrieving all attributes 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_get_attr_vals(): oc="organization" attr="o" keyval=1 
May 11 17:06:15 rad-isg slapd[4603]: backsql_get_attr_vals(): number of values in query: 1 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_get_attr_vals() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_get_attr_vals(): oc="organization" attr="objectClass" keyval=1 
May 11 17:06:15 rad-isg slapd[4603]: backsql_get_attr_vals(): number of values in query: 1 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_get_attr_vals("dc=***net,dc=net"): unable to prettify value #18446744073709551615 of AttributeDescription objectClass (21) 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_get_attr_vals() 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_id2entry() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_oc_get_candidates(): oc="domain" 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_srch_query() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_process_filter() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_process_filter() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_process_filter_attr(objectClass) 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_process_filter_attr(objectClass) 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_process_filter() succeeded 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_process_filter() 
May 11 17:06:15 rad-isg slapd[4603]: ==>backsql_process_filter_attr(uid) 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_process_filter_attr(uid) 
May 11 17:06:15 rad-isg slapd[4603]: <==backsql_process_filter() succeeded 


Не имел дела с mysql бэкендом, но считаю что тут дело в нём.


весьма вероятно. Крайне гадостаная вещь, эта прослойка, нo выбора нет, Ironport умеет только в ldap ходить, а вся инфа в базе.

epsilon1024 ()
Ответ на: комментарий от epsilon1024

\00 это явный конец строки,

Вот тут я наврал >> а всё что дальше, должно быть отброшено.
должен просто искать.

В этом дебаге тоже ничего не ясно, сорри, ничем не помогу.

bass ★★★★★ ()
Ответ на: комментарий от anonymous2

у меня в slapd.conf database - sql:

#######################################################################
# sql database definitions
#######################################################################

database        sql

epsilon1024 ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.