Files
Charon/docs/reports/qa_report.md
T

171 lines
6.0 KiB
Markdown

# QA/Security Audit Report — Post-Remediation
**Date**: 2026-03-13
**Scope**: Full audit after Telegram/Slack notification remediation + zlib CVE fix
**Auditor**: QA Security Agent
---
## Gate Summary
| # | Gate | Result | Details |
|---|------|--------|---------|
| 1 | Local Patch Coverage Preflight | **PASS** | 92.3% overall (threshold: 90%) |
| 2 | Backend Unit Tests & Coverage | **PASS** | 88.1% line coverage, 0 failures |
| 3 | Frontend Unit Tests & Coverage | **PASS** | 89.73% line coverage, 0 failures |
| 4 | TypeScript Type Check | **PASS** | 0 errors |
| 5 | Pre-commit Hooks (Lefthook) | **PASS** | All 6 hooks passed |
| 6 | Trivy Filesystem Scan | **PASS** | 0 vulnerabilities, 0 secrets |
| 7 | Docker Image Scan | **PASS** (with accepted risk) | 0 Critical, 2 High (unfixable) |
| 8 | CodeQL (Go + JavaScript) | **PASS** | 0 errors, 0 warnings |
| 9 | Backend Linting (golangci-lint) | **PASS** (pre-existing) | 53 issues (all pre-existing, non-blocking) |
| 10 | GORM Security Scan | **PASS** | 0 issues (2 info-only suggestions) |
| 11 | Gotify Token Review | **PASS** | No tokens found in artifacts |
**Overall Verdict: PASS — All blocking gates cleared.**
---
## 1. Local Patch Coverage Preflight
- **Artifacts**: `test-results/local-patch-report.md`, `test-results/local-patch-report.json` — both verified
- **Overall Patch Coverage**: 92.3% (52 changed lines, 48 covered)
- **Backend Patch Coverage**: 92.3%
- **Frontend Patch Coverage**: 100.0% (0 changed lines)
- **Uncovered Lines**: 4 lines in `notification_service.go` (L462-463, L466-467) — dead code paths for Slack error formatting, accepted per remediation decision
## 2. Backend Unit Tests & Coverage
- **Test Result**: All packages passed, 0 failures
- **Statement Coverage**: 87.9%
- **Line Coverage**: 88.1% (gate: ≥87%)
- **Gate**: PASS
## 3. Frontend Unit Tests & Coverage
- **Test Result**: All 33 test suites passed
- **Statements**: 89.01%
- **Branches**: 81.21%
- **Functions**: 86.18%
- **Lines**: 89.73% (gate: ≥87%)
- **Gate**: PASS
## 4. TypeScript Type Check
- **Command**: `tsc --noEmit`
- **Result**: 0 errors
- **Gate**: PASS
## 5. Pre-commit Hooks (Lefthook)
All hooks passed (12.19s):
- check-yaml
- actionlint
- dockerfile-check
- end-of-file-fixer
- trailing-whitespace
- shellcheck
## 6. Trivy Filesystem Scan
| Target | Type | Vulnerabilities | Secrets |
|--------|------|-----------------|---------|
| backend/go.mod | gomod | 0 | — |
| frontend/package-lock.json | npm | 0 | — |
| package-lock.json | npm | 0 | — |
| playwright/.auth/user.json | text | — | 0 |
**Gate**: PASS — Zero issues
## 7. Docker Image Scan (Grype via SBOM)
### zlib CVE-2026-27171 Verification
| Package | Previous Version | Current Version | CVE Status |
|---------|-----------------|-----------------|------------|
| zlib | 1.3.1-r2 | **1.3.2-r0** | **FIXED** |
**CVE-2026-27171 is confirmed resolved.** Zero zlib-related vulnerabilities in scan results.
### Vulnerability Summary
| Severity | Count |
|----------|-------|
| Critical | 0 |
| High | 2 |
| Medium | 12 |
| Low | 3 |
| **Total** | **17** |
### High Severity (2) — No Fix Available
| CVE | Package | Version | CVSS | Status |
|-----|---------|---------|------|--------|
| CVE-2025-69650 | binutils | 2.45.1-r0 | 7.5 | No fix available — double free in readelf |
| CVE-2025-69649 | binutils | 2.45.1-r0 | 7.5 | No fix available — null pointer deref in readelf |
**Risk Acceptance**: Both `binutils` CVEs affect `readelf` processing of crafted ELF binaries. Charon does not process user-supplied ELF files; `binutils` is present as a build-time dependency in the Alpine image. Risk is accepted as non-exploitable in production context. Will be resolved when Alpine releases updated `binutils` package.
### Medium Severity (12)
| CVE | Package | Description |
|-----|---------|-------------|
| CVE-2025-13034 | curl 8.17.0-r1 | No upstream fix |
| CVE-2025-14017 | curl 8.17.0-r1 | No upstream fix |
| CVE-2025-14524 | curl 8.17.0-r1 | No upstream fix |
| CVE-2025-14819 | curl 8.17.0-r1 | No upstream fix |
| CVE-2025-15079 | curl 8.17.0-r1 | No upstream fix |
| CVE-2025-60876 | busybox 1.37.0-r30 | Affects busybox, busybox-binsh, busybox-extras, ssl_client (4 instances) |
| CVE-2025-69644 | binutils 2.45.1-r0 | No upstream fix |
| CVE-2025-69651 | binutils 2.45.1-r0 | No upstream fix |
| CVE-2025-69652 | binutils 2.45.1-r0 | No upstream fix |
### Low Severity (3)
| CVE | Package | Fix Available |
|-----|---------|---------------|
| CVE-2025-15224 | curl 8.17.0-r1 | None |
| GHSA-fw7p-63qq-7hpr | filippo.io/edwards25519 v1.1.0 | Fixed in v1.1.1 (2 instances) |
## 8. CodeQL Scans
| Language | Errors | Warnings | Notes | Files Scanned |
|----------|--------|----------|-------|---------------|
| Go | 0 | 0 | 0 | Full backend |
| JavaScript | 0 | 0 | 0 | 354/354 files |
**Gate**: PASS
## 9. Backend Linting (golangci-lint)
- **Total Issues**: 53 (all pre-existing)
- gocritic: 50 (style suggestions)
- gosec: 2 (G203 HTML template, G306 file permissions in test)
- bodyclose: 1
- **Net New Issues from Remediation**: 0
- **Gate**: PASS (non-blocking, pre-existing)
## 10. GORM Security Scan
- Scanned 41 Go files (2253 lines)
- 0 Critical, 0 High, 0 Medium issues
- 2 informational suggestions only
- **Gate**: PASS
## 11. Gotify Token Review
- Scanned: grype-results.json, grype-results.sarif, sbom.cyclonedx.json, trivy reports
- No Gotify tokens or `?token=` query strings found
- **Gate**: PASS
---
## Remediation Confirmation
All 4 blockers from the previous audit are resolved:
1. **Slack unit test coverage**: 7 new tests covering 11 of 15 uncovered lines (4 accepted as dead code) — verified via 92.3% patch coverage
2. **CVE-2026-27171 (zlib)**: Fixed via `apk upgrade --no-cache zlib` in Dockerfile runtime stage — confirmed zlib 1.3.2-r0 in image, 0 zlib CVEs remaining
3. **E2E notification tests**: All 160 tests passing across Chromium/Firefox/WebKit (verified in prior run)
4. **Container rebuild**: Image rebuilt with zlib fix, scan confirms resolution