Что такое Bandit?

Bandit — это инструмент статического анализа безопасности, специально разработанный для Python кода. Он сканирует Python проекты на предмет общих проблем безопасности и предоставляет детальные отчеты о найденных уязвимостях.

Основные возможности Bandit

  • Специализация на Python — глубокий анализ специфичных для Python уязвимостей
  • Готовые правила — набор правил для типичных проблем безопасности
  • Гибкая конфигурация — настройка правил и исключений
  • Различные форматы отчетов — JSON, XML, CSV, HTML
  • CI/CD интеграция — легкая интеграция в pipeline
  • Плагинная архитектура — возможность создания собственных правил

Установка Bandit

Установка через pip:

1pip install bandit
2# или
3poetry add --group dev bandit
4
5# Установка с дополнительными форматами отчетов
6pip install bandit[toml]

Базовое использование

Сканирование 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:

1[bandit]
2exclude_dirs = tests,migrations,venv
3tests = B201,B301
4skips = B101,B601
5
6[bandit.assert_used]
7skips = ['*_test.py', '*test_*.py']

Конфигурация через pyproject.toml:

1[tool.bandit]
2exclude_dirs = ["tests", "migrations", "venv"]
3tests = ["B201", "B301"]
4skips = ["B101", "B601"]
5
6[tool.bandit.assert_used]
7skips = ['*_test.py', '*test_*.py']

Примеры уязвимостей, которые находит Bandit

Небезопасное использование eval():

 1# Плохо - B307: eval usage
 2user_input = input("Введите выражение: ")
 3result = eval(user_input)  # Уязвимость!
 4
 5# Хорошо - использование ast.literal_eval
 6import ast
 7try:
 8    result = ast.literal_eval(user_input)
 9except (ValueError, SyntaxError):
10    print("Некорректное выражение")

Небезопасные временные файлы:

1# Плохо - B108: hardcoded_tmp_directory
2import tempfile
3temp_file = "/tmp/myapp.tmp"  # Уязвимость!
4
5# Хорошо - использование tempfile
6import tempfile
7with tempfile.NamedTemporaryFile(delete=False) as temp_file:
8    temp_file.write(b"data")

Небезопасные HTTP запросы:

1# Плохо - B501: request_with_no_cert_validation
2import requests
3requests.get("https://api.example.com", verify=False)  # Уязвимость!
4
5# Хорошо - проверка сертификата
6import requests
7requests.get("https://api.example.com", verify=True)

Интеграция с pre-commit

Добавление в .pre-commit-config.yaml:

1repos:
2  - repo: https://github.com/PyCQA/bandit
3    rev: '1.7.5'
4    hooks:
5      - id: bandit
6        args: ['-c', 'pyproject.toml']
7        additional_dependencies: ['bandit[toml]']

Интеграция с 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 и другие веб-уязвимости.