Уроки безпечного коду для Azure DevOps
RansomLeak може залишити в pull request в Azure Repos коментар із посиланням на короткий урок безпечного коду, коли сканер повідомляє про слабке місце в ньому. Це безкоштовно, не потребує облікового запису RansomLeak і не пов’язане з налаштуваннями вашої організації в RansomLeak. Працює в будь-якій організації Azure DevOps Services.
Складників два. Більшості команд достатньо завдання пайплайна. Застосунок RansomLeak — необов’язкове доповнення.
| Завдання пайплайна | Завдання пайплайна із застосунком | |
|---|---|---|
| Що читає | Файл SARIF від вашого сканера | Той самий файл SARIF |
| Вартість | Безкоштовно | Безкоштовно, плюс одне місце Basic в Azure DevOps |
| Позначає завершений урок | Під час наступного запуску пайплайна | Одразу |
| Статус pull request | Ні | Так, ніколи не помилковий |
| Потрібен адміністратор каталогу | Ні | Так, один раз |
Завдання пайплайна
Section titled “Завдання пайплайна”Встановіть RansomLeak Secure Coding Lessons із Visual Studio Marketplace у свою організацію. Потім додайте завдання після кроку, який запускає сканер і записує SARIF.
steps: # ... your scanner writes results.sarif ... - task: RansomLeakLessons@1 condition: always() inputs: sarif: results.sarifЗавдання працює з CodeQL, Semgrep, Trivy, Gitleaks та іншими інструментами, правила яких мають CWE, CVE або GHSA, а також зі сканерами секретів. Воно запускається лише у збірках pull request для Git-репозиторіїв Azure Repos, тож додайте пайплайн як політику перевірки збірки (build validation) для цільової гілки. Інші збірки його пропускають.
Реєструватися чи додавати секрет не потрібно. Завдання входить у RansomLeak за допомогою власного токена ідентичності пайплайна, який підтверджує, у якій організації, проєкті й репозиторії воно працює. Підключення служби (service connection) не потрібне.
Коли сканер знаходить тип проблеми, для якого є урок, завдання додає до pull request одну гілку коментарів і надалі оновлює саме її. У ній до п’яти уроків, по одному на кожен окремий тип проблеми, кожен займає 5-10 хвилин.
Коментар відображає те, про що повідомляє ваш сканер, тож для меншого шуму запускайте його лише на змінених файлах або з базовим рівнем (baseline). Якщо результат SARIF має baselineState, враховуються лише результати new і updated.
Дозвольте пайплайну коментувати
Section titled “Дозвольте пайплайну коментувати”Ідентичності пайплайна потрібен дозвіл на коментування. Зробіть це один раз для кожного репозиторію або один раз для всіх:
- Відкрийте Project settings, потім Repositories.
- Виберіть репозиторій або All Repositories і відкрийте Security.
- Виберіть користувача {Project} Build Service ({Organization}).
- Встановіть для Contribute to pull requests значення Allow.

Якщо дозволу немає, завдання виводить ці кроки як попередження й нічого не публікує.
Позначки
Section titled “Позначки”Коли хтось завершує урок, позначка з’являється в гілці коментарів під час наступного запуску пайплайна для цього pull request, наприклад після наступного push. Без застосунку між запусками в pull request нічого не записується.
Завдання ніколи не завершує вашу збірку помилкою. Якщо RansomLeak недоступний, дозволу немає або файл SARIF відсутній чи пошкоджений, воно записує попередження й продовжує роботу. Pull request із форків пропускаються.

Застосунок RansomLeak (необов’язково)
Section titled “Застосунок RansomLeak (необов’язково)”Застосунок позначає уроки одразу після завершення й встановлює статус pull request. Для цього у вашій організації потрібні три речі:
- Схвалення адміністратора каталогу. Глобальний адміністратор, адміністратор хмарних застосунків або адміністратор застосунків Microsoft Entra схвалює застосунок для вашого тенанта.
- Доступ Basic. Додайте застосунок до організації Azure DevOps як користувача з доступом Basic і до проєкту з репозиторієм. Доступ Stakeholder не бачить репозиторіїв. Кожна організація має 5 безкоштовних користувачів Basic: якщо одне місце вільне, воно нічого не коштує, інакше це платне місце Basic, яке ви купуєте в Microsoft.
- Contribute to pull requests. Надайте цей дозвіл застосунку так само, як для Build Service вище, вибравши RansomLeak Secure Coding.
Щоб підключитися, відкрийте app.ransomleak.com/azure-devops/connect і виберіть Sign in with Microsoft. Після схвалення вкажіть організацію, проєкт і репозиторій і виберіть Check access. Сторінка точно покаже, чого бракує.

