
تطبيق ضعيف مع أمثلة توضح كيفية عدم استخدام الأسرار
مرحبًا بك في لعبة OWASP WrongSecrets! اللعبة مليئة بأمثلة من الحياة الواقعية حول كيفية عدم تخزين الأسرار في برامجك. كل من هذه الأمثلة مُلتقط في تحدي، والذي تحتاج إلى حله باستخدام أدوات وتقنيات متنوعة. حل هذه التحديات سيساعدك في التعرف على الأخطاء الشائعة ويمكن أن يساعدك في التفكير في استراتيجية إدارة الأسرار الخاصة بك.
هل يمكنك حل جميع التحديات الـ 67؟
جرّب بعضها على بيئة العرض التجريبي لهيروكو.
هل تريد لعب التحديات الأخرى؟ اقرأ التعليمات حول كيفية إعدادها أدناه.
هل أنت جديد في WrongSecrets؟ ابدأ من هنا:
ثم افتح http://localhost:8080 3. هل تريد رؤية ما هو قادم؟ جرّب حاوية الماستر المتطورة لدينا بأحدث الميزات: ```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، لذا قد يستغرق الأمر بعض الوقت قبل الرد.
حقوق الطبع والنشر (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
🚀 هل تريد تجربة الإصدار الأحدث؟
إذا كنت تريد رؤية ما سيأتي في الإصدار القادم، يمكنك استخدام حاوية master المبنية تلقائيًا:```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 للحصول على الوظائف الكاملة. راجع [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 حزمة دعم مذهلة للمصادر المفتوحة، مما يسمح لنا بتشغيل التطبيق هناك مجانًا، حيث يكون دائمًا قيد التشغيل تقريبًا. مع ذلك، يُرجى عدم إجراء اختبارات ضارة أو محاولة تعطيله: فأنت بذلك ستفسد الأمر على الآخرين الذين يرغبون في تجربته. استخدم [هذا الرابط](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 الأساسي
هل تريد تشغيل الإصدار الأساسي على 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، في حقل webHook 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 UI عن طريق تجاوز SPRINGDOC_UI و SPRINGDOC_DOC عند تشغيل حاوية Docker.
القادة:
أفضل المساهمين:
المساهمون:
المختبرون:
شكر خاص:
نود أن نشكر الأطراف التالية على مساعدتنا:
GitGuardian لرعايتهم التي تسمح لنا بدفع فواتير حساباتنا السحابية.
Jetbrains لترخيص نسخة من Intellij IDEA Ultimate edition لقادة المشروع. لم نكن لنكون بهذه السرعة في التطوير بدونها!
1Password لمنحنا ترخيص مفتوح المصدر لـ 1Password لاختبار كشف الأسرار.
AWS لمنحنا رصيد AWS مفتوح المصدر الذي نستخدمه لاختبار مشروعنا وإعداد Wrongsecrets CTF Party على AWS.
يمكنك مساعدتنا بالطرق التالية:
نظرًا لظهور الكثير من أدوات كشف الأسرار لكل من Docker و Git، فإننا ننشئ منصة اختبار معيارية لها. هل تريد معرفة ما إذا كانت أداتك تكتشف كل شيء؟ سنقوم بتتبع الأسرار المضمنة في هذه المشكلة ولدينا فرع نضع فيه أسرارًا إضافية لأداتك لاكتشافها. سيحتوي الفرع على سكريبت إنشاء حاوية Docker يمكنك من خلاله اختبار فحص أسرار الحاوية الخاص بك.
نقدم الآن سير عمل آلي لـ GitHub Action يقارن بين أدوات فحص الأسرار المتعددة مقابل قاعدة أكواد WrongSecrets. يقوم سير عمل مقارنة الماسحات باختبار 7 أدوات مختلفة:
يعمل سير العمل أسبوعياً ويوفر جدول مقارنة يوضح عدد الأسرار التي يكتشفها كل أداة، مما يساعدك على فهم الفعالية النسبية لأدوات فحص الأسرار المختلفة. انظر docs/scanner-comparison.md لمزيد من التفاصيل حول تشغيل النتائج وتفسيرها.
لدينا 3 طرق للعب CTF:
هل تريد استخدام CTFD للعب CTF بناءً على مثيل Heroku المجاني wrongsecrets-ctf مع CTFD؟ يمكنك ذلك!
ملاحظة: يعمل دعم CTFD الآن بناءً على Juiceshop CTF CLI.
ملاحظة-II: https://wrongsecrets-ctf.herokuapp.com (معطل مؤقتًا بسبب نقص أرصدة المصدر المفتوح) يعتمد على 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 الفعلي غير معرضة للجمهور، على غرار حاوية heroku الخاصة بنا.
## دعم FBCTF (تجريبي!)
ملاحظة: دعم FBCTF تجريبي.
اتبع نفس الخطوات المتبعة مع CTFD، لكن اختر الآن fbctfd وكرابط لتعيين الدولة (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-checker عن طريق استدعاء `mvn dependency-check:aggregate` و `mvn cyclonedx:makeBom` لاستخدام CycloneDX لإنشاء قائمة مكونات البرامج (SBOM).
### تكوين البرنامج المساعد لـ Dependency-Check في Maven
يستخدم OWASP WrongSecrets البرنامج المساعد [`dependency-check-maven`](https://jeremylong.github.io/DependencyCheck/dependency-check-maven/index.html) لفحص تبعيات المشروع تلقائيًا بحثًا عن الثغرات الأمنية المعروفة (CVEs).
#### كيف يعمل
- يتم تشغيل البرنامج المساعد أثناء بناء Maven (`./mvnw clean install`) ويفحص جميع التبعيات مقابل قواعد بيانات الثغرات الأمنية العامة.
- بشكل افتراضي، يستخدم NVD (قاعدة بيانات الثغرات الوطنية) ويمكنه أيضًا استخدام مؤشر OSS لتغطية إضافية.
#### أبرز نقاط التكوين
تم تكوين البرنامج المساعد في ملف `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 Plugin الخاصة بـ 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. قم بعمل Fork و clone للمشروع كما هو موضح في [التوثيق](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`. يتم ذلك عن طريق تعيين وسائط خيارات VM إلى `--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).
لا تتردد في التعديل واقتراح التغييرات عبر طلبات السحب. تأكد من اتباع إرشاداتنا في [التوثيق](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md) ليتم قبول عملك.
يرجى ملاحظة أننا ندعم رسميًا فقط Linux و MacOS للتطوير. إذا كنت ترغب في التطوير باستخدام جهاز Windows، فاستخدم WSL2 أو جهازًا افتراضيًا يعمل بنظام Linux. لقد قمنا بتضمين كشف عن Windows ومجموعة من ملفات `exe` لتجربة أولية، لكننا نبحث عن مشرفين نشطين لها. هل تريد التأكد من أنها تعمل على Windows؟ أنشئ طلبات سحب ;-).
إذا، بعد قراءة هذا القسم، لا تزال ليس لديك فكرة عن كود التطبيق: ألق نظرة [على بعض الدروس التعليمية حول 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 للملف الذي قمت بتغييره للتو، وهذا سيفرض إعادة تحميل التطبيق.
### كيفية إضافة تحدي
اتبع الخطوات أدناه لإضافة تحدي:
1. أولاً، تأكد من أن لديك [Issue](https://github.com/OWASP/wrongsecrets/issues) مبلغ عنها حيث أن التحدي مطلوب حقًا.
2. أضف التحدي الجديد في مجلد `org.owasp.wrongsecrets.challenges`. تأكد من إضافة شرح في `src/main/resources/explanations` والإشارة إليه من فئة التحدي الجديدة الخاصة بك.
3. أضف اختبارات الوحدة والتكامل وواجهة المستخدم حسب الاقتضاء لإظهار أن التحدي الخاص بك يعمل.
4. لا تنس تكوين التحدي في `src/main/resources/wrong-secrets-configuration.yaml`
5. راجع [دليل المساهمة](https://github.com/owasp/wrongsecrets/blob/HEAD/CONTRIBUTING.md) لإعداد بيئة المساهمة الخاصة بك وكتابة رسائل commit جيدة.
لمزيد من التفاصيل، يرجى الرجوع إلى [_Contributing.md_](https://github.com/OWASP/wrongsecrets/blob/master/CONTRIBUTING.md#how-to-add-a-challenge).
إذا كنت ترغب في نقل التحديات السحابية الحالية إلى سحابة أخرى: قم بتوسيع فئات التحديات في حزمة `org.owasp.wrongsecrets.challenges.cloud` وتأكد من إضافة Terraform المطلوبة في مجلد مع تحديد السحابة المنفصلة. تأكد من إضافة البيئة إلى `org.owasp.wrongsecrets.RuntimeEnvironment`.
تعاون مع الآخرين في المشروع لتشغيل الحاوية الخاصة بك حتى تتمكن من الاختبار على حساب السحابة.
### الاختبار المحلي
إذا قمت بإجراء بعض التغييرات على قاعدة الكود أو أضفت تحديًا جديدًا وترغب في رؤية كيف ستبدو الحاوية بالضبط بعد الدمج للاختبار، لدينا سكريبت يجعل هذا سهلاً للغاية. اتبع الخطوات أدناه:
1. تأكد من تثبيت bash وأنه مفتوح.
2. انتقل إلى .github/scripts.
3. قم بتشغيل سكريبت إنشاء docker: `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` في تعريف النشر الخاص بك.
### الاختبار الآلي المحلي
لدينا حاليًا مجموعتان مختلفتان من الاختبارات، يتم تشغيلهما باستخدام `./mvnw test`.
- مجموعة اختبارات junit عادية لاختبارات الوحدة والتكامل، موجودة في مجلد [`test/java`](https://github.com/owasp/wrongsecrets/blob/HEAD/src/test/java) مع تخزين المخرجات في دليل الهدف الافتراضي.
- مجموعة اختبارات 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/). راجع [ملف readme الخاص بـ cypress](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 <pod-name>`
**هل تحتاج إلى مساعدة؟**
- اطلع على [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 تواجه الكثير من المشكلات معه.
إذا لم تتمكن من التبديل إلى 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 ولكن بدون بعض التحديات التي لا تريد عرضها للآخرين، يرجى قراءة هذا القسم.
*_ملاحظة_* يرجى ملاحظة أننا لا نقدم أي دعم لمشروع fork الخاص بك عندما تتبع العملية أدناه. يرجى فهم أن الترخيص وحقوق النشر للتطبيق الأصلي تظل سليمة لمشروع Fork الخاص بك.
المتطلبات:
- أن يكون لديك JDK لجافا 25 مثبتاً؛
- أن يكون لديك حساب في سجل يمكنك من دفع نسختك من حاوية WrongSecrets إليه؛
فيما يلي الخطوات التي يجب عليك اتباعها لإنشاء إصدارك الخاص من WrongSecrets مع تعطيل بعض التحديات:
1. عمل Fork للمستودع.
2. في `src/main/resources/wrong-secrets-configuration.yaml` قم بإزالة المرجع للتحدي الذي لم تعد ترغب في وجوده في Fork الخاص بك.
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
هل تريد معرفة المزيد؟ اطلع على المصادر أدناه: