Мы знаем, что Stack Overflow — это ежедневная часть жизни многих разработчиков (Результат опроса разработчиков на Stack Overflow 2020). Я слышал от многих людей, что они бывают тут ежедневно (если не чаще), чтобы получить ответы на свои вопросы. Иногда ответ на вопрос о коде приходит в виде фрагмента кода. И также этот код превращается в рабочее приложение, потому что он отлично подходит.
Группа исследователей проанализировала эти фрагменты кода, чтобы выяснить, насколько они безопасны, и остались ли в проекте уязвимыми недостатки в системе безопасности, которые они внедрили. Ашкан Сами, доцент Ширасского университета, Футсе Хом, доцент Монреальского политехнического института, и Джас Уддин, сейчас старший специалист по работе с данными Банка Канады, исследовали фрагменты кода на языке C++ в Stack Overflow, чтобы ответить на этот вопрос. (Примечание редактора: ранее мы беседовали с Футсе Хомом и Джасом Уддином об их работе по сбору мнений из вопросов и комментариев Stack Overflow).
Эти исследователи занимались этим вопросом (как разработчики используют Stack Overflow) параллельно, к моменту их встречи на конференции в Швеции в 2018 году. Футсе Хом изучал код Stack Overflow на предмет лицензирования, что заставило Ашкана Сами — эксперта по безопасности задуматься, нет ли в программе недостатков, которые могли бы привести к неблагоприятным последствиям тех, кто копирует код, а не только нарушениям авторских прав.
Копирование кода само по себе не всегда плохо. Повторное использование кода может повысить эффективность разработки программного обеспечения; зачем решать проблему, которая уже хорошо решена? Но когда разработчики используют пример кода, не пытаясь понять его значение, тогда могут возникнуть проблемы.«Действительно ли их волнует тщательная проверка на наличие уязвимостей, или они все просто используют код с полки», — спросил Хом. «И если они это делают, делают ли это везде?»
Процесс исследования
Ашкан Сами и компания не были первыми исследователями, которые изучали уязвимости в коде, размещенном на Stack Overflow. Просматривая существующую литературу, они обнаружили, что не было работ, посвященных коду Stack Overflow для четвертого по популярности языка — C++. «Мы хотели сконцентрироваться на C++, чтобы лучше узнать, как изменяются уязвимости и произошел ли на самом деле перенос уязвимости из Stack Overflow в GitHub», — сказал Сами.
Они загрузили набор данных SOTorrent, который содержит историю Stack Overflow за десять лет. Первый автоматизированный проход нашел 120 000 частей текста, помеченных как фрагменты кода. С помощью процессов дедупликации и ручной проверки они сократили набор до 2560 уникальных фрагментов кода. Теперь началась тяжелая работа.
Трое из исследователей рассмотрели каждый из этих фрагментов, пытаясь найти уязвимые места в нескольких циклах проверки. После каждого цикла им приходилось объяснять, почему каждый уязвимый фрагмент является уязвимым вместе со всей исследовательской группой. «Это была огромная работа», — сказал Сами. «Но найденные ими слабые места были на самом деле уязвимостями». После нескольких циклов проверки, они свелись к 69 слабым местам, про которые можно с некоторой долей уверенности утверждать, что они уязвимы".
Эти 69 уязвимых фрагментов кода попали в одну из 29 категорий, системы классификации потенциальных и подтвержденных уязвимостей (CWE). Несмотря на то, что 69 кажется небольшим количеством, они обнаружили, что эти уязвимые фрагменты мигрировали в более чем 2800 проектов. Мы говорим не о школьных проектах, это настоящие проекты, которыми сейчас пользуются. Код продукта — в общедоступном репозитории Github.
Перед публикацией результатов они связались со всеми владельцами репозиториев и сообщили им о недочетах в их коде. Несколько человек ответили и исправили проблемы, но было много безответных или спокойно снятых с рассмотрения проблем. И там может быть больше. «Уязвимости, которые мы на самом деле выявляем, я думаю, что это всего лишь часть того, что в действительности происходит вокруг, — сказал Хом.
Копирование без понимания
Многие из проблем, которые обнаружила наша команда, были связаны с ошибками в системе безопасности. Но это не значит, что они не были распространены. Одним из наиболее распространенных недостатков является отсутствие проверки возвращаемых значений. Когда вы не проверяете возвращаемое значение на С++, вы рискуете потерять ссылку на ужасный нулевой указатель. Эта ошибка сразу же приводит к ошибке сегментации и прерывает процесс.
От этой ошибки довольно легко защититься; убедитесь, что возвращаемое значение равно !NULL. Но тот факт, что это было так распространено, указывает на большую проблему. „Если вы одолжили вещи и не понимаете содержания того, что вы одолжили, — сказал Хом, — то вы попадаете в эту ловушку повторного использования кода, в котором есть потенциальные уязвимости. Значит, ты просто разбрасываешь эти вещи вокруг“. Если ты собираешься использовать код повторно, тебе нужно понять этот код.
Эти уязвимости могут сделать программное обеспечение открытым для злоумышленников. Еще одним популярным недостатком была проверка входных данных. Подобно ошибке проверки возврата, этот недостаток возникает, когда функции обрабатывают входные данные, не убедившись, что это что-то ожидаемое. В некоторых случаях это может привести к ошибке Stack Overflow — связанной с вашим именем — и, возможно, к тому, что программа будет выполнять вход как случайный код. „Даже в прошлом году, — говорит Уддин, — были некоторые хакерские действия, которые были нацелены на уязвимость Stack Overflow в базах кода“. И это привело к несанкционированному доступу к миллионам пользовательских данных».
И Сами, и Хом — профессора, поэтому они сталкиваются со студенческой работой, которая постоянно использует код. При правильном описании и понимании того, что на самом деле делает код, скопированный код может на самом деле помочь студенту в обучении. Чаще всего, впрочем, код копируется без понимания того, как он работает. Лучший метод — это сделать всё самому. «В идеале они должны создать своё решение и получить максимальную оценку», — сказал Хом. «Потом они изучают концепцию и могут действительно что-то из нее построить».
Но если необходимо использовать скопированный код, то знание и должная осмотрительность являются обязательными. «Они должны отдать должное тому, у кого они его взяли», — сказал Сами. «Также они должны проверить, нормально ли этот компонент интегрируется с другим компонентом. Например, проблема, которая случилась на Ариане 5 и взорвала весь космический корабль, была связана с тем, что у них была такая же сложность с целочисленными переменными (Космическая ошибка: $370 000 000 за Integer overflow). 64-битное число было записано в 16-битный адрес. Они повторно использовали код из предыдущей миссии, не проверив, что он также работает в новой системе.
Что Stack может сделать с этим
Исследования дали понять, что это не единственная проблема, связанная со Stack Overflow; любой сайт, предоставляющий фрагменты кода в качестве примера, столкнется с этим. В рамках своих исследований они создали расширение браузера, которое будет определять уязвимый код.
Но есть и другие вещи, которые сообщество может сделать, чтобы помочь. В первую очередь необходимо понимать, что фрагменты кода, размещенные в качестве примеров, не являются кодом, готовым к работе. Не копируйте это в проект, не разобравшись в коде и не протестировав его. Расширением помогает распознать фрагменты, которые исследователи отметили как рискованные и база рискованных фрагментов все время пополняется.
Они также предлагают задействовать экспертов по вопросам безопасности в рамках сообщества. „Теперь сообщество разработчиков Stack Overflow действует как единое целое, и это впечатляет“, — сказал Уддин. „Они прекрасно взаимодействуют друг с другом. Если мы попытаемся мотивировать экспертов по безопасности для повышения осведомленности и просвещения сообщества пользователей, мы не только сделаем код более безопасным, но и предоставим больше информации пользователям, которые будут использовать код.“
Потому что, в конце концов, эти люди тоже занимаются обучением. Они считают, что Stack Overflow может помочь в обучении людей, задающих любопытные вопросы о безопасности, а также о методах программирования. Как сказал профессор Сами: „Не только предоставлять ответы, но и предоставлять информацию о том, является код безопасным или нет.“
Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя онлайн-курсы SkillFactory:
- Курс „Профессия Data Scientist“ (24 месяца)
- Курс „Профессия Data Analyst“ (18 месяцев)
- Курс „Python для веб-разработки“ (9 месяцев)
Читать еще
ссылка на оригинал статьи https://habr.com/ru/company/skillfactory/blog/504378/
Добавить комментарий