Ошибки в JavaScript, PHP, Python оставляют в ПО «дыры», от которых нельзя избавиться

Безопасность Стратегия безопасности Интернет Интернет-ПО
мобильная версия
, Текст: Роман Георгиев
Ошибки в самых популярных языках программирования могут представлять угрозу для любых написанных на них приложениях, утверждают эксперты. Речь идёт в первую очередь о таких языках как JavaScript, Perl, PHP, Python и Ruby.

Проблема интерпретаторов

В популярных высокоуровневых языках программирования содержатся уязвимости, которые ставят под угрозу любые приложения, написанные на них. Даже те, чья безопасность неоднократно проверена. Об этом заявил, выступая на конференции Black Hat Europe 2017 эксперт по информационной безопасности IOActive Фернандо Арнабольди (Fernando Arnaboldi).

Арнабольди исследовал функциональность нескольких наиболее популярных таких языков: JavaScript, Perl, PHP, Python и Ruby, тех, которые чаще всего используются для создания веб-приложений.

Для выявления уязвимостей он применял методику автоматического тестирования ПО под названием «фаззинг», которая заключается в передаче приложению на вход неправильных, неожиданных или случайных данных. Предметом интереса являются падения и зависания, нарушения внутренней логики и проверок в коде приложения, утечки памяти, вызванные такими данными на входе. Специально для тестирования языков и их компиляторов, Арнабольди разработал специализированный расширенный фреймворк XDiFF, с помощью которого тестируется сама структура языков.

Исследованию подверглись языки JavaScript (трансляторы v8, ChakraCore, Spidermonkey, NodeJS, Node), PHP (трансляторы PHP и HHVM), Ruby (Ruby, JRuby), Perl (Perl, ActivePerl) и Python (CPython, PyPy, Jython).

«Перед исполнением фаззер генерирует все возможные варианты тестирования, производя перестановки между функциями и вариантами полезной нагрузки. Тест единовременно сопоставлял одну функцию языка с разными такими вариантами», - говорится в исследовании, опубликованном Арнабольди.

В интерпретаторах JavaScript, Perl, PHP, Python и Ruby
присутствуют уязвимости, передаваемые ими в создаваемое ПО

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

Незадокументированные функции и имена констант

В результате исследования Арнабольди обнаружил следующие проблемы.

В Python содержатся незадокументированные методы и переменные локальной среды, которые можно использовать для выполнения команд на уровне операционной системы.

В Perl содержится функция typemaps, способная выполнить код eval().

NodeJS выдаёт ошибки, частично раскрывающие содержание файла.

JRuby загружает и выполняет посторонний код на функции, которая этого не предполагает.

Имена констант PHP можно использовать для удалённого выполнения команд.

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

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

«Разработчики ПО могут непредумышленно внедрить код в приложение, который затем будет использован не так, как предполагали сами авторы приложения. Некоторые варианты его поведения могут представлять серьёзный риск для безопасности приложений, даже если их разработка велась в полном соответствии с нормами безопасности», - заявил Арнабольди.

С ним согласен Олег Галушкин, эксперт по информационной безопасности компании SEC Consult Services.

«Несомненно, если строить крепкий дом на бракованном фундаменте, то он долго не простоит, - заметил эксперт. - Любая система будет надёжной ровно настолько, насколько надёжен самый слабый её компонент. Даже если этот компонент лежит в самом основании».