العودة إلى التحديثات
New releaseJul 25, 2026

sbomlyze v0.3.5

git diff لـ SBOM الخاص بك، مقارنة قوائم المواد CycloneDX/SPDX/Syft، اكتشاف التلاعب، وضبط CI

مشاركة

sbomlyze

git diff لقوائم SBOM الخاصة بك. قارن بين قائمتين لقائمة مواد البرمجيات (SBOM) وشاهد ما الذي تغيّر بين البنيات والإصدارات والنسخ.

يقارن sbomlyze تجزئات المكونات، وليس سلاسل أرقام الإصدارات فقط. عندما يستبدل مهاجم حزمة دون تغيير رقم إصدارها، يشير sbomlyze إلى ذلك. مولّدات القوائم وماسحات الثغرات لا تلتقط هذا الأمر.

[![CI][ci-img]][ci] [![GitHub Marketplace][marketplace-img]][marketplace] [![GitHub Release][release-img]][release] [![Go Report Card][go-report-img]][go-report] [![OpenSSF Scorecard][scorecard-img]][scorecard] [![License: Apache-2.0][license-img]][license] [![Downloads][download-img]][download]

يمنع SBOMlyze تغيير تجزئة بنفس رقم الإصدار في طلب سحب حقيقي

اكتشف لماذا تختلف هذه الإشارة عن فرق ملف البيان أو فرق المكونات العادي في فرق البيان مقابل فرق SBOM مقابل انحراف السلامة.

مولّدات SBOM تُنشئ القوائم وماسحات الثغرات تبحث عن CVEs. يخبرك sbomlyze بما تغيّر بين قائمتي SBOM وما إذا كان بإمكانك الوثوق بذلك. شغّله بعد المولّد الخاص بك: syft image:tag -o cyclonedx-json | sbomlyze - --compliance يحلّل قائمة SBOM المولّدة ويقيّمها دون الحاجة إلى ملف مؤقت. قارنها بخط أساس لتصنيف الانحراف وضبط خط أنابيبك.

بدء سريع باستخدام GitHub Action

أضِف [فرق SBOMlyze من GitHub Marketplace][marketplace] لمقارنة قائمة SBOM مُضمّنة أو مولّدة بشكل منفصل مع خط أساس git الخاص بها. قيمة SHA الثابتة أدناه هي الإجراء v0.5.1 المنشور:```yaml steps:

  • uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0

  • uses: rezmoss/sbomlyze@31503690611fda8ebba4ed2bd186eda000442594 # v0.5.1 with: sbom-path: build/sbom.cdx.json

ينشئ الإجراء ملخص Job Summary افتراضيًا ويمكنه فرض السياسات، والإبلاغ عن انحراف السلامة، ورفع SARIF، أو الحفاظ على تعليق واحد لطلب السحب. راجع [مرجع الإجراء الكامل](https://github.com/rezmoss/sbomlyze/blob/HEAD/ACTION.md) للمدخلات والمخرجات والأذونات وإرشادات الأمان. راجع [مستودع العرض التوضيحي المباشر](https://github.com/rezmoss/sbomlyze-action-demo) لتحديث تبعية ناجح وتغيير hash محجوب بنفس الإصدار، مع تشغيلات سير عمل عامة وأدلة SARIF.

للاستخدام الذاتي الخاص بالصيغة، استخدم المثال العام
[Go + SPDX](https://github.com/rezmoss/sbomlyze-go-spdx-demo)،
[Node + CycloneDX](https://github.com/rezmoss/sbomlyze-node-cyclonedx-demo)، أو
[الحاوية](https://github.com/rezmoss/sbomlyze-container-demo). يحتوي كل منها على خمسة سيناريوهات مراجعة قابلة للتكرار. يجمع [دليل beta لمدة 10 دقائق](https://github.com/rezmoss/sbomlyze/blob/HEAD/BETA.md) أربعة أسئلة مركّزة حول التفعيل وجودة الإشارة.

لا تحتاج ملفات SBOM الناتجة إلى الالتزام بها (commit): يسترد `baseline: workflow-artifact` أحدث قطعة أثرية مطابقة من تشغيل ناجح للفرع الافتراضي. يُظهر [سير عمل Syft المصاحب المثبّت](https://github.com/rezmoss/sbomlyze/blob/HEAD/examples/workflows/syft-companion.yml) التوليد ونشر الخط الأساسي بينما يظل SBOMlyze مسؤولًا عن المراجعة والسياسة.

## لماذا sbomlyze؟

تولّد العديد من الأدوات ملفات SBOM. القليل منها يقارن بينها، وعدد أقل يخبرك ما إذا كان التغيير روتينيًا أم علامة خطر في سلسلة التوريد. يسدّ sbomlyze هذه الفجوة.

| القدرة | **sbomlyze** | cyclonedx-cli | sbomqs | syft / trivy |
|---|:---:|:---:|:---:|:---:|
| مقارنة **diff** بين SBOM وSBOM | ✅ | أساسي | ❌ | ❌ |
| انحراف **السلامة / العبث** (تغيّر hash دون تغيير الإصدار) | ✅ | ❌ | ❌ | ❌ |
| فرق الرسم البياني للتبعيات + خطر العمق غير المباشر | ✅ | ❌ | ❌ | ❌ |
| تسجيل امتثال **NTIA / CISA / BSI** | ✅ | ❌ | ✅ | ❌ |
| تحويل الصيغة (Syft / CycloneDX / SPDX) | ✅ | ✅ | ❌ | جزئي |
| مستكشفات **TUI + Web UI** | ✅ | ❌ | ❌ | ❌ |
| بوابة السياسة + SARIF / JUnit / Markdown / HTML / Patch | ✅ | جزئي | جزئي | جزئي |

## الميزات

- **مقارنة SBOM**: قارن بين ملفي SBOM وشاهد المكونات المضافة والمحذوفة والمتغيرة في لمحة واحدة
- **تصنيف الانحراف**: ميِّز انحراف الإصدار عن **انحراف السلامة** (تغيّر hash دون تغيير الإصدار، مما يشير إلى العبث) وانحراف البيانات الوصفية
- **تسجيل الامتثال**: قيّم أي SBOM مقابل الحد الأدنى من عناصر **NTIA** و**CISA 2025** و**BSI TR-03183**
- **فرق الرسم البياني للتبعيات**: تتبّع التبعيات غير المباشرة وعمق سلسلة التوريد
- **دعم متعدد الصيغ**: Syft وCycloneDX وSPDX (JSON)
- **تحويل الصيغ**: التحويل بين صيغ CycloneDX وSPDX وSyft
- **مطابقة هوية قوية**: PURL → CPE → BOM-ref → أسبقية namespace/name
- **وضع الإحصاءات**: تحليل ملفات SBOM فردية لمقاييس الترخيص والتبعية والسلامة
- **وضع TUI التفاعلي**: استكشف ملفات SBOM باستخدام التنقل عبر لوحة المفاتيح والبحث
- **وضع Web UI**: مستكشف SBOM قائم على المتصفح مع رفع بالسحب والإفلات
- **محرك السياسات**: فرض قواعد الانحراف والترخيص وتسجيل الامتثال في مسارات CI
- **إجراء GitHub Marketplace**: تحكم في طلبات السحب عبر انحراف SBOM مع Job Summary وSARIF وإخراج تعليق اختياري
- **كشف التكرار والتصادم**: اعثر على إصدارات متعددة من الحزمة نفسها ومطابقات هوية غامضة
- **صيغ إخراج متعددة**: Text وJSON وSARIF وJUnit XML وMarkdown وHTML وJSON Patch
- **تحليل متسامح**: متابعة الأخطاء مع تحذيرات منظمة

## التثبيت

### Homebrew (macOS/Linux)```bash
brew install rezmoss/sbomlyze/sbomlyze

