Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 47 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# Dependabot config for npm-based frontend/CMS repos (React/Vite/Next/Vue/Strapi).
version: 2
updates:
- package-ecosystem: "npm"
directory: "/"
target-branch: "develop"
schedule:
interval: "weekly"
day: "tuesday"
time: "06:00"
timezone: "Asia/Amman"
open-pull-requests-limit: 10
groups:
npm-minor-patch:
update-types: ["minor", "patch"]
labels:
- "dependencies"
- "npm"

- package-ecosystem: "docker"
directory: "/"
target-branch: "develop"
schedule:
interval: "weekly"
day: "tuesday"
time: "06:00"
timezone: "Asia/Amman"
open-pull-requests-limit: 5
labels:
- "dependencies"
- "docker"

- package-ecosystem: "github-actions"
directory: "/"
target-branch: "develop"
schedule:
interval: "weekly"
day: "tuesday"
time: "06:00"
timezone: "Asia/Amman"
open-pull-requests-limit: 5
groups:
actions-minor-patch:
update-types: ["minor", "patch"]
labels:
- "dependencies"
- "github-actions"
38 changes: 38 additions & 0 deletions .github/workflows/critical-vuln-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# =============================================================================
# Critical Dependabot Vulnerability Check — Caller template
# =============================================================================
# USAGE:
# Copy this file to your repo at .github/workflows/critical-vuln-check.yml.
# No REPLACE values needed — this template requires no customization.
#
# WHAT IT DOES:
# Runs on every PR targeting main or develop. Fails if the repository has
# any open CRITICAL-severity Dependabot alert.
#
# Enforcement differs by target branch via each repo's OWN branch
# protection settings (not by anything in this file):
# - On `main`: mark this check REQUIRED in branch protection — merge
# is physically blocked while a critical alert is open.
# - On `develop`: leave this check NOT required — it still shows as a
# failing/red check (a visible warning) without blocking
# the merge.
# =============================================================================
name: Critical Vulnerability Check
run-name: vuln-check-${{ github.event.pull_request.number }}

on:
pull_request:
branches: [main, develop]

# critical-vuln-gate.yml's own job requests these two scopes -- a caller can
# only narrow permissions for a nested reusable-workflow job, never widen
# them, so these must be granted here or the whole file fails to parse.
permissions:
contents: write
security-events: read
Comment on lines +30 to +32

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

contents: write is overly broad for a read-only vulnerability check.

This workflow only reads Dependabot alerts — it does not modify repository contents. The comment on lines 27–29 claims the caller must grant these scopes for the reusable workflow, but reusable workflows define their own permissions block independently of the caller. If critical-vuln-gate.yml specifies its own permissions, this block is unnecessary. If it doesn't, contents: write should still be contents: read since a vulnerability gate has no reason to write to the repo.

As per path instructions, check for overbroad permissions and missing least-privilege permissions.

🔒 Proposed fix
 permissions:
-  contents: write
+  contents: read
   security-events: read
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
permissions:
contents: write
security-events: read
permissions:
contents: read
security-events: read
🧰 Tools
🪛 zizmor (1.26.1)

[error] 31-31: overly broad permissions (excessive-permissions): contents: write is overly broad at the workflow level

(excessive-permissions)


[warning] 31-31: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/critical-vuln-check.yml around lines 30 - 32, Update the
workflow permissions block near the vulnerability check configuration to remove
the unnecessary contents write access and use contents read instead, or remove
that scope if the reusable workflow critical-vuln-gate.yml declares its own
permissions. Keep security-events read and ensure the workflow retains only
permissions required for its read-only Dependabot alert check.

Source: Path instructions


jobs:
vuln-gate:
uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Pin the reusable workflow to a commit SHA, not @main.

A branch reference is mutable — if simplify9/.github is compromised or a bad commit lands on main, arbitrary code runs in this repository's CI with the granted permissions. Pin to an immutable SHA.

As per path instructions, treat GitHub Actions changes as supply-chain sensitive and check for unpinned third-party actions.

🔒 Proposed fix
-    uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main
+    uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@<full-commit-sha>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main
uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@<full-commit-sha>
🧰 Tools
🪛 zizmor (1.26.1)

[error] 36-36: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/critical-vuln-check.yml at line 36, Update the reusable
workflow reference in the critical vulnerability gate job to use a full
immutable commit SHA instead of the mutable `@main` branch reference, preserving
the existing simplify9/.github workflow path and configuration.

Source: Path instructions

