
Уязвимое приложение с примерами, показывающими, как не использовать секреты
Добро пожаловать в игру OWASP WrongSecrets! Игра наполнена реальными примерами того, как НЕ следует хранить секреты в вашем программном обеспечении. Каждый из этих примеров представлен в виде задания, которое нужно решить с помощью различных инструментов и техник. Решение этих заданий поможет вам распознавать распространённые ошибки и задуматься о собственной стратегии управления секретами.
Сможете ли вы решить все 67 заданий?
Попробуйте некоторые из них в нашей демонстрационной среде на Heroku.
Хотите попробовать другие задания? Прочитайте инструкции по их настройке ниже.
Впервые в WrongSecrets? Начните здесь:
Затем откройте http://localhost:8080 3. Хотите заглянуть в будущее? Попробуйте наш передовой master-контейнер с последними возможностями: ```bash docker run -p 8080:8080 -p 8090:8090 ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master
⚠️ *Примечание: Это разрабатываемая версия, которая может быть нестабильной*
4. **Продвинутая настройка**: Для облачных задач и упражнений с Kubernetes см. подробные инструкции ниже
**Что вы узнаете:**
- Распространённые ошибки управления секретами
- Как выявлять раскрытые учётные данные
- Лучшие практики защиты секретов
- Инструменты и методы обнаружения секретов
**Как это работает:**
Этот репозиторий содержит **намеренно уязвимый код и файлы конфигурации** с реальными и фиктивными секретами, спрятанными по всей кодовой базе. Вы будете просматривать исходный код, файлы конфигурации, контейнеры Docker и облачные развёртывания, чтобы обнаружить эти секреты. Каждое задание учит вас различным способам, которыми секреты могут быть случайно раскрыты в реальных приложениях.