سكربت التثبيت

يقوم سكربت التثبيت بتنزيل الملف الثنائي الصحيح لنظام التشغيل/البنية لديك:```bash

Install to ./bin

curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh

Install to /usr/local/bin (requires sudo)

curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sudo sh -s -- -b /usr/local/bin

Install specific version

curl -sSfL https://raw.githubusercontent.com/rezmoss/sbomlyze/main/install.sh | sh -s -- -v 0.4.0

**خيارات المثبّت:**

| الخيار | الوصف |
|--------|-------------|
| `-b <dir>` | دليل التثبيت (الافتراضي: `./bin`) |
| `-d` | تفعيل مخرجات التصحيح |
| `-v <ver>` | تثبيت إصدار محدد (الافتراضي: الأحدث) |

يتحقق المثبّت دائمًا من المجموع الاختباري للإصدار. عند تثبيت GitHub CLI متوافق،
يتحقق أيضًا من مصدر بناء الإصدار ويتوقف عن العمل إذا لم ينجح هذا التحقق.

### التثبيت عبر Go```bash
go install github.com/rezmoss/sbomlyze/cmd/sbomlyze@latest

من الإصدار الثنائي

قم بتنزيل أحدث إصدار ثنائي من إصدارات GitHub.

ابتداءً من v0.3.7، تُنشر أرشيفات الإصدارات مع تصديقات الأرتيفاكت الخاصة بـ GitHub. تحقق من التنزيل بشكل مستقل باستخدام:```bash gh attestation verify ./sbomlyze_0.4.0_Linux_x86_64.tar.gz
--repo rezmoss/sbomlyze
--signer-workflow rezmoss/sbomlyze/.github/workflows/release.yml

تمت إزالة تعليمات مستودعات apt وrpm وapk غير الموقعة حتى
تدعم المستودعات التحقق من التوقيع الأصلي لمدير الحزم.

**مستخدمو macOS:** قم بإزالة علامة العزل بعد التنزيل:```bash
xattr -d com.apple.quarantine ./sbomlyze
chmod +x ./sbomlyze

البناء من المصدر```bash

git clone https://github.com/rezmoss/sbomlyze.git cd sbomlyze go build -o sbomlyze ./cmd/sbomlyze

## البدء السريع```bash
# Compare two SBOMs (the headline use case)
sbomlyze before.json after.json

# Analyze a single SBOM
sbomlyze image.json

# Read an SBOM from standard input
syft image:tag -o cyclonedx-json | sbomlyze -

# Use standard input on either side of a diff
syft image:tag -o cyclonedx-json | sbomlyze baseline.json -

# Score an SBOM against NTIA / CISA / BSI minimum elements
sbomlyze image.json --compliance

# Interactive TUI explorer
sbomlyze image.json -i

# Web UI (opens browser)
sbomlyze -web

# Convert between SBOM formats
sbomlyze convert syft.json --to spdx
sbomlyze convert cdx.json --to syft -o output.json

# JSON output for CI integration
sbomlyze before.json after.json --json

# SARIF output for GitHub Code Scanning
sbomlyze before.json after.json --format sarif

# Markdown report for PR comments
sbomlyze before.json after.json --format markdown

# Apply policy checks
sbomlyze before.json after.json --policy policy.json

الاستخدام```

sbomlyze <sbom1|-> [sbom2|-] [options] sbomlyze convert <sbom|-> --to [-o output]

Modes: Single file: sbomlyze [--json] Show statistics Interactive: sbomlyze -i Interactive explorer Convert: sbomlyze convert --to Convert SBOM format Web server: sbomlyze -web [--port 8080] Web UI explorer Two files: sbomlyze [...] Show diff

Use - in place of one SBOM path to read it from standard input.

Options: -i, --interactive Interactive TUI explorer -web, --web Start web UI server --port Web server port (default 8080) --json Output in JSON format (shortcut for --format json) --format Output format: text, json, sarif, junit, markdown, html, patch --compliance Show NTIA/CISA/BSI compliance scoring --policy Policy file for CI checks --strict Fail on parse warnings --tolerant Continue on parse warnings (default) --no-pager Disable automatic paging of output --to Target format for convert: cyclonedx (cdx), spdx, syft -o, --output Output file for convert (default: stdout) --version, -v Show version information --help, -h Show this help message

## الأوامر

### وضع الإحصائيات (ملف واحد)

تحليل SBOM للحصول على رؤى حول المكونات والتراخيص والتبعيات.```bash
sbomlyze image.json

يشمل الإخراج سياق الفحص، والنتائج الرئيسية المكتشفة تلقائيًا، والإحصائيات:``` Scan Context: Tool: syft 1.40.1 Schema: 16.0.18 Scan Scope: all-layers Source Type: image Source: alpine:latest

Key Findings: 💻 OS/Distro: Alpine Linux v3.21 📦 Dominated by apk: 71 of 71 packages (100.0%) 📂 8,542 files tracked on filesystem 🔗 Relationships: 71 containment + 64 dependency 📜 License profile: 72% permissive, 20% copyleft ⚠️ Low hash coverage: 0.0% (71 of 71 missing) 🔍 Top catalogers: apkdb-cataloger (71)

📦 SBOM Statistics

Total Components: 71

By Package Type: apk 71

Licenses: With license: 71 Without license: 0

Top Licenses: MIT 17 BSD-3-Clause 8 GPL-2.0-only 8

Integrity: With hashes: 0 Without hashes: 71

Dependencies: Components with deps: 65 Total dep relations: 176

#### النتائج الرئيسية

يقوم sbomlyze تلقائيًا بتوليد رؤى حول ملف SBOM الخاص بك. بالنسبة لتحليل ملف واحد، تشمل هذه:

| الاكتشاف | الوصف |
|---------|-------------|
| **اكتشاف نظام التشغيل/التوزيعة** | يحدد نظام التشغيل أو التوزيعة من بيانات SBOM الوصفية |
| **النظام البيئي المهيمن** | يبلغ عندما يهيمن نوع حزمة واحد (>60% من جميع الحزم) |
| **بصمة نظام الملفات** | عدد الملفات المتعقبة على نظام الملفات |
| **كثافة العلاقات** | عدد علاقات الاحتواء والاعتماد على |
| **النقاط الساخنة للمواقع** | الدلائل الأعلى التي توجد فيها المكونات |
| **ملف مخاطر الترخيص** | توزيع نسب التراخيص المسموحة/الحمائية/غير المعروفة |
| **تحذيرات جودة البيانات** | تنبيهات عند انخفاض تغطية الترخيص (<50%) أو التجزئة (<50%) أو PURL (<80%) |
| **تحذيرات التكرار** | يعلّم مجموعات المكونات المكررة |
| **تفصيل المفهرس** | أفضل الماسحات/المفهرسات التي اكتشفت المكونات (ملفات Syft SBOM) |

#### مقاييس التغطية

يحسب وضع الإحصائيات نسب التغطية لتقييم جودة البيانات:

| المقياس | الوصف |
|--------|-------------|
| **تغطية PURL** | النسبة المئوية للمكونات التي تحتوي على روابط حزم PURL |
| **تغطية CPE** | النسبة المئوية للمكونات التي تحتوي على CPEs (الجاهزية لفحص الثغرات) |
| **تغطية الترخيص** | النسبة المئوية للمكونات التي تحتوي على ترخيص واحد على الأقل |
| **تغطية التجزئة** | النسبة المئوية للمكونات التي تحتوي على تجزئات تكامل |

#### تصنيف التراخيص

يتم تصنيف التراخيص تلقائيًا إلى:

| الفئة | أمثلة |
|----------|----------|
| **حمائي (Copyleft)** | GPL, LGPL, AGPL, MPL, EPL, CDDL |
| **مسموح (Permissive)** | MIT, BSD, Apache, ISC, Zlib, Unlicense |
| **الملكية العامة** | إهداءات الملكية العامة |
| **غير معروف** | تراخيص غير معترف بها أو مفقودة |

### وضع التحويل

حوّل ملفات SBOM بين صيغ CycloneDX وSPDX وSyft JSON. يتم اكتشاف صيغة الإدخال تلقائيًا.```bash
# CycloneDX to SPDX
sbomlyze convert image.cdx.json --to spdx

# Syft to CycloneDX (cdx is an alias for cyclonedx)
sbomlyze convert syft-output.json --to cdx

# SPDX to Syft, writing to a file
sbomlyze convert spdx-output.json --to syft -o converted.json

صيغ الهدف المدعومة

الصيغةالقيمة --toالمخرجات
CycloneDX 1.5cyclonedx أو cdxJSON بصيغة CycloneDX مع البيانات الوصفية والتبعيات والخصائص
SPDX 2.3spdxJSON بصيغة SPDX مع الحزم والعلاقات والمراجع الخارجية
SyftsyftJSON بصيغة Syft مع القطع الأثرية والعلاقات والمصدر ومعلومات التوزيعة

ما يتم الحفاظ عليه

يحافظ التحويل على أسماء المكونات وإصداراتها وPURLs وCPEs والتراخيص والتجزئات (hashes) ومعلومات المورّد وعلاقات التبعية. الحقول الخاصة بالصيغة (مثل Syft language وfoundBy وlocations) تُنقل عبر خصائص CycloneDX عند التحويل إلى CDX.

وضع الاختلاف (ملفان)

قارن بين ملفَي SBOM لمعرفة ما تغيّر بين الإصدارات.```bash sbomlyze v1.0.json v2.0.json

#### نظرة عامة على Diff

يبدأ الـ Diff بمقارنة بيانات وصفية جنبًا إلى جنب (أسماء الملفات، الأحجام، معلومات نظام التشغيل، معلومات الأداة، عدد المكونات) متبوعةً بتفاصيل سياق الفحص عند توفّرها.

#### المخرجات```
📊 Drift Summary:
  📦 Version drift:   58 components
  ⚠️  Integrity drift: 1 component (hash changed without version change!)
  📝 Metadata drift:  2 components

🔑 Key Findings:
  📈 Attack surface: +5 packages (7.0%), +120 files (3.2%)
  🚨 2 version downgrades detected: openssl 3.1.4→3.0.2, curl 8.5.0→8.4.0
  🔄 56 version upgrades (2 major, 12 minor, 42 patch) among 65 shared packages
  ⚠️  Integrity drift (1 total): 1 npm (review recommended)
  ❌ python ecosystem entirely removed (15 → 0 packages)
  ➕ New ecosystem: golang (8 packages)
  ✅ Core system packages stable: apk (71) unchanged

+ Added (2):
  + libgcrypt 1.10.3-r0
  + libgpg-error 1.49-r0

- Removed (3):
  - libapk 3.0.3-r1
  - libgcc 15.2.0-r2
  - nghttp3 1.13.1-r0

~ Changed (58):
  ~ nginx
      version: 1.29.4-r1 -> 1.27.3-r1
  ~ suspicious-pkg ⚠️  [INTEGRITY]
      hash[SHA256]: abc123 -> def456

>> Added dependencies:
  pkg:apk/alpine/libxslt: +[so:libgcrypt.so.20]

<< Removed dependencies:
  pkg:apk/alpine/libcurl: -[so:libnghttp3.so.9]

🔗 New transitive dependencies (3):
  + pkg:npm/lodash (depth 2)
    via: [pkg:npm/my-app pkg:npm/express pkg:npm/lodash]
  + pkg:npm/underscore (depth 3)
    via: [pkg:npm/my-app pkg:npm/express pkg:npm/lodash pkg:npm/underscore]

📊 New deps by depth:
  Depth 2:              1
  Depth 3+ (risky):     2 ⚠️

النتائج الرئيسية للفرق

في وضع الفرق، يقوم sbomlyze تلقائيًا بتوليد رؤى أكثر ثراءً لمقارنة كلا ملفَي SBOM:

النتيجةالوصف
عدم تطابق سياق الفحصيحذر إذا تغيّر إصدار المخطط أو نطاق الفحص بين ملفي SBOM
فارق سطح الهجومالتغيرات في عدد الحزم والملفات والعلاقات مع النسب المئوية
أنظمة بيئية اختفت/جديدةأنواع الحزم التي ظهرت أو اختفت بالكامل
الانتقال بين أنظمة التشغيل/التوزيعاتيكتشف التغيرات في نظام التشغيل بين عمليات الفحص
تحليل تغيّر الإصداراتيحسب الترقيات مقابل التخفيضات، ويصنف التغييرات كرئيسية/ثانوية/تصحيحية
تخفيضات الإصداريضع علامة على التخفيضات كإشارة أمنية مع تفاصيل المكوّن
سياق انحراف التكامليفصّل انحراف التكامل حسب نوع الحزمة مع إرشادات المخاطر
أنماط المسارات المهيمنةالتغييرات المركزة حسب النوع ومسار نظام الملفات
نقاط الإزالة/الإضافة الساخنةأكثر الدلائل تأثرًا بالتغييرات
الأنواع المستقرةأنواع الحزم ذات الأعداد المتطابقة (النواة غير المتغيرة)
تحولات فئة الترخيصالتغيرات في توازن الحقوق المتروكة/السماحية
فجوات المفهرسالماسحات التي عثرت على حزم في Before ولكن لا شيء في After

عينات الحزم حسب النوع

يتم تجميع المكونات المضافة والمحذوفة حسب نوع الحزمة مع قوائم عينات، مما يسهل رؤية ما تغيّر في كل نظام بيئي.

تقييم الامتثال

