Pull to refresh

PostgreSQL, TCL и другие: Критическая ошибка в RE engine. Возможная уязвимость

Reading time 2 min
Views 4.8K
Хочу обратить внимание хабрасообщества на возможную «уязвимость» в TCL, PostgreSQL и теоретически в некоторых других системах, использующих модули ругулярных выражений или NFA утилиты, изначально написаные самим Генри Спенсором (Henry Spencer). Измененных исходников можно найти добрую сотню (у того же Sun Microsystems, UUNET и т.д.). И хотя, я не думаю, что баг существует изначально с далеких 90-х, хотя бы потому, что кода где возникает эта ошибка я у Генри, в старых его источниках, не нашел, проверить ваши системы все-таки стоит.

И так ошибка: это busyloop на стадии компиляции регулярного выражения вида (((((x)*)*)*)*)*. Причем именно не исполнения, а компиляции, т.е. если есть проверка валидности регулярки и она базируется на том же коде NFA — имеем тот же безконечный цикл + 100% cpu usage.

Ошибку нашли коллеги по opensource проекту TCL, во всех его актуальных версиях (включая develop). Зная, что Postgres использует похожее API, нетрудно было выяснить, что скармливание этого регулярного выражения Postgres приводит к полному зависанию потока (процесса), отрабатывающего запрос.

Ошибка возникает при таком группировании только в пятом и более порядке вложенности — т.е. четыре вложеных группы корректно компилируются и исполняются.

Пример для PostgreSQL:
postgres=# select 1 where 'x' ~ '((((x)*)*)*)*';
 ?column?
----------
        1
(1 row)
postgres=# select 1 where 'x' ~ '(((((x)*)*)*)*)*';
!busyloop!

Пример для TCL:
% regexp -about {((((x)*)*)*)*}
4 REG_UEMPTYMATCH
% regexp -about {(((((x)*)*)*)*)*}
!busyloop!

Т.к. эта ошибка приводит к подвисанию потока при 100% busy, и ввиду того, что уже имеются bug reports (которые, кстати, очень активно штудируются хакерами и скрипт-киддис), пока идет поиск и не будет выпущен bug fix, рекомендую проверить свои проекты (продукты) и в случае положительного результата, поотключать возможность генерации подобных регулярных выражений или foreign input регулярок вообще.

Сегодня целых два раза уронил таким способом баг-трекер одного своего друга, после чего выслушав сперва ругань, затем что в логах ничего не было видно (аргументы post у него отключены в логе), услышал таки спасибо. Ибо, предупрежден — вооружен.

Из проверенного уязвимы:
TCL 8.4, 8.5, 8.6 — FAILED.
PostgreSQL 8.4, 9.1 — FAILED.

Не подвержены ошибке:
Python 2.5.2 и 2.7 — OK.
UPD: PostgreSQL 9.2.3 — OK. (согласно комменту ув. starius).
UPD: PostgreSQL 9.2.1, 9.2.2-2 — OK. (спасибо catlion и sdevalex).
Only registered users can participate in poll. Log in, please.
Поучавствуйте в опросе, пожалуйста — просто жутко интересно
26.85% поискал — ничего не нашел 29
5.56% поискал — нашел и прикрыл лавочку 6
8.33% поискал — нашел, да и ладно 9
59.26% не искал — оно мне надо… 64
108 users voted. 75 users abstained.
Tags:
Hubs:
If this publication inspired you and you want to support the author, do not hesitate to click on the button
+14
Comments 18
Comments Comments 18

Articles