SonarQube показывает регулярное выражение отказа в обслуживании (ReDoS) - PullRequest
0 голосов
/ 28 апреля 2020

Я проверяю дату, используя регулярное выражение в JavaScript, но когда я запускаю SonarQube для анализа кода. Он показывает регулярное выражение как уязвимость безопасности.

Пример 1:

Ниже приведен шаблон регулярного выражения (ссылка на источник регулярного выражения { ссылка }):

^(?:(?:31(\/|-|\.)(?:0?[13578]|1[02]))\1|(?:(?:29|30)(\/|-|\.)(?:0?[13-9]|1[0-2])\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:29(\/|-|\.)0?2\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:0?[1-9]|1\d|2[0-8])(\/|-|\.)(?:(?:0?[1-9])|(?:1[0-2]))\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$

Пример 2:

Для плавающего значения я использовал приведенное ниже регулярное выражение

^\d{1,5}(?:\.\d{1,5})?$

SonarQube выдает ту же ошибку безопасности, я пробовал различные шаблоны регулярных выражений, но это не работает.

1 Ответ

2 голосов
/ 30 апреля 2020

Горячая точка против уязвимости

Прежде всего, обратите внимание, что SonarQube информирует вас о горячей точке безопасности, а не об уязвимости. Это означает (цитируя the docs ):

Hotspot безопасности выделяет чувствительный к безопасности фрагмент кода, который разработчик должен просмотреть. После проверки вы либо обнаружите, что угрозы нет, либо вам нужно применить исправление для защиты кода.

[...]

С Hotspot, чувствительным к безопасности элементом кода выделен, но на общую безопасность приложения не может повлиять. Разработчик должен проверить код, чтобы определить, нужно ли исправление для обеспечения безопасности кода.

Важным выводом здесь является то, что SonarQube не сообщает вам, что что-то не так. Он говорит вам, что вы должны внимательно посмотреть код, чтобы определить , является ли что-то не так.

Другими словами, он говорит вам, что ваше регулярное выражение может быть уязвимым для ReDoS атаки, не то, что это на самом деле. Если вы просматриваете код и обнаруживаете, что уязвимости нет, совершенно нормально просто устранить проблему, не меняя ничего.

Так почему именно SonarQube предлагает вам проверить этот код?

SonarQube фактически не определяет, уязвимо ли регулярное выражение для ReDoS или нет (поэтому оно помечено как точка безопасности, а не уязвимость). Вместо этого он помечает все нетривиальные регулярные выражения и напоминает вам просмотреть их, чтобы определить, являются ли они уязвимыми или нет. Как объяснено в документации правила , оно рассматривает любое регулярное выражение как нетривиальное, содержащее более одного вхождения любого из символов *+{.

, поскольку оба ваших регулярных выражения нетривиальны по этим критериям, оба помечены.

Так уязвим ли ваш код?

Нет, ни одно из ваших регулярных выражений не уязвимо. Фактически, единственный оператор повторения, используемый в любом выражении, - это {}, и поскольку вы предоставляете верхнюю границу во всех случаях, неограниченного повторения даже не существует.

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

Так что вам следует делать?

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

В комментариях было отмечено, что сообщение исчезнет go, если вы разделите строку регулярного выражения на несколько строк или переместите ее в Переменная. Причина, по которой это работает, заключается в том, что SonarQube обманывает и не находит регулярное выражение. Таким образом, это изменение не сделает ваш код лучше или безопаснее, оно только запутает SonarQube и никоим образом не предпочтительнее, чем просто отклонить сообщение. Как правило, не рекомендуется запутывать ваш код только для того, чтобы ваши аналитические инструменты stati c закрылись.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...