Что такое Bandit?
Bandit — это инструмент статического анализа безопасности, специально разработанный для Python кода. Он сканирует Python проекты на предмет общих проблем безопасности и предоставляет детальные отчеты о найденных уязвимостях.
Основные возможности Bandit
- Специализация на Python — глубокий анализ специфичных для Python уязвимостей
- Готовые правила — набор правил для типичных проблем безопасности
- Гибкая конфигурация — настройка правил и исключений
- Различные форматы отчетов — JSON, XML, CSV, HTML
- CI/CD интеграция — легкая интеграция в pipeline
- Плагинная архитектура — возможность создания собственных правил
Установка Bandit
Установка через pip:
Базовое использование
Сканирование Python проекта:
1# Сканирование текущей директории
2bandit -r .
3
4# Сканирование конкретного файла
5bandit example.py
6
7# Сканирование с выводом в JSON
8bandit -r . -f json -o bandit-report.json
9
10# Сканирование с указанием уровня confidence
11bandit -r . -i -l
12
13# Исключение определенных тестов
14bandit -r . -s B101,B601
Конфигурация Bandit
Создание файла конфигурации .bandit:
Конфигурация через pyproject.toml:
Примеры уязвимостей, которые находит Bandit
Небезопасное использование eval():
Небезопасные временные файлы:
Небезопасные HTTP запросы:
Интеграция с pre-commit
Добавление в .pre-commit-config.yaml:
Интеграция с CI/CD
Пример для GitHub Actions:
1name: Security Scan
2
3on: [push, pull_request]
4
5jobs:
6 security:
7 runs-on: ubuntu-latest
8
9 steps:
10 - uses: actions/checkout@v3
11
12 - name: Set up Python
13 uses: actions/setup-python@v4
14 with:
15 python-version: '3.11'
16
17 - name: Install dependencies
18 run: |
19 pip install bandit[toml]
20
21 - name: Run Bandit security scan
22 run: |
23 bandit -r . -f json -o bandit-report.json
24 bandit -r . -f txt
25
26 - name: Upload security scan results
27 uses: actions/upload-artifact@v3
28 with:
29 name: bandit-report
30 path: bandit-report.json
31 if: always()
Создание собственных правил
Пример создания плагина для Bandit:
1import bandit
2from bandit.core import test_properties
3
4@test_properties.test_id('B999')
5@test_properties.test_name('custom_security_check')
6def custom_security_check(context):
7 """Проверка на использование небезопасной функции"""
8
9 if context.call_function_name == 'dangerous_function':
10 return bandit.Issue(
11 severity=bandit.HIGH,
12 confidence=bandit.HIGH,
13 text="Использование dangerous_function() может быть небезопасным",
14 lineno=context.node.lineno,
15 )
Применение Bandit
- Code Review — автоматическая проверка безопасности в PR
- CI/CD Pipeline — блокировка деплоя при критических уязвимостях
- Security Audit — регулярный аудит кодовой базы
- Обучение разработчиков — выявление небезопасных паттернов
- Compliance — соответствие стандартам безопасности
Преимущества использования
- Специализация — фокус на Python-специфичных уязвимостях
- Простота использования — минимальная настройка для начала работы
- Быстрота — быстрое сканирование больших проектов
- Интеграция — легкая интеграция в существующие процессы
- Активное развитие — регулярные обновления и новые правила
Основные категории проверок
- Injection flaws — SQL, command, code injection
- Crypto issues — слабые алгоритмы шифрования
- File handling — небезопасная работа с файлами
- Network security — проблемы с SSL/TLS
- Input validation — недостаточная валидация входных данных
FAQ
Может ли Bandit найти все уязвимости в Python коде?
Bandit находит многие типичные уязвимости, но не может заменить полноценный security review. Рекомендуется использовать его вместе с другими инструментами безопасности.
Как обрабатывать ложные срабатывания?
Можно использовать комментарии # nosec или настроить исключения в конфигурационном файле для конкретных правил или файлов.
Поддерживает ли Bandit Django проекты?
Да, Bandit имеет специальные правила для Django, включая проверки на XSS, CSRF и другие веб-уязвимости.