Документация/Для учащихся/Режим практики

Режим практики

Режим практики представляет задания по ревью кода, где Вы выявляете уязвимый код и выбираете правильное исправление. Доступно по 200+ темам, охватывающим OWASP Top 10 (Web), OWASP API Top 10, OWASP Mobile Top 10 и OWASP Client-Side Top 10 — на нескольких языках.

Как это работает

Каждое задание следует двухфазной системе, созданной для проверки Ваших навыков как обнаружения уязвимостей, так и их устранения:

Фаза 1 — Найдите уязвимость

Прочитайте фрагмент кода и определите, какой блок содержит уязвимость безопасности. Нажмите на правильный блок среди нескольких подсвеченных вариантов, чтобы перейти дальше.

Фаза 2 — Выберите исправление

Как только Вы выявили уязвимость, выберите правильное исправление из нескольких вариантов. Каждый вариант выглядит правдоподобно, но только один действительно решает проблему безопасности.

Начисление баллов: Каждое задание стоит до 200 XP — 100 XP за каждую фазу за правильный ответ с первой попытки. Повторные попытки и использование подсказок уменьшают балл за фазу (см. «Баллы и XP» ниже).

Интерфейс задания

Вот как выглядит типичное задание по ревью кода:

app.securecodinghub.com/topic/sql-injection/challenge/0
1
Найти уязвимость
2
Выбрать исправление
3
Завершено
0XP
Высокий риск

SQL Injection в поиске пользователя

backend / python / web

Сценарий

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

PYTHONviews.py
12def get_user(request):
13 user_id = request.GET['id']
14 query = "SELECT * FROM users WHERE id=" + user_id
15 cursor.execute(query)
16 return JsonResponse(cursor.fetchone())
Подсвеченные блоки — это кандидаты — выберите уязвимый.

Выбор языка

У каждой темы есть задания на нескольких языках программирования. Ваши настройки стека определяют, какой язык показывается по умолчанию — бэкенд-разработчики видят задания на Python, Java или Go, а фронтенд-разработчики видят задания на React, Vue или Angular.

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

JavaScript
TypeScript
Python
Java
C#
PHP
Go
React
Vue
Angular
Swift
Kotlin

Использование подсказок

У каждой фазы есть своя кнопка подсказки. Использование подсказки делит вдвое балл, который Вы получаете за эту фазу, с минимумом в 10 XP — поэтому чистая первая попытка фазы стоимостью 100 XP становится 50 XP, если Вы использовали подсказку, а вторая попытка фазы стоимостью 60 XP становится 30 XP. Подсказки предоставляют точечное руководство, не выдавая ответ — они указывают Вам правильное направление, всё ещё требуя критического мышления.

Подсказки опциональны. Они особенно полезны, когда Вы впервые встречаетесь с незнакомым типом уязвимости.

Баллы и XP

Каждая фаза оценивается независимо. Правильный ответ с первой попытки приносит полный XP фазы; повторные неверные попытки и использование подсказок оба уменьшают его.

Результат фазыБез подсказкиС подсказкой
Правильно с 1-й попытки100 XP50 XP
Правильно со 2-й попытки60 XP30 XP
Правильно с 3-й попытки или позже30 XP15 XP
Максимум за задание (обе фазы с первой попытки, без подсказок)200 XP

Снижение от подсказки — это сокращение на 50% с минимумом в 10 XP, поэтому даже фаза с 3-й попытки с подсказкой всё равно приносит как минимум 10 XP. Две фазы работают независимо — подсказка или неверная попытка в Фазе 1 не влияет на Фазу 2.

Что происходит при неверном ответе

Первая неверная попытка в любой фазе предлагает Вам попробовать снова на том же коде. После второй неверной попытки в Фазе 1 появляется короткий сюжетный диалог, объясняющий реальные последствия уязвимости, которую Вы пропустили, прежде чем дать Вам попробовать снова. Лимита попыток нет — Вы можете продолжать пробовать, но каждая дополнительная попытка после третьей ограничивает фазу 30 XP.

Завершение задания

После завершения обеих фаз Вы видите разбивку баллов:

app.securecodinghub.com/topic/sql-injection/challenge/0
Задание завершено
+200 XP
Фаза 1 — Найти уязвимость100 / 100
Фаза 2 — Выбрать исправление100 / 100
Следующие шаги: Изучите Режим обучения для интерактивных прохождений сценариев атак или сразу переходите к практике с панели управления.

Чтение процесса от Фазы 1 к Фазе 2

Двухфазная структура существует, потому что обнаружение уязвимостей и их устранение — это разные навыки. Фаза 1 тренирует Ваш глаз: дана полная функция или метод — какая строка опасная. Вас не просят писать код; Вас просят читать его так, как читал бы рецензент. Уязвимая строка редко является самой синтаксически интересной. Обычно это тихая строка, делающая что-то, что разработчик написал бы не задумываясь, например, конкатенирующая параметр запроса в строку, которая позже будет распарсена.

Фаза 2 тренирует Ваше суждение. Как только Вы знаете, где проблема, платформа показывает Вам несколько правдоподобных исправлений. Большинство из них компилируются, работают и выглядят разумно. Только одно полностью закрывает уязвимость. Некоторые варианты исправляют очевидный симптом, оставляя нижележащий примитив нетронутым. Некоторые варианты пере-корректируют и ломают функцию. Цель Фазы 2 — заставить Вас рассуждать о том, почему исправление работает, а не просто выглядит ли оно безопаснее оригинала. Воспринимайте неверные ответы как учебное пособие: каждый из них — это реальная ошибка, которую реальные разработчики делают в реальных pull request'ах.

Почему угадывание разрушает кривую обучения

Система подсказок делит XP за фазу пополам (с минимумом 10 XP), что звучит как штраф, но структурировано как сделка. Сделка — это значимое руководство в обмен на более низкий балл. Угадывание без подсказки стоит Вам того же XP и ничему не учит, потому что петля обратной связи слишком грубая, чтобы учиться. Если Вы обнаруживаете, что читаете фрагмент менее тридцати секунд перед нажатием, Вы почти наверняка угадываете. Замедлитесь, прочитайте фрагмент дважды, гипотезируйте, где находится граница доверия, затем нажимайте.

Правильный ритм для нового класса уязвимостей — читать внимательно, использовать подсказку, когда Вы застряли, и принимать снижение балла как цену обучения. После трёх-четырёх заданий в одном классе Вы перестаёте нуждаться в подсказке. После десяти Вы начинаете видеть тот же шаблон в собственном коде. Эту кривую невозможно сжать угадыванием. Для более глубокого контекста цепочек атак за этими фрагментами попробуйте соответствующий сценарий Обучения в Режим обучения.