WhiteSource провела исследование уязвимостей в семи наиболее распространённых языках программирования
Обзор от WhiteSource показал, какие из языков программирования имеют наибольшие дыры в безопасности. Победитель антирейтинга — Си.
Технологии в целом нашпигованы ошибками безопасности. На низком уровне это ошибки в железе. Так это было с уязвимостью Intel и ошибками Spectre. Чуть выше — дыры в безопасности языков программирования. И их ну очень много!
Недавно Open-Source компания WhiteSource, занимающаяся вопросами безопасности, провела исследование уязвимостей в семи наиболее распространённых языках программирования за последние десять лет. Для обнаружения ошибок компания использовала свою базу данных языковой безопасности. Она содержит уязвимости с открытым исходным кодом из нескольких источников, таких как Национальная База данных Уязвимостей (NVD), инструкции по безопасности, трекеры GitHub`a и проектов с открытым исходным кодом.
Компания выделила следующие языки: C, Java, JavaScript, Python, Ruby, PHP и C++. И это не удивительно. Как и то, какой язык имеет наибольшее число ошибок безопасности. С большим отрывом это Си. Более 50% обнаруженных уязвимостей были в нём.
Как недавно заметил инженер по безопасности ядра Linux в Google: «Cи — это улучшенный ассемблер. Почти машинный код.» Кроме того, «Cи несёт вызывающий беспокойство багаж, неопределённое поведение и другие слабые стороны, которые ведут к пробелам в безопасности и уязвимостям инфраструктуры.»
Однако, в WhiteSource утверждают, что «нельзя говорить, что Си менее безопасен, чем другие языки. Большое число уязвимостей в открытом исходном коде Си может объясняться рядом факторов. Для начала, Си использовался дольше, чем другие языки, которые мы исследовали. Он имеет наибольший объём написанного кода. Это также один из языков, который стоит за такими важными инфраструктурами как OpenSSL и ядро Linux. Такая комбинация объёма и центрального положения объясняет большое число известных уязвимостей в open-source.»
В WhiteSource уловили суть. Но, несмотря на десятилетия программирования и борьбы с Си, в этом языке действительно есть способы слишком легко сделать ужасные ошибки безопасности. Например, в Си есть большое количество примеров неопределённого поведения, что отрывает возможности для всех видов неприятностей.
C++ при этом «прославился» уязвимостями наиболее высокой степени опасности за последние пять лет. Ошибки буфера, которые долгое время терзали Си, зачастую обнаруживаются и в C++.
При этом JavaScript, возможно, наиболее популярный язык. И единственный, который показал «непрерывное увеличение количества уязвимостей за последние 10 лет».
WhiteSource подчёркивает, что прежде чем насмехаться над JavaScript, следует учесть, что эти результаты обманчивы. Большую часть из Общего Перечня Уязвимостей (Common Weakness Enumeration) в JavaScript составляют выходы за пределы назначенного каталога и дыры в криптозащите пакетов JavaScript, которые едва используются и поддерживаются.
Почему тогда эти и другие языковые проблемы на виду? Новые автоматизированные программы, такие как Source Code Analysis Tools, обнаруживают уязвимости, которые в ином случае проглядели бы.
Единственный язык, который хорошо показал себя в отношении дыр безопасности это (барабанная дробь!) — Python.
Почти все языки вносят свой вклад в Общий Перечень Уязвимостей. Две ошибки из перечня лидировали и были представлены в 70% случаев: Межсайтовый скриптинг (XSS), также известный как CWE-79 и Недостаточная проверка входных данных (CWE-20).
Другие часто встречающиеся ошибки: Утечка / раскрытие информации (CWE-200), Выход за пределы назначенного каталога (CWE-22) и CWE-264 — Разрешения, привилегии и средства управления доступом. Последнее с недавних пор вытесняется своим более конкретным и близким родственником — Неправильным контролем доступа (CWE-284).
Но действительно ли Си наихудший, а Python наилучший? В WhiteSource считают, что это слишком простой вывод: «Хотя игра «Мой язык программирования безопасней, чем твой» — это определённо весёлый способ провести время … ответ по всей видимости не поможет вам создать более инновационный или защищённый софт.»
И напротив, вам следует проводить больше времени «оставаясь на острие знаний уязвимостей с открытым исходным кодом, понимая сильные и слабые стороны того языка программирования, который используете вы и ваша команда.»
В конечном итоге безопасность сводится не к языкам программирования, а к тому, как вы их используете.