До списку уроків
10 клас · Урок 16 з 16

Крос-аудит red/blue team, виправлення і захист

виконано0%
Крок 1

Спершу правила, і лише потім перша команда

Сьогодні ти перевіряєш чужий продукт і даєш перевірити свій. Це останній урок модуля — і єдиний, де правила читають до техніки, а не після

Сьогоднішня робота зветься крос-аудитом. Кожна група перевіряє не себе, а сусідню. 10A перевіряє продукти 10B, 10B перевіряє 10C, 10C перевіряє 10A. Кільце замкнене, і своєї роботи не перевіряє ніхто.

Ти отримуєш адресу цілі. Списку авторів ти не отримуєш. Хто саме писав цей код, дізнаєшся аж на захисті. Так перевіряти чесніше: нема кого пожаліти і нема кому помститися. Є тільки чек-лист.

Чого навчишся за цей урок

Хід уроку

ЕтапХвЩо робимо
Брифінг red team10Межі: лише ціль зі списку, лише за чеклистом, без псування даних
Крос-аудит30Запускаємо перевірки за 12 картками, збираємо докази в audit-report.json
Обмін звітами10Читаємо чужі знахідки, ставимо уточнювальні питання
Виправлення (blue team)30Лагодимо спершу блокуючі 🔒-пункти, перезапускаємо перевірки
Повторний прогін10audit.sh по всіх продуктах — фіксуємо фінальний стан чеклиста
Захист проєктів20Проблема → рішення → демо → архітектура → «що зламали у себе самі», 3 хв + 2 хв питань
Підсумок модуля10Зведене табло — формулюємо 3 правила, які заберемо із модуля
Разом120
10A свій продукт 91.219.61.4/s/team-a* 10B свій продукт 91.219.61.4/s/team-b* 10C свій продукт 91.219.61.4/s/team-c* перевіряє за 12 пунктами перевіряє перевіряє ціль призначає вчитель · авторів команда не знає до захисту
Кільце крос-аудиту. Кожна група одночасно red team для однієї паралельної групи і blue team для власного продукту.

Правила аудиту — чотири рядки, які підписує кожен

  1. Тільки своя ціль і тільки чек-лист. Адреса — та, що дав учитель. Дії — ті дванадцять, що в списку. Усе інше поза межами дозволу.
  2. Нічого не псувати. Не видаляти, не змінювати чужі дані, не залишати слідів «я тут був». Знайшов дірку — не лізь у неї далі, ніж треба для доказу.
  3. Знайшов — зафіксуй і повідом. Доказ у звіт, звіт команді й учителю. Не в загальний чат, не в сторіс, не сусідові через парту.
  4. Поза уроком це правопорушення. Ті самі дії щодо чужого сайту без дозволу власника підпадають під ст. 361 Кримінального кодексу «Несанкціоноване втручання в роботу інформаційних систем».
Підпис — не формальність Перед першою перевіркою кожен учасник підписує ці чотири правила на паперовому бланку або в файлі audit-rules.md у теці команди. Вихід за межі анулює весь звіт команди — не лише знахідку того, хто вийшов.
Дозвіл — це не «мені сказали, що можна» У дорослому світі різницю між аудитом і атакою робить один документ: письмовий дозвіл власника із зазначеними межами й датами. Сьогодні цей документ — призначення вчителя плюс твій підпис під правилами. Поза школою його ніхто не видасть просто так.
Питання

Твоя ціль — 91.219.61.4/s/team-b3. Перевіряючи її, ти помічаєш, що на сусідній адресі 91.219.61.4/s/team-b4 форма відгуків очевидно вразлива — видно з першого погляду. Що робиш?

Крок 2

Red team і blue team — це одна професія з двох боків

Ламати цікавіше. Лагодити цінніше. Сьогодні ти півтори години робиш і те, і те — і побачиш, що це різні голови

Одні шукають, чим продукт можна зіпсувати. Вони діють як зловмисник, але в дозволених межах і з обов'язком усе записати. Таку сторону називають red team, «червона команда».

Інші приймають знахідки й закривають їх. Вони розставляють, що лагодити першим, лагодять і перевіряють, чи справді полагодилося. Це blue team, «синя команда».

Red team — шукає

достатньо одного пропущеного місця

  • перебирає перевірки списком, а не за натхненням;
  • зупиняється, щойно доказ отримано;
  • пише так, щоб інший це відтворив;
  • оцінює конфігурацію, а не людей.
Blue team — тримає

треба закрити всі місця, і надовго

  • сортує знахідки за серйозністю, а не за образою;
  • лагодить причину, а не конкретний приклад;
  • перезапускає перевірку і показує зелене;
  • записує у FIXES.md, що і коли зроблено.
RED — шукає чек-лист із 12 пунктів доказ: код і фрагмент оцінка серйозності жодних змін у даних знайти й описати продукт команди сайт, бот, дані, права, конфігурація BLUE — тримає приймає звіт без образи пріоритет: спершу 🔒 виправляє причину перезапускає перевірку закрити і довести звіт: check_id · severity · evidence · fix
Один продукт, дві ролі. Звіт — єдиний канал між ними. Чого немає у звіті, того для blue team не існує.

У житті це не дві професії, а одна. Людина, яка вміє знайти вразливість, зазвичай знає й ціну виправлення.

Тому в резюме пишуть не «я вмію ламати», а «інженер з безпеки». І на співбесіді питають не «що ти зламав». Питають інше: як ти це полагодив і чим довів, що полагоджено.

Питання

Команда за 30 хвилин знайшла в цілі одинадцять проблем і дуже цим пишається. Свій продукт після отриманого звіту вона не чіпала: «там дрібниці, полагодимо вдома». Що на це скаже регламент уроку?

Крок 3

Дванадцять перевірок. Рівно ці й у цьому порядку

Чек-лист потрібен не для бюрократії. Він робить аудит повторюваним: дві різні команди перевіряють однаково й порівнянно

Перші три пункти — про те, чи продукт узагалі живий і зрозумілий. Далі йдуть вісім технічних, і серед них усі блокуючі.

Останній, дванадцятий, перевіряє сам звіт. Аудит, який не оформлено, не зараховують: результату, якого ніхто не може прочитати, наче й немає.

чек-лист крос-аудиту · 12 пунктів 01 HTTPS сайт відкривається по https, сертифікат дійсний 02 навігація кожне посилання меню віддає 200, а не 404 03 README що це, як запустити, хто в команді 04 SECURITY.md куди писати про знахідку і за скільки відповідять 05 права 🔒 теки 755, файли 644, жодного o+w 06 секрети 🔒 жодного ключа у ~/www і в історії git 07 .env 🔒 GET /.env → 403 або 404, ~/data поза веб-корінням 08 валідація сервер відкидає порожнє, задовге й неправильне 09 екранування чужий текст виводиться як текст, не як розмітка 10 CSRF форма без токена не приймається 11 ліміт частоти 🔒 серія запитів підряд упирається в 429 12 звіт 🔒 валідний JSON, ≥3 знахідки, ≥2 підтверджені вчителем 🔒 блокуючий критерій: без нього модуль не зараховано
Дванадцятий пункт перевіряє не ціль, а тебе. Чи оформлено знайдене так, щоб інша людина це повторила.
Порядок має сенс Спершу пункти 1—3. Якщо сайт не відкривається, решта перевірок безглузді. Потім 4—7: це те, що видно ззовні, без жодної форми. Потім 8—11 — те, для чого треба надіслати дані. Пункт 12 закриваєш, коли решта вже зроблені.
Питання

Команда починає аудит із пункту 11, ліміту частоти. Вона шле 3000 запитів на форму цілі, «щоб одразу побачити найцікавіше». Сайт після цього перестає відповідати. Решту пунктів перевірити вже неможливо. Що тут порушено насамперед?

Крок 4

Як пишеться знахідка: чотири речення, не одне

«У вас усе погано» — це не знахідка. Знахідка — це те, що чужа команда може відтворити, зрозуміти й полагодити без тебе

Формат тут один і той самий: і в школі, і в дорослих звітах. Полів чотири, і кожне відповідає на своє питання.

ПолеПитанняПриклад
check_idякий пункт чек-листа env_hidden
evidenceщо знайшов і як відтворити GET /.env → 200, у тілі рядок DB_PASS=…; команда: curl -sS http://91.219.61.4/s/team-b3/.env | head -3
impactчим це загрожує пароль до бази доступний будь-кому в інтернеті без входу
fixяк полагодити винести .env вище за ~/www, додати правило заборони для файлів, що починаються з крапки, змінити пароль
Доказ — це код відповіді плюс фрагмент виводу Не «я бачив». Не «воно якось відкривалося». У звіті має бути рядок, який інша людина скопіює й отримає той самий результат. Знахідку без поля evidence не зараховують — так прямо записано в критеріях.
шлях однієї знахідки 1 · виявлено перевірка почервоніла 2 · доказ код відповіді і фрагмент 3 · у звіті severity і fix 4 · передано команді і вчителю 5 · виправлено причина, не приклад 6 · зелено перевірку перезапущено вікно ризику: дірка відкрита весь цей час час до виправлення — те, що міряє табло кроки 1—3 робить red team, кроки 5—6 — blue team, крок 4 — обидві
Знахідка живе не в чиїйсь голові, а в цьому ланцюжку. Розрив на будь-якій ланці означає одне: дірка лишилася відкритою.
Тон: пиши про систему, не про людей «Ви не вмієте писати код» — це про людей. «Форма /feedback.php приймає поле name довжиною 10 000 символів» — про систему. Друге можна полагодити. На перше можна тільки образитися.
Питання

У звіті написано: «форма відгуків небезпечна, перевірте її». Команда-адресат прочитала й нічого не зробила. Чия це проблема і що саме бракує в цьому реченні?

Крок 5

Не всі знахідки однакові

Відсутній SECURITY.md і відкритий .env із паролем до бази — це не «дві знахідки». Це різні всесвіти

Щоб оцінити знахідку, дай відповідь на два питання. Перше: що отримає зловмисник, якщо скористається цією дірою. Друге: наскільки легко йому це зробити.

Відповіді складають у одне слово — серйозність знахідки. Ми беремо просту шкалу з п'яти рівнів. Саме за нею ти вибиратимеш серйозність в арені.

шкала серйозності · що отримує зловмисник критична висока середня низька інформаційна повний доступ до даних або до акаунта дія від імені іншого або чужі дані частково псування даних, спам, зупинка сервісу незручність або підказка для атаки нічого не дає, але варто виправити приклад із нашого чек-листа .env з паролем віддається по HTTP форма без CSRF, збережений XSS немає ліміту частоти немає SECURITY.md у README немає розділу «запуск» коли лагодити сьогодні, першим сьогодні до кінця уроку у списку задач коли буде час
Шкала спрощена навмисно. Дорослі команди рахують те саме формулою CVSS. Порядок пріоритетів у них виходить такий самий.

Правило черговості на сьогодні просте. Спершу всі блокуючі 🔒, потім критичні й високі, а вже потім решта. Команда, яка почала з дрібниць і не встигла закрити .env, модуль не закриє.

Завищувати серйозність — теж помилка Якщо кожна знахідка у звіті «критична», звіт перестає працювати. Команда просто не бачить, за що хапатися першим. На захисті завищена оцінка ловиться одним питанням: «що саме отримає зловмисник?»
Питання

У цілі дві знахідки. Перша: у коді сторінки лежить робочий API-ключ платного сервісу. Друга: на сайті немає файлу SECURITY.md. Команда за дві хвилини виправила другу і звітує про прогрес. Як це оцінити?

Крок 6

Арена крос-аудиту: 12 перевірок проти навчальної цілі

Тренувальна ціль 91.219.61.4/s/team-b3 — вигадана й навмисно дірява. Тут ти проходиш увесь шлях знахідки, перш ніж торкнутися справжньої адреси

Кожна картка — один пункт чек-листа. Кнопка «запустити» показує, що повернула б така перевірка: код відповіді й фрагмент виводу.

Далі шлях знахідки. Червону додаєш у звіт одним кліком. Обираєш серйозність за шкалою з кроку 5. Учитель підтверджує доказ, команда лагодить, а ти перезапускаєш перевірку. Табло рахує все це саме.

Ціль: 91.219.61.4/s/team-b3 · аудитор: твоя команда

0подано
0підтверджено
0виправлено
час до виправлення

Табло оновлюється саме. «Час до виправлення» — середній по виправлених знахідках, від моменту подання у звіт.

чек-лист проти цілі
звіт крос-аудиту

    Жодної знахідки ще не подано. Запусти перевірки вище.

    Це симуляція: сторінка не робить жодного мережевого запиту. Коди відповідей і фрагменти виводу — заздалегідь записані приклади того, що видає справжня перевірка. На реальній цілі ті самі кроки ти виконуєш у терміналі й вставляєш вивід у evidence власноруч.

    Порядок, у якому лагодять Табло показує «час до виправлення» середнім по всіх знахідках. Але оцінюють насамперед час закриття блокуючих і критичних. Тому спершу лагодять .env, секрети, права й ліміт частоти. І лише потім беруться за SECURITY.md.
    Питання

    Перевірка «секрети» повернула рядок із живим ключем платного сервісу. Команда прибрала ключ із файлу, залила виправлену сторінку, перевірка позеленіла. Чого вона ще не зробила — і чому це найважливіше?

    Крок 7

    Тренажер формулювань: що саме ти напишеш команді

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

    Нижче три ситуації з арени. До кожної є чотири варіанти повідомлення команді-власнику. Обери той, який ти справді надіслав би. Після відповіді буде розбір усіх чотирьох.

    Три знахідки — чотири способи про них сказати

    Правило одного рядка Перед надсиланням прочитай своє повідомлення так, ніби воно про тебе. Якщо після нього хочеться виправдовуватись, а не лагодити — переписуй.
    Питання

    Ти знайшов у цілі збережений XSS і хочеш переконатися, що команда поставиться серйозно. Який доказ у повідомленні працює найкраще?

    Крок 8

    Відповідальне розкриття і чому час дорожчий за кількість

    Знайти діру — половина справи. Друга половина — розповісти про неї так, щоб її встигли закрити раніше, ніж нею скористаються

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

    Друга половина домовленості — на власнику. Він за цей час лагодить. І не переслідує того, хто повідомив, а дякує йому.

    1. знайшов — зупинився, зафіксував доказ, нічого не змінив;
    2. написав власнику каналом із SECURITY.md (у нас — команді й учителю);
    3. дав узгоджений час на виправлення;
    4. перевірив, що полагоджено;
    5. тільки після цього — публічно, і без даних, які досі шкодять.

    Саме для цього в чек-листі є пункт SECURITY.md. Без цього файлу людина, яка знайшла у вас діру, не знає, куди писати. І напише або в загальний чат, або нікуди.

    ХтоСкільки часу дає до публікації
    Google Project Zero 90 днів + 14 днів на встановлення оновлення
    CERT/CC (Carnegie Mellon) 45 днів від повідомлення
    Стандарт ISO/IEC 29147 строк не фіксує — вимагає домовленості й каналу зв'язку
    Наш урок 30 хвилин етапу виправлення
    Питання

    Ти знайшов у цілі відкритий .env із паролем. До кінця етапу аудиту лишилося 20 хвилин, команда-власник сидить за сусідньою партою. Який порядок дій відповідає правилам розкриття?

    Чому оцінюють швидкість, а не кількість

    Вразливість небезпечна рівно стільки часу, скільки вона відкрита. Двадцять дірок, які лежать невиправленими тиждень, гірші за одну, закриту за годину. Вікно ризику міряють не кількістю, а часом.

    Тому дорослі команди рахують не «скільки багів знайшли». Вони рахують час від повідомлення до виправлення. Це число видно на табло арени окремою колонкою. Воно й показує найчесніше, чи вміє команда тримати свій продукт.

    Кількість теж має ціну — але іншу Багато знахідок означає, що ти уважно пройшов чек-лист. Швидке закриття означає інше: продукт справді твій і ти в ньому орієнтуєшся. На захисті питають про обидва числа. Вирішує друге.
    Питання

    Команда A знайшла 11 дірок у чужому продукті, а свої три отримані знахідки не закрила. Команда B знайшла 3, зате свої дві закрила за 12 і 18 хвилин і перезапустила перевірки. Хто ближчий до зарахованого модуля і чому?

    Крок 9

    Як улаштовані ці 120 хвилин

    Урок жорстко розкреслений за часом: аудит, обмін звітами, виправлення, повторний прогін, захист. Кожен етап має свій вихід

    120 хвилин уроку брифінг red team 10 хв · межі, ціль, підписані правила крос-аудит 30 хв обмін звітами 10 хв · читаємо чуже, уточнюємо виправлення blue team 30 хв · спершу 🔒 повторний прогін 10 хв · audit.sh по всіх продуктах захист проєктів 20 хв · 3 хв виступ + 2 хв питань підсумок модуля 10 хв · три правила, які забираєш із собою 0 хв 30 хв (масштаб смуги)
    Два найдовші етапи однакові за часом, і це навмисно. Знайти й полагодити коштує приблизно порівну.

    Захист проєкту: 3 хвилини, п'ять пунктів

    1. Проблема — чию задачу продукт розв'язує, одним реченням;
    2. Рішення — що ви зробили, без переліку технологій;
    3. Демо — живий екран: сайт, бот, журнал автоматизації;
    4. Архітектура — де що лежить, що поза ~/www, звідки беруться секрети;
    5. «Що ми зламали в себе самі» — знахідки з крос-аудиту, що виправили, за скільки часу.
    Медіа — очно, на екрані команди Відео й аудіо на сервер не їдуть: там ліміт 2 МБ і заборонені розширення. Локальні AI-медіа й роботу бота ви показуєте зі свого екрана під час захисту. По FTP їде лише текст: HTML, CSS, JS, JSON, MD, TXT.
    Питання

    На захисті команда показує гарну презентацію, живе демо й архітектуру. Але на питання «що знайшли у вас і що ви виправили» відповідає: «нам прислали звіт, ми не встигли подивитися». Що з оцінкою?

    Крок 10

    Практика: аудит, звіт, виправлення, захист

    Аудит і всі файли ти готуєш у себе на комп'ютері. По FTP у кабінет їде тільки текст. Галочки зберігаються

    Межа, за яку не заходять Тільки призначена ціль. Тільки дванадцять пунктів. Жодних змін у чужих даних, жодних видалень, жодної публікації знайденого в загальному чаті. Порушення анулює звіт усієї команди, а не тільки твою знахідку.
    PowerShell: два місця, де все ламається У Windows PowerShell 5.1 curl — це псевдонім Invoke-WebRequest, тож у командах пиши curl.exe. І зберігай JSON без BOM, інакше чекер не прочитає файл: [IO.File]::WriteAllText($p, $t, (New-Object Text.UTF8Encoding $false)). У Git Bash, macOS і Linux просто > audit-report.json.
    Крок 11

    Автоперевірка: шість блокуючих і два звичайні

    Скрипт учителя audit.sh проходить по твоєму продукту й по твоєму звіту. Спроби не обмежені — перезапускай після кожного виправлення

    Демонстраційний режим: результат згенеровано для показу. На сервері ця кнопка викликає POST /api/check, який запускає /opt/lessons/16/audit.sh від імені учня.

    Що вчитель дивиться на твоєму екрані

    Крок 12

    Шкала виконання і підсумок модуля

    Це те, що бачить учитель, коли виставляє оцінку за урок і закриває модуль

    СкладникВагаРезультат
    Виконано
    0%
    Рекомендований бал за 12-бальною

    Шістнадцять уроків: що ти вмів на початку і що вмієш тепер

    Порівняй два стовпчики нижче. Ліворуч — те, як ти працював у вересні. Праворуч — те, що ти робиш зараз, не задумуючись. Різниця в цій таблиці набиралася по одному уроку, і саме тому вона непомітна зсередини.

    Було в уроці 1Стало в уроці 16
    Пароль на всі сервіси один і той самий Вхід на сервер за ключем ed25519, пароль на вході вимкнено
    «Права доступу» — незрозумілі цифри у FTP-клієнті 755 на теки, 644 на файли, жодного o+w — і ти можеш пояснити чому
    Ключ від API просто в коді сторінки Ключ у .env поза веб-корінням, у .gitignore, і ти вмієш його відкликати
    Форма приймала будь-що, бо «на фронті ж є перевірка» Валідація на сервері, екранування виводу, CSRF-токен, ліміт частоти
    Персональні дані й чужі медіа клалися «щоб було» Згода, походження файлів, ліцензії, жодних зайвих даних
    Вебхук приймав подію від кого завгодно HMAC-підпис, мітка часу, захист від повтору
    Помилку в чужій роботі формулював як «тут усе погано» Знахідка: check_id, severity, evidence, fix
    Про вразливість дізнавався випадково й від когось Сам проходиш чек-лист із 12 пунктів і міряєш час до виправлення

    Три речення, які лишаються після модуля

    І остання річ, яку варто забрати з собою. Сьогодні у твоєму продукті знайшли помилки — і це нормально. Їх знаходять у всіх, у дорослих командах теж. Різниця тільки в тому, чи вмієш ти їх спокійно прийняти й закрити. Сьогодні ти це вмів.

    Де найчастіше помиляються на цьому уроці

    Домашнє завдання

    Напиши особистий підсумок модуля: три правила безпеки, які ти застосуєш до власних проєктів поза школою. До кожного додай одне речення. У ньому назви конкретний випадок із цих шістнадцяти уроків, який тебе в цьому переконав.

    Другим абзацом візьми один свій старий проєкт або акаунт. Напиши, що саме ти перевіриш у ньому цього тижня за нашим чек-листом.

    Джерела

    Звідки взяті формулювання й числа

    Усе, що можна перевірити, має посилання. Усе, що є ілюстративним прикладом, підписано прямо на сторінці

    Повний список із поясненнями, що звідки взято і що є ілюстративним прикладом, — у файлі urok-16-джерела.md поруч із цією сторінкою.