قيّم أي SBOM وفقًا لأطر العناصر الدنيا الثلاثة الرئيسية للإجابة على السؤال الذي يطرحه المدققون وفرق المشتريات باستمرار: "هل هذا SBOM مكتمل بما يكفي؟"```bash

Score a single SBOM

sbomlyze image.json --compliance

Score alongside a diff

sbomlyze before.json after.json --compliance

As JSON for CI

sbomlyze image.json --compliance --json

### الأطر المُقيَّمة

| Framework | Checks | Notable requirements |
|-----------|--------|----------------------|
| **NTIA Minimum Elements** (2021) | 7 | الاسم، الإصدار، المورّد، المعرّفات الفريدة (PURL/CPE)، علاقات التبعية، مؤلف الـSBOM، الطابع الزمني |
| **CISA 2025 Minimum Elements** (Aug 2025 draft) | 10 | يضيف مُنتِج البرمجيات، معلومات الترخيص، **هاش المكوّن**، واسم الأداة إضافةً إلى NTIA |
| **BSI TR-03183-2** (v2.1.0, 2025) | 9 | يتطلب جهة اتصال منشئ المكوّن، **هاش SHA-512**، تراخيص بصيغة SPDX، وجهة اتصال منشئ SBOM |

### عرض النتائج

كل إطار يعرض نسبة مئوية (الفحوصات الناجحة / إجمالي الفحوصات) بالإضافة إلى نتيجة إجمالية (متوسط عبر الأطر)، مع مؤشرات الحالة:

| Indicator | Score |
|-----------|-------|
| 🟢 | ≥ 90% |
| 🟡 | 70–89% |
| 🟠 | 50–69% |
| 🔴 | < 50% |

مخرجات JSON (`--compliance --json`) تتضمن التقرير الكامل مع تفاصيل نجاح/فشل لكل فحص؛ بينما يدمج تنسيق HTML تقرير الامتثال في صفحة التقرير.

### فرض الامتثال في CI

قم بفرض عتبات الامتثال عبر [محرك السياسات](#policy-engine). يؤدي تعيين أي عتبة إلى تفعيل تقييم الامتثال دون علامة `--compliance`:```json
{
  "min_ntia_score": 85,
  "min_cisa_score": 70,
  "min_bsi_score": 80,
  "min_overall_compliance": 75
}

ملخص

PlexureGuard هي أداة تكتشف محاولات تسجيل الدخول بالقوة الغاشمة، وهجمات حجب الخدمة، والوصول غير المصرح به إلى خوادم الوسائط. تعمل كبرنامج وسيط بين المستخدم وPlex، حيث تقوم بتحليل الطلبات الواردة، وتحديد الجهات الضارة، واتخاذ الإجراءات اللازمة لحماية الخادم.

التثبيت

الملفات الثنائية المجمعة مسبقًا

الملفات الثنائية المجمعة مسبقًا لـ PlexureGuard متاحة لمنصات متعددة في صفحة الإصدارات. قم بتنزيل الإصدار المناسب لنظام التشغيل والمعمارية الخاصة بك، واستخرج الأرشيف إذا لزم الأمر، ثم قم بتشغيل الملف الثنائي.

البناء من المصدر

لبناء من المصدر، تأكد من تثبيت Go (الإصدار 1.22 أو أحدث). استنسخ المستودع وابني الملف الثنائي:

git clone https://github.com/42zen/plexureguard.git
cd plexureguard
make build

بعد بناء ناجح، يمكن العثور على الملف الثنائي plexureguard في مجلد ./bin.```bash sbomlyze image.json --policy compliance-policy.json

## فرق الرسم البياني للتبعيات

يتجاوز sbomlyze مجرد مقارنة قوائم المكونات البسيطة لتحليل الرسم البياني الكامل للتبعيات، ويكتشف مخاطر سلسلة التوريد التي تُدخلها التبعيات الانتقالية.

### الميزات

| الميزة | الوصف |
|---------|-------------|
| **فرق الحواف** | التبعيات المباشرة المضافة/المحذوفة (A يعتمد على B) |
| **إمكانية الوصول الانتقالية** | تبعيات غير مباشرة جديدة تظهر عبر الرسم البياني |
| **تتبع فقدان التبعيات الانتقالية** | التبعيات الانتقالية التي تمت إزالتها |
| **تتبع المسار** | يوضح بالضبط كيف يتم الوصول إلى كل تبعية انتقالية جديدة |
| **تتبع العمق** | عدد القفزات بين كل تبعية جديدة ورمزك البرمجي |
| **ملخص المخاطر** | تبعيات العمق 3+ يتم الإشارة إليها كمخاطر أعلى |

### لماذا يهم العمق؟

التبعيات التي تُدخل على مستويات أعمق في الرسم البياني هي:
- أصعب في التدقيق والمراجعة
- غالبًا ما تُجلب دون موافقة صريحة
- نواقل شائعة لهجمات سلسلة التوريد (مثل حادثة event-stream)

يساعد ملخص العمق في تحديد أولويات المراجعة:

| العمق | مستوى المخاطر | الوصف |
|-------|------------|-------------|
| **1** | منخفض | تبعيات مباشرة (أنت اخترت هذه) |
| **2** | متوسط | تبعيات تبعياتك |
| **3+** | مرتفع ⚠️ | تبعيات انتقالية عميقة - راجعها بعناية |

### مثال: اكتشاف التبعيات الانتقالية العميقة```bash
# Before: app -> express (simple, 1 dep)
# After:  app -> express -> lodash -> underscore -> deep-lib (chain of 4)

sbomlyze before.json after.json

المخرجات:``` 🔗 New transitive dependencies (3):

  • lodash (depth 2) via: [app express lodash]
  • underscore (depth 3) via: [app express lodash underscore]
  • deep-lib (depth 4) via: [app express lodash underscore deep-lib]

📊 New deps by depth: Depth 2: 1 Depth 3+ (risky): 2 ⚠️

### مخرجات JSON لمخطط التبعيات```json
{
  "dependencies": {
    "added_deps": {
      "pkg:npm/express": ["pkg:npm/lodash", "pkg:npm/body-parser"]
    },
    "removed_deps": {},
    "transitive_new": [
      {
        "target": "pkg:npm/underscore",
        "via": ["pkg:npm/my-app", "pkg:npm/express", "pkg:npm/lodash", "pkg:npm/underscore"],
        "depth": 3
      }
    ],
    "transitive_lost": [],
    "depth_summary": {
      "depth_1": 0,
      "depth_2": 2,
      "depth_3_plus": 2
    }
  }
}

كشف الانجراف

يصنّف sbomlyze تغييرات المكونات إلى ثلاثة أنواع من الانجراف، مما يساعدك على التمييز بين التحديثات العادية والتغييرات المشبوهة المحتملة.

أنواع الانجراف

النوعالمؤشرالوصفالخطورة
الإصدار📦تغيّر رقم الإصدارعادي
التكامل⚠️تغيّر التجزئة (Hash) دون تغيّر الإصدارمرتفع - استقصِ!
البيانات الوصفية📝تغيّرت البيانات الوصفية فقط (التراخيص، إلخ)منخفض

انحراف التكامل (إشارة أمنية)