secrets:
dependabot-alerts-token: ${{ secrets.DEPENDABOT_ALERTS_TOKEN }}
61 changes: 61 additions & 0 deletions .github/workflows/dependabot-auto-merge.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
# =============================================================================
# Dependabot Auto-Merge — Caller template
# =============================================================================
# USAGE:
# Copy this file to your repo at .github/workflows/dependabot-auto-merge.yml.
# No REPLACE values needed.
#
# WHAT IT DOES:
# Auto-merges a Dependabot PR ONLY when ALL of the following hold:
# - The PR author is dependabot[bot]
# - The update is a semver PATCH bump (never minor/major)
# - The ecosystem is npm, nuget, pub, bundler, or github-actions
# (NEVER docker — base image bumps always need manual review)
# - This repo currently has no open critical Dependabot alert (re-checked
# here explicitly — see workflow-templates/critical-vuln-check.yml's
# header for why this can't just `needs:` that file's job)
# "Auto-merge" here means GitHub's native auto-merge feature: it still
# waits for the repo's actual required status checks (build/test) to pass
# before merging — this workflow does not bypass those.
# =============================================================================
name: Dependabot Auto-Merge

on:
pull_request:
branches: [main, develop]
Comment on lines +23 to +25

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Add a concurrency group to cancel superseded runs.

Without concurrency settings, pushing multiple commits to the same Dependabot PR triggers overlapping workflow runs. A concurrency group cancels stale runs.

♻️ Proposed refactor
 on:
   pull_request:
     branches: [main, develop]

+concurrency:
+  group: dependabot-auto-merge-${{ github.event.pull_request.number }}
+  cancel-in-progress: true
+
 permissions:
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
on:
pull_request:
branches: [main, develop]
on:
pull_request:
branches: [main, develop]
concurrency:
group: dependabot-auto-merge-${{ github.event.pull_request.number }}
cancel-in-progress: true
🧰 Tools
🪛 zizmor (1.26.1)

[warning] 23-25: insufficient job-level concurrency limits (concurrency-limits): workflow is missing concurrency setting

(concurrency-limits)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/dependabot-auto-merge.yml around lines 23 - 25, Add a
workflow-level concurrency configuration near the existing on declaration in the
Dependabot auto-merge workflow, using a group keyed to the pull request or
workflow context and enabling cancellation of in-progress runs so superseded
commits stop older executions.


permissions:
pull-requests: write
contents: write
security-events: read
Comment on lines +27 to +30

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Scope permissions to job level to avoid granting contents: write to the vuln-gate job.

Workflow-level permissions apply to all jobs. The auto-merge job needs contents: write and pull-requests: write for gh pr merge, but the vuln-gate job does not — it calls a reusable workflow that should define its own permissions. security-events: read is only relevant to vuln-gate, not auto-merge. Move permissions to job level for least-privilege.

As per path instructions, check for overbroad permissions and missing least-privilege permissions.

🔒 Proposed fix
 permissions:
-  pull-requests: write
-  contents: write
-  security-events: read
+  contents: read
+
 jobs:
   vuln-gate:
     if: ${{ github.actor == 'dependabot[bot]' }}
+    permissions:
+      security-events: read
     uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main
     secrets:
       dependabot-alerts-token: ${{ secrets.DEPENDABOT_ALERTS_TOKEN }}

   auto-merge:
     needs: vuln-gate
     if: ${{ github.actor == 'dependabot[bot]' }}
     runs-on: ubuntu-latest
+    permissions:
+      pull-requests: write
+      contents: write
     timeout-minutes: 5
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
permissions:
pull-requests: write
contents: write
security-events: read
permissions:
contents: read
jobs:
vuln-gate:
if: ${{ github.actor == 'dependabot[bot]' }}
permissions:
security-events: read
uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main
secrets:
dependabot-alerts-token: ${{ secrets.DEPENDABOT_ALERTS_TOKEN }}
auto-merge:
needs: vuln-gate
if: ${{ github.actor == 'dependabot[bot]' }}
runs-on: ubuntu-latest
permissions:
pull-requests: write
contents: write
timeout-minutes: 5
🧰 Tools
🪛 zizmor (1.26.1)

[error] 28-28: overly broad permissions (excessive-permissions): pull-requests: write is overly broad at the workflow level

(excessive-permissions)


[error] 29-29: overly broad permissions (excessive-permissions): contents: write is overly broad at the workflow level

(excessive-permissions)


[warning] 28-28: permissions without explanatory comments (undocumented-permissions): needs an explanatory comment

