Код-ревью 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 для кеша не уязвимость), поэтому важно уметь объяснить, когда это реальный риск.
Что должен найти ревьюер
- Безопасностьстрока 4
pickle.loadsнедоверенных данных выполняет произвольный код при десериализации. - Безопасностьстрока 7
yaml.loadс полным Loader создаёт произвольные объекты Python. Нуженyaml.safe_load. - Безопасностьстрока 10
evalпользовательского выражения: выполнение кода. Для арифметики нужен отдельный разборщик. - Безопасностьстрока 13MD5 непригоден для задач безопасности (подписи, пароли). Для контрольной суммы без угрозы подмены допустим, но лучше SHA-256.
- Безопасностьстрока 16
shell=Trueсо строкой: инъекция команд, еслиcmdсодержит ввод. - Безопасностьстрока 19
tempfile.mktempнебезопасен: гонка между выбором имени и созданием файла. НуженNamedTemporaryFileилиmkstemp.
Разбор
Это классический набор правил Bandit и Semgrep для Python. Часть находок зависит от контекста (MD5 для кеша не уязвимость), поэтому важно уметь объяснить, когда это реальный риск.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.