Уязвимости в исходном коде и способы их устранения
42% разработчиков раз в месяц публикуют уязвимый исходный код, и только треть уязвимостей устраняется — исследование Tromzo. Программисты выполняют первостепенные задачи и обрабатывают большой объем информации, поэтому могут пропустить детали, влияющие на безопасность кода.
Поговорим о том, какие уязвимости в коде есть, и как их найти.
Это блог ИТ-компании Цифровые Привычки
Мы реализуем финтех-проекты для бизнеса с 2014 года. Создаем веб-сервисы и нативные приложения, ускоряем цифровизацию компаний.
Вступайте, чтобы быть в курсе вакансий.
Подписывайтесь и узнайте о нас больше.
Почему возникают уязвимости
Уязвимости в исходном коде — это слабые места или ошибки, которые могут быть использованы злоумышленниками для атаки на ПО. Они наносят ущерб как отдельному продукту, так и всей инфраструктуре: нарушают технологические процессы и работу клиентских систем, позволяют украсть личные данные и денежные средства. «Тинькофф», например, запустил публичную программу по поиску ошибок и уязвимостей в своих сервисах за вознаграждение до 400.000 ₽.
В идеальном мире разработчик с первых строк написания кода заботится о безопасности продукта, а специалисты по информационной безопасности помогают улучшить программу. Но писать сразу чистый код, когда каждый день поступают ТЗ, — тяжело, а количество новых уязвимостей ежегодно увеличивается: в 2020 году — более 18.000, в 2021 году — свыше 20.000, а в 2022 году — 25.000 (данные National Vulnerability Database).
Причины возникновения уязвимостей в коде:
- Недостаточная обработка пользовательского ввода
Отсутствие фильтров и неправильная проверка команд допускают внедрение вредоносного кода и SQL-инъекций. - Уязвимости в сторонних библиотеках
Отбор и обновление библиотек с помощью последних исправлений безопасности необходимы, чтобы слабые места в исходном коде не появлялись. - Отсутствие проверок аутентификации
Игнорирование проверок авторизации приводит к несанкционированному доступу к системе, где хакеры выполняют привилегированные операции без разрешений. - Слабые точки в безопасности
Использование стандартных паролей, хранение паролей в открытом виде, не безопасная передача данных и отсутствие шифрования данных — все это уязвимости. - Уязвимости, связанные с памятью
Переполнение буфера или использование нулевого указателя приводят к сбою продукта или возможности выполнения удаленного кода. - Недостаточная обработка исключений и ошибок
Ошибки, не обрабатывающиеся должным образом, открывают доступ злоумышленникам к информации о системе. Исключения используются для осуществления атак. - Отсутствие экранирования входных данных
Без валидации злоумышленник внедряет вредоносный код, который будет исполняться при обработке пользовательского ввода.
Примеры уязвимостей
Согласно отчету Veracode 2022 распространенными уязвимостями являются: Information leakage (утечка информации) — 65,9%; CRLF Injection (CRLF инъекция) — 65,4%; Cryptographic issues (криптографические проблемы) — 63,7%.
Код безопасности: как находить уязвимости в веб-приложениях

