TL;DR

  • CVE-2026-40871 / GHSA-r8fq-wrfm-cj2q — Second-Order SQL Injection trong mailcow: dockerized.
  • Severity: High, CVSS 7.2 (AV:N/AC:L/PR:H/UI:N/C:H/I:H/A:H).
  • Affected: mọi bản < 2026-03b. Fixed: >= 2026-03b.
  • Trigger không phải HTTP request — mà là cron job quarantine_notify.py. WAF không thấy.
  • Exfil channel = chính cái email thông báo quarantine mailcow gửi đi. Egress-lock không cứu.
  • Hành động: ./update.sh ngay, rotate API key, audit cột quarantine_category.

What's new

Ngày 16/04/2026, đội mailcow công bố advisory GHSA-r8fq-wrfm-cj2q — "Second Order SQL Injection in quarantine category via API". Reporter là lukehebe, được khuếch đại trên X bởi @Dinosn vài ngày sau.

Điểm thú vị: đây không phải SQLi cổ điển nơi bạn nhét ' OR 1=1-- vào URL rồi mọi thứ nổ ngay. Đây là second-order — payload được nhận qua API, lưu nguyên xi vào DB, và chỉ phát nổ khi một tiến trình nền khác (quarantine notifier) đọc lại để dựng câu query.

Why it matters

Stored SQLi đáng sợ hơn reflected SQLi vì ba lý do thực tế:

  • WAF/RASP detection rate ≈ 0. Lúc payload đi qua HTTP nó chỉ là một string "category" hợp lệ. Lúc nó nổ, không có HTTP request nào đang chạy.
  • Time-of-check ≠ time-of-use. Vài giờ — thậm chí vài ngày — giữa lúc poison và lúc trigger. Forensics khó truy ngược attacker session.
  • Output channel là SMTP. Kết quả UNION SELECT được nhúng vào body của email quarantine notification, gửi đến mailbox attacker tự kiểm soát. Mọi outbound firewall đều cho qua vì... đây là MTA, gửi mail là việc của nó.

Với một MSP đang host mailcow cho khách, một tenant API key bị leak trong CI là đủ để attacker rút credential admin của toàn bộ instance.

Technical facts

Theo advisory:

  • Source: endpoint POST /api/v1/add/mailbox (và các edit variant) chấp nhận trường quarantine_category không sanitize.
  • Sink: data/web/inc/lib/quarantine_notify.py dựng câu SQL bằng Python %-formatting thay vì parameterized query / prepared statement.
  • Primitive: UNION SELECT với MariaDB của mailcow. Số column khớp với câu query notification gốc, attacker có thể kéo bất kỳ bảng nào quyền DB user của mailcow truy cập được — gồm bảng admin.
  • Weakness map: CWE-89 (SQLi), CWE-20 (Improper Input Validation), CWE-116 (Improper Encoding/Escaping), CWE-564.
  • CVSS 3.1: 7.2 High. PR:H — cần API token đủ quyền tạo/sửa mailbox; không phải pre-auth.

Comparison với các CVE mailcow trước đây

AdvisoryLớpĐiểm chungKhác biệt
GHSA-r8fq-wrfm-cj2q (CVE-2026-40871)Stored SQLiĐụng quarantine notifierExfil qua SMTP, async trigger
GHSA-8p7g-6cjj-wr9mSSTI (Jinja2)Đụng quarantine/quota notification templateCần admin, RCE-class nhưng cùng code path
Các CVE mailcow cũ hơnXSS, host-header, privescPhần lớn là web UIKhông chạm DB sink trực tiếp

Pattern rõ: quarantine notification subsystem đang là khu vực hot. Nếu bạn audit mailcow nội bộ, đây là nơi nên đặt review priority cao.

Ai bị ảnh hưởng nhất

  • MSP / hosting providers chạy mailcow multi-tenant — mỗi tenant có API key riêng và surface PR:H trở thành surface thực tế.
  • Trường đại học, lab mở API cho script provisioning sinh viên / lecturer mailbox.
  • Self-hoster cá nhân tưởng "chỉ mình tao xài API" nhưng để token trong dotfiles, repo, hoặc home-lab Ansible vault commit nhầm.

Limitations & pricing

Vài giới hạn cần nhìn thẳng:

  • Không pre-auth. Cần token API có quyền create/edit mailbox. Đối với public-facing mailcow đặt sau Cloudflare Access hoặc IP allowlist, blast radius hẹp lại đáng kể.
  • Cần notifier chạy. Nếu admin đã tắt quarantine notification (không hiếm), trigger không xảy ra — nhưng payload vẫn nằm chờ trong DB chờ ngày bật lại.
  • Không có pricing change. mailcow vẫn open-source. Fix là ./update.sh sang 2026-03b, miễn phí.

What's next — checklist hành động

  1. Update ngay lên 2026-03b hoặc mới hơn.
  2. Rotate mọi API token mailcow đã cấp cho automation, MSP tenants, CI pipelines.
  3. Audit DB: query bảng mailbox cho các giá trị quarantine_category bất thường — chứa UNION, SELECT, dấu nháy, hoặc ký tự không in được. Xoá / reset về default trước khi notifier chạy lại.
  4. Đọc lại mail log Postfix vài tuần qua: tìm quarantine notification có recipient lạ hoặc body size bất thường — dấu hiệu đã bị khai thác.
  5. Code review nội bộ mọi vị trí dùng Python % hoặc f-string để dựng SQL — không chỉ trong mailcow, áp dụng cho mọi codebase bạn maintain.

Nguồn: GitHub Security Advisory GHSA-r8fq-wrfm-cj2q, mailcow advisories index, @Dinosn trên X.