(undocumented-permissions)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/dependabot-auto-merge.yml around lines 27 - 30, Move the
workflow-level permissions into the corresponding job definitions: give
auto-merge only pull-requests: write and contents: write, and give vuln-gate
only security-events: read. Remove the global permissions block so vuln-gate
does not inherit contents: write or pull-requests: write, while preserving each
job’s required access.

Source: Path instructions


jobs:
vuln-gate:
if: ${{ github.actor == 'dependabot[bot]' }}
uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

Pin both action references to commit SHAs.

Line 35 references the reusable workflow at @main — a mutable branch reference that executes arbitrary code if the upstream repo is compromised. Line 47 uses dependabot/fetch-metadata@v2 — a major version tag that can shift under you. Both should be pinned to immutable commit SHAs.

As per path instructions, treat GitHub Actions changes as supply-chain sensitive and check for unpinned third-party actions.

🔒 Proposed fix
-    uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@main
+    uses: simplify9/.github/.github/workflows/critical-vuln-gate.yml@<full-commit-sha>
-        uses: dependabot/fetch-metadata@v2
+        uses: dependabot/fetch-metadata@<full-commit-sha>

Also applies to: 47-47

🧰 Tools
🪛 zizmor (1.26.1)

[error] 35-35: unpinned action reference (unpinned-uses): action is not pinned to a hash (required by blanket policy)

(unpinned-uses)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/dependabot-auto-merge.yml at line 35, Pin both GitHub
Actions references to immutable commit SHAs: update the reusable workflow
reference at `critical-vuln-gate.yml` and the `dependabot/fetch-metadata` action
from their mutable `@main`/`@v2` references, preserving the existing workflow
behavior.

Source: Path instructions

secrets:
dependabot-alerts-token: ${{ secrets.DEPENDABOT_ALERTS_TOKEN }}

auto-merge:
needs: vuln-gate
if: ${{ github.actor == 'dependabot[bot]' }}
runs-on: ubuntu-latest
timeout-minutes: 5
steps:
- name: Fetch Dependabot metadata
id: metadata
uses: dependabot/fetch-metadata@v2
with:
github-token: ${{ secrets.GITHUB_TOKEN }}

- name: Enable auto-merge for eligible patch bumps
if: |
steps.metadata.outputs.update-type == 'version-update:semver-patch' &&
contains(fromJSON('["npm_and_yarn", "nuget", "pub", "bundler", "github_actions"]'), steps.metadata.outputs.package-ecosystem)
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_URL: ${{ github.event.pull_request.html_url }}
run: |
set -euo pipefail
echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} — patch-level ${{ steps.metadata.outputs.package-ecosystem }} bump, vuln gate passed"
gh pr merge --auto --squash "$PR_URL"
Comment on lines +58 to +61

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 Security & Privacy | 🔵 Trivial | 💤 Low value

Pass package-ecosystem via environment variable instead of template expansion.

The if condition on lines 52–54 validates the value against an allowlist, so injection risk is mitigated. However, using an env variable is the consistent pattern already used for PR_URL on line 57.

♻️ Proposed refactor
         env:
           GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
           PR_URL: ${{ github.event.pull_request.html_url }}
+          ECOSYSTEM: ${{ steps.metadata.outputs.package-ecosystem }}
         run: |
           set -euo pipefail
-          echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} — patch-level ${{ steps.metadata.outputs.package-ecosystem }} bump, vuln gate passed"
+          echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} — patch-level ${ECOSYSTEM} bump, vuln gate passed"
           gh pr merge --auto --squash "$PR_URL"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
run: |
set -euo pipefail
echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} — patch-level ${{ steps.metadata.outputs.package-ecosystem }} bump, vuln gate passed"
gh pr merge --auto --squash "$PR_URL"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
PR_URL: ${{ github.event.pull_request.html_url }}
ECOSYSTEM: ${{ steps.metadata.outputs.package-ecosystem }}
run: |
set -euo pipefail
echo "::notice title=🤖 [AUTO-MERGE] Enabling auto-merge::${PR_URL} — patch-level ${ECOSYSTEM} bump, vuln gate passed"
gh pr merge --auto --squash "$PR_URL"
🧰 Tools
🪛 zizmor (1.26.1)

[info] 60-60: code injection via template expansion (template-injection): may expand into attacker-controllable code

(template-injection)

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.github/workflows/dependabot-auto-merge.yml around lines 58 - 61, Update the
auto-merge step’s notice command to read package-ecosystem through an
environment variable, following the existing PR_URL pattern, and configure that
variable from the validated metadata output. Preserve the allowlist condition
and current notice and merge behavior.

Source: Path instructions

Loading