Как проводить Code Review для безопасника
Всем привет. В этом посте я хотел бы раскрыть такую тему, как ручной Code Review для безопасников.
Тема эта в разы шире, чем один пост на 4096 символов, поэтому я постараюсь вложить сюда максимум самого ценного из того, что знаю сам, и прикрепить пару изображений с примерами.
━━━━━━━━━━ Вводная часть ━━━━━━━━━━
Code Review сильно отличается в зависимости от того, какой стек технологий использует команда разработки от языка программирования до фраемворков и библиотек поменьше.
В этом посте я буду разбирать: PHP, Python, Go, TypeScript, Kotlin. Покажу, какие методы и конструкции особенно интересны при ревью, а также приведу примеры уязвимостей в коде на этих языках программирования.
━━━━━━━━━━ PHP ━━━━━━━━━━
➤ eval() - выполняет PHP-код из строк
➤ system() - запускает системную команду и сразу выводит результат
➤ exec() - запускает команду и возвращает вывод в массив или строку
➤ shell_exec() - выполняет shell-команду и возвращает вывод строкой
➤ passthru() - выполняет команду и отдает сырой бинарный вывод
➤ fopen() - открывает файл по указанному пути
➤ file_get_contents() - читает файл или URL
➤ unserialize() - опасная десериализация объектов
➤ и это лишь малая часть интересных методов, на которые стоит смотреть
━━━━━━━━━━ Python ━━━━━━━━━━
➤ eval() - выполняет Python-выражение из строк
➤ exec() - выполняет произвольный Python-код из строки
➤ os.system() - запускает shell-команду через системную оболочку
➤ subprocess.run(…, shell=True) - запускает команду через shell
➤ os.path.join() - просто склеивает части пути
➤ open() - открывает файл по пути, который может быть частично или полностью контролируем пользователем
➤ requests.get() - делает исходящий HTTP-запрос
━━━━━━━━━━ Go ━━━━━━━━━━
➤ exec.Command() - запускает внешнюю программ
➤ os.Open() - открывает файл по пути
➤ filepath.Join() - объединяет путь, но не ограничивает его базовой директорией
➤ fmt.Fprintf(w, …) - ручная вставка HTML без escaping
━━━━━━━━━━ TypeScript ━━━━━━━━━━
➤ eval() - выполняет JavaScript-код из строк
➤ child_process.exec() - запускает команду через shell
➤ innerHTML - небезопасная вставка HTML в DOM
➤ dns.lookup() - используется для преобразования имени хоста в IP-адрес
━━━━━━━━━━ Kotlin ━━━━━━━━━━
➤ File(…) - работает с файлами и директориями по пут
➤ Files.readString(…) - читает файл по пути
➤ Runtime.getRuntime().exec() - запускает внешнюю команду
➤ ProcessBuilder() - создает внешний процесс
━━━━━━━━━━ Итог ━━━━━━━━━━
При столь ограниченном количестве символов невозможно перечислить все важные методы в каждом языке программирования, но я постарался показать самое критичное. Также я подготовил примеры для каждого языка, в которых специально заложены уязвимости, и их можно попробовать выявить самостоятельно
Для тех, кому это будет трудно с первого раза, я дам небольшие подсказки в комментариях к посту.
· 15.04
В предоставленных мною примерах есть такие уязвимости как:
ответить
коммент удалён