Как проводить 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() - создает внешний процесс

━━━━━━━━━━ Итог ━━━━━━━━━━

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

Для тех, кому это будет трудно с первого раза, я дам небольшие подсказки в комментариях к посту.

#AppSec #IT #CyberSecurity

Как проводить Code Review для безопасника | Сетка — социальная сеть от hh.ru Как проводить Code Review для безопасника | Сетка — социальная сеть от hh.ru
Как проводить Code Review для безопасника | Сетка — социальная сеть от hh.ru Как проводить Code Review для безопасника | Сетка — социальная сеть от hh.ru Как проводить Code Review для безопасника | Сетка — социальная сеть от hh.ru