Security incident response plan
QR Branding API — GDPR Art. 33-34
| Field | Value |
|---|---|
| Controller | QR Branding (Quartzon) |
| Date | 2026-03-08 |
| Version | 1.0 |
| Next review | 2026-09-08 |
1. Objective
To set out a structured procedure for detecting, responding to and notifying security breaches affecting personal data, in compliance with the requirements of GDPR Art. 33 (notification to the supervisory authority) and Art. 34 (communication to data subjects).
2. Definitions
| Term | Definition |
|---|---|
| Personal data breach | A breach of security leading to the accidental or unlawful destruction, loss or alteration of, or unauthorized disclosure of, personal data (Art. 4(12) GDPR) |
| Security incident | Any event that compromises the confidentiality, integrity or availability of the system, whether or not it involves personal data |
| Time zero (T0) | The moment the incident is detected or becomes known |
3. Incident classification
Level 1 — Critical (personal data breach)
- Exposure of QR content containing personal data (vCards, emails, phone numbers)
- Exposure of users' AI prompts
- Leakage of API keys (RapidAPI, LLM providers)
- Unauthorized access to Application Insights containing user data
- Supply chain compromise (malicious NuGet dependency)
Level 2 — High (security incident with no confirmed personal data involved)
- Successful exploitation of a vulnerability (SSRF, injection, etc.)
- Sustained denial of service
- Compromise of the CI/CD pipeline (GitHub Actions)
- Unauthorized access to Azure App Settings or secrets
- Anomalous LLM provider behavior (responses containing other users' data)
Level 3 — Medium (contained incident)
- Attack attempts detected and blocked by rate limiting
- Vulnerability scanning detected
- Dependency with a published CVE (no confirmed exploitation)
- Service degradation due to resource abuse
Level 4 — Low (informational event)
- Failed authentication attempts
- Normal rate limit triggers
- Performance alerts (cold starts, timeouts)
4. Response procedure
Phase 1: Detection and triage (T0 → T0+1h)
| Step | Action | Owner |
|---|---|---|
| 1.1 | Identify the source of the alert (Application Insights, GitHub Security Advisories, user report, monitoring) | Technical team |
| 1.2 | Classify the incident by level (Section 3) | Technical team |
| 1.3 | Document what was detected, when, how, and the estimated scope | Technical team |
| 1.4 | If Level 1 or 2: escalate immediately to the person responsible for data protection | Technical team |
Phase 2: Containment (T0+1h → T0+4h)
| Step | Action |
|---|---|
| 2.1 | Immediate containment, depending on the type of incident: |
| - Leaked API key → rotate it immediately in Azure App Settings and at the provider | |
| - Exploited vulnerability → deploy a hotfix or disable the affected endpoint | |
| - SSRF/injection → block the attack pattern in validation | |
| - Compromised CI/CD → revoke GitHub tokens, audit recent commits | |
| 2.2 | Preserve evidence (Application Insights logs, configuration snapshots) |
| 2.3 | Verify that containment is effective |
| 2.4 | Assess whether personal data is affected → determine whether it is a GDPR breach |
Phase 3: GDPR notification (where applicable)
Art. 33 — Notification to the supervisory authority (within 72h of T0)
Only required if the breach poses a risk to the rights and freedoms of individuals.
Content of the notification:
- Nature of the breach (which data, estimated number of data subjects)
- Controller's contact details
- Likely consequences of the breach
- Measures taken or proposed to address it
When notification is NOT required:
- Availability incidents (DoS) with no data exposure
- Attack attempts that were successfully blocked
- Incidents affecting only non-personal data (configuration, code)
QR Branding context: Because the service is stateless and does not store personal data, most incidents do not constitute a personal data breach. The exceptions would be:
- Exposure of Application Insights logs containing request metadata
- Interception of traffic in transit (unlikely with TLS)
- Anomalous LLM provider behavior exposing other users' prompts
Art. 34 — Communication to data subjects
Only required if the breach poses a high risk to rights and freedoms.
Not required if:
- The data was encrypted or anonymized
- Measures have been taken that ensure the risk is no longer likely to materialize
- It would involve disproportionate effort (in which case a public communication is made)
Phase 4: Eradication and recovery (T0+4h → T0+48h)
| Step | Action |
|---|---|
| 4.1 | Identify and remove the root cause |
| 4.2 | Apply permanent patches or fixes |
| 4.3 | Run regression tests |
| 4.4 | Deploy to production via CI/CD (GitHub Actions → Azure) |
| 4.5 | Verify that the fix is effective in production |
| 4.6 | Monitor closely for 48-72h after the fix |
Phase 5: Post-incident (T0+48h → T0+2 weeks)
| Step | Action |
|---|---|
| 5.1 | Document the full incident (timeline, impact, response) |
| 5.2 | Carry out a root cause analysis (RCA) |
| 5.3 | Identify preventive improvements |
| 5.4 | Update the DPIA if the incident reveals risks not previously considered |
| 5.5 | Update this plan if gaps in the procedure are identified |
| 5.6 | Share lessons learned (without sensitive data) |
5. Incident log (Art. 33(5))
Every incident must be logged, whether or not it requires notification to the authority. The log must include:
| Field | Description |
|---|---|
| Incident ID | Unique identifier (INC-YYYY-NNN) |
| Detection date/time | T0 |
| Containment date/time | End of Phase 2 |
| Classification | Level 1-4 |
| Description | What happened |
| Data affected | Categories of personal data involved (if applicable) |
| Data subjects affected | Estimated number |
| Root cause | Outcome of the RCA |
| Measures taken | Containment and remediation actions |
| Notification to the authority | Yes/No, date, reference |
| Communication to data subjects | Yes/No, date, channel |
| Resolution | Final status and closing date |
6. Key contacts
| Role | Contact |
|---|---|
| Technical lead | QR Branding team |
| Privacy/DPO | support@qr-branding.com |
| RapidAPI Platform | RapidAPI support |
| Microsoft Azure Support | Azure portal |
Supervisory authorities (reference)
| Country | Authority | Website |
|---|---|---|
| Spain | AEPD | aepd.es |
| EU (general) | EDPB | edpb.europa.eu |
7. Drills
At least one incident response drill per year will be carried out to:
- Verify that the procedure works
- Measure response times
- Identify gaps in capabilities or communication
- Familiarize the team with the process
Document generated on 2026-03-08. Next scheduled review: 2026-09-08.