Trivy u CI/CD 2026: skeniranje ranjivosti, SBOM-a i tajni iz napadačeve perspektive

Kroz stvarni napad na neažuriranu sliku pokazujem kako Trivy 0.60+ hvata CVE-ove, tajne i pogrešne IaC konfiguracije prije nego što pipeline probije napadač.

Ažurirano: 31. kolovoza 2026.

Trivy je open-source skener ranjivosti tvrtke Aqua Security koji u jednom binariju otkriva CVE-ove, tajne, licence i pogrešne IaC konfiguracije u kontejnerskim slikama, repozitorijima i Kubernetes klasterima. Od 2026. je de facto zadani "shift-left" alat u CI/CD-u. U ovom vodiču napadam ranjivu sliku, gledam kako je Trivy 0.60+ hvata, pa svaki nalaz mapiram u konkretnu hardening kontrolu za GitLab CI i GitHub Actions pipeline.

  • Trivy 0.60+ pokriva CVE-ove, tajne, licence, IaC misconfige i generira SBOM (CycloneDX/SPDX) iz jednog binarija, pa ne trebate četiri odvojena alata.
  • Nakon opskrbnog napada iz ožujka 2026. koji je kompromitirao 75 verzijskih tagova aquasecurity/trivy-action, akciju uvijek pinajte na commit SHA, nikada na @v0.
  • EU Cyber Resilience Act traži strojno čitljiv SBOM. Obveze izvještavanja počinju 11. rujna 2026., a kazne dosežu 15 milijuna eura ili 2,5% globalnog prihoda.
  • Za brzo skeniranje samo ranjivosti Grype je 30–40% brži, no Trivy vodi po širini (secrets, IaC, Kubernetes i licence).
  • Trivy Operator u Kubernetesu radi kontinuirano skeniranje pod-ova, čvorova i RBAC-a te izlaže VulnerabilityReport CRD-ove za policy engine.
  • SARIF izlaz ide izravno u GitHub Code Scanning i AWS Security Hub, čime CVE-ovi postaju vidljivi Security timu bez dodatnog tooling-a.

Što je Trivy i kako ga napadač vidi?

Kad procijenim novi mikroservis, prvo pitam: koja je bazna slika, koje su verzije libssl, glibc i runtime paketa, i piše li netko tajne u Dockerfile. Za sve to bez Trivyja treba grep, dpkg -l, distro CVE tracker i sat vremena. Trivy sve to napravi u 15 sekundi, i to je razlog zašto ga i napadač i branitelj koriste, samo obrnutim redoslijedom.

Tehnički, Trivy je Go binarij (~40 MB) koji održava vlastitu offline bazu ranjivosti (osvježena svakih 6 sati) i skenira šest tipova ciljeva: kontejnerske slike (Docker, OCI, containerd), lokalne rootfs putanje, Git repozitorije, VM slike, Kubernetes klaster i cloud (AWS) račune. Uz to detektira secrets s ugrađenim regex pravilima, hvata IaC misconfige preko integrirane Aqua Trivy checks baze (bivši tfsec + Kubesec + Terrascan), i generira SBOM u CycloneDX ili SPDX formatu. GitHub zvjezdice (preko 35.000 do sredine 2026.) najbolji su signal da je alat postao standard u cloud-native svijetu.

Iskreno, za napadača poanta je jednostavna: sve što Trivy detektira, on je već iskoristio na drugim metama. Ako ranjivi CI ne blokira high CVE-ove ili tajne u kodu, radim vam credential theft iz .env fajla za manje od pet minuta. Za sličan defensive kontekst pogledajte i sigurnost Linux kontejnera od izolacije do produkcije.

Instalacija Trivyja 0.60+ na Linuxu 2026

Instalacija je trivijalna. Na Debianu i Ubuntuu radim preko službenog Aqua APT repozitorija, na RHEL/Rocky/Alma preko DNF-a. Ne koristim curl | bash instalere iz nepovjerljivih izvora; ako Trivy postavljate na runner, provjerite verziju i integritet paketa prije nego što pokrenete bilo što drugo.

# Ubuntu 24.04 / Debian 12, službeni Aqua APT repo
sudo apt-get install -y wget apt-transport-https gnupg
wget -qO - https://aquasecurity.github.io/trivy-repo/deb/public.key \
  | sudo gpg --dearmor -o /usr/share/keyrings/trivy.gpg
echo "deb [signed-by=/usr/share/keyrings/trivy.gpg] \
  https://aquasecurity.github.io/trivy-repo/deb generic main" \
  | sudo tee /etc/apt/sources.list.d/trivy.list
sudo apt-get update && sudo apt-get install -y trivy

# Provjera verzije: 0.60+ ima nova IaC pravila i SBOM v1.6
trivy --version
# Version: 0.62.1
# Vulnerability DB: 2026-08-30 06:00:00 +0000 UTC

Prije prve upotrebe pokrenite trivy image --download-db-only. Preuzimanje offline baze traje 20-ak sekundi i ide iz GitHub Container Registryja (ghcr.io/aquasecurity/trivy-db). Na air-gap serverima instaliram i trivy image --skip-db-update uz bazu učitanu --db-repository flagom iz internog registryja. Bez tog koraka pipeline se lomi svakih šest sati kad se baza pokuša osvježiti.

Kako skenirati Docker sliku Trivyjem korak po korak?

Ovo je 80% posla. Uzeo sam namjerno rupičastu sliku nginx:1.18, verziju iz 2020. koja još luta produkcijskim registryjima. Cilj: pokazati kako Trivy izvlači CVE-ove iz OS paketa i aplikacijskih ovisnosti.

# 1) Cijeli izvještaj u tablici, samo HIGH/CRITICAL (CI-friendly output)
trivy image \
  --severity HIGH,CRITICAL \
  --ignore-unfixed \
  --format table \
  nginx:1.18

# 2) JSON za daljnju obradu ili SIEM ingest
trivy image --format json --output nginx-scan.json nginx:1.18

# 3) SARIF za GitHub Code Scanning / AWS Security Hub
trivy image --format sarif --output trivy.sarif nginx:1.18

# 4) Non-zero exit code na CRITICAL, koristi se u pipelineu kao gate
trivy image --exit-code 1 --severity CRITICAL nginx:1.18

Rezultat je hrpa CVE-ova iz openssl, libgcrypt i zlib, svaki s referencom, CVSS ocjenom i primary source URL-om. Flag --ignore-unfixed filtrira ranjivosti za koje upstream nema patch (praktično kad razvojni tim ne može popraviti nešto što još nije popravljeno), ali to smanjuje pokrivenost zero-day tracking-a. Za compliance izvještaj radije držim sve, pa filtriram preko .trivyignore po CVE-u.

Za dublje razumijevanje kako se ovi nalazi vežu uz MAC politike pogledajte SELinux vs AppArmor usporedbu. Ranjivi paket unutar dobro postavljene MAC politike znatno je manje eksploatibilan.

Generiranje SBOM-a (CycloneDX i SPDX) za CRA

Software Bill of Materials nije više dobrovoljan. EU Cyber Resilience Act stupio je na snagu 10. prosinca 2024., izvještajne obveze počinju 11. rujna 2026., a puna primjena je 11. prosinca 2027. Za svaki proizvod s digitalnim elementima proizvođač mora imati strojno čitljiv SBOM, u praksi to znači CycloneDX ili SPDX. Kazne dosežu 15 milijuna eura ili 2,5% globalnog prihoda.

# CycloneDX JSON (najčešći format u CI/CD-u)
trivy image --format cyclonedx --output sbom.cdx.json myapp:1.0.0

# SPDX 2.3 (preferiran kod velikih enterprise kupaca i US federal)
trivy image --format spdx-json --output sbom.spdx.json myapp:1.0.0

# Attach SBOM-a kao OCI artefakt uz sliku (Cosign)
cosign attach sbom --sbom sbom.cdx.json myregistry/myapp:1.0.0
cosign sign myregistry/myapp:1.0.0

# Ingest ranije generiranog SBOM-a, brže nego ponovno skeniranje
trivy sbom sbom.cdx.json

Kad SBOM potpišete Cosignom i attach-nete kao OCI artefakt, imate kompletnu supply chain provenance koju CRA i US Executive Order 14028 traže. Njemački BSI TR-03183-2 (kolovoz 2025.) je jedini konkretno propisao koja polja SBOM mora sadržavati (trenutačno najstroži tehnički okvir na svijetu), i on prihvaća oba formata.

Skeniranje IaC-a: Terraform, Kubernetes, Dockerfile

Većina proboja u cloudu zadnje tri godine nije bila zbog CVE-a, nego zbog otvorenog S3 buketa, otvorenog security groupa 0.0.0.0/0:22, ili privileged: true u Kubernetes Deploymentu. Trivy pokriva sve to preko config podkomande, bez potrebe za tfsec, Checkov ili KICS.

# Skeniraj Terraform, K8s manifeste, Dockerfile, sve odjednom
trivy config ./infra/

# Samo Kubernetes YAML s definiranom razinom
trivy config --severity HIGH,CRITICAL ./k8s/

# Isključi provjere koje razvojni tim ne može popraviti
trivy config --skip-check AVD-KSV-0014 ./k8s/

# Custom Rego pravila (OPA) za organizacijske politike
trivy config --policy ./my-policies/ ./infra/

Trivy koristi ugrađene Aqua Trivy Checks, konsolidiranu bazu koja je 2023. apsorbirala tfsec i dio Kubesec-a. U 0.60+ verziji dodane su STIG i CIS Kubernetes 1.10 mape, kao i pravila za ambient capabilities u containerd runtime-u. Ako pišete vlastite politike, držite se OPA/Rego jer to isti binarij evaluira i za IaC i za Kubernetes runtime u Trivy Operatoru. Zajednička jezična baza znači manje duplikata.

Kako Trivy detektira tajne u repozitoriju?

Zadnje godine radio sam red team engagement gdje smo eksfiltrirali AWS pristupni ključ iz .git/objects/. Netko ga je commit-ao 2019., poslije ga izbrisao, ali git ga je pamtio. Trivy skeniranjem repozitorija to hvata pomoću secret detektora zasnovanog na regex i entropy pravilima.

# Skeniraj filesystem, cijeli repo
trivy fs --scanners secret .

# Kombinirano: ranjivosti + secrets + config u jednom passu
trivy fs --scanners vuln,secret,misconfig .

# Custom pravila: dodaj interne tajne (npr. company API tokene)
cat > trivy-secret.yaml <<'EOF'
rules:
  - id: internal-jwt
    category: internal
    severity: CRITICAL
    title: "Interni JWT token"
    regex: "eyJhbGciOi[A-Za-z0-9\\-_]{15,}\\.[A-Za-z0-9\\-_]{20,}\\.[A-Za-z0-9\\-_]{20,}"
EOF
trivy fs --secret-config trivy-secret.yaml .

Za git history pretragu (koju Trivy sam ne radi) preporučujem Gitleaks kao komplement. Istu podatkovnu bazu regex pravila možete koristiti u oba alata. Praktična kombinacija u pipelineu: Gitleaks kao pre-commit hook na razvojnoj strani, a Trivy fs --scanners secret kao defense in depth u CI-u.

Trivy u GitLab CI i GitHub Actions pipelineima

Ovo je mjesto gdje Trivy plaća najam. Cilj: pipeline pada na CRITICAL, upozorava na HIGH, artefaktira JSON za dashboard i šalje SARIF u sigurnosnu platformu. Prvo GitHub Actions primjer, s obveznim SHA pinning-om nakon ožujskog 2026. incidenta.

# .github/workflows/security.yml
name: Trivy Security Scan
on: [push, pull_request]

jobs:
  scan:
    runs-on: ubuntu-24.04
    permissions:
      security-events: write   # potrebno za SARIF upload
      contents: read
    steps:
      - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2

      # OVAJ SHA, nakon supply chain napada u ožujku 2026.
      # NIKAD ne koristi @master, @v0, @latest
      - name: Trivy scan
        uses: aquasecurity/trivy-action@6c175e9c4083a92bbca2f9724c8a5e33bc2d97a5 # v0.29.0
        with:
          image-ref: 'ghcr.io/${{ github.repository }}:${{ github.sha }}'
          format: 'sarif'
          output: 'trivy-results.sarif'
          severity: 'CRITICAL,HIGH'
          exit-code: '1'
          ignore-unfixed: true

      - uses: github/codeql-action/upload-sarif@f6091c0113d1dcf9b98e269ee48e8a7e51b7bdd4 # v3.28.0
        if: always()
        with:
          sarif_file: 'trivy-results.sarif'

GitLab varijanta koristi Trivy Docker image kao osnovu image: ključa. Ključna razlika: allow_failure: false na critical, true na high. Inače će development tim naučiti ignorirati crveni pipeline unutar tjedan dana.

# .gitlab-ci.yml
trivy:image:
  image:
    name: aquasec/trivy:0.62.1
    entrypoint: [""]
  stage: security
  variables:
    TRIVY_NO_PROGRESS: "true"
    TRIVY_CACHE_DIR: ".trivycache/"
  script:
    - trivy --version
    - trivy image --download-db-only
    - trivy image
        --exit-code 1
        --severity CRITICAL
        --format template
        --template "@contrib/gitlab.tpl"
        --output gl-container-scanning-report.json
        $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
  cache:
    paths: [".trivycache/"]
  artifacts:
    reports:
      container_scanning: gl-container-scanning-report.json

Ovaj JSON format GitLab automatski ubacuje u Security Dashboard i Merge Request Widget. Vezano uz mrežnu izolaciju CI runnera, provjerite i naš vodič za nftables konfiguraciju vatrozida. CI runner treba egress samo prema registry-ju i vulnerability DB-u.

Trivy vs Grype vs Snyk 2026: kada koji?

Nema univerzalno "najboljeg" skenera. Tri alata rješavaju tri različita problema, a ozbiljne organizacije često koriste dva paralelno.

KriterijTrivy 0.62Grype 0.85Snyk (komercijalno)
LicencaMIT, open sourceApache 2.0, open sourceKomercijalna SaaS + free tier
Opseg skeniranjaCVE + tajne + IaC + licence + K8s + cloudSamo CVE (fokus na dubinu)CVE + SAST + IaC + open source, s remediacijom
Brzina (pure CVE)Referentna30–40% bržiOvisi o SaaS latenciji
PrioritetizacijaCVSS + KEV (0.58+)CVSS + EPSS + KEV composite (0–10)Vlastiti exploitability score
SBOMGenerira i konzumira (CycloneDX, SPDX)Preko Syft-a (Anchore par)Generira, uz commercial features
CI/CD integracijaGitHub Action, GitLab, Jenkins, AzureGitHub Action, plugin za JenkinsNative u većini IDE-ova + CI
Cijena za 50 razvojnih inženjera0 EUR0 EUR~1.250–3.100 EUR mjesečno
Enterprise dashboardPreko Aqua platforme (komercijalno)Preko Anchore Enterprise (komercijalno)Uključen

Praktična preporuka koju najčešće dajem klijentima: počnite s Trivyjem. Pokriva CVE, IaC, tajne i Kubernetes u jednom binariju, besplatan je i integrira se svugdje. Ako trebate EPSS-based prioritetizaciju i najmanju false-positive stopu, dodajte Grype za vulnerability-only put. Snyk uzimam samo kad kupac izričito traži PR anotacije i developer dashboard preko svih repo-a te ima budžet.

Trivy Operator za Kubernetes runtime skeniranje

CI skeniranje ne pokriva klaster nakon deploya. Trivy Operator instalira se kao Kubernetes controller i kontinuirano skenira sve pod-ove, čvorove, RBAC objekte i Kubernetes verziju. Rezultati završavaju u VulnerabilityReport, ConfigAuditReport, i ExposedSecretReport Custom Resource Definition-ima koje Gatekeeper ili Kyverno mogu koristiti kao input za admission control.

# Instalacija preko Helm-a
helm repo add aqua https://aquasecurity.github.io/helm-charts/
helm install trivy-operator aqua/trivy-operator \
  --namespace trivy-system --create-namespace \
  --set="trivy.ignoreUnfixed=true" \
  --set="operator.scanJobTimeout=10m"

# Ispis nalaza po namespace-u
kubectl get vulnerabilityreports -n production
kubectl get configauditreports -n production
kubectl get exposedsecretreports -A

# Prometheus metrike su izložene na :8080/metrics
kubectl port-forward -n trivy-system svc/trivy-operator 8080:80
curl -s localhost:8080/metrics | grep trivy_

Operator radi compliance reports za CIS Kubernetes Benchmark, NSA/CISA Kubernetes Hardening Guide i PSS (Pod Security Standards). Ovo je jedini alat za koji sam našao da automatski mapira nalaze prema tim baselinima bez custom skripata. Rezultati se izlažu i preko OpenTelemetry-ja, tako da mogu ući u ELK, Loki ili Splunk stack.

Često postavljana pitanja

Je li Trivy besplatan za komercijalnu upotrebu?

Da. Trivy je pod MIT licencom i besplatan je za bilo koju upotrebu, uključujući komercijalne pipelineove i SaaS proizvode. Komercijalne Aqua Enterprise značajke (centralni dashboard, RBAC, integracija s ticketing sustavima) plaćaju se odvojeno, no sam skener nikad nije bio i nije freemium.

Koliko često treba pokretati Trivy u pipelineu?

Minimalno na svaki push u main granu i pri buildanju produkcijske slike. Osim toga preporučujem daily scheduled scan zadnje objavljene slike jer se CVE baza mijenja svakih 6 sati; nova ranjivost može se pojaviti u paketu koji je jučer bio čist. U Kubernetesu Trivy Operator to rješava kontinuiranim skeniranjem svakih 6 sati po zadanim postavkama.

Može li Trivy raditi offline u air-gapped okruženju?

Da. Trivy podržava potpuni offline mod preko --offline-scan i --skip-db-update, a vulnerability DB se može mirrorati u lokalni OCI registry preko trivy image --download-db-only pa oras push. Ključno je da Java DB (za Maven jar-ove) također ide zasebno kroz --download-java-db-only.

Podržava li Trivy SPDX SBOM format uz CycloneDX?

Podržava. Trivy 0.60+ generira SPDX 2.3 (JSON i tag-value), CycloneDX 1.5/1.6 (JSON i XML), te GitHub-ov proprietary format. Za CRA i BSI TR-03183-2 usklađenost i SPDX i CycloneDX prolaze; birajte format koji vaši downstream alati (dependency-track, Anchore, GitHub Advanced Security) najbolje jedu.

Kako spriječiti ponavljanje ožujskog 2026. supply chain napada na trivy-action?

Uvijek pinajte GitHub Actions na commit SHA, nikad na verzijski tag ili granu. Uključite Dependabot koji SHA-eve podiže kroz PR-ove, i konfigurirajte permissions: blok na najniže potrebne (u ovom slučaju samo security-events: write i contents: read). Za dodatnu obranu koristite OIDC tokene umjesto dugovječnih tajni; čak i ako je akcija kompromitirana, izloženi token vrijedi 15 minuta.

Felix Lindqvist
O Autoru Felix Lindqvist

Penetration tester and OSCP holder. Reverse engineers misconfigured servers for a living and writes about what he finds.