Pull to refresh

У Интернета могут быть серьёзные проблемы из-за языков, подобных C и C++, которые способствуют появлению уязвимостей

Reading time 4 min
Views 20K
Привет, Хабр! Представляю вашему вниманию перевод статьи "Internet aurait de sérieux problèmes à cause de langages comme C et C++ favorisant la survenue de failles" (фр. язык).

Но мало кого из разработчиков это волнует


Один баг затрагивает iPhone, другой – Windows, а третий – сервера, работающие на Linux. На первый взгляд эти баги не имеют ничего общего, так как касаются разных платформ: Android, iOS, macOS, Windows, Linux. Однако, на самом деле, всё иначе, по мнению Алекса Гейнора, инженера по безопасности программного обеспечения в Mozilla, ранее работавшего в USDS (United States Digital Service).

[1]
Подробнее — https://www.usds.gov, здесь и далее прим. переводчика.

Во время третьего «Weakest Link», ежегодного мероприятия, организованного Motherboard Vice,

[2]
Подробнее — https://motherboard.vice.com/en_us

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

Гейнор объяснил, что три ранее упомянутые ошибки существуют, потому что программное обеспечение, которое они затрагивают на разных платформах, было написано с помощью языков программирования, имеющих неприятную тенденцию способствовать возникновению ошибок типа «memory unsafety», разрешая доступ к невыделенным областям памяти.

[3]
Скорее всего, имелось в виду, что обращение к 6 элементу массива, состоящего из 5 элементов, допустимо, хотя в других языках программирования, более «безопасных», как минимум будет выведено сообщение об ошибке.

Эта категория ошибок может привести к багам и уязвимостям безопасности во время получения доступа к памяти.

Давая возможность для возникновения ошибок типа «memory unsafety», языки программирования, такие как C и C++, могут способствовать распространению почти бесконечного потока критических уязвимостей безопасности на протяжении многих лет. В качестве примера этих уязвимостей можно привести:

  • несоответствие типов
  • переполнение буфера
  • переполнение целочисленных переменных
  • уязвимость «use after free»

Несоответствие типов может возникать, когда участок кода не проверяет тип передаваемого ему объекта и использует его вслепую. Такая ситуация может оказаться опасной. Кроме того, вместе с несоответствием типов неправильные указатели на функции или неправильные данные связаны с неправильной частью кода, что в некоторых случаях может привести к его выполнению.

Переполнение буфера (или «buffer overflow» на английском языке) является критической уязвимостью безопасности, которая возникает, когда пользователь вводит строку, которая будет находиться в массиве символов недостаточного размера. Это приводит к записи данных вне области памяти, выделенной для массива. HeartBleed, например, оказавший влияние на 17% защищенных серверов в интернете, был уязвимостью переполнения буфера, позволяющей считывать 60 КБ после конца списка, включая пароли и другие пользовательские данные.

Переполнение целочисленных переменных — трудно обнаружимая уязвимость, которая использует тот факт, что числа не могут превышать определенное значение, которое зависит от количества бит, используемых для их представления, и метода кодирования.

Уязвимость «use after free» обычно возникает в случае использования указателя или данных в памяти, когда указатель (или блок памяти) уже освобожден.

Вместе эти уязвимости представляют собой эксплойты, наиболее часто встречающиеся в популярном программном обеспечении, к примеру, Firefox, Chrome, Windows, Android или iOS. Гейнор уже насчитал по крайней мере 400 и утверждает: «Я следил за безопасностью этих проектов более года, и почти во всех версиях этих продуктов более половины уязвимостей — это «memory unsafety». И еще более тревожно то, что тяжелые и критические уязвимости [...] почти всегда имеют этот тип».

Несмотря на значительные риски, связанные с безопасностью программного обеспечения, которое они поддерживают, языки программирования «memory unsafety friendly», такие как C или C++, всё ещё используются разработчиками, в то время как проверенные альтернативы, такие как Rust, Swift, которые можно рассматривать как языки «memory safe», редки.

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

Кроме того, большинство программных проектов, даже самых важных для безопасности Интернета, не являются новыми. Они были запущены десять лет назад, если не больше. Linux, OpenSSL и веб-серверу Apache, например, более двадцати лет. Для масштабных проектов, подобных этим, переписывание всего кода на новом языке не вариант. Они должны быть преобразованы постепенно, что значит, что проекты должны быть написаны и сохранены на двух разных языках вместо одного. Это также предполагает необходимость формирования большой команды, которое занимает много времени и требует больше средств.

Самая большая проблема, наконец, связана с тем, что многие разработчики вообще не верят, что проблема существует. Они считают, что проблема не в том, что такие языки, как C или C++, способствуют возникновению уязвимостей, а в других программистах, которые пишут код с ошибками. Они считают, что проблемы с этими якобы «memory unsafety friendly» языками нет, потому что никакой код не идеален, просто люди не умеют ими пользоваться.

А что Вы думаете по этому поводу?



Отмечу, что здравая критика перевода также приветствуется.

Спасибо за внимание!
Tags:
Hubs:
+7
Comments 470
Comments Comments 470

Articles