Код-ревью Junior Secure SDLC, сканеры и пентест обновлено

Ревью: что найдёт SAST в Python-коде

Вопрос

Найдите места, которые типичный SAST отметит как опасные, и объясните почему.

import pickle, subprocess, yaml, hashlib, tempfile

def load_profile(blob):
    return pickle.loads(blob)

def load_config(text):
    return yaml.load(text, Loader=yaml.Loader)

def calc(expr):
    return eval(expr)

def checksum(data):
    return hashlib.md5(data).hexdigest()

def run(cmd):
    return subprocess.check_output(cmd, shell=True)

def tmp():
    return open(tempfile.mktemp(), "w")

Коротко

Это классический набор правил Bandit и Semgrep для Python. Часть находок зависит от контекста (MD5 для кеша не уязвимость), поэтому важно уметь объяснить, когда это реальный риск.

Что должен найти ревьюер

  1. Безопасностьстрока 4
    pickle.loads недоверенных данных выполняет произвольный код при десериализации.
  2. Безопасностьстрока 7
    yaml.load с полным Loader создаёт произвольные объекты Python. Нужен yaml.safe_load.
  3. Безопасностьстрока 10
    eval пользовательского выражения: выполнение кода. Для арифметики нужен отдельный разборщик.
  4. Безопасностьстрока 13
    MD5 непригоден для задач безопасности (подписи, пароли). Для контрольной суммы без угрозы подмены допустим, но лучше SHA-256.
  5. Безопасностьстрока 16
    shell=True со строкой: инъекция команд, если cmd содержит ввод.
  6. Безопасностьстрока 19
    tempfile.mktemp небезопасен: гонка между выбором имени и созданием файла. Нужен NamedTemporaryFile или mkstemp.

Разбор

Это классический набор правил Bandit и Semgrep для Python. Часть находок зависит от контекста (MD5 для кеша не уязвимость), поэтому важно уметь объяснить, когда это реальный риск.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.