Hi devs,
Edit (2026-10-13): this idea is now the plan B. The preferred option is to keep security issues in our tracker, with confidential work packages in OpenProject, and we’re asking the OpenProject team what that feature will cover and when. We’ll choose one or the other once they’ve answered, so that we don’t switch twice. Following the feedback, I’ve also fixed the statements on the reproduction steps and the report form, and removed the step about informing the sponsoring companies through the forum. See my reply for the details.
We’re preparing to leave jira.xwiki.org for OpenProject (op.xwiki.org); the proposal for the migration will be posted soon. Before that, we need to agree on a new place for security issues. Today they’re reported in Jira with the “Confidential” security level, and we already use GitHub Security Advisories (GHSA) drafts for the advisory text, the private fork, the CVE and the credits. OpenProject doesn’t support confidential work packages yet, and it’s unlikely to be available within the next 6 months, so we can’t simply move this part of the process to op.xwiki.org.
This is a brainstorming, not a vote: I’d like to gather your opinions first. The idea below is to make GHSA the place where security issues are reported and discussed. Since it doesn’t depend on the migration, it could be applied as soon as we agree on it.
The idea in short
- Security issues are reported privately on GitHub (“Report a vulnerability” button on the repository’s Security tab), or by email to the security@xwiki.org mailing list for reporters without a GitHub account.
- All confidential content (description, reproduction steps, discussion with the reporter, fix review) lives in the GHSA advisory and its temporary private fork.
- For each accepted issue, a committer creates a public placeholder issue with a neutral title in the issue tracker (Jira until the XS projects move, then OpenProject). It carries what the tracker is good at: the issue key used in commit messages, the assignee, the priority and the Fix Versions used by the release process and the release notes.
- Creating and updating the placeholder can be one command for the committer, through a Claude Code skill (see below).
- When the advisory is published (3 months after the fix is released, as today), the placeholder issue gets the
securitylabel and a link to the advisory. - Reporting confidential issues in Jira stops. Open confidential Jira issues are handled as they are now until the XS migration, when each one gets a GHSA draft (most already have one) and a placeholder work package with the same key.
Why GHSA
- Most security researchers already have a GitHub account. They don’t need to create an account on our tracker.
- Reports are always private. Today a reporter can forget to set the “Confidential” level in Jira, which discloses the issue publicly.
- One place for the whole lifecycle: the report, the discussion with the reporter, the fix in a private fork (the reporter can contribute to it), the CVSS score, the CVE request (GitHub is a CVE Numbering Authority), the credits and the publication. We already do most of this in GHSA, so this removes the back-and-forth between Jira and GitHub.
- The discussion stays private after publication. Only the advisory description becomes public, while the comments and the edit history stay visible to collaborators only. Since the report form’s answers (including the reproduction steps) go into the description, the committer moves them to a comment at acceptance (see the committers’ steps). Today, removing the Confidential level in Jira makes every comment public.
- A structured report form, defined once for all our repositories, asks reporters for what we need (affected version, steps, impact). Its answers become the advisory description, which is rewritten at acceptance.
- It’s independent of the tracker migration, so it can be applied now and it doesn’t depend on OpenProject delivering confidential work packages.
- It’s a common practice. Publishing advisories on GHSA is close to a standard (it feeds the GitHub Advisory Database, Dependabot and OSV), and more and more projects also take reports there. See the survey below.
What other projects do
I checked the security policies of about 30 well-known open source projects:
| How reports are received | Projects |
|---|---|
| GHSA private reporting | CPython, Spring, Jetty, Mastodon, OpenProject (GHSA or email) |
| Private issues in the project’s own tracker | Jenkins (Jira), Mozilla (Bugzilla), Wikimedia (Phabricator), Moodle, GitLab (as a second option) |
| Bug bounty platform (HackerOne, Intigriti, YesWeHack) | Node.js, Rails, curl, Nextcloud, WordPress, Discourse, Kubernetes, GitLab, Grafana |
| Private email list | Apache projects (Tomcat, Log4j…), Django, Go, Rust, OpenSSL, Keycloak, Quarkus, Mattermost, Next.js, Vault, Matrix |
Some takeaways:
- There’s no single standard way to receive reports, but GHSA private reporting is growing among projects hosted on GitHub. Jetty, for example, does triage and discussion in the advisory comments and handles email reports by creating the advisory itself, which is what’s proposed here.
- Projects that receive reports elsewhere still publish their advisories on GHSA (Keycloak, Rails, Grafana, Discourse, Nextcloud, WordPress, OpenProject).
- The OpenSSF guide for maintainers accepts either a tracker with private issues or email for receiving reports. It recommends using the GHSA private fork to develop the fix, and keeping an email address as a fallback. That’s why the mailing list stays.
Details: the survey, project by project
Sources: each project’s SECURITY.md or security policy page, read on 2026-10-07, and the OpenSSF maintainer guide.
| Project | Where reports go | Fallback | Tracking and publication |
|---|---|---|---|
| CPython | GHSA private reporting | — | GHSA |
| Spring (all projects) | GHSA, in one central repository (spring-projects/security-advisories), with a template and a sample pushed to the advisory’s private fork |
— | GHSA, spring.io |
| Jetty | GHSA private reporting (“preferred”) | Email; the team creates the advisory for email reports | Triage in the advisory comments; CVE through a confidential Eclipse GitLab issue |
| Mastodon | GHSA or email (equal) | — | GHSA |
| OpenProject | Email or GHSA (“if you prefer”), not its own tracker | — | GHSA, release notes |
| Jenkins | Its own Jira, SECURITY project (visible to the reporter and the security team only), one component per core/plugin | Private mailing list (the team files the issue) | Jira, jenkins.io advisories |
| Mozilla | Its own Bugzilla, security bugs | security@ | Bugzilla, advisories |
| MediaWiki / Wikimedia | Its own Phabricator, “Report Security Issue” form | Email (the team creates the task and adds the reporter) | The task is made public at fix time |
| Moodle | A security form linked to its own tracker | — | Tracker |
| GitLab | HackerOne | Confidential issue in its own GitLab (email no longer accepted) | Issues made public 90 days after the fix |
| Node.js, Rails, curl, Nextcloud, WordPress, Discourse | HackerOne | Email (some) | Own advisories; most also publish on GHSA |
| Grafana | Intigriti | GHSA | |
| Kubernetes | HackerOne | Email list | Own process |
| Keycloak | Email (plus a YesWeHack bounty) | — | GHSA |
| Apache (Tomcat, Log4j, all ASF projects) | Email, security@ or project lists | — | The ASF is the CNA; Jira after disclosure |
| Django, Go, Rust, OpenSSL, Quarkus, Mattermost, Next.js, Vault, Matrix | — | Own advisories (several also on GHSA) | |
| XWiki (today) | Our Jira, Confidential level and security label |
security@xwiki.org | Jira and a GHSA draft, then a published GHSA |
Patterns:
- There are four families: bug bounty platforms (projects with a budget or a company behind them), private email lists (foundations: ASF, Django, Go, Rust, OpenSSL), private issues in the project’s own tracker (projects with a strong tracker culture, like ours) and GHSA private reporting (growing among projects hosted on GitHub).
- GHSA as the publication channel is close to a de facto standard, even for projects that take reports elsewhere, because it feeds the GitHub Advisory Database, Dependabot and OSV. We already do this.
- The closest project to ours is Jenkins: Java, self-hosted, a core plus about 2,000 plugin repositories on GitHub (like our core and contrib). It keeps reports in its own Jira. Spring solves GitHub’s “one form per repository” limitation with a single central advisories repository.
- OpenProject itself takes reports through GHSA or email, not through confidential work packages.
- Many policies now warn against unreviewed AI-generated reports (Keycloak, Go, curl). Open channels, GHSA private reporting included, receive the most of them.
Details: GHSA vs an issue tracker, need by need
supported ·
partial or workaround ·
missing. The tracker column is an issue tracker with confidential issues, like Jira as we use it today (OpenProject doesn’t have them yet).
For reporters
| Need | GHSA | Tracker with confidential issues |
|---|---|---|
| Account needed | GitHub account (most researchers have one) | An account on our tracker |
| Single entry point | ||
| Wrong place | ||
| Structured form | ||
| Private by default | ||
| Attachments (screenshots, proof of concept) | ||
| Following the status | ||
| Discussion with the team | ||
| Proposing a fix | ||
| Credit and CVE | ||
| Reporting without an account |
For committers
| Need | GHSA | Tracker with confidential issues |
|---|---|---|
| Assignee | ||
| Triage queue across all repositories | ||
| Full-text search in drafts | ||
| Priority and CVSS | ||
| Labels and components | ||
| Fix Versions tied to releases (release plans, release notes) | ||
| Issue key for commit messages | ||
| Links, duplicates, blockers | ||
| Issue spanning several repositories | ||
| Trusted non-committers (sponsoring companies) | ||
| Disclosure | ||
| Embargo tracking and reminders | Same application | |
| API and automation | ||
| Available now | Jira: yes, but it’s going away. OpenProject: not before 6 months |
Conclusion: GHSA is excellent for the collaboration between the reporter and the people fixing the issue, and we already use it for that. It isn’t an issue tracker, though, so GHSA alone doesn’t work; that’s why the idea pairs it with a public placeholder issue, which covers every
in the committers’ table.
Details: facts checked on our repositories (2026-10-07)
- Private vulnerability reporting is currently disabled on xwiki-platform, xwiki-commons and xwiki-rendering. It can be enabled for a whole organization through a security configuration.
- xwiki-platform already has 112 draft, 234 published and 4 closed advisories.
- The xwiki organization has 10 public repositories and xwiki-contrib 370.
- An advisory goes through these states: triage → draft → published, or closed. The API filters by state only.
- An advisory holds: summary, description, severity or CVSS vector, CWE ids, affected packages with vulnerable and patched versions (free text), credits, collaborators (users and teams), CVE id.
- The report form’s answers are merged into the advisory description, which is what gets published. Comments and the edit history stay visible to the advisory’s collaborators only, even after publication. Since 2026-10-02, comments can be listed, read, added and edited through the REST API (public preview), so tooling can copy the discussion elsewhere; maintainer-only confidential comments are only returned by the GraphQL API.
Limitations and how we handle them
- GHSA isn’t an issue tracker: it has no assignee, components, versions, links or saved searches. → That’s the role of the placeholder issue.
- Reports are per repository, so a reporter has to pick xwiki-platform, xwiki-commons, xwiki-rendering or a contrib repository. → The security policy says “if unsure, report on xwiki-platform”. A committer recreates the advisory in the right repository when needed, since an advisory can’t be moved.
- A GitHub account is required. → The security@xwiki.org mailing list stays open to anyone.
- Two items to keep consistent per issue (the advisory and the placeholder). → The advisory holds the placeholder key; the placeholder never links to the advisory before publication. The Claude Code skill below does both updates.
- A placeholder with a neutral title is visible before disclosure. → Same rule as our obfuscated commit messages: the title describes the change, not the vulnerability.
Making the placeholder a one-step task
The extra work this adds for committers is the placeholder issue. We can make it simple with a Claude Code skill, run by the committer handling the security issue, for example with the advisory’s URL:
- At acceptance: it reads the advisory, picks the tracker project from the repository, proposes a neutral title (which the committer validates), creates the placeholder with the assignee, the priority computed from the CVSS score and the Fix Versions, then writes the placeholder’s key into the advisory.
- At publication: it adds the
securitylabel and the link to the advisory on the placeholder.
Committers who don’t use Claude Code can do the same by hand, following the steps below; it takes a couple of minutes.
The process, step by step
For reporters
- Read the Security Policy (what counts as a vulnerability, how we compute severity).
- Open the Security tab of the affected repository (xwiki-platform if unsure) and click Report a vulnerability. Without a GitHub account, send the same information by email to security@xwiki.org.
- Fill in the form: affected versions, description, reproduction steps, impact.
- Follow the discussion in the advisory comments (GitHub notifications), answer questions, and optionally contribute a fix in the temporary private fork.
- Get credited in the advisory when it’s published, with a CVE.
- Don’t disclose the issue until the advisory is published.
For committers
- Receive the report: GitHub notifies the security team (it gets the security manager role on the xwiki and xwiki-contrib organizations). Email reports arrive on security@xwiki.org: the committer creates the advisory and adds the reporter as a collaborator if they have a GitHub account, otherwise relays by email.
- Triage in the advisory comments: reproduce it, ask the reporter for missing information. If it’s not a vulnerability, close the advisory with an explanation. If it’s in the wrong repository, recreate it in the right one.
- Accept (“Accept and open as draft”), add the XWiki/Security team as collaborator, compute the CVSS score following the Security Policy, and set the CWE and the affected versions. Move the reproduction steps and the proof of concept to a comment, and rewrite the description with our advisory template (Impact, Patches, Workarounds, References), since the description is what gets published.
- Create the placeholder issue in the tracker, with the skill or by hand: neutral title (as for an obfuscated commit message), priority from the CVSS score, assignee, Fix Versions; no
securitylabel and no link to the advisory. Put its key in the advisory. - Fix it on all supported branches, in the advisory’s temporary private fork when working with the reporter or a non-committer (merged with the existing manual recipe, not from the GitHub UI). Commit messages use the placeholder key and stay obfuscated.
- Release: the placeholder is closed with its Fix Versions, like any other issue. Refresh the advisory in the Security Advisory Application, which computes the embargo and sends the reminders.
- Request the CVE (from GitHub, or from our own CNA once it’s in place) and publish the advisory at the end of the embargo (at least 3 months after the release, as today).
- Update the placeholder issue (with the skill or by hand): add the
securitylabel and the link to the advisory, so that release notes and searches find it.
What it would imply
- Enable GitHub private vulnerability reporting on all repositories of the xwiki and xwiki-contrib organizations, with one report form for all of them.
- Give the XWiki/Security team the security manager role on both organizations, so it sees every report.
- Write the Claude Code skill for the placeholder issue.
- Update the Security Policy page and add a
SECURITY.mdto our repositories. - Remove the “Confidential” security level from new Jira issues once the existing ones are handled.
Questions for you
- Do you see needs that GHSA plus a placeholder issue wouldn’t cover?
- Would you prefer one central repository for all reports (as Spring does), instead of reporting on each repository?
- Any concern about the neutral placeholder issue being public before disclosure?
If the feedback is positive, I’ll follow up with a proposal or a vote.
Thanks