Как стать автором
Обновить

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

Время на прочтение2 мин
Количество просмотров4.9K
Хочу обратить внимание хабрасообщества на возможную «уязвимость» в 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).
Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.
Поучавствуйте в опросе, пожалуйста — просто жутко интересно
26.85% поискал — ничего не нашел29
5.56% поискал — нашел и прикрыл лавочку6
8.33% поискал — нашел, да и ладно9
59.26% не искал — оно мне надо…64
Проголосовали 108 пользователей. Воздержались 75 пользователей.
Теги:
Хабы:
Если эта публикация вас вдохновила и вы хотите поддержать автора — не стесняйтесь нажать на кнопку
+14
Комментарии18

Публикации

Изменить настройки темы

Истории

Работа

Ближайшие события

Weekend Offer в AliExpress
Дата20 – 21 апреля
Время10:00 – 20:00
Место
Онлайн
Конференция «Я.Железо»
Дата18 мая
Время14:00 – 23:59
Место
МоскваОнлайн