يحدث انحراف التكامل عندما تتغير تجزئة أحد المكونات بينما يبقى إصداره كما هو. قد يشير هذا إلى:

  • هجوم سلسلة التوريد: تم استبدال الحزمة بنسخة خبيثة
  • إعادة بناء دون تحديث الإصدار: ممارسة مشروعة لكنها سيئة
  • بيئة بناء مختلفة: مشكلات في قابلية الاستنساخ```bash

Example output with integrity drift

~ suspicious-pkg ⚠️ [INTEGRITY] hash[SHA256]: abc123 -> def456

**توصية**: تحقق دائمًا من انحراف التكامل. قد يكون غير ضار، لكنه إشارة رئيسية لأمن سلسلة التوريد.

### مخرجات JSON للانحراف

ملخص الانحراف موجود داخل كائن `diff`:```json
{
  "diff": {
    "changed": [
      {
        "id": "pkg:npm/suspicious-pkg",
        "name": "suspicious-pkg",
        "changes": ["hash[SHA-256]: abc123 -> def456"],
        "drift": {
          "type": "integrity",
          "hash_changes": {
            "changed": {
              "SHA-256": {"before": "abc123", "after": "def456"}
            }
          }
        }
      }
    ],
    "drift_summary": {
      "version_drift": 55,
      "integrity_drift": 1,
      "metadata_drift": 2
    }
  }
}

استخراج ملخص الانجراف:```bash

Get drift summary

sbomlyze before.json after.json --json | jq '.diff.drift_summary'

Check for integrity drift in CI

sbomlyze before.json after.json --json | jq -e '.diff.drift_summary.integrity_drift > 0'

## كشف التكرار والتصادم

### كشف التكرار

يحدد sbomlyze المكونات التي لها نفس الهوية ولكن بإصدارات مختلفة داخل SBOM:```
⚠️  Duplicates Found: 2
  lodash: [4.17.20, 4.17.21]
  express: [4.18.0, 4.19.2]

في وضع الفرق، يتتبّع مقارنة الإصدارات المكررة:

  • مكررات جديدة: مكونات أصبحت مكررة في قائمة المكوّنات (SBOM) الجديدة
  • مكررات محلولة: مجموعات مكررة تم دمجها
  • إضافات/إزالات الإصدارات: تغييرات الإصدارات ضمن المجموعات المكررة الموجودة

كشف التصادمات

التصادمات هي تطابقات هوية غامضة حيث تشارك المكونات في نفس المعرّف ولكن بخصائص متعارضة:

النوعالوصف
عدم تطابق الاسمأسماء مكونات مختلفة مرتبطة بنفس معرّف الهوية
عدم تطابق التجزئةنفس إصدار المكوّن لديه تجزئات مختلفة (احتمال عبث)

SBOMlyze SBOM Explorer (TUI)```bash

sbomlyze sbom.json -i

![interactive-sbom](https://assets.kitploit.com/production/public/readmes/12637/d28ec876b78778fce19967cad0a41a5ebd0acb43ad4dd0aeb7837ff5204b9903.gif)

### اختصارات لوحة المفاتيح في واجهة TUI

#### التنقل

| المفتاح | الإجراء |
|---------|--------|
| `↑` / `k` | التحرك لأعلى |
| `↓` / `j` | التحرك لأسفل |
| `PgUp` / `Ctrl+u` | نصف صفحة لأعلى |
| `PgDn` / `Ctrl+d` | نصف صفحة لأسفل |
| `Home` / `g` | الانتقال إلى الأعلى |
| `End` / `G` | الانتقال إلى الأسفل |
| `Enter` | عرض تفاصيل المكوّن |
| `Esc` / `Backspace` | العودة للخلف |
| `q` / `Ctrl+c` | الخروج |

#### البحث والتصفية

| المفتاح | الإجراء |
|---------|--------|
| `/` | بحث عميق في جميع الحقول (الاسم، PURL، التراخيص، JSON الخام) |
| `t` | التصفية حسب نوع الحزمة (npm، apk، golang، pypi، إلخ.) |
| `c` | مسح جميع عوامل التصفية النشطة |

#### العروض

| المفتاح | السياق | الإجراء |
|---------|--------|--------|
| `j` | عرض التفاصيل | عرض JSON الخام للمكوّن مع تمييز بناء الجملة |
| `d` | عرض JSON | العودة إلى عرض التفاصيل |
| `Enter` | عرض JSON | تصدير JSON الخاص بالمكوّن إلى ملف |
| `?` | أي عرض | إظهار التعليمات مع جميع اختصارات المفاتيح |

### عرض تفاصيل المكوّن

يعرض عرض التفاصيل معلومات شاملة عن المكوّن:
- معلومات الحزمة (الاسم، الإصدار، PURL، النطاق، المورّد)
- التراخيص مع مؤشرات بصرية
- تجزئات التكامل
- CPEs (Common Platform Enumeration)
- قائمة التبعيات
- المعرّفات (ID، BOM-ref، SPDX-ID)

## وضع واجهة الويب

تشغيل مستكشف SBOM يعمل بالمتصفح مع إمكانية رفع الملفات بالسحب والإفلات:```bash
# Start web server on default port 8080
sbomlyze -web

# Start on custom port
sbomlyze -web --port 3000

ثم افتح http://localhost:8080 في متصفحك.

Screenshot 2026-02-06 at 17 08 13

ميزات واجهة الويب

الميزةالوصف
رفع بالسحب والإفلاتاسحب وأفلت أي ملف SBOM (Syft أو CycloneDX أو SPDX) في الصفحة (حتى 500MB)
شجرة التبعياتعرض شجري تفاعلي مع تنقّل بالتوسيع/الطي (مقسّم إلى صفحات لأكثر من 5000 مكوّن)
تفاصيل المكوّنعرض التراخيص والتجزئات والتبعيات ومعلومات المورّد وعدد الملفات
عرض JSON الخامJSON مع تلوين بناء الجملة لكل مكوّن
البحث العميقابحث في جميع الحقول بما في ذلك بيانات JSON الخام
لوحة الإحصائياتمقاييس التغطية وفئات التراخيص وتوزيع اللغات
متصفح نظام الملفاتتصفّح الملفات داخل SBOM مع تنقّل في الدلائل وبحث وفلترة حسب الطبقات

الإحصائيات المعروضة

تعرض واجهة الويب إحصائيات شاملة تشمل:

  • أعداد المكوّنات حسب نوع الحزمة (npm، apk، pypi، إلخ.)
  • توزيع التراخيص مع تفصيل الفئات (copyleft، permissive، public domain)
  • مقاييس التغطية مع أشرطة تقدم مرئية:
    • تغطية PURL (وجود رابط الحزمة)
    • تغطية CPE (الجاهزية لفحص الثغرات)
    • تغطية الترخيص
    • تغطية التجزئة/التكامل
  • تفصيل اللغات (لملفات SBOM المولّدة بواسطة Syft)
  • إحصائيات العلاقات (contains، dependency-of، evident-by)
  • تحذيرات اكتشاف التكرارات

حالات الاستخدام

مراجعة الأمان

  • ارفع ملف SBOM واستكشف شجرة التبعيات الكاملة
  • تحقق من تغطية CPE لضمان عمل فحص الثغرات
  • راجع المكوّنات التي لا تحتوي على تراخيص أو تجزئات

تدقيق الامتثال

  • ابحث عن تراخيص محددة عبر جميع المكوّنات
  • اعرض توزيع فئات التراخيص (copyleft مقابل permissive)
  • صدّر JSON الخام للتوثيق

تصحيح أخطاء التطوير

  • استكشف الحزم المضمّنة في صورتك
  • تحقق من التبعيات غير المباشرة
  • تحقق من صحة البيانات الوصفية للحزمة