## 📋 Предварительные требования
**Для базового использования:**
- Веб-браузер
- Docker (для локальной настройки) – [Установить здесь](https://docs.docker.com/get-docker/)
**Для продвинутых настроек:**
- Kubernetes/Minikube – [Установить здесь](https://minikube.sigs.k8s.io/docs/start/)
- Учётная запись в облаке (AWS/GCP/Azure) для облачных задач
- Знакомство с командной строкой
<a href="https://github.com/vshymanskyy/StandWithUkraine/blob/main/README.md"><img src="https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner2-no-action.svg" /></a>
## Содержание
### 🎯 Начало работы
- [Быстрый старт](#-quick-start)
- [Предварительные требования](#-prerequisites)
- [Поддержка](#support)
### 🐳 Варианты развёртывания
- [Базовые упражнения с Docker](#basic-docker-exercises)
- [Запуск на Heroku](#running-these-on-heroku)
- [Запуск на Render.io](#running-these-on-renderio)
- [Запуск на Railway](#running-these-on-railway)
- [Базовое упражнение K8s](#basic-k8s-exercise)
- [На основе Minikube](#minikube-based)
- [На основе k8s](#k8s-based)
- [Упражнения с Vault в Minikube](#vault-exercises-with-minikube)
### ☁️ Облачные задачи
- [Облачные задачи](#cloud-challenges)
- [Запуск WrongSecrets в AWS](#running-wrongsecrets-in-aws)
- [Запуск WrongSecrets в GCP](#running-wrongsecrets-in-gcp)
- [Запуск WrongSecrets в Azure](#running-wrongsecrets-in-azure)
- [Запуск Challenge15 только в своём облаке](#running-challenge15-in-your-own-cloud-only)
### 🎮 Продвинутое использование
- [Хотите играть без подсказок?](#do-you-want-to-play-without-guidance-or-spoils)
- [CTF](#ctf)
- [Поддержка CTFD](#ctfd-support)
- [Поддержка FBCTF](#fbctf-support-experimental)
- [Использование OWASP WrongSecrets как эталон для обнаружения секретов](#use-owasp-wrongsecrets-as-a-secret-detection-benchmark)
### 👨💻 Разработка и вклад
- [Заметки по разработке](#notes-on-development)
- [Контрольный список перехода на Spring Boot 4](https://github.com/owasp/wrongsecrets/blob/HEAD/docs/SPRING_BOOT_4_ADOPTION_CHECKLIST.md)
- [Управление зависимостями](#dependency-management)
- [Запуск проекта в IntelliJ IDEA](#get-the-project-started-in-intellij-idea)
- [Автоматическая перезагрузка во время разработки](#automatic-reload-during-development)
- [Как добавить задачу](#how-to-add-a-challenge)
- [Локальное тестирование](#local-testing)
- [Автоматизированное локальное тестирование](#Local-automated-testing)
- [Хотите отключить задачи в своём релизе?](#want-to-disable-challenges-in-your-own-release)
### 📚 Ресурсы и сообщество
- [Особая благодарность и участники](#special-thanks--contributors)
- [Спонсорство](#sponsorships)
- [Требуется помощь](#help-wanted)
- [Дополнительное чтение по управлению секретами](#further-reading-on-secrets-management)
## Поддержка
Нужна поддержка? Свяжитесь с нами
через [OWASP Slack](https://owasp.slack.com/archives/C02KQ7D9XHR), для регистрации перейдите [сюда](https://owasp.org/slack/invite),
создайте [PR](https://github.com/OWASP/wrongsecrets/pulls), заведите
[issue](https://github.com/OWASP/wrongsecrets/issues) или
используйте [обсуждения](https://github.com/OWASP/wrongsecrets/discussions). Обратите внимание, что это проект волонтёров OWASP,
поэтому ответ может занять некоторое время.
Copyright (c) 2020-2025 Jeroen Willemsen и участники WrongSecrets.
## 🛤️ Выберите свой путь
Не уверены, какая настройка вам подходит? Вот краткое руководство:
| **Я хочу...** | **Рекомендуемая настройка** | **Доступные задачи** |
|------------------|----------------------|--------------------------|
| Попробовать быстро онлайн | [Контейнер, запущенный на Heroku](https://www.wrongsecrets.com/) | Базовые задачи (0-4, 8, 12-32, 34-43, 49-52, 54-66) |
| Запустить локально с Docker | [Базовый Docker](#basic-docker-exercises) | То же, что и выше, но на вашей машине |
| Изучить секреты Kubernetes | [Настройка K8s/Minikube](#basic-k8s-exercise) | Задачи Kubernetes (0-6, 8, 12-43, 48-66) |
| Практиковаться с облачными секретами | [Облачные задачи](#cloud-challenges) | Все задачи (0-66) |
| Провести воркшоп/CTF | [Настройка CTF](#ctf) | Настраиваемые наборы задач |
| Внести вклад в проект | [Настройка для разработки](#notes-on-development) | Все задачи + инструменты разработки |
## Базовые упражнения с Docker
_Можно использовать для задач 0-4, 8, 12-32, 34-43, 49-52, 54-66_
Для базовых упражнений с Docker потребуется:
- Docker [Установить отсюда](https://docs.docker.com/get-docker/)
- Браузер, способный отображать HTML
Установить можно так:```bash
docker run -p 8080:8080 -p 8090:8090 jeroenwillemsen/wrongsecrets:latest-no-vault
🚀 Хотите попробовать самую свежую версию?
Если вы хотите увидеть, что выйдет в следующем релизе, вы можете использовать наш автоматически собираемый мастер-контейнер:```bash docker run -p 8080:8080 -p 8090:8090 ghcr.io/owasp/wrongsecrets/wrongsecrets-master:latest-master
⚠️ **Предупреждение**: Это разработочная версия, собранная из последней ветки master, и может содержать экспериментальные функции или нестабильность.
**📝 Примечание по портам:**
- Порт **8080**: Основное приложение (задания 0-66)
- Порт **8090**: MCP-сервер (требуется для Задания 60)
**📝 Примечание по Заданию 62 (Google Drive MCP):**
Для Задания 62 требуется настроить Google Service Account для полной функциональности. См. [docs/CHALLENGE62_GOOGLE_DRIVE_SETUP.md](https://github.com/owasp/wrongsecrets/blob/HEAD/docs/CHALLENGE62_GOOGLE_DRIVE_SETUP.md) для инструкций по настройке. Без настройки задание будет показывать замещающее сообщение.
Теперь вы можете попробовать найти секреты, решая задания, представленные по ссылкам ниже
<details>
<summary>все ссылки для docker-заданий (нажмите треугольник, чтобы открыть блок).
</summary>
- [localhost:8080/challenge/challenge-0](http://localhost:8080/challenge/challenge-0)
- [localhost:8080/challenge/challenge-1](http://localhost:8080/challenge/challenge-1)
- [localhost:8080/challenge/challenge-2](http://localhost:8080/challenge/challenge-2)
- [localhost:8080/challenge/challenge-3](http://localhost:8080/challenge/challenge-3)
- [localhost:8080/challenge/challenge-4](http://localhost:8080/challenge/challenge-4)
- [localhost:8080/challenge/challenge-8](http://localhost:8080/challenge/challenge-8)
- [localhost:8080/challenge/challenge-12](http://localhost:8080/challenge/challenge-12)
- [localhost:8080/challenge/challenge-13](http://localhost:8080/challenge/challenge-13)
- [localhost:8080/challenge/challenge-14](http://localhost:8080/challenge/challenge-14)
- [localhost:8080/challenge/challenge-15](http://localhost:8080/challenge/challenge-15)
- [localhost:8080/challenge/challenge-16](http://localhost:8080/challenge/challenge-16)
- [localhost:8080/challenge/challenge-17](http://localhost:8080/challenge/challenge-17)
- [localhost:8080/challenge/challenge-18](http://localhost:8080/challenge/challenge-18)
- [localhost:8080/challenge/challenge-19](http://localhost:8080/challenge/challenge-19)
- [localhost:8080/challenge/challenge-20](http://localhost:8080/challenge/challenge-20)
- [localhost:8080/challenge/challenge-21](http://localhost:8080/challenge/challenge-21)
- [localhost:8080/challenge/challenge-22](http://localhost:8080/challenge/challenge-22)
- [localhost:8080/challenge/challenge-23](http://localhost:8080/challenge/challenge-23)
- [localhost:8080/challenge/challenge-24](http://localhost:8080/challenge/challenge-24)
- [localhost:8080/challenge/challenge-25](http://localhost:8080/challenge/challenge-25)
- [localhost:8080/challenge/challenge-26](http://localhost:8080/challenge/challenge-26)
- [localhost:8080/challenge/challenge-27](http://localhost:8080/challenge/challenge-27)
- [localhost:8080/challenge/challenge-28](http://localhost:8080/challenge/challenge-28)
- [localhost:8080/challenge/challenge-29](http://localhost:8080/challenge/challenge-29)
- [localhost:8080/challenge/challenge-30](http://localhost:8080/challenge/challenge-30)
- [localhost:8080/challenge/challenge-31](http://localhost:8080/challenge/challenge-31)
- [localhost:8080/challenge/challenge-32](http://localhost:8080/challenge/challenge-32)
- [localhost:8080/challenge/challenge-34](http://localhost:8080/challenge/challenge-34)
- [localhost:8080/challenge/challenge-35](http://localhost:8080/challenge/challenge-35)
- [localhost:8080/challenge/challenge-36](http://localhost:8080/challenge/challenge-36)
- [localhost:8080/challenge/challenge-37](http://localhost:8080/challenge/challenge-37)
- [localhost:8080/challenge/challenge-38](http://localhost:8080/challenge/challenge-38)
- [localhost:8080/challenge/challenge-39](http://localhost:8080/challenge/challenge-39)
- [localhost:8080/challenge/challenge-40](http://localhost:8080/challenge/challenge-40)
- [localhost:8080/challenge/challenge-41](http://localhost:8080/challenge/challenge-41)
- [localhost:8080/challenge/challenge-42](http://localhost:8080/challenge/challenge-42)
- [localhost:8080/challenge/challenge-43](http://localhost:8080/challenge/challenge-43)
- [localhost:8080/challenge/challenge-49](http://localhost:8080/challenge/challenge-49)
- [localhost:8080/challenge/challenge-50](http://localhost:8080/challenge/challenge-50)
- [localhost:8080/challenge/challenge-51](http://localhost:8080/challenge/challenge-51)
- [localhost:8080/challenge/challenge-52](http://localhost:8080/challenge/challenge-52)
- [localhost:8080/challenge/challenge-54](http://localhost:8080/challenge/challenge-54)
- [localhost:8080/challenge/challenge-55](http://localhost:8080/challenge/challenge-55)
- [localhost:8080/challenge/challenge-56](http://localhost:8080/challenge/challenge-56)
- [localhost:8080/challenge/challenge-57](http://localhost:8080/challenge/challenge-57)
- [localhost:8080/challenge/challenge-58](http://localhost:8080/challenge/challenge-58)
- [localhost:8080/challenge/challenge-59](http://localhost:8080/challenge/challenge-59)
- [localhost:8080/challenge/challenge-60](http://localhost:8080/challenge/challenge-60)
- [localhost:8080/challenge/challenge-61](http://localhost:8080/challenge/challenge-61)
- [localhost:8080/challenge/challenge-62](http://localhost:8080/challenge/challenge-62)
- [localhost:8080/challenge/challenge-63](http://localhost:8080/challenge/challenge-63)
- [localhost:8080/challenge/challenge-64](http://localhost:8080/challenge/challenge-64)
- [localhost:8080/challenge/challenge-65](http://localhost:8080/challenge/challenge-65)
- [localhost:8080/challenge/challenge-66](http://localhost:8080/challenge/challenge-66)
</details>
Обратите внимание, что эти задания пока очень простые, и их объяснения тоже. Не стесняйтесь создавать PR, чтобы улучшить их ;-).
### Запуск на Heroku
Вы также можете протестировать их на [https://wrongsecrets.herokuapp.com/](https://wrongsecrets.herokuapp.com/)! Ребята из Heroku предоставили нам отличный пакет поддержки open source, который позволяет запускать приложение там бесплатно, и оно почти всегда работает. Тем не менее, пожалуйста, не занимайтесь фаззингом и/или не пытайтесь положить его: вы испортите удовольствие другим, кто хочет попробовать.
Используйте [эту ссылку](https://wrongsecrets.herokuapp.com/), чтобы перейти к нашей размещённой версии приложения. Если вы хотите разместить его на Heroku самостоятельно (например, для проведения тренинга), вы можете сделать это, нажав [эту ссылку](https://heroku.com/deploy?template=https://github.com/OWASP/wrongsecrets/tree/master). Имейте в виду, что это повлечёт расходы, за которые этот проект и/или его сопровождающие не могут нести ответственность.
### Запуск на Render.io
*статус: экспериментальный*
Вы можете протестировать их на [https://wrongsecrets.onrender.com/](https://wrongsecrets.onrender.com/). Пожалуйста, учтите, что мы работаем на бесплатном уровне, мы не можем давать никаких гарантий. Пожалуйста, не занимайтесь фаззингом и/или не пытайтесь положить его: вы испортите удовольствие другим, кто хочет попробовать.
Хотите развернуть сами с помощью Render? Нажмите кнопку ниже:
[](https://render.com/deploy?repo=https://github.com/OWASP/wrongsecrets)
### Запуск на Railway
*статус: поддерживается [alphasec.io](https://github.com/alphasecio)*
Если вы хотите разместить WrongSecrets на Railway, вы можете это сделать, развернув [этот шаблон в один клик](https://railway.com/deploy/McqJ_j?referralCode=I07F1). Railway больше не предлагает всегда бесплатный тариф, но бесплатного пробного периода достаточно, чтобы протестировать его, прежде чем решиться на обновление. Если вам нужно пошаговое руководство, см. [эту запись в блоге](https://alphasec.io/test-your-secret-management-skills-with-owasp-wrongsecrets/).
[](https://railway.com/deploy/McqJ_j?referralCode=I07F1j)
## Базовое упражнение с K8s
_Может использоваться для заданий 0-6, 8, 12-43, 48-66_
### На основе Minikube
Убедитесь, что у вас установлено следующее:
- Docker [Установить отсюда](https://docs.docker.com/get-docker/)
- Minikube [Установить отсюда](https://minikube.sigs.k8s.io/docs/start/)
Текущая настройка K8S основана на использовании Minikube для локального развлечения. Вы можете использовать команды ниже из корня проекта:```bash
minikube start
kubectl apply -f k8s/secrets-config.yml
kubectl apply -f k8s/secrets-secret.yml
kubectl apply -f k8s/challenge33.yml
kubectl apply -f k8s/challenge53/secret-challenge53.yml
echo "Setting up the bitnami sealed secret controler"
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl apply -f k8s/sealed-secret-controller.yaml
kubectl apply -f k8s/main.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
kubectl create -f k8s/sealed-challenge48.json
echo "finishing up the sealed secret controler part"
wait 10 #or check whether secret48 is there
kubectl apply -f k8s/secret-challenge-deployment.yml
while [[ $(kubectl get pods -l app=secret-challenge -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for secret-challenge" && sleep 2; done
kubectl expose deployment secret-challenge --type=LoadBalancer --port=8080
minikube service secret-challenge
В качестве альтернативы вы можете сделать :```bash ./k8s-vault-minikube-start.sh
теперь вы можете использовать предоставленный IP-адрес и порт, чтобы продолжить взаимодействие с вариантом K8s (вместо localhost).
- [localhost:8080/challenge/challenge-5](http://localhost:8080/challenge/challenge-5)
- [localhost:8080/challenge/challenge-6](http://localhost:8080/challenge/challenge-6)
- [localhost:8080/challenge/challenge-33](http://localhost:8080/challenge/challenge-33)
- [localhost:8080/challenge/challenge-48](http://localhost:8080/challenge/challenge-48)
- [localhost:8080/challenge/challenge-53](http://localhost:8080/challenge/challenge-53)
### на основе k8s
Хотите запустить vanilla на своем собственном k8s? Используйте команды ниже:```bash
kubectl apply -f k8s/secrets-config.yml
kubectl apply -f k8s/secrets-secret.yml
echo "Setting up the bitnami sealed secret controler"
kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/download/v0.27.0/controller.yaml
kubectl apply -f k8s/sealed-secret-controller.yaml
kubectl apply -f k8s/main.key
kubectl delete pod -n kube-system -l name=sealed-secrets-controller
kubectl create -f k8s/sealed-challenge48.json
echo "finishing up the sealed secret controler part"
wait 10 #or check whether secret48 is there
kubectl apply -f k8s/challenge33.yml
kubectl apply -f k8s/secret-challenge-deployment.yml
while [[ $(kubectl get pods -l app=secret-challenge -o 'jsonpath={..status.conditions[?(@.type=="Ready")].status}') != "True" ]]; do echo "waiting for secret-challenge" && sleep 2; done
kubectl port-forward \
$(kubectl get pod -l app=secret-challenge -o jsonpath="{.items[0].metadata.name}") \
8080:8080
теперь вы можете использовать предоставленный IP-адрес и порт, чтобы продолжить работу с вариантом K8s (вместо localhost).
Можно использовать для испытаний 0–8, 12–66 Убедитесь, что у вас установлено следующее:
Запустите ./k8s-vault-minikube-start.sh. Когда скрипт завершится, испытания будут ждать вас по адресу http://localhost:8080. Это позволит вам запустить испытания 0–8, 12–66.
Если вы остановили скрипт k8s-vault-minikube-start.sh и хотите возобновить перенаправление портов, выполните: k8s-vault-minikube-resume.sh.
Это связано с тем, что если вы снова запустите стартовый скрипт, он заменит секрет в vault, но не обновит приложение secret-challenge новым секретом.
Можно использовать для испытаний 0–66
ПРОЧТИТЕ ЭТО: Учитывая, что приведенные ниже упражнения содержат упражнения по повышению привилегий IAM, никогда не запускайте их в учётной записи, связанной с вашей производственной средой или способной повлиять на ресурсы, выходящие за рамки одной учётной записи.
Следуйте шагам, описанным в README в подпапке AWS.
Следуйте шагам, описанным в README в подпапке GCP.
Следуйте шагам, описанным в README в подпапке Azure.
Если вы хотите добавить собственные Canarytokens для вашего облачного развертывания, сделайте следующее:
AWS Keys, в поле URL веб-хука добавьте <your-domain-created-at-step1>/canaries/tokencallback.Каждое испытание имеет кнопки Show hints и What's wrong?. Эти кнопки помогают упростить испытания и дают объяснения читателю. Однако объяснения могут испортить удовольствие, если вы хотите выполнять это как хакерское упражнение. Поэтому вы можете управлять ими, переопределив следующие настройки в вашем окружении:
hints_enabled=false отключит кнопку Show hints.reason_enabled=false отключит кнопку объяснения What's wrong?.spoiling_enabled=false отключит конечную точку /spoil/challenge-x (где x — короткое имя испытания).Вы можете включить документацию Swagger и пользовательский интерфейс Swagger, переопределив переменные SPRINGDOC_UI и SPRINGDOC_DOC при запуске Docker-контейнера.
Руководители:
Ведущие участники:
Участники:
Тестировщики:
Особая благодарность:
Мы хотели бы поблагодарить следующие организации за помощь:
GitGuardian за их спонсорство, которое позволяет нам оплачивать счета за наши облачные аккаунты.
Jetbrains за предоставление лицензии на экземпляр Intellij IDEA Ultimate edition для руководителей проекта. Без этого мы не смогли бы так быстро разрабатывать!
1Password за предоставление лицензии с открытым исходным кодом на 1Password для тестового стенда обнаружения секретов.
AWS за предоставление кредитов AWS Open Source, которые мы используем для тестирования нашего проекта и настройки Wrongsecrets CTF Party на AWS.
Вы можете помочь нам следующими способами:
Поскольку появляется множество инструментов для обнаружения секретов как для Docker, так и для Git, мы создаём тестовый стенд для них. Хотите узнать, обнаруживает ли ваш инструмент всё? Мы будем отслеживать встроенные секреты в этом issue и у нас есть ветка, в которую мы добавляем дополнительные секреты для обнаружения вашим инструментом. Ветка будет содержать скрипт генерации Docker-контейнера, с помощью которого вы сможете в конечном итоге протестировать сканирование секретов вашего контейнера.
Теперь мы предоставляем автоматизированный рабочий процесс GitHub Actions, который сравнивает несколько инструментов сканирования секретов с кодовой базой WrongSecrets. Рабочий процесс сравнения сканеров тестирует 7 различных инструментов:
Рабочий процесс запускается еженедельно и предоставляет таблицу сравнения, показывающую, сколько секретов обнаруживает каждый инструмент, помогая вам понять относительную эффективность различных инструментов сканирования секретов. Подробнее о запуске и интерпретации результатов см. в docs/scanner-comparison.md.
У нас есть 3 способа играть в CTF:
Хотите использовать CTFD для игры в CTF на основе бесплатного экземпляра Heroku wrongsecrets-ctf вместе с CTFD? Вы можете!
ПРИМЕЧАНИЕ: поддержка CTFD теперь работает на основе Juiceshop CTF CLI.
ПРИМЕЧАНИЕ II: https://wrongsecrets-ctf.herokuapp.com (временно недоступен из-за нехватки кредитов OSS) работает на Heroku и имеет ограниченную ёмкость.
Первоначальное создание zip-файла для CTFD требует однократного посещения https://wrongsecrets-ctf.herokuapp.com/api/Challenges перед выполнением следующих шагов.
Выполните следующие шаги:```shell npm install -g [email protected] juice-shop-ctf #choose ctfd and https://wrongsecrets-ctf.herokuapp.com as domain. No trailing slash! The key is 'TRwzkRJnHOTckssAeyJbysWgP!Qc2T', feel free to enable hints. docker run -p 8001:8000 -it ctfd/ctfd:3.7.4
> **Примечание:** Подсказки могут быть сгенерированы только если экземпляр WrongSecrets имеет включенные подсказки (`HINTS_ENABLED=true`). Экземпляр Heroku CTF ([https://wrongsecrets-ctf.herokuapp.com](https://wrongsecrets-ctf.herokuapp.com)) работает с `HINTS_ENABLED=false`, поэтому выбор «Бесплатные подсказки» или «Платные подсказки» приведет к пустому списку подсказок. Чтобы генерировать подсказки, запустите свой собственный экземпляр с `HINTS_ENABLED=true`.
Теперь посетите экземпляр CTFD по адресу [http://localhost:8001](http://localhost:8001) и настройте свой CTF.
Затем используйте функцию административного резервного копирования, чтобы импортировать zip-файл, который вы создали с помощью команды juice-shop-ctf.
Играйте, используя [https://wrongsecrets-ctf.herokuapp.com](https://wrongsecrets-ctf.herokuapp.com)!
Хотите настроить свой собственный? Вы можете! Однако следите, чтобы кто-то не нашел ваш ключ, поэтому защитите его должным образом: убедитесь, что работающий контейнер с актуальным ctf-key не открыт для аудитории, аналогично нашему контейнеру heroku.
## Поддержка FBCTF (Экспериментальная!)
ПРИМЕЧАНИЕ: Поддержка FBCTF является экспериментальной.
Выполните те же шаги, что и с CTFD, только теперь выберите fbctfd и в качестве URL для countrymapping выберите `https://raw.githubusercontent.com/OWASP/wrongsecrets/79a982558016c8ce70948a8106f9a2ee5b5b9eea/config/fbctf.yml`.
Затем следуйте [https://github.com/facebookarchive/fbctf/wiki/Quick-Setup-Guide](https://github.com/facebookarchive/fbctf/wiki/Quick-Setup-Guide) для запуска FBCTF.
## Заметки по разработке
Для разработки на локальной машине используйте профиль `local`: `./mvnw spring-boot:run -Dspring-boot.run.profiles=local,without-vault`
Если вы хотите протестировать работу с vault без K8s: запустите vault локально с```shell
export SPRING_CLOUD_VAULT_URI='http://127.0.0.1:8200'
export VAULT_API_ADDR='http://127.0.0.1:8200'
vault server -dev
и в вашем следующем терминале выполните (с токеном из предыдущих команд):```shell export SPRING_CLOUD_VAULT_URI='http://127.0.0.1:8200' export SPRING_CLOUD_VAULT_TOKEN='' vault token create -id="00000000-0000-0000-0000-000000000000" -policy="root" vault kv put secret/secret-challenge vaultpassword.password="$(openssl rand -base64 16)" vault kv put secret/injected vaultinjected.value="$(openssl rand -base64 16)" vault kv put secret/codified challenge47secret.value="debugvalue"
Теперь используйте профиль `local-vault` для вашей разработки.```shell
./mvnw spring-boot:run -Dspring-boot.run.profiles=local,local-vault
Если вы хотите разрабатывать без экземпляра Vault, дополнительно используйте профиль without-vault для вашей разработки:```shell
./mvnw spring-boot:run -Dspring-boot.run.profiles=local,without-vault
Хотите запушить контейнер? Смотрите скрипт `.github/scripts/docker-create-and-push.sh`, который создает и отправляет все контейнеры. Не забудьте пересобрать приложение перед сборкой контейнера.
Хотите проверить, почему что-то в vault не работает в Kubernetes? Выполните `kubectl exec vault-0 -n vault -- vault audit enable file file_path=stdout`.
### Управление зависимостями
У нас интегрированы CycloneDX и OWASP Dependency-check для проверки зависимостей на уязвимости.
Вы можете использовать OWASP Dependency-check, вызвав `mvn dependency-check:aggregate`, и `mvn cyclonedx:makeBom` для создания SBOM с помощью CycloneDX.
### Конфигурация плагина Dependency-Check Maven
OWASP WrongSecrets использует плагин [`dependency-check-maven`](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html) для автоматического сканирования зависимостей проекта на известные уязвимости (CVE).
#### Как это работает
- Плагин запускается во время сборки Maven (`./mvnw clean install`) и проверяет все зависимости по публичным базам данных уязвимостей.
- По умолчанию он использует NVD (National Vulnerability Database), а также может использовать OSS Index для дополнительного покрытия.
#### Основные моменты конфигурации
Плагин настраивается в `pom.xml` в разделе `<build><plugins>`:```xml
<plugin>
<groupId>org.owasp</groupId>
<artifactId>dependency-check-maven</artifactId>
<version>${dependency-check-maven.version}</version>
<configuration>
<nvdApiKey>...</nvdApiKey>
<assemblyAnalyzerEnabled>false</assemblyAnalyzerEnabled>
<ossIndexServerId>ossindex</ossIndexServerId>
<ossIndexAnalyzerEnabled>true</ossIndexAnalyzerEnabled> <!-- SET THIS TO FALSE IF YOU HAVE NO SONATYPE ACCOUNT! -->
</configuration>
<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
settings.xml Maven для OSS Index (см. ниже).true, чтобы включить сканирование OSS Index. Если вы сталкиваетесь с ошибками аутентификации (401), установите false, чтобы отключить OSS Index.Чтобы использовать OSS Index, необходимо добавить свои учетные данные в ваш settings.xml Maven:```xml
ossindex
YOUR_OSSINDEX_USERNAME
YOUR_OSSINDEX_API_TOKEN
Замените `YOUR_OSSINDEX_USERNAME` и `YOUR_OSSINDEX_API_TOKEN` на данные вашей учетной записи OSS Index.
#### Устранение неполадок
- Если вы видите ошибки `401 Unauthorized` для OSS Index, проверьте свои учетные данные или отключите OSS Index, установив `<ossIndexAnalyzerEnabled>false</ossIndexAnalyzerEnabled>` в `pom.xml`.
- Вы всегда можете запустить сборку без OSS Index, если предпочитаете только сканирование на основе NVD.
#### Дополнительная информация
См. [Документацию по плагину Maven Dependency-Check](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html) для расширенных параметров конфигурации.
### Запуск проекта в IntelliJ IDEA
Требования: убедитесь, что у вас установлены следующие инструменты: [Docker](https://www.docker.com/products/docker-desktop/), [Java25 JDK](https://jdk.java.net/25/), [NodeJS 24](https://nodejs.org/en/download/current) и [IntelliJ IDEA](https://www.jetbrains.com/idea/download).
1. Сделайте форк и клонируйте проект, как описано в [документации](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md).
2. Импортируйте проект в IntelliJ (например, импортируйте как mvn-проект/локальные источники).
3. Перейдите в настройки проекта и убедитесь, что используется Java25 (и что JDK найден).
4. Перейдите в настройки IDE > Language & Frameworks > Lombok и убедитесь, что обработка Lombok включена.
5. Откройте вкладку Maven в вашей IDEA и запустите «Reload All Maven Projects», чтобы система выполнила синхронизацию и загрузила всё. Затем на той же вкладке используйте опцию «install» в рамках жизненного цикла OWASP WrongSecrets, чтобы сгенерировать asciidoc и т. д.
6. Теперь запустите метод `main` в `org.owasp.wrongsecrets.WrongSecretsApplication.java`. Это должно завершиться ошибкой с трассировкой стека.
7. Теперь перейдите в конфигурацию запуска приложения и убедитесь, что у вас активен профиль `without-vault`. Это делается установкой аргументов параметров виртуальной машины: `--server.port=8080 --spring.profiles.active=local,without-vault`. Установите `K8S_ENV=docker` в качестве аргумента окружения.
8. Повторите шаг 6: запустите приложение снова, должно получиться корректно работающее приложение, доступное в браузере по адресу http://localhost:8080.
**Иллюстрированное руководство** по запуску проекта в IntelliJ IDEA доступно в [_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-get-started-with-the-project-in-intellij-idea).
Не стесняйтесь редактировать и предлагать изменения через pull-запросы. Следуйте нашим рекомендациям из [документации](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md), чтобы ваша работа была принята.
Обратите внимание: официально мы поддерживаем только Linux и MacOS для разработки. Если вы хотите разрабатывать на машине с Windows, используйте WSL2 или виртуальную машину с Linux. Мы включили обнаружение Windows и несколько `exe`-файлов для первого эксперимента, но ищем активных мейнтейнеров для них. Хотите убедиться, что всё работает на Windows? Создавайте PR ;-).
Если после прочтения этого раздела у вас всё ещё нет представления о коде приложения: посмотрите [некоторые руководства по Spring Boot от Baeldung](https://www.baeldung.com/spring-boot).
### Автоматическая перезагрузка во время разработки
Чтобы изменения применялись быстрее, мы добавили `spring-dev-tools` в проект Maven.
Чтобы включить это автоматически в IntelliJ, убедитесь, что:
- В разделе Compiler -> Automatically build project включено, и
- В разделе Advanced settings -> Allow auto-make to start even if developed application is currently running включено.
Вы также можете вручную вызвать: Build -> Recompile the file you just changed, это также вызовет принудительную перезагрузку приложения.
### Как добавить задание
Выполните следующие шаги для добавления задания:
1. Сначала убедитесь, что зарегистрирована [Проблема](https://github.com/OWASP/wrongsecrets/issues), для которой действительно требуется задание.
2. Добавьте новое задание в папку `org.owasp.wrongsecrets.challenges`. Убедитесь, что вы добавили пояснение в `src/main/resources/explanations` и сослались на него в вашем новом классе Challenge.
3. Добавьте модульные, интеграционные тесты и тесты UI по мере необходимости, чтобы показать, что ваше задание работает.
4. Не забудьте настроить задание в `src/main/resources/wrong-secrets-configuration.yaml`.
5. Просмотрите [руководство CONTRIBUTING](https://github.com/owasp/wrongsecrets/blob/HEAD/CONTRIBUTING.md), чтобы настроить среду для разработки и писать хорошие сообщения коммитов.
Для получения более подробной информации обратитесь к [_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-add-a-challenge).
Если вы хотите перенести существующие облачные задания в другое облако: расширьте классы Challenge в пакете `org.owasp.wrongsecrets.challenges.cloud` и убедитесь, что вы добавили требуемый Terraform в отдельную папку с идентификатором облака. Убедитесь, что среда добавлена в `org.owasp.wrongsecrets.RuntimeEnvironment`.
Сотрудничайте с другими участниками проекта, чтобы ваш контейнер работал, и вы могли тестировать в облачной учетной записи.
### Локальное тестирование
Если вы внесли некоторые изменения в кодовую базу или добавили новое задание и хотите точно увидеть, как будет выглядеть контейнер после слияния для тестирования, у нас есть скрипт, который делает это очень простым. Выполните следующие шаги:
1. Убедитесь, что у вас установлен bash и он открыт.
2. Перейдите в .github/scripts.
3. Запустите скрипт docker-create: `bash docker-create.sh`.
- Примечание: Хотите запустить это в вашем minikube? Сначала выполните `eval $(minikube docker-env)`.
4. Следуйте любым выданным инструкциям, возможно, вам потребуется установить/изменить пакеты.
5. Запустите только что созданный контейнер:
- для локального запуска: `docker run -p 8080:8080 -p 8090:8090 jeroenwillemsen/wrongsecrets:local-test-no-vault`
- для запуска в вашем minikube: используйте контейнер `jeroenwillemsen/wrongsecrets:local-test-k8s-vault` в определении вашего развёртывания.
- для запуска с Vault в вашем minikube: используйте контейнер `jeroenwillemsen/wrongsecrets:local-test-local-vault` в определении вашего развёртывания.
### Локальное автоматизированное тестирование
У нас сейчас есть 2 разных тестовых набора, оба запускаются командой `./mvnw test`.
- Обычный набор JUnit тестов: модульные и интеграционные тесты, расположенные в папке [`test/java`](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/java) с выводом в каталог по умолчанию target.
- Набор тестов Cypress, интегрированный с помощью JUnit теста, расположенный в папке [`test/e2e`](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/e2e) с выводом в [`target/test-classes/e2e/cypress/reports/`](https://github.com/owasp/wrongsecrets/blob/HEAD/target/test-classes/e2e/cypress/reports/). Подробнее см. в [cypress readme](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/e2e/cypress/README.md).
Примечание: Вы можете выполнить полный цикл очистки, сборки и тестирования с помощью `./mvnw clean install`.
## 🔧 Устранение неполадок
### Часто встречающиеся проблемы
**Проблемы с Docker:**
- **Порт уже занят**: Измените привязку портов: `docker run -p 8081:8080 -p 8091:8090 jeroenwillemsen/wrongsecrets:latest-no-vault`
- **Docker не найден**: Убедитесь, что Docker установлен и запущен
- **Отказано в доступе**: В Linux возможно потребуется добавить вашего пользователя в группу docker
**Проблемы с браузером:**
- **Не удаётся получить доступ к localhost:8080**: Проверьте, работает ли контейнер Docker, с помощью `docker ps`
- **Задания не загружаются**: Очистите кеш браузера или попробуйте режим инкогнито
**Проблемы с Kubernetes:**
- **Minikube не запускается**: Попробуйте `minikube delete`, затем `minikube start`
- **Pods зависли в состоянии ожидания**: Проверьте ресурсы с помощью `kubectl describe pod <имя-пода>`
**Нужна помощь?**
- Проверьте наши [GitHub Issues](https://github.com/OWASP/wrongsecrets/issues)
- Присоединяйтесь к нам в [OWASP Slack](https://owasp.slack.com/archives/C02KQ7D9XHR)
- Просмотрите раздел [Поддержка](#support)
## Хотите поиграть, но не имеете возможности установить инструменты?
Если вы хотите пройти задания, но не можете установить инструменты вроде keepass, Radare и т. д., однако вам разрешено запускать контейнеры Docker, попробуйте следующее:```shell
docker run -p 3000:3000 -v /var/run/docker.sock:/var/run/docker.sock jeroenwillemsen/wrongsecrets-desktop:latest
или используйте что-то более настраиваемое:```shell
docker run -d
--name=webtop
--security-opt seccomp=unconfined
-e PUID=1000
-e PGID=1000
-e TZ=Europe/London
-e SUBFOLDER=/
-e KEYBOARD=en-us-qwerty
-p 3000:3000
-v /var/run/docker.sock:/var/run/docker.sock
--shm-size="2gb"
--restart unless-stopped
jeroenwillemsen/wrongsecrets-desktop:latest
А затем на [http://localhost:3000](http://localhost:3000).
Примечание: будьте осторожны при попытке развернуть контейнер `jeroenwillemsen/wrongsecrets-desktop` в Heroku ;-).
## Docker на macOS с M1 и Colima (Экспериментально!)
ПРИМЕЧАНИЕ: Мы официально не поддерживаем Colima, так как видим, что у Github runner'ов с ним много проблем.
Если вы не можете переключиться на Docker Desktop/Podman и хотите использовать Colima с Apple Silicon M1 для запуска Docker-образа `jeroenwillemsen/wrongsecrets`, попробуйте один из вариантов:
- отключите Colima (`colima stop`)
- измените контекст Docker (`docker --context desktop-linux run -p 8080:8080 jeroenwillemsen/wrongsecrets:latest-no-vault`)
- запустите Colima с 1 CPU (`colima start -m 8 -c 1 --arch x86_64`)
## Хотите отключить испытания в вашем собственном релизе?
Если вы хотите запустить WrongSecrets, но без некоторых испытаний, которые вы не хотите показывать другим, пожалуйста, прочитайте этот раздел.
*_ПРИМЕЧАНИЕ_* Обратите внимание, что мы не предоставляем поддержку вашему форку, если вы следуете описанному ниже процессу. Пожалуйста, понимайте, что лицензия и авторские права оригинального приложения остаются неизменными для вашего форка.
Требования:
- Установите JDK Java 25;
- Имейте учетную запись в реестре, куда вы можете отправить свой вариант контейнера WrongSecrets;
Вот шаги, которые необходимо выполнить для создания собственного релиза WrongSecrets с отключенными определёнными испытаниями:
1. Сделайте форк репозитория.
2. В файле `src/main/resources/wrong-secrets-configuration.yaml` удалите ссылку на испытание, которое больше не хотите иметь в своём форке.
3. В корне проекта выполните `./mvnw clean install`
4. Теперь соберите Docker-образ для вашей целевой платформы:```sh
docker buildx create --name mybuilder
docker buildx use mybuilder
docker buildx build --platform linux/amd64,linux/arm64 -t <registry/container-name>:<yourtag>-no-vault --build-arg "argBasedPassword='this is on your command line'" --build-arg "PORT=8081" --build-arg "argBasedVersion=<yourtag>" --build-arg "spring_profile=without-vault" --push
docker buildx build --platform linux/amd64,linux/arm64 -t <registry/container-name>:<yourtag>-kubernetes-vault--build-arg "argBasedPassword='this is on your command line'" --build-arg "PORT=8081" --build-arg "argBasedVersion=<yourtag>" --build-arg "spring_profile=kubernetes-vault" --push
Хотите узнать больше? Ознакомьтесь с источниками ниже: