Version: 1.0
Last Updated: 2026-03-30
Status: Active
This plan defines how the Nova Rewards team detects, responds to, and recovers from security incidents. Given the on-chain nature of the platform, some incidents (e.g., token theft) may be irreversible, making rapid detection and containment the top priority.
| Severity | Definition | Response SLA |
|---|---|---|
| P0 — Critical | Active exploit, funds at risk, contract compromised, data breach in progress | Immediate (< 15 min) |
| P1 — High | Confirmed vulnerability being exploited, service down, credentials compromised | < 1 hour |
| P2 — Medium | Suspected attack, anomalous behavior, non-critical data exposure | < 4 hours |
| P3 — Low | Policy violation, minor misconfiguration, failed attack attempt | < 24 hours |
| Role | Responsibility |
|---|---|
| Incident Commander (IC) | Coordinates response, makes escalation decisions, owns communication |
| Security Lead | Technical investigation, containment actions |
| Backend Engineer | API/DB investigation and remediation |
| Smart Contract Engineer | On-chain analysis, contract pause/upgrade if needed |
| DevOps Engineer | Infrastructure isolation, log retrieval, service restoration |
| Communications Lead | User/merchant notifications, public statements |
The on-call engineer who detects the incident assumes IC until a senior team member takes over.
Detection sources:
/infrastructure/logging/alert_rules.yml)Triage steps:
#incident-YYYY-MM-DD)Act fast to limit damage. Choose the appropriate containment action:
Smart contract incidents:
# Pause the affected contract (requires admin multi-sig)
stellar contract invoke --id <CONTRACT_ID> -- pause
# Revoke compromised admin key
stellar contract invoke --id <admin_roles_CONTRACT_ID> -- revoke_admin --address <COMPROMISED_KEY>
API / backend incidents:
# Block a specific IP at the load balancer
aws wafv2 update-ip-set --name BlockedIPs --scope REGIONAL --id <ID> \
--addresses <ATTACKER_IP>/32 --lock-token <TOKEN>
# Rotate JWT signing secret (forces all sessions to re-authenticate)
# Update JWT_SECRET in AWS Secrets Manager, then restart backend
aws secretsmanager put-secret-value --secret-id nova/jwt-secret --secret-string "<NEW_SECRET>"
# Scale down to zero if full API shutdown needed
aws autoscaling set-desired-capacity --auto-scaling-group-name nova-backend-asg --desired-capacity 0
Database incidents:
# Revoke compromised DB credentials immediately
psql -c "REVOKE ALL ON ALL TABLES IN SCHEMA public FROM <COMPROMISED_ROLE>;"
psql -c "ALTER ROLE <COMPROMISED_ROLE> NOLOGIN;"
Infrastructure incidents:
# Isolate a compromised EC2 instance
aws ec2 modify-instance-attribute --instance-id <ID> --groups <QUARANTINE_SG_ID>
Key log sources:
/infrastructure/logging/loki-config.yml)/deployment/nginx/nginx.conf)Internal: Keep #incident-YYYY-MM-DD updated with every action taken.
User/merchant notification (P0/P1 — within 2 hours of confirmation):
Public status page: Update status.novarewards.io for any service degradation.
Regulatory: If personal data is breached, notify relevant authorities within 72 hours per applicable data protection law.
Within 5 business days of resolution:
/docs/security/post-mortems/YYYY-MM-DD-<title>.md| Escalation Level | Contact |
|---|---|
| On-call engineer | PagerDuty rotation |
| Security Lead | Direct message + phone |
| CTO | Phone (P0 only) |
| Legal / Compliance | Email (data breach only) |
| Stellar Foundation | security@stellar.org (contract-level issues) |
| Bug bounty reporter | Acknowledge within 24h, update within 7 days |
Reviewed by: Security Team
Next review due: 2026-09-30