متصفح نظام الملفات

تتضمن واجهة الويب متصفح نظام ملفات كامل لاستكشاف الملفات داخل ملفات SBOM (مفيد بشكل خاص لملفات SBOM المولّدة بواسطة Syft مع بيانات وصفية للملفات):

  • تنقّل في الشجرة الدليلية مع مسار تنقّل (breadcrumb)
  • بحث في الملفات يدعم أنماط السلاسل الفرعية والـ glob (مثل *.so, /usr/lib/**/*.conf)
  • فلترة الطبقات لملفات SBOM الخاصة بصور الحاويات (تصفّح الملفات حسب طبقة الصورة)
  • علاقات المكوّن بالملفات (أي مكوّن يملك أي ملفات)
  • إحصائيات الملفات حسب النوع ونوع MIME والامتداد والطبقة
  • اكتشاف الملفات غير المملوكة (الملفات غير المرتبطة بأي مكوّن)

الخيارات

-i (الوضع التفاعلي)

شغّل مستكشف TUI القائم على الطرفية للتنقل في ملفات SBOM باستخدام ضوابط لوحة المفاتيح.```bash sbomlyze image.json -i

الميزات: التنقل الشجري، تفاصيل المكوّنات، البحث، فحص الترخيص/التجزئة.

### `-web` (وضع خادم الويب)

يشغّل خادم ويب لاستكشاف قائمة مكوّنات البرمجيات (SBOM) عبر المتصفح.```bash
# Default port 8080
sbomlyze -web

# Custom port
sbomlyze -web --port 3000

توفر واجهة الويب رفعًا بالسحب والإفلات، وعرضًا شجريًا تفاعليًا، وبحثًا عميقًا، ولوحة إحصائيات.

--compliance

قيّم ملف SBOM وفقًا لأطر الحد الأدنى من العناصر الخاصة بـ NTIA وCISA 2025 وBSI TR-03183. انظر تقييم الامتثال.```bash sbomlyze image.json --compliance sbomlyze image.json --compliance --json

### `--format` / `-f`

اختر تنسيق الإخراج. تتوفر سبعة تنسيقات:

| التنسيق | الخيار | الوصف | الأنسب لـ |
|--------|------|-------------|----------|
| **text** | `--format text` (الافتراضي) | مخرجات طرفية قابلة للقراءة من قبل الإنسان | الفحص المحلي |
| **json** | `--json` أو `--format json` | JSON منظم | خطوط أنابيب CI، والبرمجة النصية |
| **sarif** | `--format sarif` | SARIF 2.1.0 لـ GitHub Code Scanning | التكامل مع GitHub |
| **junit** | `--format junit` | نتائج اختبارات JUnit بصيغة XML | لوحات معلومات اختبارات CI |
| **markdown** | `--format markdown` | تقرير Markdown جاهز لتعليقات PR | تعليقات طلبات السحب |
| **html** | `--format html` | تقرير HTML مكتفٍ ذاتيًا (CSS/JS مضمّنان) | المدققون، تقارير قابلة للمشاركة |
| **patch** | `--format patch` | عمليات RFC 6902 JSON Patch | الترقيع البرمجي |```bash
# SARIF output for GitHub Code Scanning
sbomlyze before.json after.json --format sarif > results.sarif

# JUnit output for CI test dashboards
sbomlyze before.json after.json --format junit > results.xml

# Markdown report for PR comments
sbomlyze before.json after.json --format markdown > report.md

# Self-contained HTML report
sbomlyze before.json after.json --format html > report.html

# JSON Patch operations
sbomlyze before.json after.json --format patch > changes.json

تنسيق SARIF

يُنشئ تقرير SARIF 2.1.0 مناسبًا لـ GitHub Code Scanning. تشمل القواعد المكتشفة:

  • integrity-drift (خطأ): تغيّر التجزئة دون تغيير الإصدار
  • deep-dependency (تحذير): تبعية جديدة في العمق 3+
  • new-component / removed-component (ملاحظة): إضافات/إزالات المكوّنات
  • version-change (ملاحظة): تحديثات إصدارات المكوّنات
  • policy-violation (خطأ/تحذير): انتهاكات قواعد السياسة

تنسيق JUnit

يُنشئ ملف JUnit XML مع حالات اختبار لـ:

  • عدم وجود انحراف في السلامة
  • عدم وجود تبعيات انتقالية عميقة (العمق 3+)
  • الامتثال للسياسة (حالة اختبار واحدة لكل انتهاك)
  • ملخص الفروقات في SBOM

تنسيق Markdown

يُنشئ تقرير Markdown يتضمن:

  • جدول مقارنة SBOM جنبًا إلى جنب (الملف، الحجم، نظام التشغيل، مقاييس التغطية)
  • تفاصيل سياق الفحص
  • النتائج الرئيسية
  • الحزم المضافة/المزالة مجمّعة حسب النوع (في أقسام قابلة للطي)
  • ملخص الانحراف، عمق التبعيات، وانتهاكات السياسة

تنسيق HTML

يُنشئ ملف HTML واحدًا مكتفيًا بذاته (CSS وJavaScript مضمّنان، بدون موارد خارجية) مناسبًا للإرسال بالبريد الإلكتروني إلى المدققين أو للإرفاق مع إصدار. يتضمن لوحة الإحصائيات وشجرة التبعيات وملخص الانحراف وتقرير الامتثال المضمّن عند ضبط --compliance.

تنسيق Patch

يُنشئ مصفوفة من عمليات RFC 6902 JSON Patch (add، remove، replace) تمثل الفروقات.

--json

اختصار لـ --format json. يُخرج النتائج بتنسيق JSON للاستهلاك البرمجي.```bash

Stats as JSON

sbomlyze image.json --json

Diff as JSON

sbomlyze before.json after.json --json

**بنية JSON للإحصائيات:**```json
{
  "stats": {
    "total_components": 71,
    "by_type": {"apk": 71},
    "by_license": {"MIT": 17, "BSD-3-Clause": 8},
    "without_license": 0,
    "with_hashes": 0,
    "without_hashes": 71,
    "total_dependencies": 176,
    "with_dependencies": 65,
    "duplicate_count": 0,
    "by_language": {"go": 45, "python": 12},
    "by_found_by": {"apk-db-cataloger": 71},
    "license_categories": {
      "copyleft": 8,
      "permissive": 55,
      "public_domain": 0,
      "unknown": 8
    },
    "with_cpes": 71,
    "without_cpes": 0,
    "with_purl": 71,
    "without_purl": 0
  },
  "warnings": []
}

--policy <file>

طبّق قواعد السياسة وأفشِل CI في حال انتهاكها.```bash sbomlyze before.json after.json --policy policy.json

انظر [محرك السياسات](#policy-engine) للتفاصيل.

### `--strict`

يفشل فورًا عند أي خطأ في التحليل.```bash
sbomlyze broken.json --strict
# Error parsing broken.json: unknown SBOM format
# exit status 1

--tolerant (الافتراضي)

