И так ошибка: это 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, 9.2 — FAILED.
Не подвержены ошибке:
Python 2.5.2 и 2.7 — OK.
ссылка на оригинал статьи http://habrahabr.ru/post/169183/
Добавить комментарий