O Bandit percorre a AST do Python procurando construções sabidamente perigosas: subprocess com shell=True, yaml.load sem loader seguro, assert usado para validação, senhas hardcoded.
É o primeiro scan a rodar e o mais barato de manter. A série o usa como linha de base honesta em todo laboratório, inclusive onde ele volta limpo diante de código realmente vulnerável — o Bandit conhece Python, não Django, então uma chamada .raw() do ORM montada com f-string é invisível para ele. É nessa lacuna que as regras próprias do Semgrep começam.