- GHSA-r8fq-wrfm-cj2q vừa được mailcow công bố ngày 16/04/2026: lỗ hổng Second-Order SQL Injection (CVSS 7.2 High) qua trường quarantine_category.
- Payload nằm im trong DB rồi nổ khi quarantine_notify.py chạy nền — và rò dữ liệu ra qua chính email thông báo.
- Đã vá trong 2026-03b.
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.shngay, rotate API key, audit cộtquarantine_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ườngquarantine_categorykhông sanitize. - Sink:
data/web/inc/lib/quarantine_notify.pydựng câu SQL bằng Python%-formatting thay vì parameterized query / prepared statement. - Primitive:
UNION SELECTvớ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ảngadmin. - 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
| Advisory | Lớp | Điểm chung | Khác biệt |
|---|---|---|---|
| GHSA-r8fq-wrfm-cj2q (CVE-2026-40871) | Stored SQLi | Đụng quarantine notifier | Exfil qua SMTP, async trigger |
| GHSA-8p7g-6cjj-wr9m | SSTI (Jinja2) | Đụng quarantine/quota notification template | Cần admin, RCE-class nhưng cùng code path |
| Các CVE mailcow cũ hơn | XSS, host-header, privesc | Phần lớn là web UI | Khô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.shsang2026-03b, miễn phí.
What's next — checklist hành động
- Update ngay lên
2026-03bhoặc mới hơn. - Rotate mọi API token mailcow đã cấp cho automation, MSP tenants, CI pipelines.
- Audit DB: query bảng
mailboxcho các giá trịquarantine_categorybất thường — chứaUNION,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. - Đọ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.
- 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.