متابعة المعالجة عند حدوث أخطاء، وجمع التحذيرات.```bash sbomlyze broken.json --tolerant

📦 SBOM Statistics

==================

Total Components: 0

...

⚠️ Parse Warnings (1):

[broken.json] unknown SBOM format

تتضمن تحذيرات التحليل معلومات منظمة: الملف المصدر، ورسالة قابلة للقراءة من قبل البشر، وبشكل اختياري الحقل الذي سبّب المشكلة.

### `--no-pager`

تعطيل ترقيم الصفحات التلقائي للمخرجات. مفيد عند تمرير المخرجات إلى أمر آخر أو عند العمل في بيئات غير تفاعلية.```bash
sbomlyze image.json --no-pager
sbomlyze before.json after.json --no-pager | head -20

محرك السياسات

أنشئ سياسات لفرض القواعد في خطوط أنابيب CI/CD. يخرج sbomlyze برمز 1 عند حدوث انتهاكات.

تنسيق ملف السياسات```json

{ "max_added": 10, "max_removed": 5, "max_changed": 100, "deny_licenses": ["GPL-3.0", "AGPL-3.0"], "require_licenses": true, "deny_duplicates": true, "deny_integrity_drift": true, "max_depth": 3, "warn_supplier_change": true, "warn_new_transitive": true, "min_ntia_score": 85, "min_cisa_score": 70, "min_bsi_score": 80, "min_overall_compliance": 75 }

### قواعد السياسة

| القاعدة | النوع | الوصف |
|------|------|-------------|
| `max_added` | int | الحد الأقصى للمكونات الجديدة المسموح بها (0 = غير محدود) |
| `max_removed` | int | الحد الأقصى للمكونات المُزالة المسموح بها (0 = غير محدود) |
| `max_changed` | int | الحد الأقصى للمكونات المتغيّرة المسموح بها (0 = غير محدود) |
| `deny_licenses` | []string | قائمة بمعرّفات التراخيص المحظورة |
| `require_licenses` | bool | يتطلب أن تحتوي جميع المكونات *المضافة* على تراخيص (يتحقق فقط من المكونات المضافة حديثًا في وضع الفرق) |
| `deny_duplicates` | bool | فشل إذا وُجدت حزم مكررة في النتيجة |
| `deny_integrity_drift` | bool | فشل إذا تغيّرت تجزئة المكوّن دون تغيير الإصدار (خطر سلسلة التوريد) |
| `max_depth` | int | فشل إذا وُجدت تبعيات انتقالية جديدة على عمق >= N (0 = غير محدود) |
| `warn_supplier_change` | bool | تحذير (وليس فشل) إذا تغيّر مورّد المكوّن أو مؤلفه |
| `warn_new_transitive` | bool | تحذير (وليس فشل) عند وجود أي تبعيات انتقالية جديدة |
| `min_ntia_score` | int | فشل إذا كانت درجة امتثال NTIA أقل من هذا (0-100، 0 = معطّل) |
| `min_cisa_score` | int | فشل إذا كانت درجة امتثال CISA أقل من هذا (0-100، 0 = معطّل) |
| `min_bsi_score` | int | فشل إذا كانت درجة امتثال BSI أقل من هذا (0-100، 0 = معطّل) |
| `min_overall_compliance` | int | فشل إذا كانت درجة الامتثال الإجمالية أقل من هذا (0-100، 0 = معطّل) |

> تعيين أي عتبة من عتبات `min_*_score` يؤدي تلقائيًا إلى تشغيل تقييم الامتثال، حتى بدون علامة `--compliance`.

### مثال: سياسة صارمة```json
{
  "max_added": 5,
  "max_removed": 3,
  "max_changed": 20,
  "deny_licenses": ["GPL-3.0", "AGPL-3.0", "SSPL-1.0"],
  "require_licenses": true,
  "deny_duplicates": true,
  "deny_integrity_drift": true,
  "max_depth": 3,
  "warn_supplier_change": true,
  "warn_new_transitive": true,
  "min_overall_compliance": 80
}

مخرجات انتهاكات السياسة```

!! Policy Violations (3): [max_added] too many components added: 10 > 5 [max_removed] too many components removed: 7 > 3 [deny_licenses] component foo has denied license: GPL-3.0

## صيغ SBOM المدعومة

| الصيغة | اكتشاف الملف | المعرّفات المستخرجة |
|--------|----------------|----------------------|
| Syft (الأصلي) | مفتاح JSON `"artifacts"` + أحد `"source"` أو `"distro"` أو `"descriptor"` | PURL, CPE, name |
| CycloneDX | مفتاح JSON `"bomFormat"` = `"CycloneDX"`، أو `"$schema"` يحتوي على `cyclonedx` | PURL, CPE, BOM-ref, group (namespace) |
| SPDX | مفتاح JSON `"spdxVersion"` يبدأ بـ `"SPDX-"` | PURL, CPE, SPDXID |

يجب أن تكون جميع الصيغ بصيغة JSON. دعم XML غير متاح حاليًا.

### تحويل الصيغ

يمكن لـ sbomlyze التحويل بين أي من الصيغ الثلاث المدعومة:```bash
sbomlyze convert input.json --to spdx          # any format → SPDX 2.3
sbomlyze convert input.json --to cyclonedx     # any format → CycloneDX 1.5
sbomlyze convert input.json --to syft          # any format → Syft JSON

انظر وضع التحويل للحصول على التفاصيل.

المقارنة عبر الصيغ

يمكن لـ sbomlyze مقارنة ملفات SBOM بصيغ مختلفة:```bash

Compare Syft output with CycloneDX

sbomlyze syft-output.json cyclonedx-output.json

Compare SPDX with Syft

sbomlyze spdx-output.json syft-output.json

**ملاحظة:** تختلف مستويات التفاصيل التي تستخرجها صيغ SBOM المختلفة. قد يُظهر الفرق عبر الصيغ تغييرات تعكس اختلافات في الصيغة (مثل توفر الحقول) وليس تغييرات فعلية في النظام. سيقوم نظام النتائج الرئيسية بالتحذير عند اكتشاف عدم تطابق في سياق الفحص.

## مطابقة هوية المكوّن

تُطابَق المكوّنات باستخدام نظام هوية قائم على الأولوية:

| الأولوية | المعرّف | مثال | الوصف |
|----------|------------|---------|-------------|
| 1 | PURL | `pkg:npm/lodash` | رابط الحزمة (بدون رقم الإصدار) |
| 2 | CPE | `cpe:vendor:product` | بائع CPE:المنتج (بدون رقم الإصدار) |
| 3 | BOM-ref / SPDXID | `ref:component-123` | معرّف CycloneDX bom-ref أو معرّف SPDX |
| 4 | Namespace + Name | `com.example/mypackage` | المجموعة/الفضاء الاسمي مع الاسم |
| 5 | Name | `simple-package` | الرجوع إلى الاسم فقط |

## تكامل CI/CD

### GitHub Actions

يوفّر SBOMlyze إجراءً لـ JavaScript خالٍ من التبعيات. يقارن SBOM الخاص بالفرع الحالي (المُضمَّن في المستودع أو المُنشأ بشكل منفصل) مع الملف الموجود في قاعدة git لطلب السحب، وينشر ملخص الوظيفة (Job Summary)، وينتج بصورة اختيارية SARIF أو يحدّث تعليقًا واحدًا على طلب السحب (PR).```yaml
name: SBOM Check
on:
  pull_request:

permissions:
  contents: read

jobs:
  sbom-diff:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
        with:
          fetch-depth: 0

      - id: sbomlyze
        uses: rezmoss/sbomlyze@31503690611fda8ebba4ed2bd186eda000442594 # v0.5.1
        with:
          sbom-path: build/sbom.cdx.json
          policy: .github/sbom-policy.json
          fail-on: policy

الإجراء لا يشغّل أوامر المولّد أبدًا. أنشئ SBOM الرئيسي في خطوة منفصلة ومراجَعة أو أضفه إلى المستودع. كل من comment و sarif يُضبطان افتراضيًا على false؛ لا تزال طلبات السحب من الفروع (forked PRs) تتلقى ملخص الوظيفة الكامل عند عدم توفّر صلاحية التعليق. راجع مرجع الإجراء لمعرفة كل المدخلات/المخرجات، وتثبيت SHA، ورفع SARIF، والصلاحيات، وسلوك الأمان.

GitLab CI```yaml

sbom-diff: stage: test script: - syft . -o json > current.json - sbomlyze baseline.json current.json --policy policy.json --json > sbom-report.json - sbomlyze baseline.json current.json --format junit > sbom-junit.xml artifacts: paths: - sbom-report.json reports: junit: sbom-junit.xml when: always

### تنبيه انحراف النزاهة```bash
# Alert on any integrity drift (CI example)
if sbomlyze baseline.json current.json --json | jq -e '.diff.drift_summary.integrity_drift > 0' > /dev/null; then
  echo "⚠️  INTEGRITY DRIFT DETECTED - Investigate immediately!"
  exit 1
fi

تنبيه التبعية العميقة```bash

Alert on new deep transitive dependencies

if sbomlyze baseline.json current.json --json | jq -e '.diff.dependencies.depth_summary.depth_3_plus > 0' > /dev/null; then echo "⚠️ New deep transitive dependencies detected - Review required!" fi

### بوابة الامتثال```bash
# Fail the build if the SBOM doesn't meet minimum-element requirements
sbomlyze current.json --policy compliance-policy.json
# where compliance-policy.json sets min_overall_compliance / min_ntia_score / etc.

رموز الخروج

الرمزالمعنى
0النجاح، لا توجد اختلافات أو انتهاكات
1تم العثور على اختلافات (أي مكونات مضافة/محذوفة/معدلة)، أو انتهاكات للسياسة، أو أخطاء

ملاحظة: في وضع الفرق، يتم إرجاع رمز الخروج 1 عند اكتشاف أي تغييرات في المكونات، حتى بدون ملف سياسة. وهذا يجعله قابلاً للاستخدام كبوابة بسيطة لـ "هل تغير أي شيء؟" في CI.

أمثلة

مقارنة Docker Images```bash

Generate SBOMs

syft nginx:1.25-alpine -o json > nginx-125.json syft nginx:1.26-alpine -o json > nginx-126.json

Compare

sbomlyze nginx-125.json nginx-126.json

### تدقيق الترخيص```bash
# Check for GPL licenses in new dependencies
cat > audit-policy.json << EOF
{
  "deny_licenses": ["GPL-2.0", "GPL-3.0", "LGPL-2.1", "LGPL-3.0"],
  "require_licenses": true
}
EOF

sbomlyze old.json new.json --policy audit-policy.json

كشف انحراف التبعيات```bash

Detect any changes (strict mode for no drift)

cat > no-drift.json << EOF { "max_added": 0, "max_removed": 0, "max_changed": 0 } EOF

sbomlyze baseline.json current.json --policy no-drift.json

### فحص الامتثال```bash
# Score an SBOM and enforce a minimum
sbomlyze image.json --compliance

cat > compliance-policy.json << EOF
{
  "min_ntia_score": 90,
  "min_overall_compliance": 80
}
EOF

sbomlyze image.json --policy compliance-policy.json

تحويل صيغ SBOM```bash

Convert a Syft SBOM to CycloneDX for tools that require it

syft alpine:latest -o json > alpine-syft.json sbomlyze convert alpine-syft.json --to cyclonedx -o alpine-cdx.json

Convert CycloneDX to SPDX for compliance workflows

sbomlyze convert vendor-sbom.cdx.json --to spdx > vendor-sbom.spdx.json

Pipe conversion output directly

sbomlyze convert input.json --to spdx | jq '.packages | length'

### استكشف SBOM في المتصفح```bash
# Generate SBOM and explore in web UI
syft alpine:latest -o json > alpine.json

# Start web server
sbomlyze -web

# Then open http://localhost:8080 and drag-drop alpine.json

استكشاف الطرفية التفاعلية```bash

Explore with keyboard navigation

sbomlyze alpine.json -i

Navigate with arrow keys, search with '/', view details with Enter

## التطوير

### تشغيل الاختبارات```bash
make test
# or
go test -v ./...

Lint```bash

make lint # runs go vet + golangci-lint + staticcheck make vulncheck # runs govulncheck for known CVEs

### البناء```bash
make build-quick
# or
go build -o sbomlyze ./cmd/sbomlyze

أوامر Make```bash

make all # Run test, lint, and build make test # Run all tests with race detector make lint # Run go vet, golangci-lint, and staticcheck make vulncheck # Run govulncheck for known vulnerabilities make build # Build with goreleaser (snapshot) make build-quick # Quick build for development make snapshot-test # Run snapshot tests only make update-snapshot # Update snapshot golden files make clean # Remove build artifacts

## المساهمة

المساهمات مرحّب بها! القضايا الجيدة للمبتدئين مُعلَّمة بوسم [`good first issue`](https://github.com/rezmoss/sbomlyze/issues?q=is%3Aissue+is%3Aopen+label%3A%22good+first+issue%22). انظر [CONTRIBUTING.md](https://github.com/rezmoss/sbomlyze/blob/HEAD/CONTRIBUTING.md) إذا كان موجودًا، ولا تتردد في فتح قضية أو مناقشة لاقتراح تغييرات.



[ci]: https://github.com/rezmoss/sbomlyze/actions/workflows/ci.yml
[ci-img]: https://github.com/rezmoss/sbomlyze/actions/workflows/ci.yml/badge.svg
[marketplace]: https://github.com/marketplace/actions/sbomlyze-diff
[marketplace-img]: https://img.shields.io/badge/Marketplace-SBOMlyze%20Diff-blue?logo=github
[release]: https://github.com/rezmoss/sbomlyze/releases
[release-img]: https://img.shields.io/github/v/release/rezmoss/sbomlyze
[go-report]: https://goreportcard.com/report/github.com/rezmoss/sbomlyze
[go-report-img]: https://goreportcard.com/badge/github.com/rezmoss/sbomlyze
[license]: https://raw.githubusercontent.com/rezmoss/sbomlyze/main/LICENSE
[license-img]: https://img.shields.io/badge/License-Apache%202.0-blue.svg
[download]: https://github.com/rezmoss/sbomlyze/releases
[download-img]: https://img.shields.io/github/downloads/rezmoss/sbomlyze/total
[scorecard]: https://scorecard.dev/viewer/?uri=github.com/rezmoss/sbomlyze
[scorecard-img]: https://api.scorecard.dev/projects/github.com/rezmoss/sbomlyze/badge

الفئات