Skip to content

docs: add SECURITY.md and update security.txt#2386

Draft
morri-son wants to merge 13 commits intoopen-component-model:mainfrom
morri-son:docs/add-security-policy
Draft

docs: add SECURITY.md and update security.txt#2386
morri-son wants to merge 13 commits intoopen-component-model:mainfrom
morri-son:docs/add-security-policy

Conversation

@morri-son
Copy link
Copy Markdown
Contributor

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

Summary

  • Add a repository-level SECURITY.md based on the NeoNephos Security Guidelines template, replacing the inherited SAP boilerplate with an OCM-specific vulnerability disclosure policy
  • Update website/static/.well-known/security.txt (RFC 9116) to reference the new reporting channels and refresh the expired date

Closes open-component-model/ocm-project#1021

Details

The SECURITY.md covers:

  • GitHub Private Vulnerability Reporting as the primary intake channel
  • TSC mailing list as email fallback
  • TSC as collective security contact with the chair as lead
  • Supported versions policy (latest minor only, pre-1.0)
  • Response process and severity targets per NeoNephos Security Guidelines
  • Links to docs/security/secure-design.md and docs/security/assurance-case.md
  • Coordinated disclosure policy

Test plan

  • Verify SECURITY.md renders correctly on GitHub
  • Verify the "Report a vulnerability" link resolves to the correct advisory form
  • Verify security.txt is valid per RFC 9116 (e.g. via https://securitytxt.org/)

Add a repository-level SECURITY.md based on the NeoNephos security
guidelines template. This replaces the inherited SAP boilerplate with
a project-specific vulnerability disclosure policy covering GitHub
private vulnerability reporting, TSC contact information, supported
versions, response timelines, and coordinated disclosure.

Update security.txt (RFC 9116) to point to the new reporting channels
and refresh the expired date.

Closes: open-component-model/ocm-project#1021
Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
@morri-son morri-son requested a review from a team as a code owner April 24, 2026 08:03
@netlify
Copy link
Copy Markdown

netlify Bot commented Apr 24, 2026

Deploy Preview for ocm-website ready!

Name Link
🔨 Latest commit c374e86
🔍 Latest deploy log https://app.netlify.com/projects/ocm-website/deploys/69f88ddb14795000087dcdf5
😎 Deploy Preview https://deploy-preview-2386--ocm-website.netlify.app
📱 Preview on mobile
Toggle QR Code...

QR Code

Use your smartphone camera to open QR code link.
🤖 Make changes Run an agent on this branch

To edit notification comments on pull requests, go to your Netlify project configuration.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 24, 2026

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

Poem

🐰 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.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main changes: adding SECURITY.md and updating security.txt files as documentation.
Description check ✅ Passed The description provides relevant context about the changes, referencing the NeoNephos template, listing key content areas covered in SECURITY.md, and linking to the closed issue #1021.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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

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

@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
- Use absolute GitHub links for security docs (not local relative paths)
- Add CVSS, mitigations, and OpenSSF to the spellcheck wordlist

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
@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
The security design and assurance case docs are part of PR open-component-model#2290
which hasn't merged yet. Reference them by path instead of as
clickable links to avoid 404 errors during link verification.

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Replace the old SAP-internal fetch with a job that bumps the
Expires field in our project-owned security.txt by one year.
Runs on November 1st annually so a renewal PR is ready well
before the April expiry.

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
- Set Expires to 2027-12-31 (year-end convention)
- Schedule renewal workflow for December 1st to match the new cadence

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Use sparse checkout — only the single security.txt file is needed,
no point cloning the entire repo.

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
@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
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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
Copy link
Copy Markdown
Contributor

@Skarlso Skarlso left a comment

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
morrison-sap and others added 2 commits April 28, 2026 17:01
- Add Canonical field to security.txt (RFC 9116)
- Add set -euo pipefail and validation guards to renewal workflow
- Run renewal workflow every weekday in December (idempotent)
- Remove stale "None yet" text from Past Security Advisories

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Signed-off-by: Gerald Morrison <67469729+morri-son@users.noreply.github.com>
@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

| Name | Handle | Role |
|------|--------|------|
| Jakob Moeller | [@jakobmoellerdev](https://github.com/jakobmoellerdev) | TSC Chair / Lead Security Contact |
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 is incorrect. I'm the chair and Fabian is the Tech Lead.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

This is not for the SIG runtime, it is TSC. As long as we have dedicated security contacts I pinned it to the TSC Chair.

@morri-son morri-son requested a review from Skarlso April 29, 2026 14:18
Copy link
Copy Markdown
Contributor

@frewilhelm frewilhelm left a comment

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 on lines +27 to +35
- 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
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 looks redundant. What is the reason behind it?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Now it always writes 31.12.xxxx as expiry data and moved the year +1. Simple

# Job runs every day in December at 00:00 UTC
- cron: '0 0 * 12 *'
# Run every weekday in December at 09:00 UTC. The create-pull-request
# action is idempotent so repeated runs simply update the same PR branch.
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.

What happens if the branch get merged? Will the PR get recreated until the end of december?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

I changed the job a bit. Now it always writes 31.12.xxxx as expiry data. So all future runs after a merge will detect no changes, so no new PR.

Comment thread SECURITY.md Outdated

## Supported Versions

Only the latest minor release receives security updates. Given the project's pre-1.0 status and
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.

I believe this contradicts the policy that was decided in the release-manager ADR

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

copy paste and not adopted :-). Now adopted to our relase process Latest 3 minors (y, y-1, y-2)

Comment thread SECURITY.md
Comment on lines +86 to +87
- Secure Design (in `docs/security/secure-design.md`)
- Security Assurance Case (in `docs/security/assurance-case.md`)
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.

where are those files?

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.

ah i see #2290

Comment thread .github/workflows/website-update-security-txt.yaml Outdated
Copy link
Copy Markdown
Contributor

@matthiasbruns matthiasbruns left a comment

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

## Response Process

This project follows the [NeoNephos Security Guidelines](https://github.com/neonephos/guidelines-development/blob/main/security-guidelines/security-guidelines.md)
Copy link
Copy Markdown
Member

@jakobmoellerdev jakobmoellerdev May 4, 2026

Choose a reason for hiding this comment

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

These guidelines are still in development so we cannot rely on them until they are approved unfortunately. We can note that we are working on integrating with the foundation policy but for now we must use our own or rely on LF

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

Then my proposal would be to make this PR draft and wait for the security guidelines PR merged in the NeoNephos repo and get approved.

Comment thread SECURITY.md
| Latest minor (currently 0.x) | Yes |
| Older minors | No |

## Response Process
Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

Currently this guide is written as if there was a stable submission process but there isn't any. What are our security issue submission channels actually now?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

The ones GH offers and in addition via email, like described under ## Reporting a Vulnerability

…olicy

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
…component-model into docs/add-security-policy

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

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

Remove duplicate broken step and replace complex date-parsing logic
with a simple idempotent approach: always set Expires to Dec 31 of
next year. This ensures repeated runs produce no diff after merge.

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
Update supported versions section to reflect the "latest 3 minors
(y, y-1, y-2)" policy from the release strategy ADR instead of
claiming only the latest minor is supported.

Signed-off-by: Gerald Morrison (SAP) <gerald.morrison@sap.com>
@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

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/m Medium

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Create consolidated security design and assurance case document

6 participants