Новый код для веб-приложений разрабатывается и выпускается быстрее, чем когда-либо, с применением экстремально быстрых методик разработки и повторно используемых блоков. Теперь уже не написанное с нуля, современное веб приложение (как для ПК, так и для мобильного устройства) собирается из взаимосвязанных API-интерфейсов, компонентов с открытым исходным кодом и облачных компонентов, таких как контейнеры и микросервисы/веб-сервисы.nnБольше 80% веб-приложений, написанных на РНР, Classic ASP или ColdFusion, подвержены как минимум одной критической уязвимости из ТОП-10 OWASP (см. рис.). Уязвимости в приложениях, написанных на скриптовых языках, встречаются гораздо чаще, чем в приложениях, написанных на .NET или Java. Фактически 64% приложений на Classic ASP, 62% на ColdFusion и 56% на РНР имеют по крайней мере одну уязвимость SQL-иньекции. Для сравнения: у NET эта цифра составляет 29%, а у Java — 21%. Данное обстоятельство вызывает серьезную тревогу, особенно в свете того, что большое количество веб-приложений сидят на CMS под управлением РНР. В том числе WordPress и Drupal.nnСоздать веб-приложение, в котором не будет ни одного дефекта, практически невозможно. Но даже если теоретически предположить, что кому-то из разработчиков это удалось, злоумышленникам никто не помешает эксплуатировать уязвимости бэкенд-движка, под управлением которого это веб-приложение работает, и таким образом менять поведение веб-приложения на свое усмотрение. В 2017 году на конференции Black Hat были представлены критические уязвимости в пяти наиболее распространенных языках веб-программирования:n
- Python. Содержит недокументированные методы и локальные переменные окружения, которые могут использоваться для выполнения команд операционной системы.
- Perl. У него есть скрытая функция, которая осуществляет попытку передать управление на один из переданных ей аргументов.
- Node.js. Встроенные сообщения об ошибках Node.js для функции require могут эксплуатироваться киберзлоумышленником для определения наличия на машине файла с заданным именем и для считывания первой строки этого файла.
- JRuby.CneunanncTaMH было обнаружено, что Java-версия Ruby позволяет осуществлять удаленное выполнение кода способом, непредусмотренным базовой спецификацией языка.
РНР. Специфически построенный РНР-код позволяет осуществлять несанкционированное удаленное выполнение команд операционной системы.
Скриптовые движки постоянно развиваются и усложняются. Вместе с новыми возможностями приходят и новые уязвимости. Потому что для реализации этих новых возможностей уже существующая функциональность скриптового движка используется новым, незапланированным до этого способом. Так, например, обсуждаются новые интересные особенности JavaScript, с появлением которых в JS-движке также появились и новые критические уязвимости, которым подвержены самые разнообразные современные скриптовые движки. В том числе те, которые реализованы в Adobe Flash. Chrome, Microsoft Edge и Safari.nnНагромождение спецификаций друг на друга в целях реализации обновленной функциональности, как правило, негативно сказывается на безопасности уже существующего кода скриптового движка. Разработчики скриптовых движков это понимают, но идут на поводу у веб-программистов. Веб-программисты тоже понимают это. Однако соблазн воспользоваться более новой и более удобной функцией берет верх над здравым смыслом.nnВ качестве примера развития и усложнения скриптовых движков можно посмотреть, что собой на сегодняшний день представляет такой программный примитив, как массив. Массив в JavaScript представляет собой смесь фильтров, умной индексации, смешанных типов, подклассов, многопоточного доступа и других концепций. Техническая спецификация. объясняющая разработчикам браузеров то. каким должен быть массив, — громоздкая и труднопонимае-мая, а в некоторых местах вообще неоднозначная. Поэтому у каждого браузера получается своя реализация поддержки массивов, которая полностью или частично не совместима с массивами других браузеров. Так происходит не только с массивами, но и со всеми остальными компонентами скриптовых движков.