Skip to content

docs: update security.txt and re-introduce workflow to update the expiry date every year - #2386

Merged
morri-son merged 5 commits into
open-component-model:mainfrom
morri-son:docs/add-security-policy
Sep 16, 2026
Merged

morri-son merged 5 commits into
open-component-model:mainfrom
morri-son:docs/add-security-policy

Conversation

@morri-son

@morri-son morri-son commented Apr 24, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Add security.txt and a workflow to update it for Open Component Model vulnerability disclosure, aligned with NeoNephos Security Guidelines and CRA compliance requirements.

Important: The organization-wide SECURITY.md has been moved to a separate PR (open-component-model/.github#115) in the repository.

Changes

  • ✅ Update website/static/.well-known/security.txt (RFC 9116 compliance)

    • Reference new reporting channels and contacts
    • Add Expires field with automated renewal workflow
  • ✅ Restore automated security.txt expiry renewal workflow

    • Runs every weekday in December at 09:00 UTC
    • Automatically updates Expires field to next year
    • Creates idempotent PR for review and merge
    • Ensures RFC 9116 compliance without manual maintenance

Related PRs

⚠️ MERGE ORDER MATTERS:

  1. FIRST: Merge open-component-model/.github#115

    • Organization-wide SECURITY.md (applies to all repos)
    • NeoNephos Security Guidelines compliance
    • CRA stewardship statement per Linux Foundation
    • Commercial intent declaration
  2. THEN: Merge this PR (open-component-model/open-component-model#2386)

    • security.txt and workflow for updates

Reason: The .github SECURITY.md is organization-wide and is referenced by this PR's security.txt updates.

Test Plan

  • Verify security.txt is valid per RFC 9116
  • Verify security.txt references correct SECURITY.md location
  • Verify workflow runs correctly (manual trigger or wait for December)
  • Verify Expires field updates to next year + 12-31

Closes

@morri-son
morri-son requested a review from a team as a code owner April 24, 2026 08:03
@netlify

netlify Bot commented Apr 24, 2026 •

Copy link
Copy Markdown

👷 Deploy Preview for ocm-website processing.

Name Link
🔨 Latest commit 3cf8988
🔍 Latest deploy log https://app.netlify.com/projects/ocm-website/deploys/6aaa72e3f862670009cd61a0

@coderabbitai

coderabbitai Bot commented Apr 24, 2026 •

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds a vulnerability disclosure policy and security contacts, updates .well-known/security.txt (contacts and Expires), changes the GitHub Actions workflow to sparse-checkout and bump only the Expires field on weekdays, and extends the spell-check wordlist with three security terms.

Changes

Security & Release Flow

Layer / File(s) Summary
Policy document
SECURITY.md
Adds a new vulnerability disclosure document describing reporting channels (GitHub private advisory + TSC email), supported versions, response timelines, CVSS-based targets, coordinated disclosure expectations, and contact list.
Public security descriptor
website/static/.well-known/security.txt
Replaces SAP contact with GitHub advisories and TSC mailto, adds Canonical and Policy links (points to SECURITY.md), sets Preferred-Languages: en, and updates Expires to 2027-12-31T00:00:00.000Z.
Automation: expiry-only renewal
.github/workflows/website-update-security-txt.yaml
Changes December cron to weekdays at 09:00 UTC; switches to sparse-checkout for website/static/.well-known/security.txt; removes external fetch; adds an in-place step that computes next year and rewrites the Expires: line with YYYY-12-31T00:00:00.000Z; updates PR branch/title/commit/body to reflect expiry-only renewal and RFC 9116 reference.

Spell-check vocabulary

Layer / File(s) Summary
Wordlist additions
.github/config/wordlist.txt
Inserts three terms into the repository wordlist: cvss (line ~176), mitigations (line ~446), and openssf (line ~523).

Sequence Diagram(s)

sequenceDiagram
    participant Workflow as GitHub Actions workflow
    participant Repo as Repository (files)
    participant GitHub as GitHub API (PR)
    participant Runner as Actions runner

    Workflow->>Runner: scheduled run (Dec weekdays 09:00 UTC)
    Runner->>Repo: sparse-checkout `website/static/.well-known/security.txt`
    Runner->>Runner: compute next year (date +1)
    Runner->>Repo: rewrite `Expires:` in security.txt
    Runner->>GitHub: create branch `security/renew-security-txt` and PR (Expires-only update)
    GitHub->>Repo: PR created (title/commit/description reference RFC 9116)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Linked Issues check ✅ Passed The PR addresses the SECURITY.md creation requirement from issue #1021 as specified in the acceptance criteria, implementing vulnerability disclosure process documentation.
Out of Scope Changes check ✅ Passed All changes are within scope: SECURITY.md creation, security.txt updates, wordlist additions, and workflow updates directly support the security disclosure policy objective from issue #1021.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Title check ✅ Passed The title clearly describes the security.txt update and annual expiry workflow. It omits the new SECURITY.md file, but it accurately covers substantial changes in the pull request.
Description check ✅ Passed The description directly explains the security.txt changes, the expiry renewal workflow, vulnerability disclosure channels, and related security policy work.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

🐰 I nibble at lines and hop with glee,
Contacts set, expiry bumped to see,
cvss, mitigations, openssf I add,
A tidy PR, neither loud nor mad.
I twitch my whiskers — secure and glad.

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added area/documentation Documentation related size/s Small labels Apr 24, 2026
@morri-son
morri-son marked this pull request as draft April 24, 2026 08:35
@github-actions github-actions Bot added component/github-actions Changes on GitHub Actions or within `.github/` directory size/m Medium and removed size/s Small labels Apr 24, 2026
@morri-son morri-son added the kind/chore chore, maintenance, etc. label Apr 24, 2026
@morri-son

Copy link
Copy Markdown
Contributor Author

neonephos/guidelines-development#7 has been approved, so this PR can make use of the ne SECURITY.md template from NeoNephos.

@morri-son
morri-son marked this pull request as ready for review April 28, 2026 07:24

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (1)
.github/workflows/website-update-security-txt.yaml (1)

5-7: Adjust Expires calculation to stay within RFC 9116's <1-year horizon.

The current workflow runs on December 1st and adds 1 year to the existing Expires timestamp, which typically sets the date to December 31st of the following year. This results in an Expires value ~13 months in the future, exceeding RFC 9116 section 2.5.5's recommendation to keep Expires less than one year ahead.

To comply with the RFC, set the Expires date to approximately 11–12 months from the workflow execution date rather than hardcoding to a fixed end-of-year date.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/website-update-security-txt.yaml around lines 5 - 7, The
workflow currently schedules on "0 9 1 12 *" and extends the security.txt
Expires field by adding a full year which can push expiry beyond 12 months;
change the Expires calculation step so it computes Expires relative to the
workflow run date (e.g., run_date + ~330 days or run_date + 11 months) instead
of forcing an end-of-year date; update the step that generates the Expires
timestamp (the job/step that currently adds 1 year to the existing Expires) to
produce a date <1 year ahead (approx 11–12 months) formatted per RFC 9116 before
writing security.txt.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In @.github/workflows/website-update-security-txt.yaml:
- Around line 27-36: The step "Bump Expires date by one year" currently proceeds
even if parsing/computing NEW fails; update the step to validate parsing by
checking that CURRENT is non-empty and NEW was successfully computed (e.g., test
-n "$CURRENT" and test -n "$NEW" or check date exit status) before running sed,
and if either is empty or date failed, print a clear error (including values of
FILE and CURRENT) and exit 1 to fail the job; reference the variables/labels
FILE, CURRENT, NEW and the step name to locate where to add the checks and early
exit.

---

Nitpick comments:
In @.github/workflows/website-update-security-txt.yaml:
- Around line 5-7: The workflow currently schedules on "0 9 1 12 *" and extends
the security.txt Expires field by adding a full year which can push expiry
beyond 12 months; change the Expires calculation step so it computes Expires
relative to the workflow run date (e.g., run_date + ~330 days or run_date + 11
months) instead of forcing an end-of-year date; update the step that generates
the Expires timestamp (the job/step that currently adds 1 year to the existing
Expires) to produce a date <1 year ahead (approx 11–12 months) formatted per RFC
9116 before writing security.txt.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: b6067089-1525-4689-b6f7-d182f52b6e90

📥 Commits

Reviewing files that changed from the base of the PR and between 2e601ca and 6329c9a.

📒 Files selected for processing (4)
  • .github/config/wordlist.txt
  • .github/workflows/website-update-security-txt.yaml
  • SECURITY.md
  • website/static/.well-known/security.txt

Comment thread .github/workflows/website-update-security-txt.yaml Outdated

@Skarlso Skarlso left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This closes the attached issue but where is assurance-case.md and secure-design.md docs? Is that another PR?

Comment thread .github/workflows/website-update-security-txt.yaml Outdated
Comment thread website/static/.well-known/security.txt
Comment thread .github/workflows/website-update-security-txt.yaml
Comment thread SECURITY.md Outdated
Comment thread .github/workflows/website-update-security-txt.yaml Outdated
@morri-son
morri-son requested a review from Skarlso April 28, 2026 15:06
@morri-son
morri-son enabled auto-merge (squash) April 28, 2026 15:06
Comment thread SECURITY.md Outdated
@morri-son
morri-son requested a review from Skarlso April 29, 2026 14:18

@frewilhelm frewilhelm left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

The neonephos PR is not merged yet - should we wait?

Comment thread .github/workflows/website-update-security-txt.yaml Outdated
Comment thread .github/workflows/website-update-security-txt.yaml
Comment thread SECURITY.md Outdated
Comment thread SECURITY.md Outdated
Comment thread .github/workflows/website-update-security-txt.yaml Outdated

@matthiasbruns matthiasbruns left a comment •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Tackle the open points and I am happy

Comment thread SECURITY.md Outdated
Comment thread SECURITY.md Outdated

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

♻️ Duplicate comments (1)
.github/workflows/website-update-security-txt.yaml (1)

27-54: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Remove the incomplete duplicate step — it causes a bash syntax error on every run.

Lines 27–34 contain an abandoned partial copy of the "Bump Expires" step, missing the closing fi for the if [[ -z ... ]] block. GitHub Actions executes both list items sequentially; the first one causes bash to exit with unexpected end of file under set -euo pipefail, so the workflow always fails before the correct step (lines 35–54) can execute.

The incomplete step also uses the ::error:: annotation style inconsistent with the >&2 pattern in the real step, and contains none of the date-computation logic — it is clearly a stale draft left over when the "fail-fast" fix from the previous review round was appended rather than merged in-place.

🐛 Proposed fix — drop the orphaned first step
-    - name: Bump Expires date by one year
-      run: |
-        set -euo pipefail
-        FILE=website/static/.well-known/security.txt
-        CURRENT=$(sed -n 's/^Expires:[[:space:]]*//p' "$FILE")
-        if [[ -z "${CURRENT}" ]]; then
-          echo "::error::Missing Expires field in ${FILE}"
-          exit 1
-
     - name: Bump Expires date by one year
       run: |
         set -euo pipefail
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/website-update-security-txt.yaml around lines 27 - 54,
Remove the stray/incomplete duplicate job step named "Bump Expires date by one
year" (the first occurrence) that is missing the closing fi and uses the
::error:: annotation; keep only the complete "Bump Expires date by one year"
step that parses CURRENT, computes NEW with date and replaces the Expires line.
In practice, delete the earlier run: | block (the abandoned partial copy) so the
workflow contains a single correct Bump Expires step (the one that sets FILE,
extracts CURRENT, computes NEW with date -u -d ... || date -u -j ..., checks
NEW, runs sed -i, and prints the update).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Duplicate comments:
In @.github/workflows/website-update-security-txt.yaml:
- Around line 27-54: Remove the stray/incomplete duplicate job step named "Bump
Expires date by one year" (the first occurrence) that is missing the closing fi
and uses the ::error:: annotation; keep only the complete "Bump Expires date by
one year" step that parses CURRENT, computes NEW with date and replaces the
Expires line. In practice, delete the earlier run: | block (the abandoned
partial copy) so the workflow contains a single correct Bump Expires step (the
one that sets FILE, extracts CURRENT, computes NEW with date -u -d ... || date
-u -j ..., checks NEW, runs sed -i, and prints the update).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 2a29f7b1-b863-489e-8fab-7c0d75e8ac3d

📥 Commits

Reviewing files that changed from the base of the PR and between f24dba6 and 3f55e07.

📒 Files selected for processing (2)
  • .github/config/wordlist.txt
  • .github/workflows/website-update-security-txt.yaml
✅ Files skipped from review due to trivial changes (1)
  • .github/config/wordlist.txt

@morri-son

Copy link
Copy Markdown
Contributor Author

put this back to draft, until neonephos/guidelines-development#7 is merged AND approved by NeoNephos TAG.

@morri-son
morri-son marked this pull request as draft May 4, 2026 12:18
auto-merge was automatically disabled May 4, 2026 12:18

Pull request was converted to draft

@github-actions

Copy link
Copy Markdown
Contributor

This pull request was marked as stale because it has not had recent activity.

@github-actions github-actions Bot added the lifecycle/stale Nobody worked on this for 6 months (will further age) label Aug 20, 2026
@matthiasbruns

Copy link
Copy Markdown
Contributor

@morri-son status?

@github-actions github-actions Bot removed the lifecycle/stale Nobody worked on this for 6 months (will further age) label Aug 27, 2026
Comment thread SECURITY.md Outdated
@github-actions github-actions Bot added size/xs Extra small size/s Small and removed size/m Medium size/xs Extra small labels Sep 14, 2026
Comment thread .github/workflows/website-update-security-txt.yaml Fixed
Comment thread .github/workflows/website-update-security-txt.yaml Fixed
@morri-son
morri-son force-pushed the docs/add-security-policy branch from 3253fc7 to f2790f3 Compare September 14, 2026 15:35
@morri-son morri-son changed the title docs: add SECURITY.md and update security.txt docs: update security.txt and re-introduce workflow to update the expiry date every year Sep 14, 2026
Comment thread .github/workflows/website-update-security-txt.yaml Fixed
@morri-son
morri-son marked this pull request as ready for review September 14, 2026 15:51
@morri-son
morri-son enabled auto-merge (squash) September 14, 2026 15:51
Restore the Expires field in security.txt and implement a compliant automation:

- Add Expires: 2028-12-31T00:00:00.000Z to security.txt
- Restore workflow that updates expiry date annually
- Ensures RFC 9116 compliance (security.txt must have valid Expires)
- Uses GitHub App token for automated PR creation
- Signs commits for compliance audit trail

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Implement automated renewal of the Expires field in security.txt:

- Runs every weekday in December at 09:00 UTC
- Updates Expires to next December 31st
- Creates idempotent PR for review and merge
- Ensures RFC 9116 compliance without manual maintenance
- Uses scoped GitHub App token (current repo only)
- Signs commits for compliance

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
- Replace outdated action with actions/create-github-app-token (v3.2.0)
- Update actions/checkout to v7.0.1 to match repo standards
- Ensure precise version comments for zizmor security compliance
- Aligns workflow with established patterns in the repository

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Restrict the GitHub App token to minimal required permissions following
the principle of least privilege and zizmor security best practices:

- Add 'repositories' constraint to limit token to current repo only
- Add explicit 'permission-pull-requests: write' for PR creation
- Add explicit 'permission-contents: write' for commit signing
- Remove blanket installation permissions

This aligns with security practices used throughout the repository and
ensures the token only has the minimum permissions required to create
pull requests with signed commits.

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
@morri-son
morri-son force-pushed the docs/add-security-policy branch from d3df2af to 6192a64 Compare September 14, 2026 15:55
@morri-son
morri-son merged commit 6579bd7 into open-component-model:main Sep 16, 2026
18 of 22 checks passed
ocmbot Bot pushed a commit that referenced this pull request Sep 16, 2026
…iry date every year (#2386)

## Summary

Add security.txt and a workflow to update it for Open Component Model
vulnerability disclosure, aligned with NeoNephos Security Guidelines and
CRA compliance requirements.

**Important**: The organization-wide has been moved to a separate PR in
the repository (see Related PRs below). This PR focuses on tooling,
workflows, and security.txt updates only.

## Changes

- ✅ Update `website/static/.well-known/security.txt` (RFC 9116
compliance)
  - Reference new reporting channels and contacts
  - Add Expires field with automated renewal workflow

- ✅ Restore automated security.txt expiry renewal workflow
  - Runs every weekday in December at 09:00 UTC
  - Automatically updates Expires field to next year
  - Creates idempotent PR for review and merge
  - Ensures RFC 9116 compliance without manual maintenance

- ✅ Security documentation references
  - Links to `docs/security/secure-design.md`
  - Links to `docs/security/assurance-case.md`

## Related PRs

**⚠️ MERGE ORDER MATTERS:**

1. **FIRST**: Merge `open-component-model/.github#115`
   - Organization-wide SECURITY.md (applies to all repos)
   - NeoNephos Security Guidelines compliance
   - CRA stewardship statement per Linux Foundation
   - Commercial intent declaration
   - URL: open-component-model/.github#115

2. **THEN**: Merge this PR
(`#2386`)
   - Security tooling and automation
   - security.txt updates

**Reason**: The .github SECURITY.md is organization-wide and is
referenced by this PR's security.txt updates.

## Compliance

- ✅ RFC 9116 (security.txt standard)
- ✅ NeoNephos Security Guidelines
- ✅ CRA (EU Cyber Resilience Act) stewardship
- ✅ DCO sign-off on all commits

## Test Plan

- [x] Verify `security.txt` is valid per RFC 9116
- [x] Verify `security.txt` references correct SECURITY.md location
- [x] Verify workflow runs correctly (manual trigger or wait for
December)
- [x] Verify Expires field updates to next year + 12-31

## Closes

- open-component-model/ocm-project#683 (security.txt automation)

---------

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Signed-off-by: Gerald Morrison <67469729+morri-son@users.noreply.github.com>
Co-authored-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Co-authored-by: Matthias Bruns <github@matthiasbruns.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> 6579bd7
morri-son added a commit to open-component-model/.github that referenced this pull request Sep 17, 2026
…#115)

## Overview

Update the organization-wide SECURITY.md to align with NeoNephos
Foundation security standards and EU Cyber Resilience Act (CRA)
compliance requirements.

## Changes

- Replace SAP-focused security policy with Open Component Model specific
policy
- Reference [NeoNephos Security
Guidelines](https://github.com/neonephos/guidelines-development/blob/main/security-guidelines/security-guidelines.md)
for standardized vulnerability handling
- Add CRA stewardship statement per Linux Foundation requirements
- Document commercial intent (required for CRA compliance)
- Include escalation contact for CRA: `steward@linuxfoundation.org`
- Align response timelines with NeoNephos standards:
  - Initial response: 14 calendar days
  - Vulnerability embargo: up to 90 days
  - Severity-based response targets (Critical, High, Medium, Low)

## CRA Compliance Details

- **Steward**: Linux Foundation
- **Steward Contact**: steward@linuxfoundation.org
- **Commercial Intent**: Open Component Model software is intended for
commercial use
- **Reference**: [NeoNephos CRA Guidelines
§11](https://github.com/neonephos/guidelines-development/blob/main/security-guidelines/security-guidelines.md#11-eu-cyber-resilience-act-cra-compliance)

## Implementation Notes

This update follows the standardized approach adopted by all NeoNephos
Foundation projects as of the September 2026 Linux Foundation guidance
update. All commits include DCO sign-off for compliance audit trail.

## Related

- Upstream PR: open-component-model/open-component-model#2386 (security
tooling and workflow)
- NeoNephos Guidelines:
https://github.com/neonephos/guidelines-development/
- LF CRA Guidance: https://www.linuxfoundation.org/security

---------

Signed-off-by: Gerald Morrison (D032990) <gerald.morrison@sap.com>
Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Signed-off-by: Gerald Morrison <67469729+morri-son@users.noreply.github.com>
Co-authored-by: Gerald Morrison (D032990) <gerald.morrison@sap.com>
Co-authored-by: Frederic Wilhelm <fre.wilhelm@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/documentation Documentation related component/github-actions Changes on GitHub Actions or within `.github/` directory kind/chore chore, maintenance, etc. size/s Small

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants