Security Operations
On this page
This page documents CRAIG’s operational security processes: how vulnerabilities are classified, how quickly they must be remediated, how penetration tests are conducted, and how security incidents are handled.
Severity Classification
CRAIG classifies vulnerabilities using the Common Vulnerability Scoring System (CVSS v3.1) base score as the primary input, adjusted by deployment context.
| Severity | CVSS Range | Criteria |
|---|---|---|
Critical |
9.0 – 10.0 |
Remote code execution, authentication bypass, SQL injection enabling full data exfiltration, or any vulnerability actively exploited in the wild. Affects confidentiality of child welfare records (PII/PHI). |
High |
7.0 – 8.9 |
Privilege escalation, significant data exposure (e.g., cross-tenant data leak), denial of service against core services, or vulnerabilities in authentication/authorization flows. |
Medium |
4.0 – 6.9 |
Information disclosure of non-sensitive data, cross-site scripting (XSS) requiring user interaction, missing security headers, or denial of service against non-critical endpoints. |
Low |
0.1 – 3.9 |
Minor information leaks (version banners, stack traces in non-production), cosmetic security issues, or vulnerabilities requiring local access and authenticated sessions. |
Contextual Adjustments
-
If a vulnerability affects PII or PHI (child records, case narratives, health data), increase severity by one level.
-
If a vulnerability is only exploitable in devstack (not production configurations), decrease severity by one level.
-
If a CVE has a known public exploit, treat as Critical regardless of CVSS score.
Remediation SLAs
Remediation timelines are measured from the date a vulnerability is confirmed (triaged and classified).
| Severity | Time to Patch | Time to Deploy | Notes |
|---|---|---|---|
Critical |
24 hours |
48 hours |
Emergency release. All other work stops. Notify deploying agencies immediately. |
High |
7 days |
14 days |
Expedited release. May be bundled with other high-severity fixes. |
Medium |
30 days |
60 days |
Included in the next scheduled release. |
Low |
90 days |
Next release |
Addressed in normal development cycle. |
"Time to Patch" is the deadline for merging a fix to the main branch.
"Time to Deploy" is the deadline for deploying the fix to production environments.
Deploying agencies are responsible for meeting the deployment deadline once a patched release is published.
Escalation Procedures
Severity-Based Escalation
| Severity | Escalation Path |
|---|---|
Critical |
Project maintainer notified immediately. Deploying agency CISOs notified within 4 hours. Fix branch created within 2 hours. Post-incident review required within 5 business days. |
High |
Project maintainer notified within 4 hours. Deploying agencies notified within 24 hours via security advisory. Fix prioritized above all non-critical work. |
Medium |
Logged as a confidential GitLab issue. Assigned to the next sprint. Deploying agencies notified in the release notes. |
Low |
Logged as a confidential GitLab issue. Addressed during normal development. |
Security Update Release Process
-
Triage: Confirm the vulnerability, classify severity, assign a CVE identifier if applicable.
-
Fix: Develop the patch on a private branch. The branch name must NOT reveal the vulnerability.
-
Test: Run the full CI pipeline (unit, integration, E2E). Add a regression test for the vulnerability.
-
Review: Security-sensitive MRs require review from a maintainer who did not author the fix.
-
Release: Tag a new patch version. Publish container images. Update
CHANGELOG.adoc. -
Notify: Send security advisory to deploying agencies per the escalation procedures above.
-
Verify: Confirm deploying agencies acknowledge receipt and have a deployment plan.
Penetration Test Process
Recommended Frequency
-
Annual: Full-scope penetration test covering all services and authentication flows.
-
After major changes: Any new service, new authentication mechanism, or significant API surface change.
-
After critical vulnerability remediation: Re-test to verify the fix is effective and no regressions were introduced.
Scope Definition Template
Before engaging a penetration testing vendor, define the scope using this template:
| Item | Description |
|---|---|
Target Services |
List specific CRAIG services (e.g., craig-web, craig-intake, craig-cases) and their endpoints. |
Authentication Flows |
OIDC Authorization Code + PKCE (web UI), ROPC (CLI/tests), API key (partner intake), unauthenticated (public intake form). |
In-Scope Attacks |
OWASP Top 10, authentication bypass, RBAC boundary testing, IDOR, CSRF, injection attacks, API abuse. |
Out-of-Scope |
Denial of service against production, social engineering, physical access, attacks against Keycloak itself (separate product). |
Environment |
Devstack (Docker Compose) or staging deployment. Never test against production with real data. |
Test Accounts |
Provide test credentials for each role: admin, supervisor, caseworker, eligibility_worker, icpc_coordinator, readonly. |
Data Sensitivity |
Test environment must use synthetic data only (generated by |
Vendor Selection Criteria
-
CREST, OSCP, or equivalent certification for lead tester
-
Experience with REST API security testing
-
Experience with OIDC/OAuth2 authentication flows
-
Familiarity with child welfare or government systems (preferred)
-
Ability to produce findings in a format compatible with GitLab confidential issues
-
Willingness to perform re-testing after remediation at no additional cost
Pre-Test Checklist
-
Devstack or staging environment deployed and accessible to the testing team
-
Synthetic seed data loaded (
craig-seed --seed 42 --families 12) -
Test accounts created in Keycloak for all 9 roles (6 operational + the 3 ADR-054 office roles)
-
Scope document signed by both parties
-
Project maintainers and deploying agency stakeholders notified of test window
-
Database snapshot taken (for restoration after destructive tests)
-
Monitoring and alerting configured to distinguish test traffic from real incidents
Post-Test Report Handling
-
Vendor delivers findings report (PDF + structured format).
-
Project maintainer reviews findings within 2 business days.
-
Each finding is logged as a confidential GitLab issue with severity classification.
-
Findings are mapped to NIST SP 800-53 controls where applicable (see NIST Architecture Mapping).
-
Remediation is prioritized per the SLA table above.
-
Deploying agencies receive a summary of findings and remediation timeline (details redacted until fixes are deployed).
Re-Test Verification
-
After all Critical and High findings are remediated, request a re-test from the original vendor.
-
Re-test scope is limited to the specific findings and their surrounding attack surface.
-
Re-test results are appended to the original report.
-
Final report is stored as a security review evidence artifact in
craig-securityobject storage.
Incident Response Overview
CRAIG follows a five-phase incident response lifecycle aligned with NIST SP 800-61.
Phase 1: Detect
-
Automated detection via the wildcard RabbitMQ audit subscriber (
audit_logtable) -
CI/CD security scanning (SAST, dependency scanning, secret detection,
cargo auditadvisory DB) -
Breach detection rules flag anomalous patterns (six default rules on
detection_rules: failed auth, bulk access, after-hours access, privilege escalation, data export, account lockout) -
Pre-push quality gates:
cargo xtask security(ZAP + ffuf, phases 1–5) and the blocking axe-core accessibility audit over the enumerated page set (counts live in the VPAT) -
External reports via the vulnerability disclosure policy (
SECURITY.md)
Phase 2: Contain
-
Isolate affected service(s) — stop the container or revoke network access
-
Revoke compromised credentials (Keycloak sessions, API keys)
-
Preserve audit logs and database state for forensic analysis
-
Notify deploying agency incident response teams
Phase 3: Eradicate
-
Identify root cause (code vulnerability, misconfiguration, compromised credential)
-
Develop and test the fix per the security update release process above
-
Scan for indicators of compromise (IOCs) across all services
Phase 4: Recover
-
Deploy the patched version to all affected environments
-
Restore data from backup if integrity was compromised
-
Re-enable services and verify normal operation
-
Monitor for recurrence (increased logging, additional alerting rules)
Phase 5: Learn
-
Conduct a post-incident review within 5 business days
-
Document the timeline, impact, root cause, and remediation actions
-
Update security controls and monitoring rules to prevent recurrence
-
File a biennial security review record via
POST /v1/security/reviewsif the incident reveals a systemic gap -
Update the NIST control assessment if any control was found to be ineffective
Related Pages
-
NIST Architecture Mapping — how CRAIG implements each NIST SP 800-53 control
-
ATO Readiness Checklist — pre-assessment checklist for deploying agencies
-
VPAT 2.5 — Section 508 / WCAG 2.1 AA — accessibility conformance declaration, axe-core pre-push gate details
-
Configuration Reference — security-related environment variables
-
Deployment Guide — production deployment procedures