Как находить уязвимости в коде
Перейти к содержимому

Как находить уязвимости в коде

  • автор:

Уязвимости в исходном коде и способы их устранения

42% разработчиков раз в месяц публикуют уязвимый исходный код, и только треть уязвимостей устраняется — исследование Tromzo. Программисты выполняют первостепенные задачи и обрабатывают большой объем информации, поэтому могут пропустить детали, влияющие на безопасность кода.

Поговорим о том, какие уязвимости в коде есть, и как их найти.

Это блог ИТ-компании Цифровые Привычки

Мы реализуем финтех-проекты для бизнеса с 2014 года. Создаем веб-сервисы и нативные приложения, ускоряем цифровизацию компаний.

����‍�� Вступайте, чтобы быть в курсе вакансий.

�� Подписывайтесь и узнайте о нас больше.

Почему возникают уязвимости

Уязвимости в исходном коде — это слабые места или ошибки, которые могут быть использованы злоумышленниками для атаки на ПО. Они наносят ущерб как отдельному продукту, так и всей инфраструктуре: нарушают технологические процессы и работу клиентских систем, позволяют украсть личные данные и денежные средства. «Тинькофф», например, запустил публичную программу по поиску ошибок и уязвимостей в своих сервисах за вознаграждение до 400.000 ₽.

В идеальном мире разработчик с первых строк написания кода заботится о безопасности продукта, а специалисты по информационной безопасности помогают улучшить программу. Но писать сразу чистый код, когда каждый день поступают ТЗ, — тяжело, а количество новых уязвимостей ежегодно увеличивается: в 2020 году — более 18.000, в 2021 году — свыше 20.000, а в 2022 году — 25.000 (данные National Vulnerability Database).

Причины возникновения уязвимостей в коде:

  1. Недостаточная обработка пользовательского ввода
    Отсутствие фильтров и неправильная проверка команд допускают внедрение вредоносного кода и SQL-инъекций.
  2. Уязвимости в сторонних библиотеках
    Отбор и обновление библиотек с помощью последних исправлений безопасности необходимы, чтобы слабые места в исходном коде не появлялись.
  3. Отсутствие проверок аутентификации
    Игнорирование проверок авторизации приводит к несанкционированному доступу к системе, где хакеры выполняют привилегированные операции без разрешений.
  4. Слабые точки в безопасности
    Использование стандартных паролей, хранение паролей в открытом виде, не безопасная передача данных и отсутствие шифрования данных — все это уязвимости.
  5. Уязвимости, связанные с памятью
    Переполнение буфера или использование нулевого указателя приводят к сбою продукта или возможности выполнения удаленного кода.
  6. Недостаточная обработка исключений и ошибок
    Ошибки, не обрабатывающиеся должным образом, открывают доступ злоумышленникам к информации о системе. Исключения используются для осуществления атак.
  7. Отсутствие экранирования входных данных
    Без валидации злоумышленник внедряет вредоносный код, который будет исполняться при обработке пользовательского ввода.

Примеры уязвимостей

Согласно отчету Veracode 2022 распространенными уязвимостями являются: Information leakage (утечка информации) — 65,9%; CRLF Injection (CRLF инъекция) — 65,4%; Cryptographic issues (криптографические проблемы) — 63,7%.

Код безопасности: как находить уязвимости в веб-приложениях

image

Мини-обзор решений и подходов для повышения безопасности на всех этапах разработки приложений.

  • Этапы разработки
  • Классы решений для безопасности разработки
  • Инструмент статического анализа. 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 является важным этапом разработки безопасных приложений. Следуя описанным методам и обращая внимание на общие уязвимости, вы можете укрепить безопасность вашего программного обеспечения и защитить его от потенциальных атак.
Было бы круто, если бы каждый, кто ознакомился с представленными методами, мог добавить еще что-то от себя, чтобы вместе мы могли намного лучше защитить наш софт от различного рода атак и возможных уязвимостей

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *