[security] Образ awg-dash содержит 21 HIGH + 1 CRITICAL (Go stdlib 1.25.14, golang.org/x/crypto 0.42.0) #61

Open
opened 2026-10-28 23:12:36 +03:00 by embeddevio · 1 comment
Owner

Найдено: CI-гейт image-scan (trivy, issue #17) на образе, собранном из deploy/Dockerfile (#18). Блокирует публикацию staging-<sha> и любой релиз.

Результат скана (run #49, job image-scan)

Total: 22 (HIGH: 21, CRITICAL: 1)
Компонент Версия в образе Находки Фикс
Go stdlib (amneziawg-go/awg) v1.25.14 CVE-2026-56857 (CRITICAL, Root.Mkdir(All) — follow junctions), CVE-2026-111943 (HIGH, crypto/x509 MITM), CVE-2026-78667 (HIGH, HTTP Range DoS), CVE-2026-97031 (HIGH, crypto/tls ECH DoS) Go 1.26.10 / 1.27.3
golang.org/x/crypto v0.42.0 CVE-2025-47913 (HIGH, ssh/agent) 0.43.0
alpine-пакеты 3.21 остальные HIGH обновление apk

Ссылка на job: http://192.168.1.111:3000/embeddevio/awg-dash/actions/runs/49/jobs/140

Что нужно

  1. В deploy/Dockerfile (владелец #18) поднять ARG GO_IMAGE=golang:1.26-alpine (или новее) и обновить зависимость golang.org/x/crypto в сборке amneziawg-go до >= 0.43.0 (через -u или бамп fork'а).
  2. Обновить базовый alpine:3.21 → текущая ветка с патчами.

После фикса

Ничего в CI менять не нужно: image-scan (trivy --severity HIGH,CRITICAL --ignore-unfixed --exit-code 1) пойдёт зелёным и job push опубликует 192.168.1.111:3000/embeddevio/awg-dash:staging-<sha8>.

Проверка локально (на build-хосте):

docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
  -v /opt/trivy-cache:/root/.cache/trivy aquasec/trivy:0.76.1 image \
  --image-src docker --severity HIGH,CRITICAL --ignore-unfixed --exit-code 1 \
  192.168.1.111:3000/embeddevio/awg-dash:staging-<sha8>

Refs #17, Refs #18

**Найдено:** CI-гейт `image-scan` (trivy, issue #17) на образе, собранном из `deploy/Dockerfile` (#18). **Блокирует** публикацию `staging-<sha>` и любой релиз. ## Результат скана (run #49, job `image-scan`) ``` Total: 22 (HIGH: 21, CRITICAL: 1) ``` | Компонент | Версия в образе | Находки | Фикс | |---|---|---|---| | Go stdlib (amneziawg-go/awg) | **v1.25.14** | CVE-2026-56857 (**CRITICAL**, `Root.Mkdir(All)` — follow junctions), CVE-2026-111943 (HIGH, crypto/x509 MITM), CVE-2026-78667 (HIGH, HTTP Range DoS), CVE-2026-97031 (HIGH, crypto/tls ECH DoS) | Go **1.26.10 / 1.27.3** | | `golang.org/x/crypto` | v0.42.0 | CVE-2025-47913 (HIGH, ssh/agent) | **0.43.0** | | alpine-пакеты | 3.21 | остальные HIGH | обновление apk | Ссылка на job: http://192.168.1.111:3000/embeddevio/awg-dash/actions/runs/49/jobs/140 ## Что нужно 1. В `deploy/Dockerfile` (владелец #18) поднять `ARG GO_IMAGE=golang:1.26-alpine` (или новее) и обновить зависимость `golang.org/x/crypto` в сборке `amneziawg-go` до `>= 0.43.0` (через `-u` или бамп fork'а). 2. Обновить базовый `alpine:3.21` → текущая ветка с патчами. ## После фикса Ничего в CI менять не нужно: `image-scan` (`trivy --severity HIGH,CRITICAL --ignore-unfixed --exit-code 1`) пойдёт зелёным и job `push` опубликует `192.168.1.111:3000/embeddevio/awg-dash:staging-<sha8>`. Проверка локально (на build-хосте): ```bash docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \ -v /opt/trivy-cache:/root/.cache/trivy aquasec/trivy:0.76.1 image \ --image-src docker --severity HIGH,CRITICAL --ignore-unfixed --exit-code 1 \ 192.168.1.111:3000/embeddevio/awg-dash:staging-<sha8> ``` **Refs #17, Refs #18**
Author
Owner

Статус на момент паузы: 5 HIGH вместо 22, корневая причина каждого шага установлена

Что закрыто (проверено на живом раннере, образ staging-20db51b7 / staging-cc3621a1)

Было Стало Как
Go stdlib 1.25.14: 1 CRITICAL (CVE-2026-56857) + 3 HIGH 0 GO_IMAGE golang:1.25 → golang:1.26-alpine
alpine 3.21 — HIGH в пакетах базы 0 runtime alpine:3.21 → alpine:3.23.7 (+ apk upgrade), 66 пакетов чисто
golang.org/x/crypto 0.42.0 — 1 HIGH + (после обновления БД trivy) ещё 4 0 go get golang.org/x/crypto@v0.58.0 в сборке amneziawg-go
golang.org/x/net 0.45.0 — 16 HIGH (http2/idna/dnsmessage) 0 go get golang.org/x/net@v0.62.0
urllib3 2.7.0 / msgpack 1.1.2 / setuptools 70.3.0 осталось 5 HIGH пины в requirements.txt (>=2.8.0 / >=1.2.3 / >=78.1.1)

Корень оставшихся 5 HIGH (важно, чтобы не искать заново)

После пинов trivy продолжал показывать urllib3 2.7.0 / msgpack 1.1.2 / setuptools 70.3.0. Проверка внутри самого образа (pip list и поиск METADATA) дала факт: в venv стоят 1.2.4 / 2.8.0 / 84.2.1 — то есть исправленные.

Источник ложных версий найден:

$ find / -name vendor.txt | …
/opt/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt
    msgpack==1.1.2
    urllib3==2.7.0
    setuptools==70.3.0
/usr/lib/python3.12/site-packages/pip/_vendor/vendor.txt
    msgpack==1.1.0 / urllib3==1.26.20 / setuptools==70.3.0

Trivy разбирает pip/_vendor/vendor.txt и репортит вендоренные в pip пакеты как установленные (в --list-all-pkgs они идут без FilePath, в отличие от реальных *.dist-info/METADATA). Ни один из этих пакетов в образе не импортируется.

Фикс (закоммичен в ветку PR #49, коммит b69c3b6): py3-pip переведён из runtime-пакета в .build-deps, после сборки venv удаляется; pip вычищается и из venv, и из системного site-packages. Runtime не должен содержать инсталлятор — заодно минус размер и минус поверхность атаки.

Что НЕ проверено

Гейт на b69c3b6 не прогнан: работы по команде владельца приостановлены, раннер на 192.168.1.147 остановлен (docker stop gitea-runner-awg-repo). Ожидаемый исход — image-scan зелёный; если нет, смотреть новых находок в логе job'а (не верить total_count артефактов — они не публикуются, #62).

После зелёного image-scan правок в CI не требуется — push пойдёт сам, как только появится секрет REGISTRY_TOKEN (write:package).

## Статус на момент паузы: 5 HIGH вместо 22, корневая причина каждого шага установлена ### Что закрыто (проверено на живом раннере, образ `staging-20db51b7` / `staging-cc3621a1`) | Было | Стало | Как | |---|---|---| | Go stdlib 1.25.14: 1 CRITICAL (CVE-2026-56857) + 3 HIGH | **0** | `GO_IMAGE` golang:1.25 → **golang:1.26-alpine** | | alpine 3.21 — HIGH в пакетах базы | **0** | runtime alpine:3.21 → **alpine:3.23.7** (+ `apk upgrade`), 66 пакетов чисто | | `golang.org/x/crypto` 0.42.0 — 1 HIGH + (после обновления БД trivy) ещё 4 | **0** | `go get golang.org/x/crypto@v0.58.0` в сборке amneziawg-go | | `golang.org/x/net` 0.45.0 — 16 HIGH (http2/idna/dnsmessage) | **0** | `go get golang.org/x/net@v0.62.0` | | urllib3 2.7.0 / msgpack 1.1.2 / setuptools 70.3.0 | **осталось 5 HIGH** | пины в `requirements.txt` (`>=2.8.0` / `>=1.2.3` / `>=78.1.1`) | ### Корень оставшихся 5 HIGH (важно, чтобы не искать заново) После пинов trivy **продолжал** показывать urllib3 2.7.0 / msgpack 1.1.2 / setuptools 70.3.0. Проверка внутри самого образа (`pip list` и поиск `METADATA`) дала факт: в venv стоят **1.2.4 / 2.8.0 / 84.2.1** — то есть исправленные. Источник ложных версий найден: ``` $ find / -name vendor.txt | … /opt/venv/lib/python3.12/site-packages/pip/_vendor/vendor.txt msgpack==1.1.2 urllib3==2.7.0 setuptools==70.3.0 /usr/lib/python3.12/site-packages/pip/_vendor/vendor.txt msgpack==1.1.0 / urllib3==1.26.20 / setuptools==70.3.0 ``` Trivy разбирает `pip/_vendor/vendor.txt` и репортит вендоренные в pip пакеты как установленные (в `--list-all-pkgs` они идут без `FilePath`, в отличие от реальных `*.dist-info/METADATA`). Ни один из этих пакетов в образе не импортируется. **Фикс (закоммичен в ветку PR #49, коммит `b69c3b6`):** `py3-pip` переведён из runtime-пакета в `.build-deps`, после сборки venv удаляется; pip вычищается и из venv, и из системного `site-packages`. Runtime не должен содержать инсталлятор — заодно минус размер и минус поверхность атаки. ### Что НЕ проверено Гейт на `b69c3b6` **не прогнан**: работы по команде владельца приостановлены, раннер на 192.168.1.147 остановлен (`docker stop gitea-runner-awg-repo`). Ожидаемый исход — `image-scan` зелёный; если нет, смотреть новых находок в логе job'а (не верить `total_count` артефактов — они не публикуются, #62). После зелёного `image-scan` правок в CI не требуется — `push` пойдёт сам, как только появится секрет `REGISTRY_TOKEN` (write:package).
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: embeddevio/awg-dash#61