Skip to content

Commit a9e893f

Browse files
authored
chore(security): rewrite SECURITY.md with SOC2-ready policy (#762)
* chore(security): rewrite SECURITY.md with SOC2-ready policy Adds explicit triage/remediation SLA (critical 7d, high 30d, medium 90d), documents the current scanning toolchain (CodeQL, Scorecard, Trivy, Dependabot, secret scanning), branch protection on develop, and quarterly access reviews. Updates the reporting address from a non-routable security@ alias to anand.ray@rocketride.ai pending shared-mailbox creation. Refs #760 * docs(security): reference settings as source of truth (CodeRabbit feedback) * docs(security): address CodeRabbit feedback (settings as source of truth + SLA wording)
1 parent 05a8864 commit a9e893f

1 file changed

Lines changed: 60 additions & 15 deletions

File tree

SECURITY.md

Lines changed: 60 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ We release security patches for the following versions:
99
| 3.1.x | :white_check_mark: |
1010
| < 3.1 | :x: |
1111

12+
Critical-severity issues in unsupported versions are evaluated case-by-case.
13+
1214
## Reporting a Vulnerability
1315

1416
We take security vulnerabilities seriously. If you discover a security issue, please report it responsibly.
@@ -26,13 +28,15 @@ We take security vulnerabilities seriously. If you discover a security issue, pl
2628

2729
### What to Expect
2830

29-
- **Acknowledgment**: Within 48 hours
30-
- **Initial Assessment**: Within 5 business days
31-
- **Resolution Timeline**: Depends on severity
32-
- Critical: 1-7 days
33-
- High: 7-30 days
34-
- Medium: 30-90 days
35-
- Low: Next release cycle
31+
- **Acknowledgment**: within 2 business days
32+
- **Triage and Remediation SLA**:
33+
34+
| Severity | Triage SLA | Remediation SLA |
35+
| ---------- | --------------- | ---------------- |
36+
| Critical | 1 business day | 7 calendar days |
37+
| High | 3 business days | 30 calendar days |
38+
| Medium | 5 business days | 90 calendar days |
39+
| Low / Note | Best effort | Best effort |
3640

3741
### Disclosure Policy
3842

@@ -42,13 +46,25 @@ We take security vulnerabilities seriously. If you discover a security issue, pl
4246

4347
## Vulnerability & Alert Triage
4448

45-
This project uses GitHub-native scanning on the `develop` branch — CodeQL (Default Setup), Secret Scanning with Push Protection, Scorecard, and Dependabot. CodeQL and Scorecard findings both surface as code scanning alerts in the same GitHub UI and share the dismissal workflow described below. All findings are triaged against the SLAs in [What to Expect](#what-to-expect).
49+
This project uses GitHub-native scanning on the `develop` branch. CodeQL and Scorecard findings both surface as code scanning alerts in the same GitHub UI and share the dismissal workflow described below. All findings are triaged against the SLAs in [What to Expect](#what-to-expect).
50+
51+
### Scanning Tools and Coverage
52+
53+
| Tool | Coverage |
54+
| -------------------------------------------- | ---------------------------------------------------- |
55+
| **CodeQL** | Python, JavaScript/TypeScript, C/C++ (Default Setup) |
56+
| **Scorecard** | Supply-chain best practices |
57+
| **Trivy** | Dockerfile config + dependency CVEs |
58+
| **Dependabot** | Dependency vulnerabilities |
59+
| **GitHub Secret Scanning + Push Protection** | Credential leak prevention |
60+
61+
Tool configuration, cadence, and exact workflow names are maintained in `.github/workflows/` and the repository's security settings — refer to those as the source of truth.
4662

4763
### Two-Person Control on Alert Dismissals
4864

4965
To prevent unilateral dismissal of security findings, this repository operates under GitHub's **Delegated Alert Dismissal**, enabled at the `rocketride-org` organization level:
5066

51-
1. **Request** — any maintainer with write access can submit a dismissal request. The request **must** include a documented justification: compensating controls, mitigation rationale, or basis for "won't fix". This justification is recorded as the dismissal comment on the alert.
67+
1. **Request** — any maintainer with write access can submit a dismissal request. The request **must** include a documented justification: compensating controls, mitigation rationale, or basis for "accepted risk". This justification is recorded as the dismissal comment on the alert.
5268
2. **Approval** — must be given by a *different* authorized reviewer under GitHub Delegated Alert Dismissal (organization owner, security manager, or explicitly delegated custom role). The requester cannot self-approve.
5369
3. **Dismissal** — GitHub auto-applies the dismissal once approval lands. The full `request → approval → dismissal` trail is preserved on the alert and serves as the system-of-record for audit.
5470

@@ -58,12 +74,12 @@ Direct (one-step) dismissal is blocked at the organization level.
5874

5975
When closing an alert, choose one of:
6076

61-
| Disposition | When to use | Evidence captured |
62-
| --- | --- | --- |
63-
| **Fix** | Vulnerability is exploitable in our usage | PR linking the alert (auto-closes on merge) |
64-
| **Mitigated** | Code path is reachable but compensating controls neutralize the risk | Two-person dismissal with controls listed in comment |
65-
| **False positive** | Tool flagged a non-issue (e.g., test fixture, intentional pattern) | Two-person dismissal with explanation |
66-
| **Won't fix** | Risk accepted by ownership | Two-person dismissal with named approver and rationale |
77+
| Disposition | When to use | Evidence captured |
78+
| ------------------ | -------------------------------------------------------------------- | --------------------------------------------------------------------------- |
79+
| **Fixed** | Vulnerability is exploitable in our usage; patch landed | PR linking the alert (auto-closes on merge) |
80+
| **Mitigated** | Code path is reachable but compensating controls neutralize the risk | Two-person dismissal with controls listed in comment |
81+
| **False positive** | Tool flagged a non-issue (e.g., test fixture, intentional pattern) | Two-person dismissal with explanation |
82+
| **Accepted risk** | Risk accepted by ownership | Two-person dismissal with named approver, rationale, and re-evaluation date |
6783

6884
### Secret Scanning & Dependabot
6985

@@ -74,6 +90,35 @@ When closing an alert, choose one of:
7490
- Dismissal reason and any SLA exception must be recorded in the dismissal comment.
7591
- Fixes are tracked via Dependabot security update PRs against the SLAs above.
7692

93+
## Branch Protection (`develop`)
94+
95+
- All changes land via pull request
96+
- At least 1 code-owner approval required (per `CODEOWNERS`)
97+
- All required CI and security-scanning status checks (as configured in branch protection settings) must pass
98+
- Force-pushes disallowed
99+
- Branch deletion disallowed
100+
- Linear history enforced
101+
- Stale reviews dismissed on new pushes
102+
- **Admin bypass disabled** — protection rule applies to all users including org owners
103+
104+
## Access Reviews
105+
106+
Access to this repository is reviewed **quarterly** by an org owner. The review covers:
107+
108+
1. All members of `rocketride-org`
109+
2. All outside collaborators with any permission level
110+
3. All org owners and their continuing need for that role
111+
4. 2FA compliance across the org
112+
113+
Reviews are documented internally with disposition for each non-employee or elevated-access user.
114+
115+
## Public Vulnerability Disclosure
116+
117+
After remediation lands in a supported version, we publish an advisory at:
118+
https://github.com/rocketride-org/rocketride-server/security/advisories
119+
120+
Reporters are credited unless they request otherwise.
121+
77122
## Security Best Practices
78123

79124
When using RocketRide Engine:

0 commit comments

Comments
 (0)