Jak dziurę w OpenLDAP znalazłem (CVE-2022-29155)

Potrzebowałem zrobić bramkę LDAP do istniejącej bazy adresowej. To wziąłem to, co wydawało się oczywistym wyborem: OpenLDAP i jego plugin ‚back-sql’. Skonfigurowanie bramki okazało się niespodziewanie skomplikowane. Nie dość, że schemat LDAP niespecjalnie jest kompatybilny z naszym schematem bazy (generalnie struktura katalogu LDAP niespecjalnie się mapuje do
relacyjnej bazy danych), to jeszcze ten ‚back-sql’ wydawał się nieco przekombinowany. Szczegóły mapowania schematów same musiały być zapisane w bazie SQL. No ale coś udało mi się wydziergać i jakoś działało.

Problem wyszedł gdy próbowałem wyszukać kontakt z apostrofem w nazwisku (ktoś się naprawdę postarał przygotowując nasze dane testowe). Wyszukiwanie zamiast oczekiwanego wyniku dawało błędy SQL w logach serwera. Nieładnie.

Wiedząc czym to pachnie zacząłem kombinować z zapytaniami, aż udało mi się to, czego się obawiałem: byłem w stanie wykonać dowolną instrukcję SQL na serwerze. Niby nie był to duży problem, bo uprawnienia bramki LDAP były ograniczone tylko do odczytu konkretnych tabel, ale jednak uznałem to za niedopuszczalne.

Następny krok to Google: na pewno ktoś już to zauważył, może jest już poprawioen. I tu niespodzianka: ani śladu zgłoszenia takiego błędu. Co wciąż nie wykluczało możliwości, że jest dawno poprawiony. Użyłem jakiegoś antycznego OpenLDAP 2.4 (swoją drogą nawet Debian wciąż na 2.4 stoi), a już był dostępny OpenLDAP 2.6.1. No to czas na aktualizację!

Przy okazji okazało się, że ‚back-sql’ już nie tylko jest ‚experimental’, ale też ‚obsolete’ i w ogóle nie zalecany… No fajnie, ale ja już tego użyłem, a implementacja bramki od nowa, w Perlu, jakoś mnie nie pociąga. Tak, czy siak, ‚back-sql’ wciąż jest częścią OpenLDAP i powinien działać. Niestety, w 2.6.1 bez zmian: babol ‚SQL injection’ jak był, tak jest.

Zajrzałem do kodu, może jestem w stanie to poprawić. Ale szybko się poddałem. Ten ‚back-sql’ jest faktycznie przekombinowany. Kod masakrycznie złożony, prościej będzie już nową bramkę z użyciem ‚back-perl’ napisać niż się w tym połapać i czegoś bardziej nie zepsuć.

Błąd postanowiłem jednak zgłosić do autorów, bez większej nadziei na jego poprawę (skoro siedzi tam od kilkunastu lat, a plugin jest ‚experimental’ i ‚obsolete’). Skleciłem do tego prosty ‚proof of concept’ kasujący rekordy w przykładowej bazie. Ku mojemu zaskoczeniu już po paru godzinach dostałem pierwszego patcha który miał to poprawić. Patch nie do końca działał, ale ewidentnie wola rozwiązania problemu była.

Po dwóch dniach miałem już działającą poprawkę. A teraz poprawiona wersja OpenLDAP jest już publicznie dostępna, a problem zarejestrowany jako CVE-2022-29155.

Co o tym sądzisz?

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Wyloguj /  Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Wyloguj /  Zmień )

Zdjęcie na Facebooku

Komentujesz korzystając z konta Facebook. Wyloguj /  Zmień )

Połączenie z %s