Мини-обзор решений и подходов для повышения безопасности на всех этапах разработки приложений.
- Этапы разработки
- Классы решений для безопасности разработки
- Инструмент статического анализа. PT Application Inspector.
- [Демо] Функциональный разбор инструмента
- Секция вопросов и ответов
2 ноября, также с 11:00 до 12:00 (Мск) встречаемся на втором (заключительном) вебинаре о безопасной разработке.
В программе:
- Инструменты динамического анализа. PT BlackBox.
- Инструменты защиты образов приложения и контейнерных сред
- [Демо] Функциональный разбор инструмента
- Секция вопросов и ответов
Вебинары содержат информацию, полезную руководителям службы информационной безопасности, руководителям подразделений разработки, техническим тим-лидам ИТ-проектов.
Реклама, ООО «Телеком Интеграция», ИНН 7731642944
Как находить уязвимости в коде на PHP?
Сегодня я наткнулся на вот этот пост Intigriti в Twitter:
«Мы только что написали потрясающий фрагмент кода, но… Наша команда разработки утверждает, что он небезопасен. Помогите нам найти уязвимости в коде!».
Введение
Это фрагмент кода PHP, который в хакерской среде считается очень популярным языком, имеющим довольно много проблем! Одна из таких важных проблем — манипуляции с типами. Кто-то называет это частью функционала PHP, другие видят в этих манипуляциях множество багов (но видение этой проблемы зависит от того, в каком ракурсе ее рассматривать).
Все дело в том, что в PHP при сравнении двух значений с помощью оператора == и выполнении «свободных» сравнений результаты бывают довольно неожиданными из-за того, что в языке отсутствует строгая типизация. То есть здесь нет понятия строки и целых чисел: типы в PHP определяются динамически на основе содержащегося в переменной значения. А выполняемые над ними операции чреваты преобразованиями типов.
В этой таблице проиллюстрировано то, что я имел в виду под свободными сравнениями, приводящими к неожиданным результатам:
То есть 1 дает true .
И то же самое –1 :
И тут самое время задуматься: «А как убедиться в том, что сравнения точны?».
Для этого в PHP есть оператор === , с помощью которого сравнения проводятся так, как ожидалось.
В следующей таблице только записи, находящиеся на одной-единственной диагонали, дают true . Другие, не находящиеся на этой диагонали, дают false , свидетельствуя о том, что сравниваемые значения отличаются. И поэтому строгое их сравнение дает false .
Но достаточно теории. Посмотрим теперь, насколько уязвим был код, выложенный в Twitter!
Проблемы
Взглянем на код и обсудим потенциальные проблемы:
Итак, какие уязвимости есть у этого кода?
Манипуляции с типами? Верно!
Использование хеша md5 ? Нет… Это проблема, но она не подразумевает никакой уязвимости.
Итак, манипуляции с типами и уязвимость. Имеется ли возможность ею воспользоваться и распечатать ветку недостижимого кода без взлома хеша md5 ?
Решение
Чтобы пройти проверки и добраться до желаемого оператора печати, нужно передать admin , так как имя пользователя и пароль — все еще недостающая часть.
Так как же обойти эту проверку? Есть какие-нибудь идеи? Манипуляции с типами? Ну конечно же!
Задействуем манипуляции с типами, так как в коде выполняется свободное сравнение с использованием оператора == .
Заметили, что там дальше с правой стороны от оператора? Дальше 0e ?
0e обозначает экспоненциальное представление, которое имеет следующий вид:
0 * (10 , возведенное в степень числа после 0e ) = 0 (ведь любое число, умноженное на ноль, равно нулю).
Поэтому, поработав с хешем md5 и приведя его к значению, также имеющему тип 0e с последующим числом, будем считать его числовым значением (экспоненциальным представлением), равным 0.
Я нашел статью, в которой говорилось о нескольких возможных значениях для пароля, приводящего к нужному нам хешу ( 0e с последующими числами):
Видите, какие значения надо взять? ‘240610708’ и ‘QNKCDZO’ !
Я просто разместил фрагмент кода на сервере, использовав следующую команду:
Затем попробовал оба возможных значения пароля (очевидно, понадобится больше значений из-за коллизий в MD5):
Логи сервера должны выглядеть так:
Заключение
PHP — это совершенно фантастический язык программирования для специалиста по анализу защищенности информационных систем. Так много возможностей столкнуться с трудностями нет ни в одном другом языке.
И самыми распространенными проблемами здесь являются манипулирование типами и путаница с порядком аргументов функций.
- Как подключить базу данных MySQL к сайту на PHP
- Ключевое слово static в PHP
- Java убьет ваш стартап. PHP спасёт его
Анализ уязвимостей в коде на Go и Python: Как обнаружить потенциальные риски
Программирование на Go и Python становится все более популярным, и разработчики по всему миру активно используют эти языки для создания приложений и сервисов. Однако, при написании кода нет гарантии отсутствия уязвимостей и слабых мест, которые могут стать точкой входа для злоумышленников. В этой статье мы рассмотрим методы анализа кода на Go и Python с целью выявления потенциальных уязвимостей и узнаем, как можно укрепить безопасность вашего приложения.
Раздел 1: Анализ кода на Go
Go, также известный как Golang, является языком программирования с открытым исходным кодом, разработанным Google. Он известен своей производительностью и эффективностью, но даже в этом мощном языке могут скрываться уязвимости. Для анализа кода на Go с целью обнаружения потенциальных проблем безопасности используются следующие методы:
1.1. Статический анализ кода: Статический анализатор, такой как GoSec или SonarQube, может помочь выявить уязвимости на этапе компиляции. Он ищет типичные паттерны уязвимостей, такие как SQL-инъекции или утечки данных.
1.2. Анализ зависимостей: Go-модули и инструменты, такие как GoReportCard, могут анализировать зависимости проекта и искать обновления с учетом уязвимостей в сторонних библиотеках.
1.3. Тестирование на проникновение: Используйте инструменты для тестирования на проникновение, чтобы выявить слабые места в коде, которые могут быть использованы для атак.
Раздел 2: Анализ кода на Python
Python — это другой популярный язык программирования, который широко используется для веб-разработки, научных вычислений и других приложений. Однако, как и в случае Go, безопасность кода требует внимания. Вот как можно провести анализ кода на Python:
2.1. Использование инструментов статического анализа: Инструменты, такие как PyLint и Flake8, помогают выявить потенциальные ошибки и уязвимости на этапе написания кода.
2.2. Аудит зависимостей: Используйте инструменты, например, pipenv или pip-check, для анализа зависимостей и поиска обновлений с учетом известных уязвимостей.
2.3. Тестирование безопасности: Используйте библиотеки, такие как OWASP ZAP, для тестирования на проникновение и выявления уязвимостей в веб-приложениях.
Раздел 3: Общие методы анализа
Вне зависимости от выбранного языка программирования, существуют общие методы анализа кода на уязвимости:
3.1. Анализ кода на предмет инъекций: Проверьте, нет ли мест, где пользовательский ввод передается напрямую в SQL-запросы или команды операционной системы. Используйте параметризованные запросы и проверку ввода.
3.2. Проверка аутентификации и авторизации: Гарантируйте, что доступ к чувствительным данным контролируется правильно. Избегайте хранения паролей в открытом виде и используйте библиотеки аутентификации.
3.3. Анализ утечек информации: Проверьте, нет ли участков кода, где конфиденциальные данные могут быть утечены. Используйте механизмы шифрования и маскирования данных.
3.4. Сетевая безопасность: Обратите внимание на обработку сетевых запросов и валидацию входных данных. Защитите приложение от атак вроде межсетевых атак и переполнения буфера.
Раздел 4: Примеры кода с уязвимостями (следующие 500 символов):
Для лучшего понимания, давайте рассмотрим примеры кода на Go и Python с потенциальными уязвимостями:
Пример на Go:
Этот код подвержен инъекции команд, так как пользовательский ввод cmd передается напрямую в системный вызов exec.Command.
Пример на Python:
import sqlite3 def get_user_data(user_id): conn = sqlite3.connect(«users.db») cursor = conn.cursor() query = f»SELECT * FROM users WHERE cursor.execute(query) user_data = cursor.fetchone() conn.close() return user_data
Этот код подвержен SQL-инъекции, так как пользовательский ввод user_id вставляется в SQL-запрос без проверки.
В заключение, анализ уязвимостей в коде на Go и Python является важным этапом разработки безопасных приложений. Следуя описанным методам и обращая внимание на общие уязвимости, вы можете укрепить безопасность вашего программного обеспечения и защитить его от потенциальных атак.
Было бы круто, если бы каждый, кто ознакомился с представленными методами, мог добавить еще что-то от себя, чтобы вместе мы могли намного лучше защитить наш софт от различного рода атак и возможных уязвимостей