По данным исследования, который провел старший консультант по безопасности компании IOActive Фернандо Арнаболди, защищенные приложения подвержены атакам из-за уязвимостей в интерпретируемых языках программирования, на которых они написаны. Интерпретируемый язык программирования отличается тем, что исходный код не преобразовывается в машинный для непосредственного выполнения центральным процессором (как в компилируемых языках), а исполняется с помощью специальной программы-интерпретатора.
С помощью автоматизированный техники, известной как фаззинг, эксперт протестировал интерпретаторы пяти популярных языков программирования — JavaScript, Perl, PHP, Python и Ruby. Для наблюдений применялся XDiFF (Extended Differential Fuzzing Framework — расширенный дифференциальный фреймворк для фаззинга), который заточен под анализ структуры языков программирования и их поведения.
Суть фаззинга как методики тестирования заключается в том, что система передает приложению на выход неправильные, неожиданные или случайные данные. Такой метод эффективен для предотвращения утечек памяти, которые приводят к зависанию или аварийному завершению работы программ. Обычно такие проблемы легко решаются оптимизацией исходного кода, но иногда они таят в себе проблемы, связанные с безопасностью, и не зависят от разработчиков конечного ПО.
Для тестирования языков Арнаболди использовались менее тридцати примитивных величин (число, буква и т. д.), скомбинированных со специальными примерами полезной нагрузки так, чтобы можно было определить, когда ПО пытается получить доступ к внешним ресурсам. Исследователь «разобрал» языки до базовых функций, а затем протестировал каждую из них: JavaScript — 450 функций; PHP — 1405; Ruby — 2483; Perl — 3105; Python — 3814.
Обнаружилось, что в Python содержатся незадокументированные методы и переменные локальной среды, которые можно использовать для выполнения команд на уровне операционной системы, а в Perl содержится функция typemaps, способная выполнить код eval(). Что касается NodeJS, то он выдаёт ошибки, частично раскрывающие содержание файла. JRuby загружает и выполняет посторонний код на функции, которая этого не предполагает, а имена констант PHP можно использовать для удалённого выполнения команд.
«Разработчики ПО могут непредумышленно внедрить в приложение код, который затем будет использован не так, как предполагали сами авторы приложения. Некоторые варианты его поведения могут представлять серьёзный риск для безопасности приложений, даже если их разработка велась в полном соответствии с нормами безопасности», — заявил Арнабольди.
Эксперты находили уязвимости в языках программирования и раньше. Так, Veracode опубликовала результаты исследования зависимости числа уязвимостей в коде от используемого языка программирования. В рамках исследования был выполнен статический анализ более 200 тыс. приложений, который показал, что наибольшее число связанных с безопасностью ошибок присутствует в коде проектов на ASP, ColdFusion и PHP.
В 2013 г. была зафиксирована массовая атака на сайты, использующие устаревшие выпуски фреймворка Ruby on Rails, содержащие неисправленную уязвимость CVE-2013-0156. Учитывая то, что на PHP и Ruby on Rails написаны платформы Drupal, Joomla и WordPress, доля которых среди систем управления контентом составляет около 70% и на которых работает четверть крупнейших сайтов Сети, язык PHP указан как приносящий наибольшие проблемы с безопасностью.