Перейти к основному содержимому

Оценка компетенций разработчиков по безопасности

12 мин чтения·Для руководителя разработки и лидера безопасности
Цикл из четырёх частей

Это цикл об обучении разработчиков безопасности:

  1. Программа и ресурсы — что требовать
  2. Оценка и отслеживание (этот раздел) — как проверять
  3. Руководство по внедрению — как запустить программу
  4. Культура и коммуникация — как закрепить результат

Улучшить можно только то, что измеряешь. Прежде чем запускать обучение, нужно понять стартовую точку. После обучения — убедиться, что оно сработало. Без регулярной оценки навыки деградируют, а вложения в обучение не дают измеримого результата.

Этот раздел — для руководителя и лидера безопасности. Здесь методы оценки знаний разработчиков, инструменты для построения карт компетенций и способы показать динамику.

Зачем измерять компетенции

Выявить пробелы до обучения. Обучение «обо всём» тратит время на темы, которые команда и так знает. Оценка показывает, что нужно именно вашей команде.

Убедиться, что обучение работает. Сравнение результатов до и после даёт ответ: вложение оправдано или нет.

Отслеживать деградацию. Знания без практики затухают. Регулярная оценка выявляет это раньше, чем проблема даст о себе знать в коде.

Обосновывать инвестиции. Руководству нужны конкретные метрики. Оценка компетенций — основа для отчёта по эффективности программы.

Мотивировать разработчиков. Чёткие уровни компетенций дают понятные цели. Видимый прогресс — стимул к развитию.

Методы оценки

Метод 1: тест на знание теории

Самый простой способ. Вопросы с выбором ответа и короткими ответами по ключевым темам.

Принципы составления теста:

ПринципПочему важен
Релевантность ролиНе тестируйте backend-разработчиков по iOS-специфике
Прогрессия сложностиУ1 (базовый) → У2 (средний) → У3 (продвинутый)
Практический фокусВопросы с кодом лучше вопросов на определения
Нет ловушекТест на знание, а не на внимательность
Объяснение ответовРазбор ошибок — часть обучения

Структура теста:

  • Длительность: 45–60 минут
  • Формат: онлайн, доверительный режим (без строгого контроля)

Разделы:

  1. Основные концепции безопасности — 10 вопросов (все роли)
  2. OWASP Top 10 — 10 вопросов (все роли)
  3. Язык/стек — 10 вопросов (по роли)
  4. Аутентификация и авторизация — 5 вопросов (backend/fullstack)
  5. Тестирование безопасности — 5 вопросов (все роли)

Шкала оценки:

  • 90%+ → У3 (Эксперт)
  • 70–89% → У2 (Практикующий)
  • 50–69% → У1 (Осведомлённый)
  • Менее 50% → Обязательное обучение

Инструменты для проведения тестов:

  • Яндекс Формы (forms.yandex.ru) — бесплатно, интеграция с корпоративными сервисами
  • Яндекс Тестирование — для более продвинутого сценария с автоматической проверкой
  • Собственная LMS — если в компании уже используется платформа дистанционного обучения
  • CTFd (self-hosted) — геймифицированный формат с задачами

Метод 2: упражнение по code review

Более практичный подход — давать разработчикам фрагменты кода с намеренными уязвимостями и просить найти проблемы.

Как проводить:

  1. Подготовьте 5–10 фрагментов кода с уязвимостями (попросите лидера безопасности)
  2. Установите время (30–45 минут)
  3. Попросите разработчика найти и объяснить проблемы
  4. Оценивайте по количеству найденных уязвимостей и качеству объяснений

Это упражнение значительно ближе к реальной работе, чем теоретический тест. Разработчик, умеющий распознать уязвимость в чужом коде, скорее всего не напишет её сам.

Типичные уязвимости для включения в упражнение (пример набора для Python):

  • Жёстко заданный секретный ключ в коде
  • SQL-запрос через конкатенацию строк вместо параметризованного
  • XSS через вывод пользовательского ввода без экранирования
  • Обход пути (path traversal) при работе с файлами
  • Инъекция в шаблон (SSTI)
  • Небезопасная десериализация
  • Инъекция в системную команду
  • Включение режима отладки в продуктивной среде

Оценка: за каждую уязвимость — 1 балл, за правильное объяснение эффекта — ещё 1, за предложение корректного исправления — ещё 1. Максимум зависит от числа уязвимостей в упражнении.

Метод 3: CTF (Capture The Flag)

Геймифицированная оценка, при которой разработчики эксплуатируют уязвимости в контролируемой среде и находят «флаги» — секретные строки, подтверждающие выполнение задания.

Почему это работает:

  • Вовлекательно и интересно
  • Тестирует практические навыки, а не память
  • Поощряет обучение через исследование
  • Командный формат развивает сотрудничество

Как провести внутренний CTF:

Длительность: 2–4 часа или распределить на несколько дней.

Подготовка: развернуть OWASP Juice Shop (open-source, намеренно уязвимое приложение) или подготовить кастомные задания через CTFd (open-source платформа для CTF). Сформировать команды по 2–3 человека, перемешивая уровни опыта. Подготовить подсказки для застрявших команд.

Задания по уровням:

  • Простые (1 звезда): базовый XSS, robots.txt, типичные страницы ошибок
  • Средние (2–3 звезды): SQL-инъекция, обход авторизации
  • Сложные (4–5 звёзд): небезопасная десериализация, SSRF

После мероприятия: разбор решений по всем заданиям, признание лучших команд, индивидуальные заметки по участию для карты компетенций.

Метод 4: инъекция уязвимостей в код

Наиболее реалистичный метод. лидер безопасности намеренно добавляет уязвимости в тестовую ветку репозитория и просит разработчика провести code review.

Как организовать:

  1. Создать ветку с намеренными уязвимостями (подготавливает лидер безопасности)
  2. Попросить разработчика провести review этого PR
  3. Зафиксировать, какие уязвимости найдены, а какие пропущены
  4. Дать обратную связь по пропущенным проблемам

Это упражнение максимально близко к реальной рабочей ситуации и выявляет пробелы, которые теоретический тест не покажет.

Создание вопросов для тестов

Использование ИИ для генерации вопросов

Попросите лидера безопасности использовать языковую модель для создания вопросов. Шаблон запроса:

Создай 5 вопросов с выбором ответа по теме [ТЕМА] для разработчиков,
работающих со стеком [ТЕХНОЛОГИИ].

Требования:
— Включи примеры кода, где возможно
— Варьируй сложность (2 × У1, 2 × У2, 1 × У3)
— Сосредоточься на [КОНКРЕТНАЯ ОБЛАСТЬ: SQL-инъекции, аутентификация]
— Укажи правильный ответ и объяснение
— Неправильные варианты должны быть правдоподобными, но явно ошибочными

Примеры вопросов по темам

SQL-инъекции (backend)

Вопрос 1 (У1): Какой из этих вариантов кода уязвим к SQL-инъекции?

  • А) Параметризованный запрос через placeholder
  • Б) Запрос с подстановкой пользовательского ввода через форматирование строки
  • В) Использование ORM (например, Django или SQLAlchemy)

Правильный ответ: Б. Подстановка пользовательских данных напрямую в строку запроса открывает путь к SQL-инъекции. Параметризованные запросы и ORM отделяют данные от структуры запроса.


Вопрос 2 (У2): Разработчик добавил проверку: если значение состоит только из цифр, передаёт его в raw SQL. Защищает ли это от SQL-инъекции?

  • А) Нет — проверка цифр устраняет инъекцию, но паттерн остаётся опасным
  • Б) Да — числа не могут содержать SQL-конструкции
  • В) Зависит от базы данных

Правильный ответ: А (с нюансом). Проверка исключает инъекцию в данном конкретном случае, но паттерн — raw() или аналог с форматированием строк — хрупкий и легко нарушается при рефакторинге. Всегда лучше использовать параметризованные запросы.


Вопрос 3 (У3): В коде используются параметризованные запросы для значений. Защищает ли это от SQL-инъекции при подстановке имени таблицы из пользовательского запроса?

  • А) Да — параметризация защищает все вводимые данные
  • Б) Нет — имя таблицы является идентификатором, а не значением, и не защищается параметризацией
  • В) Зависит от драйвера базы данных

Правильный ответ: Б. Параметризация работает для значений, но не для идентификаторов (имён таблиц, столбцов). При необходимости динамических имён таблиц — используйте белый список допустимых значений.


XSS (frontend/backend)

Вопрос 1 (У1): Что такое XSS?

  • А) Cross-Site Scripting — инъекция вредоносного скрипта в страницу, которую видят другие пользователи
  • Б) Атака через межсерверный запрос
  • В) Перехват трафика между клиентом и сервером

Правильный ответ: А.


Вопрос 2 (У2): В React при использовании JSX {userInput} — уязвимо ли это к XSS?

  • А) Нет — React автоматически экранирует содержимое JSX
  • Б) Да — JavaScript в строке исполнится
  • В) Зависит от версии React

Правильный ответ: А. React экранирует содержимое по умолчанию в JSX-выражениях. Исключение — явное использование dangerouslySetInnerHTML, которое отключает эту защиту.


Аутентификация (все роли)

Вопрос 1 (У1): Где безопаснее всего хранить JWT-токен в браузере?

  • А) localStorage
  • Б) sessionStorage
  • В) HttpOnly cookie
  • Г) В URL-параметре

Правильный ответ: В. HttpOnly cookie недоступны через JavaScript, что защищает токен от кражи при XSS-атаке. localStorage и sessionStorage доступны скриптам. URL-параметры логируются и кешируются.


Вопрос 2 (У2): Почему использование MD5 для хранения паролей — ошибка?

  • А) MD5 слишком медленный алгоритм
  • Б) MD5 имеет известные коллизии и слишком быстр для перебора; соль не используется автоматически
  • В) MD5 устарел, но безопасен при добавлении соли
  • Г) Нет ничего принципиально неправильного

Правильный ответ: Б. MD5 очень быстр — это делает его непригодным для паролей (перебор возможен с огромной скоростью). Для паролей нужны специально замедленные функции: bcrypt, Argon2, scrypt.


Авторизация (backend)

Вопрос 1 (У1): Что такое IDOR?

  • А) Insecure Direct Object Reference — возможность получить доступ к чужим данным, угадав или изменив идентификатор в запросе
  • Б) Internal Data Object Routing — внутренний паттерн API
  • В) Тип атаки на инфраструктуру

Правильный ответ: А.


Вопрос 2 (У2): Эндпоинт возвращает профиль пользователя по его ID. Что в нём пропущено?

GET /api/users/{user_id}/profile
  • А) Валидация формата user_id
  • Б) Проверка авторизации — убедиться, что запрашивающий вправе видеть эти данные
  • В) Rate limiting
  • Г) Требование HTTPS

Правильный ответ: Б. Любой аутентифицированный пользователь может подобрать чужой user_id и получить доступ к чужим данным. Нужна явная проверка: «текущий пользователь — владелец этих данных или администратор».

Построение карт компетенций

Карты компетенций помогают руководителю видеть состояние команды целиком и принимать решения об обучении.

Индивидуальная карта

Разработчик: Алексей Сидоров | Роль: Senior Developer | Уровень: У2

ОбластьРезультатСтатус
Безопасное кодирование80%
Аутентификация90%
Валидация ввода100%
Криптография40%⚠ Пробел
Моделирование угроз50%
Тестирование безопасности70%
Управление зависимостями80%
Реагирование на инциденты40%⚠ Пробел

Рекомендации: курс по криптографии, участие в учебных учениях по инцидентам.

Тепловая карта команды

СотрудникБезопасный кодАутентификацияВвод данныхКриптографияУгрозыТестированиеЗависимости
Алексей С.✓✓✓✓✓✓✓✓✓✓
Мария К.✓✓✓✓✓✓✓✓✓✓
Дмитрий Л.✓✓
Ольга П.✓✓✓✓✓✓✓✓✓✓✓✓✓✓
Игорь В.
Среднее80%75%90%45% ПРОБЕЛ40% ПРОБЕЛ60%70%

✓✓ = Сильный (70%+) · ✓ = Развивается (40–70%) · ✗ = Пробел (менее 40%)

Такая карта сразу показывает: приоритет для ближайшего обучения — криптография и моделирование угроз.

Отслеживание динамики

Отслеживание динамики

Оценка Q1:

ОбластьРезультатЦельСтатус
Безопасное кодирование80%80%Достигнуто
Аутентификация75%80%В процессе
Криптография45%60%Пробел
Моделирование угроз40%60%Пробел
Тестирование безопасности60%70%В процессе

Запланированные действия:

  • Модуль по аутентификации — завершён
  • Воркшоп по моделированию угроз — запланирован на следующий квартал
  • Курс по криптографии для команды — запланирован

Цели Q2: криптография — выше 60% · моделирование угроз — выше 60% · все разработчики проходят промежуточную оценку

Инструменты для ведения карт

ПодходПодходит дляУсилия
Таблица (Excel/Яндекс Таблицы)Команды до 10 человекНизкие
Вики/ConfluenceКомпании с развитой документациейНизкие
LMS-платформаКомпании с автоматизированным обучениемСредние
Собственная панель метрикСпецифические требованияВысокие

Шаблон таблицы для отслеживания:

РазработчикРольOWASP Top 10АутентификацияКриптографияТестированиеМоделирование угрозДата оценки
Алексей С.Senior4/55/52/53/53/515.01.2025
Мария К.Middle3/53/54/52/54/515.01.2025

Анализ «до и после» — шаблон отчёта

Отчёт о влиянии обучения: Q2

Показатели тестов до и после обучения:

ОбластьДо обученияПосле обученияПрирост
Предотвращение SQL-инъекций65%88%+23%
Аутентификация70%85%+15%
Валидация ввода60%82%+22%

Реальное влияние за тот же период:

МетрикаQ1Q2Изменение
Находки SAST14589−39%
Уязвимости в продуктиве125−58%
Среднее время исправления (дни)84−50%

Обучение демонстрирует измеримый возврат инвестиций. Рекомендуется продолжить квартальные оценки и сосредоточить следующий цикл обучения на текущих пробелах.

Метрики для руководителя

МетрикаСпособ измеритьЧто считать результатом
Средний балл оценкиРезультаты тестовРост каждый квартал
Плотность уязвимостейНаходки SAST на 1000 строк кодаСнижение со временем
Время на исправлениеДанные из трекера задачСнижение для задач по безопасности
Уязвимости в продуктивеДанные из трекера инцидентовМеньше с каждым релизом
Результативность code reviewКомментарии по безопасности в PRРост числа выявленных проблем до попадания в продукт
Завершение обученияLMS или таблица100% по обязательным модулям

Типичные ошибки при оценке

  1. Тест только на теорию. Включайте практические упражнения — только так можно проверить реальные навыки.
  2. Единый тест для всех. Настраивайте под роль и стек технологий.
  3. Однократная оценка. Навыки деградируют без практики. Регулярность обязательна.
  4. Наказание за низкий балл. Это подавляет честность. Низкий результат — информация для руководителя, а не повод для взыскания.
  5. Оценка без действия. Карта компетенций, которую никто не использует для планирования обучения, — потраченное время.
  6. Слишком долго. 45–60 минут — максимум для теста. Больше — усталость и снижение качества ответов.
Управленческий чек-лист

Контрольные точки для руководителя:

  • Базовая оценка проведена до начала обучения
  • Результаты зафиксированы в карте компетенций (таблица или LMS)
  • Определены приоритетные пробелы для первого цикла обучения
  • Намечен срок повторной оценки (через 8–12 недель после обучения)
  • Метрики SAST и уязвимостей в продуктиве отслеживаются для подтверждения ROI
  • Индивидуальные рекомендации по обучению сформированы для каждого разработчика

Вопросы для контроля (задайте лидеру безопасности):

  • Все ли разработчики прошли базовую оценку?
  • Составлена ли карта пробелов на уровне команды?
  • Есть ли индивидуальные учебные планы?
  • Когда запланирована следующая оценка?

Что дальше

Следующий раздел — руководство по внедрению: пошаговый план запуска программы, работа с сопротивлением и построение устойчивой культуры безопасной разработки.