Після підключення уроки завдання публікуються від імені застосунку, а завершений урок позначається одразу. Застосунок також встановлює статус pull request ransomleak/secure-coding. Поки уроки відкриті, він має значення pending, а коли всі перелічені уроки завершено, — succeeded. Він ніколи не буває помилковим.
Застосунок редагує лише ті гілки коментарів, які створив сам. Якщо в pull request завдання вже опублікувало гілку до підключення застосунку, застосунок створить власну з усіма уроками й позначками та закриє гілку завдання, тож активною залишиться одна гілка з уроками. Це працює й навпаки: якщо застосунок відключено, наступний запуск завдання оновить свою гілку й закриє гілку застосунку.
Не робіть цей статус обов’язковою політикою: pull request без уроків ніколи про нього не звітують.
Якщо застосунок втрачає доступ, наприклад його видалено з організації, він позначається відключеним, і завдання знову бере роботу на себе. Повторний запуск Check access знову підключає його. Щоб припинити використання застосунку, виберіть Disconnect на сторінці підключення й видаліть його з користувачів організації.
Організації, які не прив’язані до Microsoft Entra ID, можуть використовувати лише завдання.
Що покрито
Section titled “Що покрито”- SQL-ін’єкції
- Міжсайтовий скриптинг (XSS)
- Обхід шляху (path traversal)
- Ін’єкції команд
- Підробка запитів на боці сервера (SSRF)
- Секрети в коді
- Зовнішні сутності XML (XXE)
- Відкрите перенаправлення
- Міжсайтова підробка запитів (CSRF)
- Вразливі залежності
Для десеріалізації та слабкої криптографії уроків поки немає.
Знахідка зіставляється за її CWE. Знахідки сканерів секретів і рекомендації щодо залежностей зіставляються за типом сканера. Категорії OWASP і широкі батьківські CWE, як-от CWE-200, не використовуються, бо вони не вказують на один конкретний урок.
Виправлення коду не прибирає урок із гілки коментарів.
Які дані надсилаються
Section titled “Які дані надсилаються”Завдання надсилає лише ідентифікатори: назву сканера, ідентифікатори CWE правил, що дали результат, ознаку того, що правило є рекомендацією CVE або GHSA, і номер pull request. Організація, проєкт і репозиторій беруться з токена ідентичності пайплайна. Вихідний код, шляхи до файлів, повідомлення, фрагменти й секрети не залишають агент.
Кожне посилання на урок містить токен з назвами й ідентифікаторами організації та проєкту, ідентифікатором репозиторію, номером pull request, уроком і внутрішніми ідентифікаторами. Вони потрібні, щоб завершений урок потрапив до правильного pull request. Токен підписаний, але не зашифрований, тому будь-хто з посиланням може його декодувати й прочитати ці значення.
RansomLeak не зберігає персональних даних розробників. Зберігається:
- До двох записів про встановлення для кожної організації: один для завдання і, якщо ви його підключите, один для застосунку. Кожен містить ідентифікатори, а також ключ підпису й секрет прийому даних, які генеруємо ми й зберігаємо в зашифрованому вигляді. Запис застосунку також містить назву організації, ідентифікатор вашого тенанта Microsoft Entra і час підключення. Жодних персональних даних. Служба підтримки видаляє їх на запит.
- Для кожного завершеного уроку одна позначка завершення для кожної організації, репозиторію, pull request і уроку, лише з ідентифікаторами й часом. Вона видаляється через 30 днів.
Див. політику конфіденційності.
Завершення не підтверджується
Section titled “Завершення не підтверджується”Посилання на урок належить pull request, а не людині. Будь-хто, хто може відкрити pull request, може відкрити посилання й позначити урок завершеним.
Позначка означає, що урок завершено за цим посиланням. Сприймайте її як підказку, а не як доказ того, хто саме пройшов навчання.
Обмеження
Section titled “Обмеження”- Уроки англійською.
- Лише Azure DevOps Services. Azure DevOps Server не підтримується.
- Сповіщення GitHub Advanced Security for Azure DevOps самі по собі не створюють уроків, бо сповіщення, знайдені в гілках pull request, не зберігаються. Експортуйте результати сканування як SARIF і передайте файл завданню.
- Pull request із форків не підтримуються.
- Урок з’являється лише тоді, коли знахідка сканера має відповідний урок. Для знахідок без відповідного уроку коментаря немає, зокрема для знахідок лише з категорією OWASP.