Skip to content

Commit 49f24b4

Browse files
committed
Merge #455: chore: [#432] upgrade Caddy to 2.11.2 and document CVE analysis
36fd5c3 chore: [#432] upgrade Caddy to 2.11.2 and document CVE analysis (Jose Celano) Pull request description: ## Summary Upgrades Caddy from `2.10.2` to `2.11.2` (latest as of 2026-04-14). Meaningful reduction in vulnerabilities but 2 CRITICAL CVEs remain in upstream binary dependencies — issue left open for revisit. Related to #432 ## Changes - `templates/docker-compose/docker-compose.yml.tera`: bump Caddy tag `2.10.2` → `2.11.2` - `.github/workflows/docker-security-scan.yml`: update scan matrix and example comment - `docs/security/docker/scans/caddy.md`: update header, current status, add Apr 15 scan history entry - `docs/security/docker/scans/README.md`: update Caddy row - `docs/issues/432-caddy-cves.md`: fill in Outcome section, check steps - `project-words.txt`: add `SCEP` ## Scan Results ### Version Comparison | Version | HIGH | CRITICAL | | -------- | ---- | -------- | | `2.10` | 18 | 6 | | `2.10.2` | 14 | 4 | | `2.11.2` | 10 | 2 | ### Remaining CRITICAL CVEs in 2.11.2 (upstream binary, cannot be fixed without a Caddy release) | CVE | Library | Fix | Notes | | -------------- | ---------------------- | ------- | --------------------------------------------------- | | CVE-2026-30836 | smallstep/certificates | 0.30.0 | Unauthenticated SCEP cert issuance | | CVE-2026-33186 | google.golang.org/grpc | 1.79.3 | Authorization bypass via HTTP/2 path ⚠️ network-accessible | Issue #432 left open — will revisit when Caddy ships updated grpc-go (≥1.79.3) and smallstep/certificates (≥0.30.0). ACKs for top commit: josecelano: ACK 36fd5c3 Tree-SHA512: 2769549456f65d2b371d12685baa828e1fc72e7bcdc161b428b72dd8c047aade35c052237f45af19f6fa31a5be3de7d91ca0e24639c376dc658a67af571f4cf4
2 parents 43f790e + 36fd5c3 commit 49f24b4

6 files changed

Lines changed: 107 additions & 24 deletions

File tree

.github/workflows/docker-security-scan.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ jobs:
101101
timeout-minutes: 10
102102
outputs:
103103
# JSON array of Docker image references for use in scan matrix
104-
# Example: ["torrust/tracker:develop","mysql:8.4","prom/prometheus:v3.11.2","grafana/grafana:13.0.0","caddy:2.10.2"]
104+
# Example: ["torrust/tracker:develop","mysql:8.4","prom/prometheus:v3.11.2","grafana/grafana:13.0.0","caddy:2.11.2"]
105105
images: ${{ steps.extract.outputs.images }}
106106

107107
steps:
@@ -182,7 +182,7 @@ jobs:
182182
.docker_images.mysql,
183183
.docker_images.prometheus,
184184
.docker_images.grafana
185-
] | map(select(. != null)) + ["caddy:2.10.2"]')
185+
] | map(select(. != null)) + ["caddy:2.11.2"]')
186186
187187
echo "Detected images: $images"
188188
echo "images=$images" >> "$GITHUB_OUTPUT"

docs/issues/432-caddy-cves.md

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,24 +27,49 @@ After PR #436 upgraded Caddy from `2.10` to `2.10.2`:
2727

2828
## Steps
2929

30-
- [ ] Check the latest Caddy release:
30+
- [x] Check the latest Caddy release:
3131
<https://hub.docker.com/_/caddy> and <https://github.com/caddyserver/caddy/releases>
32-
- [ ] Run Trivy against the latest tag:
32+
- [x] Run Trivy against the latest tag:
3333
`trivy image --severity HIGH,CRITICAL caddy:LATEST_TAG`
34-
- [ ] Compare results against the 2.10.2 baseline in
34+
- [x] Compare results against the 2.10.2 baseline in
3535
`docs/security/docker/scans/caddy.md`
36-
- [ ] **If CRITICALs are cleared (or HIGH count drops meaningfully)**: update
36+
- [x] **If CRITICALs are cleared (or HIGH count drops meaningfully)**: update
3737
`templates/docker-compose/docker-compose.yml.tera` and the CI scan matrix;
3838
update the scan doc; post results comment; close #432
3939
- [ ] **If CRITICALs remain**: post comment documenting which CVEs remain and why
4040
they cannot be fixed (upstream binary); add revisit note to #432; leave open
4141

4242
## Outcome
4343

44-
<!-- Fill in after doing the work -->
44+
- Date: 2026-04-15
45+
- Latest Caddy tag tested: `2.11.2` (released 2026-04-14)
46+
- Decision: **upgrade to `caddy:2.11.2`** — HIGH count dropped meaningfully (14→10), CRITICAL halved (4→2)
47+
- Action: updated `templates/docker-compose/docker-compose.yml.tera` and CI scan matrix
48+
- Issue: **left open** — 2 CRITICAL CVEs remain in upstream binary dependencies
49+
- PR: opened against `main` on branch `432-caddy-cves`
4550

46-
- Date:
47-
- Latest Caddy tag tested:
48-
- Findings (HIGH / CRITICAL):
49-
- Decision: upgrade / accept risk / leave open
50-
- Comment/PR:
51+
### Scan details — `caddy:2.11.2` (Trivy v0.69.3, 2026-04-15)
52+
53+
**Version comparison:**
54+
55+
| Version | HIGH | CRITICAL |
56+
| -------- | ---- | -------- |
57+
| `2.10` | 18 | 6 |
58+
| `2.10.2` | 14 | 4 |
59+
| `2.11.2` | 10 | 2 |
60+
61+
**Target breakdown:**
62+
63+
| Target | HIGH | CRITICAL |
64+
| -------------- | ---- | -------- |
65+
| caddy (alpine) | 3 | 0 |
66+
| usr/bin/caddy | 7 | 2 |
67+
68+
**Remaining CRITICAL CVEs (upstream binary, cannot be fixed without Caddy release):**
69+
70+
| CVE | Library | Fix | Notes |
71+
| -------------- | ---------------------- | ------ | ---------------------------------------------------------- |
72+
| CVE-2026-30836 | smallstep/certificates | 0.30.0 | Unauthenticated SCEP cert issuance |
73+
| CVE-2026-33186 | google.golang.org/grpc | 1.79.3 | Authorization bypass via HTTP/2 path ⚠️ network-accessible |
74+
75+
**Revisit**: when Caddy ships updated grpc-go (≥1.79.3) and smallstep/certificates (≥0.30.0).

docs/security/docker/scans/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This directory contains historical security scan results for Docker images used
1010
| `torrust/tracker-backup` | trixie | 6 | 0 | ℹ️ Remediation no change | Apr 8, 2026 | [View](torrust-tracker-backup.md) |
1111
| `torrust/tracker-ssh-server` | 3.23.3 | 0 | 0 | ✅ Remediated (vuln scan) | Apr 8, 2026 | [View](torrust-ssh-server.md) |
1212
| `torrust/tracker-provisioned-instance` | 24.04 | 0 | 0 | ✅ Remediated (vuln scan) | Apr 8, 2026 | [View](torrust-tracker-provisioned-instance.md) |
13-
| `caddy` | 2.10.2 | 14 | 4 | ⚠️ Partial remediation | Apr 8, 2026 | [View](caddy.md) |
13+
| `caddy` | 2.11.2 | 10 | 2 | ⚠️ Partial remediation | Apr 15, 2026 | [View](caddy.md) |
1414
| `prom/prometheus` | v3.11.2 | 4 | 0 | ✅ Remediated | Apr 14, 2026 | [View](prometheus.md) |
1515
| `grafana/grafana` | 12.4.2 | 4 | 0 | ⚠️ Partial remediation | Apr 8, 2026 | [View](grafana.md) |
1616
| `mysql` | 8.4 | 7 | 1 | ⚠️ Monitored | Apr 8, 2026 | [View](mysql.md) |

docs/security/docker/scans/caddy.md

Lines changed: 67 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,85 @@
11
# Caddy Security Scan History
22

3-
**Image**: `caddy:2.10.2`
3+
**Image**: `caddy:2.11.2`
44
**Purpose**: TLS termination proxy for HTTPS support
55
**Documentation**: [Caddy TLS Proxy Evaluation](../../research/caddy-tls-proxy-evaluation/README.md)
66

77
## Current Status
88

9-
| Version | HIGH | CRITICAL | Status | Scan Date |
10-
| ------- | ---- | -------- | ------------------------------------ | ----------- |
11-
| 2.10.2 | 14 | 4 | ⚠️ Partial improvement after upgrade | Apr 8, 2026 |
9+
| Version | HIGH | CRITICAL | Status | Scan Date |
10+
| ------- | ---- | -------- | ------------------------------------ | ------------ |
11+
| 2.11.2 | 10 | 2 | ⚠️ Partial improvement after upgrade | Apr 15, 2026 |
1212

13-
**Deployment Status**: ⚠️ Requires follow-up - upgrading from `2.10` to `2.10.2` reduced findings, but HIGH/CRITICAL issues remain in Caddy binary dependencies
13+
**Deployment Status**: ⚠️ Requires follow-up — 2 CRITICAL CVEs remain in upstream Caddy binary dependencies (smallstep/certificates, grpc-go). Fixes require upstream Caddy releases.
1414

1515
## Vulnerability Summary
1616

17-
The Caddy 2.10 image has:
17+
The Caddy 2.11.2 image has:
1818

19-
- **Alpine base image**: Clean (0 vulnerabilities)
20-
- **Caddy binary (Go)**: 4 vulnerabilities in dependencies (not Caddy core)
19+
- **Alpine base image**: 3 HIGH, 0 CRITICAL (libcrypto3/libssl3, zlib — fixed versions available)
20+
- **Caddy binary (Go)**: 7 HIGH, 2 CRITICAL in dependencies (not Caddy core)
2121

22-
All vulnerabilities have fixed versions available upstream and are expected to be resolved in the next Caddy release.
22+
The 2 CRITICAL CVEs are in upstream Caddy binary dependencies and require Caddy to update its vendored modules.
2323

2424
## Scan History
2525

26+
### April 15, 2026 - Remediation Pass 2 (Issue #432)
27+
28+
**Scanner**: Trivy v0.69.3
29+
**Scan Mode**: `--scanners vuln --severity HIGH,CRITICAL`
30+
**Image**: `caddy:2.11.2`
31+
**Status**: ⚠️ **12 vulnerabilities** (10 HIGH, 2 CRITICAL)
32+
33+
#### Summary
34+
35+
Upgraded Caddy from `2.10.2` to `2.11.2` (latest as of 2026-04-14). Meaningful reduction in findings but 2 CRITICAL CVEs remain in upstream binary dependencies.
36+
37+
Vulnerability comparison:
38+
39+
| Version | HIGH | CRITICAL |
40+
| -------- | ---- | -------- |
41+
| `2.10` | 18 | 6 |
42+
| `2.10.2` | 14 | 4 |
43+
| `2.11.2` | 10 | 2 |
44+
45+
Issue left open — CRITICALs not fully cleared.
46+
47+
#### Target Breakdown (`2.11.2`)
48+
49+
| Target | Type | HIGH | CRITICAL |
50+
| -------------- | -------- | ---- | -------- |
51+
| caddy (alpine) | alpine | 3 | 0 |
52+
| usr/bin/caddy | gobinary | 7 | 2 |
53+
54+
#### CVE Details
55+
56+
**Alpine OS layer:**
57+
58+
| CVE | Library | Severity | Fixed In | Notes |
59+
| -------------- | ------------------- | -------- | -------- | -------------------------- |
60+
| CVE-2026-28390 | libcrypto3, libssl3 | HIGH | 3.5.6-r0 | OpenSSL DoS via NULL deref |
61+
| CVE-2026-22184 | zlib | HIGH | 1.3.2-r0 | Buffer overflow in untgz |
62+
63+
**Caddy binary (Go):**
64+
65+
| CVE | Library | Severity | Fixed In | Notes |
66+
| -------------- | ---------------------- | -------- | ------------- | ------------------------------------------- |
67+
| CVE-2026-34986 | go-jose/go-jose v3+v4 | HIGH | 3.0.5 / 4.1.4 | DoS via crafted JWE |
68+
| CVE-2026-30836 | smallstep/certificates | CRITICAL | 0.30.0 | Unauthenticated SCEP cert issuance |
69+
| CVE-2026-39883 | otel/sdk | HIGH | 1.43.0 | Local PATH hijack (no remote path) |
70+
| CVE-2026-33186 | google.golang.org/grpc | CRITICAL | 1.79.3 | Authorization bypass via HTTP/2 path |
71+
| CVE-2026-25679 | stdlib | HIGH | 1.26.1 | Incorrect IPv6 parsing in net/url |
72+
| CVE-2026-27137 | stdlib | HIGH | 1.26.1 | Email constraint enforcement in crypto/x509 |
73+
| CVE-2026-32280 | stdlib | HIGH | 1.26.2 | Excessive work during chain building |
74+
| CVE-2026-32282 | stdlib | HIGH | 1.26.2 | Root.Chmod follows symlinks out of root |
75+
76+
**Overall risk**: The 2 CRITICAL CVEs (CVE-2026-30836, CVE-2026-33186) are in upstream
77+
Caddy binary dependencies and require a new Caddy release to fix. CVE-2026-33186
78+
(gRPC authorization bypass) has a network-accessible attack path. Revisit when
79+
Caddy ships the updated grpc-go and smallstep dependencies.
80+
81+
---
82+
2683
### April 8, 2026 - Remediation Pass 1 (Issue #428)
2784

2885
**Scanner**: Trivy v0.68.2
@@ -85,7 +142,7 @@ Remaining issues are in upstream Caddy binary dependencies and require vendor/up
85142
## How to Rescan
86143

87144
```bash
88-
trivy image --severity HIGH,CRITICAL caddy:2.10.2
145+
trivy image --severity HIGH,CRITICAL caddy:2.11.2
89146
```
90147

91148
## Security Advisories

project-words.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -440,6 +440,7 @@ sandboxed
440440
sarif
441441
sarifs
442442
scannability
443+
SCEP
443444
schemafile
444445
schemars
445446
scriptable

templates/docker-compose/docker-compose.yml.tera

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ services:
5252
# Placed first as it's the entry point for HTTPS traffic
5353
caddy:
5454
<<: *defaults
55-
image: caddy:2.10.2
55+
image: caddy:2.11.2
5656
container_name: caddy
5757
# NOTE: No UFW firewall rule needed for these ports!
5858
# Docker-published ports bypass iptables/UFW rules entirely.

0 commit comments

Comments
 (0)