تحكّم في الإصدارات حسب عتبة الخطورة، وصدّر مخرجات SARIF/JSON/HTML، وحافظ على اتساق الفحوص الأمنية في الـ CI.
معرّفات قواعد SARIF (محرك الإصدار v0.2+) تأخذ الشكل fendix.<category>.<title-slug>. يجب إعادة توليد خطوط الأساس أو الاستثناءات في المسار المرتبطة بمعرّفات القواعد القديمة لكل حالة وفق صيغة SARIF الجديدة.
v0.5+: تدفّق عمل جاهز لـ GitHub Actions · v0.14+: قوالب أصلية لـ GitLab CI وCircleCI · v0.16+: خطّاف ما قبل الالتزام (fendix hook install) وفحوص مدركة للفروق عند كل التزام
يوجد تدفّق عمل مرجعي كامل لـ GitHub Actions في examples/github-actions/fendix-scan.yml — فحص + خط أساس مُخزَّن مؤقتًا + رفع SARIF + تعليق ملخص على الـ PR + بوابة --fail-on HIGH. ضعه في .github/workflows/ ليعمل على كل PR. ولـ GitLab CI وCircleCI، شغّل fendix init --ci gitlab أو fendix init --ci circleci لتوليد ملف إعداد أصلي.
جديد في v0.7: تطبيق GitHub (فحوص PR دون إعداد)
تجاوز ملفات YAML لتدفّق العمل تمامًا. ثبّت تطبيق Fendix على GitHub في المستودع، وكل pull_request يُفتح أو يُزامَن أو يُعاد فتحه يُطلق فحصًا هجينًا تلقائيًا — استنساخ لـ head SHA فقط (دون السجل)، ثم fendix scan، يليه تعليق Markdown على الـ PR ورفع SARIF إلى تبويب Code Scanning. الإعداد: docs/github-app.md يغطّي تسجيل التطبيق عبر app/manifest.yml والاستضافة الذاتية لـ fendix-app عبر Dockerfile.app (صورة عديمة الحالة بحجم ~250 ميبي بايت، تعمل على Fly.io / Cloud Run / Render / Railway / ECS / k8s دون تغيير).
- name: Run Fendix scan
run: |
fendix scan \
--url ${{ secrets.API_URL }} \
--format sarif \
--fail-on HIGH \
--baseline ./baseline.json \
--save-baseline ./baseline.json \
--output fendix.sarif
- name: Upload SARIF
if: always()
uses: github/codeql-action/upload-sarif@v3
with:
sarif_file: fendix.sarif# Generate a native GitLab CI template (saves as .gitlab-ci.yml)
fendix init --ci gitlab
# The generated job (or paste manually):
fendix_scan:
image: ghcr.io/abdel-rahmansaied/fendix:latest
script:
- fendix scan
--url "$API_URL"
--format json
--fail-on HIGH
--baseline ./baseline.json
--save-baseline ./baseline.json
--output fendix.json
artifacts:
paths: [fendix.json, baseline.json]# Generate a native CircleCI config (saves as .circleci/config.yml)
fendix init --ci circleci
# The generated orb step (or paste manually):
version: 2.1
jobs:
security-scan:
docker:
- image: ghcr.io/abdel-rahmansaied/fendix:latest
steps:
- checkout
- run:
name: Fendix scan
command: |
fendix scan \
--url "$API_URL" \
--code ./src \
--format sarif \
--fail-on HIGH \
--output fendix.sarif
- store_artifacts:
path: fendix.sarifsh '''
fendix scan \
--url $API_URL \
--code ./src \
--format html \
--fail-on HIGH \
--save-baseline ./baseline.json \
--output fendix.html
'''services:
fendix:
image: ghcr.io/abdel-rahmansaied/fendix:latest
command: >
scan --url http://api:8080
--code /workspace/src
--format json --fail-on HIGH
--save-baseline /workspace/baseline.json
--output /workspace/results.json
volumes:
- .:/workspace# Idempotent: creates issues on first run, updates on re-run, skips already-filed
fendix jira \
--findings fendix.json \
--project SEC \
--server https://your-org.atlassian.net
# Environment variables (recommended over flags):
# FENDIX_JIRA_TOKEN=<personal-access-token>
# FENDIX_JIRA_USER=you@example.com
# FENDIX_JIRA_SERVER=https://your-org.atlassian.net
# FENDIX_JIRA_PROJECT=SEC# Slack webhook
fendix notify \
--findings fendix.json \
--slack-webhook "$SLACK_WEBHOOK_URL"
# Microsoft Teams webhook
fendix notify \
--findings fendix.json \
--teams-webhook "$TEAMS_WEBHOOK_URL"
# Both at once, only notify on HIGH+
fendix notify \
--findings fendix.json \
--slack-webhook "$SLACK_WEBHOOK_URL" \
--teams-webhook "$TEAMS_WEBHOOK_URL" \
--min-severity HIGHإلى جانب مقتطفات CI، تتيح لك واجهة Fendix SaaS بدء الفحوصات برمجيًا، وقراءة لوحة تحكم مجمّعة، و— مع مشغّل ذاتي الاستضافة — دفع فحوصات الأهداف الخاصة أو الداخلية مباشرةً إلى مساحة عملك. صادِق باستخدام X-API-Key (بادئة fx_، خطة Pro فما فوق).
المشغّلات ذاتية الاستضافة تصل إلى ما لا تصل إليه السحابة.
المشغّل هو وكيل تستضيفه داخل شبكتك. يلتقط المهام المُدرجة، ويُشغّل المحرّك على الأهداف الخاصة، ويُرسل تقرير JSON إلى لوحة التحكم — فتظهر واجهات API الداخلية وفحوصات الشيفرة جنبًا إلى جنب مع بقية النتائج. يتطلّب ميزة self_hosted_runners في خطة Enterprise.
# Launch a scan via the API (X-API-Key, fx_ prefix, shown once at creation)
curl -X POST https://api.fendix.dev/api/scans \
-H "X-API-Key: $FENDIX_API_KEY" \
-H 'Content-Type: application/json' \
-d '{ "mode": "blackbox", "url": "https://api.example.com", "fail_on": "high" }'
# Poll one scan (returns a {scan, findings} envelope)
curl https://api.fendix.dev/api/scans/$SCAN_ID -H "X-API-Key: $FENDIX_API_KEY"# Workspace overview: totals, severity + category breakdowns, 8-week trend.
# Scope to one org with ?organization=<uuid>, or omit for personal scans.
curl "https://api.fendix.dev/api/dashboard?organization=$ORG_ID" \
-H "X-API-Key: $FENDIX_API_KEY"
# → { total_scans, total_findings, by_severity, by_category, recent_scans, trend }# Self-hosted runner (Enterprise): scan private/internal targets in-network
# and push results to the dashboard. Register once (org admin) → fxr_ token.
TOKEN="fxr_..."
# Claim the next queued job (atomic) → or 204 No Content
curl -X POST https://api.fendix.dev/api/runners/claim -H "X-Runner-Token: $TOKEN"
# Run the engine locally, then submit the JSON report
fendix scan --code /repo --format json --output report.json
curl -X POST "https://api.fendix.dev/api/runners/jobs/$SCAN_ID/result" \
-H "X-Runner-Token: $TOKEN" -H 'Content-Type: application/json' \
--data-binary @report.json