Режим практики
Режим практики представляет задания по ревью кода, где Вы выявляете уязвимый код и выбираете правильное исправление. Доступно по 200+ темам, охватывающим OWASP Top 10 (Web), OWASP API Top 10, OWASP Mobile Top 10 и OWASP Client-Side Top 10 — на нескольких языках.
Как это работает
Каждое задание следует двухфазной системе, созданной для проверки Ваших навыков как обнаружения уязвимостей, так и их устранения:
Фаза 1 — Найдите уязвимость
Прочитайте фрагмент кода и определите, какой блок содержит уязвимость безопасности. Нажмите на правильный блок среди нескольких подсвеченных вариантов, чтобы перейти дальше.
Фаза 2 — Выберите исправление
Как только Вы выявили уязвимость, выберите правильное исправление из нескольких вариантов. Каждый вариант выглядит правдоподобно, но только один действительно решает проблему безопасности.
Интерфейс задания
Вот как выглядит типичное задание по ревью кода:
SQL Injection в поиске пользователя
backend / python / web
Эндпоинт деталей пользователя принимает id из строки запроса и использует его для получения соответствующей строки. Один из блоков-кандидатов ниже доверяет этому значению, чего делать не должен.
Выбор языка
У каждой темы есть задания на нескольких языках программирования. Ваши настройки стека определяют, какой язык показывается по умолчанию — бэкенд-разработчики видят задания на Python, Java или Go, а фронтенд-разработчики видят задания на React, Vue или Angular.
Вы можете переключать языки в любое время через селектор языка. Ваши настройки сохраняются, поэтому Вы всегда видите задания в Вашем предпочитаемом стеке в первую очередь.
Использование подсказок
У каждой фазы есть своя кнопка подсказки. Использование подсказки делит вдвое балл, который Вы получаете за эту фазу, с минимумом в 10 XP — поэтому чистая первая попытка фазы стоимостью 100 XP становится 50 XP, если Вы использовали подсказку, а вторая попытка фазы стоимостью 60 XP становится 30 XP. Подсказки предоставляют точечное руководство, не выдавая ответ — они указывают Вам правильное направление, всё ещё требуя критического мышления.
Подсказки опциональны. Они особенно полезны, когда Вы впервые встречаетесь с незнакомым типом уязвимости.
Баллы и XP
Каждая фаза оценивается независимо. Правильный ответ с первой попытки приносит полный XP фазы; повторные неверные попытки и использование подсказок оба уменьшают его.
| Результат фазы | Без подсказки | С подсказкой |
|---|---|---|
| Правильно с 1-й попытки | 100 XP | 50 XP |
| Правильно со 2-й попытки | 60 XP | 30 XP |
| Правильно с 3-й попытки или позже | 30 XP | 15 XP |
| Максимум за задание (обе фазы с первой попытки, без подсказок) | 200 XP | |
Снижение от подсказки — это сокращение на 50% с минимумом в 10 XP, поэтому даже фаза с 3-й попытки с подсказкой всё равно приносит как минимум 10 XP. Две фазы работают независимо — подсказка или неверная попытка в Фазе 1 не влияет на Фазу 2.
Что происходит при неверном ответе
Первая неверная попытка в любой фазе предлагает Вам попробовать снова на том же коде. После второй неверной попытки в Фазе 1 появляется короткий сюжетный диалог, объясняющий реальные последствия уязвимости, которую Вы пропустили, прежде чем дать Вам попробовать снова. Лимита попыток нет — Вы можете продолжать пробовать, но каждая дополнительная попытка после третьей ограничивает фазу 30 XP.
Завершение задания
После завершения обеих фаз Вы видите разбивку баллов:
Чтение процесса от Фазы 1 к Фазе 2
Двухфазная структура существует, потому что обнаружение уязвимостей и их устранение — это разные навыки. Фаза 1 тренирует Ваш глаз: дана полная функция или метод — какая строка опасная. Вас не просят писать код; Вас просят читать его так, как читал бы рецензент. Уязвимая строка редко является самой синтаксически интересной. Обычно это тихая строка, делающая что-то, что разработчик написал бы не задумываясь, например, конкатенирующая параметр запроса в строку, которая позже будет распарсена.
Фаза 2 тренирует Ваше суждение. Как только Вы знаете, где проблема, платформа показывает Вам несколько правдоподобных исправлений. Большинство из них компилируются, работают и выглядят разумно. Только одно полностью закрывает уязвимость. Некоторые варианты исправляют очевидный симптом, оставляя нижележащий примитив нетронутым. Некоторые варианты пере-корректируют и ломают функцию. Цель Фазы 2 — заставить Вас рассуждать о том, почему исправление работает, а не просто выглядит ли оно безопаснее оригинала. Воспринимайте неверные ответы как учебное пособие: каждый из них — это реальная ошибка, которую реальные разработчики делают в реальных pull request'ах.
Почему угадывание разрушает кривую обучения
Система подсказок делит XP за фазу пополам (с минимумом 10 XP), что звучит как штраф, но структурировано как сделка. Сделка — это значимое руководство в обмен на более низкий балл. Угадывание без подсказки стоит Вам того же XP и ничему не учит, потому что петля обратной связи слишком грубая, чтобы учиться. Если Вы обнаруживаете, что читаете фрагмент менее тридцати секунд перед нажатием, Вы почти наверняка угадываете. Замедлитесь, прочитайте фрагмент дважды, гипотезируйте, где находится граница доверия, затем нажимайте.
Правильный ритм для нового класса уязвимостей — читать внимательно, использовать подсказку, когда Вы застряли, и принимать снижение балла как цену обучения. После трёх-четырёх заданий в одном классе Вы перестаёте нуждаться в подсказке. После десяти Вы начинаете видеть тот же шаблон в собственном коде. Эту кривую невозможно сжать угадыванием. Для более глубокого контекста цепочек атак за этими фрагментами попробуйте соответствующий сценарий Обучения в Режим обучения.