A container image can include vulnerable operating-system packages and application libraries even when your own code passes its tests. A container vulnerability scanner identifies the software in an image and checks it against published security advisories. It helps you decide what to update before deployment and what needs attention in images already running.

Trivy scans container images and also offers checks for secrets and configuration problems. Grype focuses on vulnerability scanning of images, filesystems and software inventories. In Trivy versus Grype, compare how well each covers your actual languages and base images, how clearly it explains findings and how it fits your build process. A larger finding count alone does not establish that one is more accurate.

Trivy vs Grype: which should you choose?

Choose Trivy when you want its combination of scan types or its Kubernetes report integration. Evaluate Grype when a focused vulnerability scanner fits the workflow you already have. A scanner reports findings; a separate rule in your build or deployment process decides whether those findings should block a release. The workflow below uses Trivy and preserves the old comparison as historical evidence, not a new scanner benchmark.

Verify the tool that receives your build credentials

The March 2026 Trivy ecosystem advisory covers a malicious v0.69.4 release, compromised GitHub Action tags and malicious v0.69.5/v0.69.6 Docker Hub images. These were distinct distribution events. Review the advisory's exact artifact and execution windows when auditing old jobs, mirrors and runner caches; a version string alone cannot describe every exposure.

For a current pipeline, record the scanner's publisher, version and immutable artifact identity. Verify its release asset or image through the published signature-verification procedure and review advisories before promoting it into your own approved toolchain. Pin action code and the scanner it installs separately. A pinned action that downloads a mutable scanner still leaves a changing dependency.

Give the scan job only the credentials and filesystem access it needs. Separate untrusted pull-request execution from jobs holding production or signing credentials, restrict write permissions and treat plugins as additional executable dependencies. Pinning prevents an approved reference from silently moving; it does not prove that the approved content was benign. If an affected scanner already ran, replacing it does not undo possible credential exposure: use the upstream response guidance and your incident process.

Choose a checkpoint for each decision

CheckpointUseful roleWhat it cannot establish alone
Build or CI image scanGive the owning team findings against the image digest it is about to publish or promote.That the same digest is deployed later, or that tomorrow's advisories are covered.
Registry or scheduled rescanRevisit retained images as vulnerability data changes.Which images are actually running, unless deployment inventory is joined to it.
Trivy OperatorProduce Kubernetes vulnerability reports tied to workload images.A deployment block merely because a report exists. Report creation and admission are separate controls.
Kyverno image verificationEvaluate trusted signatures and attestations during matched admission requests.The correctness or freshness of a scan unless those properties are explicitly part of the policy.
Runtime detectionObserve behavior after execution, using a tool such as Falco.Complete vulnerability inventory or build provenance.

Trivy Operator documents its report workflow. Pilot it with a limited namespace and private-registry access before broad deployment. Establish report ownership, rescan behavior, retention and scan-job resource limits; otherwise the cluster accumulates reports without an action path.

Keep a scan record that can explain a later disagreement

Retain the image digest and architecture, scanner version/digest, enabled scanners, database update time and source, configuration and ignore-file revision, report timestamp, execution status and full machine-readable output. Separate the record for scanner execution from the decision derived from its findings. A timeout, authentication failure or missing database must remain distinguishable from a completed scan with no matching findings.

Trivy's databases can be downloaded and cached independently, including a separate Java database. Set an acceptable age for the environment and expose stale or unavailable data as an operational condition. An offline pipeline needs a verified update and distribution process; permanently skipping updates changes what the scan can know.

Make coverage explicit. Trivy's scanner settings distinguish vulnerabilities, secrets, misconfigurations and licenses; container-image scanning enables vulnerability and secret scanning by default in the documented configuration. Scanning Kubernetes or Helm configuration is another target and should have its own result. Restrict access to reports that might contain sensitive paths or secret findings.

For a multi-platform image, record the platform-specific manifest scanned as well as any image-index digest used for promotion. Scanning the variant selected for one architecture does not establish coverage of every variant in the index. Include each platform that your cluster can run in the acceptance scope.

Define the gate before tuning filters

Trivy normally exits successfully when it finds issues; its configurable --exit-code makes findings affect CI. Decide what blocks promotion and encode that decision explicitly. One team's policy might reject new high-severity findings with a supported fix while routing unfixed issues for separate review. Another may block a specific exploited vulnerability regardless of the generic severity label. Neither policy is implied by merely installing Trivy.

Keep the complete report even when the gate uses a subset. Filtering options change what is reported: --ignore-unfixed hides findings without an available fix; it does not make them harmless. Give every accepted exception an advisory/package identity, affected image scope, explanation, owner, expiry and reassessment trigger. Treat a claim that software is not affected as evidence to review, not an indefinite blanket ignore.

ResultRelease decision to defineEvidence to retain
Scan completed; no findings match the gateEligible to continue if coverage and data freshness also meet policy.Full report, digest, settings and database age.
Finding matches a blocking ruleRemediate or obtain the scoped exception.Advisory, package path, fixed version where available and owner.
Scan incomplete or data too oldRetry, hold or use an explicitly approved contingency.Error category and reason the report cannot support the normal decision.
Previously accepted image gains a new findingRoute to the deployed workload's owner and remediation deadline.Running image identity and new advisory evidence.

Derive the gate from one completed report

Prefer one recorded scan snapshot for the report and its release decision. Trivy's convert command can read a saved Trivy JSON report and apply severity and exit-code settings when producing another output. That avoids independently rescanning an image for the human report and the gate, potentially against different database updates.

  1. Write the full report to a fresh location for this run, using the reviewed configuration. Capture scanner execution errors separately.
  2. Proceed only after the scan completes and the report's image identity, coverage and data age meet policy. A file left by a previous failed run is not evidence for this run.
  3. Evaluate the saved report with the selected rule and exception revision. For example, a HIGH/CRITICAL severity gate must fail on a matching finding; it must also have a separate outcome for an incomplete scan.
  4. Publish the report and decision together with the image digest, policy revision and timestamp. Test a permitted report, a blocking finding, malformed input and unavailable data before trusting the CI integration.

Report conversion does not refresh vulnerability data or restore findings suppressed during the original scan. A severity filter also cannot implement a rule about newly introduced findings by itself; that needs a defined baseline and package/advisory comparison. Keep the gate's actual behavior aligned with the policy description.

Compare scanners by investigating disagreement

Use the same digest-pinned image set, architectures, advisory-data dates and enabled analyzers. Include supported operating systems and application-package ecosystems that represent your workloads, plus deliberately chosen known findings and fixed packages. Record unsupported components, acquisition failures and skipped files. Only compare elapsed time or resource consumption after holding hardware, network and cache conditions constant.

For a disagreement, inspect the package identity, installation method, advisory source, distribution version and patch status. Trivy explains its vendor-advisory and severity selection, including backported distribution fixes. Another scanner using different metadata can report a different count without either total proving accuracy. Investigate the underlying advisory before choosing a winner.

The original Kubedex comparison is historical. Anchore Engine and Aqua MicroScanner are retired lines; a present-day evaluation should identify current products, such as Grype and Trivy, and record a fresh method. The Anchore Engine repository and MicroScanner repository establish those lifecycle changes. This update does not rerun the old results.

Carry the decision to admission without rescanning on every request

A practical design publishes a signed statement about a scanned digest, then lets admission evaluate the trusted signer, subject, policy result and permitted age. Decide how the statement is renewed when advisories change and how deployed workloads are followed up. Verifying that a signed statement exists is weaker than checking its contents. Continue with the Kyverno enforcement and migration guide for the trust policy and failure rehearsal.

The original record

Historical Kubedex content

Original publication: 2018-09-30T14:18:35+00:00. Preserved for context. Commands, versions, prices and results below reflect the original research.

Containers help solve the “well it worked on my laptop” issue that was quite prevalent in the past. Developers can now define the exact versions of dependencies that have been tested to work alongside their applications. There is however a dark side to this. In the old days you may have had a team of operations and security people responsible for upgrades. Today we have thousands of images with who knows what inside that never get updated.

This security issue became headline news a few years ago when it emerged that a large proportion of the images on Dockerhub contained vulnerabilities. Docker went to great lengths to add new features to try to combat this massively negative publicity. More recently I read an article that said backdoored images on Dockerhub had been downloaded 5 million times before removal.

Today we’ll compare some container vulnerability scanning applications that you can run yourself. This comparison does not include any SaaS applications. The majority are free and opensource with the exception of Twistlock which I included because I had already set it up at work.

Anchore Engine vs Aqua Microscanner vs Clair vs Dagda vs Twistlock

Instead of just doing internet searches and comparing features I wanted to install each and scan a single container to get a sense of how simple they are to setup, how quickly they run and what the results look like.

This approach immediately excluded a bunch of paid options like Sonatype Nexus, Blackduck and Qualys. If I manage to get access to any of these I’d be happy to try them out and add to the blog.

I’ve evaluated each of the applications from the perspective of potentially adding them to a continuous delivery pipeline. Where containers would get scanned on each pull request and fail the build if any vulnerabilities are found.

For my testing I tried to scan the official Kong image on Dockerhub. At the time of writing this is docker.io/library/kong:1.0.0rc1. This is based on Alpine 3.6 so has some known vulnerabilities and I thought that it may be representative of the types of containers people might be running. I was expecting the scanners to mostly report the same output but as you’ll see below I was mistaken.

Clair

This was beautifully simple to setup. I used the arminc/clair-local-scan which includes the latest database snapshot updated every 24 hours. With two Docker commands I had the server and Postgres database running on my laptop. Another binary called clair-scannner is then used to connect to the server to run the scan.

Historical illustration

The only problem I had was that I’m running OSX which has Docker running in a VM. It took a couple of Google searches to realise I needed to set the ip address clair-scanner uses to the address on network interface en0. On Linux you can probably just use localhost.

Clair reported only a single vulnerability: CVE-2018-14618. I like the pretty coloured text output and it was very quick to run (4 seconds). With the baked in database and Docker containers this would be extremely simple to add to a CI build stage.

Anchore Engine

The instructions for this one looked a bit daunting at first but they are actually really simple copy and pastes. You create a directory, download a config file and then run docker-compose to start the server and database. Anchore Engine uses Postgres.

Once the server is running you can use the Anchore CLI which can be installed by Python pip. The CLI has commands to add an image to the engine, query for status and print out a report. I quite like this interface when playing locally but it’s not optimum for a CI pipeline. You have to poll in a loop to check status as per the Gitlab integration document.

Historical illustration

Anchore Engine reported the same vulnerability as Clair. The scan time was a little bit longer than Clair but still only a couple of minutes from start to finish. This could easily be added to a CI system.

Aqua Microscanner

Aqua make some cool open source security software. What I liked about Aqua Microscanner is it takes a different approach to scanning than the other options. To enable scanning you simply add 3 lines to a Dockerfile. The free version does come at the cost of providing an email address. There is also a paid enterprise version that adds more features.

By default Aqua Microscanner outputs a big block of JSON so I won’t screenshot that here. You can see the full output for all scans in this spreadsheet.

Aqua Microscanner found two vulnerabilities. CVE-2015-9261 and CVE-2016-3189 which relate to issues with unzipping zip files.

Aqua Microscanner didn’t find the Curl vulnerability. Or from another perspective Clair and Anchore Engine didn’t find these two vulnerabilities.

The scan was very quick and this is probably the simplest way to add vulnerability scanning to your pipelines.

Twistlock

This is paid software. I was curious to see what vulnerabilities it would find versus the free options. Installation of Twistlock wasn’t particularly difficult. We bundled it into a container and execute scans as part of our pull request builds.

Historical illustration

Twistlock found three vulnerabilities. CVE-2016-8610 CVE-2015-9261 and CVE-2016-7055

What’s weird is that Twistlock found a high and medium severity CVE in openssl whereas the others didn’t. It also picked up on one of the unzipping CVE’s found solely by Aqua Microscanner. However, it didn’t detect the Curl CVE found by Clair and Anchore Engine.

Dagda

Dagda looks really promising from the readme. It scans for vulnerabilities and compares against not only CVE’s but also BIDs (Bugtraq IDs), RHSAs (Red Hat Security Advisories) and RHBAs (Red Hat Bug Advisories).

Unfortunately I wasn’t able to get this running. It didn’t seem to want to work on my laptop and I assumed it was because it needed Linux as it has some integration with Falco that needs development headers. So I ran it on an AWS instance and that failed due to filling memory. I set it up a third time on an instance with 8GB ram and it seems to be stuck populating the Mongo database.

I’ll persist and update the blog when I get the results.

From what I know so far I think you’d need to setup a long running Dagda server on a reasonably sized instance and then connect out from your CI system via an SSH tunnel to execute scans. I don’t know how long the scans themselves take but I saw some Github issues stating 30 minutes was not unusual.

Dagda has issues open for performance and is under constant development so I think these problems could end up being solved.

EDIT:  I got it working after a couple more restarts!

Dagda found CVE-2015-9261 BID-99575 (CVE-2017-11164) BID-101688 (CVE-2017-16231)

This matches the unzip bug found by Aqua Microscanner and Twistlock. It also found a couple of issues with PCRE. One in the nvd database and another by doing a lookup against the Bugtraq database.

In the end, after the server is up and running, the scan itself was very quick. So this could be added to a pipeline assuming you run the Dagda server itself and Mongo on an instance with > 4Gb memory and try not to rebuild the database too often from scratch.

OpenSCAP

I read various Github issues that said the oscap-docker tool would scan any flavour of container. It’s maintained by Redhat and the official docs all seem to state it’s for RHEL scanning. So I persisted anyway and installed OpenSCAP on a Centos instance using the yum packages. It complained about needing Atomic so I installed that too.

Historical illustration

Only 10 minutes of my life wasted but a bit disappointing. As you can see it does seem to output RHSA information when you feed it a RHEL based image so this could be valuable for companies running RHEL exclusively.

Summary

All of the scanning applications I tested with the exception of Dagda were extremely simple to get up and running. Aqua Microscanner is definitely the simplest to integrate.

Clair, Anchore Engine, Aqua Microscanner and Twistlock all only take a couple of minutes to run which is perfect for adding to a pipeline.

These scanners mostly work by enumerating installed OS packages and comparing versions to the CVE database. I’m confused why 4 different scanners would produce such different results. Obviously comparing just a single image isn’t very scientific but it does make me wonder whether you need to run multiple scanners in your pipeline to catch everything which is a bit insane.

wdt_ID Clair Anchore Engine Aqua Microscanner Twistlock Dagda
1 CVE-2018-14618 CVE-2018-14618 CVE-2015-9261 CVE-2016-3189  CVE-2016-8610 CVE-2015-9261 CVE-2016-7055 CVE-2015-9261 CVE-2017-11164 CVE-2017-16231

That’s a total of 7 unique vulnerabilities found and you’d need to run at least 4 different scanning applications to find them all.

I must admit that I haven’t yet investigated if any of these CVE’s are false positives. It’s highly possible they are. However, given the sample size of a single image it’s not a great way to judge a winner. It’s merely anecdotal evidence that differences are quite apparent between applications that scan the same image.

The results are interesting at least. I don’t consider this blog complete and will continue to add to it as I find out more information. Many of these scanners do more than just output CVE’s to a console. Some integrate with other server components and have many different options which I’ve not really looked into.

If you have any feedback please leave a message in the comment section.

Edit: A follow up blog has been completed which explains the differing results and why it’s probably not a good idea to scan Alpine containers with open source vulnerability scanners.

The post Container Scanning appeared first on kubedex.com.

Historical workbook values; blanks mean unknown, not No. Prices, versions, maturity labels and feature claims are not current recommendations. Scanner columns contain independent historical output. Values on the same row are not matched vulnerabilities or comparable scores.

Container Scan / Kong Alpine (historical)

Historical snapshot

Recovered comparison data. Versions, prices and availability describe the original research, not a current benchmark. Blank or damaged source values are marked unknown.

Choose columns
Visible columns
Container Scan / Kong Alpine (historical)
TwistlockClairAnchore EngineAqua MicroscannerDagda
Image ID CVE Package Version Severity StatusUnapproved Unknown CVE-2018-14618 curl 7.61.0-r0 https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14618CVE-2018-14618 curl-7.61.0-r0 Unknown 7.61.1-r0 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14618{[
----- -- --- ------- ------- -------- ------UnknownCVE-2018-14618 libcurl-7.61.0-r0 Unknown 7.61.1-r0 http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-14618scan_started: {{
docker.io/library/image-kong:latest fd444f66ec18a5f8 CVE-2016-8610 openssl 1.0.2o-r1 highUnknownUnknownseconds: 1538551399,id: "5bb1bf4a586b2200017c0ab3",
docker.io/library/image-kong:latest fd444f66ec18a5f8 CVE-2015-9261 busybox 1.26.2-r11 medium fixed in 1.27.2-r11UnknownUnknownnanos: 527330949image_name: "kong",
docker.io/library/image-kong:latest fd444f66ec18a5f8 CVE-2016-7055 openssl 1.0.2o-r1 mediumUnknownUnknown},static_analysis: {
Vulnerability threshold check results: FAILUnknownUnknownscan_duration: 2,malware_binaries: [],
UnknownUnknownUnknowndigest: "1a7153cd8c58404b75ffad20d98ac6c3419cb40cd564718341f0b78b3214a67d",os_packages: {
ComplianceUnknownUnknownmetadata: {ok_os_packages: 23,
----------UnknownUnknowncontainer_config: {},os_packages_details: [
Image ID Severity DescriptionUnknownUnknownconfig: {}{
----- -- -------- -----------UnknownUnknown},is_false_positive: false,
docker.io/library/image-kong:latest fd444f66ec18a5f8 high Image should be created with a userUnknownUnknownos: "alpine",is_vulnerable: false,
UnknownUnknownUnknownversion: "3.6.3",product: "musl",
UnknownUnknownUnknownresources: [version: "1.1.16",
UnknownUnknownUnknown{vulnerabilities: []
UnknownUnknownUnknownresource: {},
UnknownUnknownUnknownformat: "apk",{
UnknownUnknownUnknownname: "musl",is_false_positive: false,
UnknownUnknownUnknownversion: "1.1.16-r14",is_vulnerable: true,
UnknownUnknownUnknownarch: "x86_64",product: "busybox",
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:musl:1.1.16-r14",version: "1.26.2",
UnknownUnknownUnknownlicense: "MIT",vulnerabilities: [
UnknownUnknownUnknownname_hash: "e6a295ffc4b56faeb936c5ed9b621796"{
UnknownUnknownUnknown},CVE-2015-9261: {
UnknownUnknownUnknownscanned: truecveid: "CVE-2015-9261",
UnknownUnknownUnknown},cvss_access_complexity: "Medium",
UnknownUnknownUnknown{cvss_access_vector: "Network",
UnknownUnknownUnknownresource: {cvss_authentication: "None required",
UnknownUnknownUnknownformat: "apk",cvss_availability_impact: "Partial",
UnknownUnknownUnknownname: "busybox",cvss_base: 4.3,
Test Imagehttps://github.com/Kong/docker-kong/blob/e30f249b206f2cbcda1eee603390436ae00010b3/alpine/DockerfileUnknownversion: "1.26.2-r11",cvss_confidentiality_impact: "None",
UnknownUnknownUnknownarch: "x86_64",cvss_exploit: 8.6,
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:busybox:1.26.2-r11",cvss_impact: 2.9,
UnknownUnknownUnknownlicense: "GPL2",cvss_integrity_impact: "None",
UnknownUnknownUnknownname_hash: "1a0be787cebd01a5ca5d163e1502c1c6"cvss_vector: [
UnknownUnknownUnknown},AV:N,
UnknownUnknownUnknownscanned: true,AC:M,
UnknownUnknownUnknownvulnerabilities: [Au:N,
UnknownUnknownUnknown{C:N,
UnknownUnknownUnknownname: "CVE-2015-9261",I:N,
UnknownUnknownUnknowndescription: "huft_build in archival/libarchive/decompress_gunzip.c in BusyBox before 1.27.2 misuses a pointer, causing segfaults and an application crash during an unzip operation on a specially crafted ZIP file.",A:P
UnknownUnknownUnknownnvd_score: 4.3,],
UnknownUnknownUnknownnvd_score_version: "CVSS v2",cweid: "CWE-476",
UnknownUnknownUnknownnvd_vectors: "AV:N/AC:M/Au:N/C:N/I:N/A:P",mod_date: "24-09-2018",
UnknownUnknownUnknownnvd_severity: "medium",pub_date: "26-07-2018",
UnknownUnknownUnknownnvd_url: "https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2015-9261",summary: "huft_build in archival/libarchive/decompress_gunzip.c in BusyBox before 1.27.2 misuses a pointer, causing segfaults and an application crash during an unzip operation on a specially crafted ZIP file."
UnknownUnknownUnknownvendor_score: 4.3,}
UnknownUnknownUnknownvendor_score_version: "CVSS v2",}
UnknownUnknownUnknownvendor_vectors: "AV:N/AC:M/Au:N/C:N/I:N/A:P",]
UnknownUnknownUnknownvendor_severity: "medium",},
UnknownUnknownUnknownpublish_date: "2018-07-26",{
UnknownUnknownUnknownmodification_date: "2018-09-24",is_false_positive: false,
UnknownUnknownUnknownnvd_score_v3: 5.5,is_vulnerable: false,
UnknownUnknownUnknownnvd_vectors_v3: "CVSS:3.0/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H",product: "alpine-baselayout",
UnknownUnknownUnknownnvd_severity_v3: "medium"version: "3.0.4",
UnknownUnknownUnknown}vulnerabilities: []
UnknownUnknownUnknown]},
UnknownUnknownUnknown},{
UnknownUnknownUnknown{is_false_positive: false,
UnknownUnknownUnknownresource: {is_vulnerable: false,
UnknownUnknownUnknownformat: "apk",product: "alpine-keys",
UnknownUnknownUnknownname: "alpine-baselayout",version: "2.1",
UnknownUnknownUnknownversion: "3.0.4-r0",vulnerabilities: []
UnknownUnknownUnknownarch: "x86_64",},
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:alpine-baselayout:3.0.4-r0",{
UnknownUnknownUnknownlicense: "GPL2",is_false_positive: false,
UnknownUnknownUnknownname_hash: "0316409a5019da26c343d407d1c7b0fb"is_vulnerable: false,
UnknownUnknownUnknown},product: "libressl2.5-libcrypto",
UnknownUnknownUnknownscanned: trueversion: "2.5.5",
UnknownUnknownUnknown},vulnerabilities: []
UnknownUnknownUnknown{},
UnknownUnknownUnknownresource: {{
UnknownUnknownUnknownformat: "apk",is_false_positive: false,
UnknownUnknownUnknownname: "alpine-keys",is_vulnerable: false,
UnknownUnknownUnknownversion: "2.1-r1",product: "libressl2.5-libssl",
UnknownUnknownUnknownarch: "x86_64",version: "2.5.5",
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:alpine-keys:2.1-r1",vulnerabilities: []
UnknownUnknownUnknownlicense: "MIT",},
UnknownUnknownUnknownname_hash: "15e58036e489dbb2e315895941442f71"{
UnknownUnknownUnknown},is_false_positive: false,
UnknownUnknownUnknownscanned: trueis_vulnerable: false,
UnknownUnknownUnknown},product: "libressl2.5-libtls",
UnknownUnknownUnknown{version: "2.5.5",
UnknownUnknownUnknownresource: {vulnerabilities: []
UnknownUnknownUnknownformat: "apk",},
UnknownUnknownUnknownname: "libressl2.5-libcrypto",{
UnknownUnknownUnknownversion: "2.5.5-r2",is_false_positive: false,
UnknownUnknownUnknownarch: "x86_64",is_vulnerable: false,
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libressl2.5-libcrypto:2.5.5-r2",product: "ssl_client",
UnknownUnknownUnknownlicense: "custom",version: "1.26.2",
UnknownUnknownUnknownname_hash: "c0c60b126dd08f23d05491df9d1a5c8b"vulnerabilities: []
UnknownUnknownUnknown},},
UnknownUnknownUnknownscanned: true{
UnknownUnknownUnknown},is_false_positive: false,
UnknownUnknownUnknown{is_vulnerable: false,
UnknownUnknownUnknownresource: {product: "zlib",
UnknownUnknownUnknownformat: "apk",version: "1.2.11",
UnknownUnknownUnknownname: "libressl2.5-libssl",vulnerabilities: []
UnknownUnknownUnknownversion: "2.5.5-r2",},
UnknownUnknownUnknownarch: "x86_64",{
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libressl2.5-libssl:2.5.5-r2",is_false_positive: false,
UnknownUnknownUnknownlicense: "custom",is_vulnerable: false,
UnknownUnknownUnknownname_hash: "6414eb6422c2397bebb57eec11148cb1"product: "apk-tools",
UnknownUnknownUnknown},version: "2.7.6",
UnknownUnknownUnknownscanned: truevulnerabilities: []
UnknownUnknownUnknown},},
UnknownUnknownUnknown{{
UnknownUnknownUnknownresource: {is_false_positive: false,
UnknownUnknownUnknownformat: "apk",is_vulnerable: false,
UnknownUnknownUnknownname: "libressl2.5-libtls",product: "scanelf",
UnknownUnknownUnknownversion: "2.5.5-r2",version: "1.2.2",
UnknownUnknownUnknownarch: "x86_64",vulnerabilities: []
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libressl2.5-libtls:2.5.5-r2",},
UnknownUnknownUnknownlicense: "custom",{
UnknownUnknownUnknownname_hash: "107a0e7c30a9bf3f53b376550a282789"is_false_positive: false,
UnknownUnknownUnknown},is_vulnerable: false,
UnknownUnknownUnknownscanned: trueproduct: "musl-utils",
UnknownUnknownUnknown},version: "1.1.16",
UnknownUnknownUnknown{vulnerabilities: []
UnknownUnknownUnknownresource: {},
UnknownUnknownUnknownformat: "apk",{
UnknownUnknownUnknownname: "ssl_client",is_false_positive: false,
UnknownUnknownUnknownversion: "1.26.2-r11",is_vulnerable: false,
UnknownUnknownUnknownarch: "x86_64",product: "libc-utils",
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:ssl_client:1.26.2-r11",version: "0.7.1",
UnknownUnknownUnknownlicense: "GPL2",vulnerabilities: []
UnknownUnknownUnknownname_hash: "0e1e26be5ac881a9a01726216f8e1ae6"},
UnknownUnknownUnknown},{
UnknownUnknownUnknownscanned: trueis_false_positive: false,
UnknownUnknownUnknown},is_vulnerable: false,
UnknownUnknownUnknown{product: "ca-certificates",
UnknownUnknownUnknownresource: {version: "20161130",
UnknownUnknownUnknownformat: "apk",vulnerabilities: []
UnknownUnknownUnknownname: "zlib",},
UnknownUnknownUnknownversion: "1.2.11-r0",{
UnknownUnknownUnknownarch: "x86_64",is_false_positive: false,
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:zlib:1.2.11-r0",is_vulnerable: false,
UnknownUnknownUnknownlicense: "zlib",product: "libssh2",
UnknownUnknownUnknownname_hash: "7a990d405d2c6fb93aa8fbb0ec1a3b23"version: "1.8.0",
UnknownUnknownUnknown},vulnerabilities: []
UnknownUnknownUnknownscanned: true},
UnknownUnknownUnknown},{
UnknownUnknownUnknown{is_false_positive: false,
UnknownUnknownUnknownresource: {is_vulnerable: false,
UnknownUnknownUnknownformat: "apk",product: "libcurl",
UnknownUnknownUnknownname: "apk-tools",version: "7.61.0",
UnknownUnknownUnknownversion: "2.7.6-r0",vulnerabilities: []
UnknownUnknownUnknownarch: "x86_64",},
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:apk-tools:2.7.6-r0",{
UnknownUnknownUnknownlicense: "GPL2",is_false_positive: false,
UnknownUnknownUnknownname_hash: "1854316599af827d5e6b31ac311bac1f"is_vulnerable: false,
UnknownUnknownUnknown},product: "curl",
UnknownUnknownUnknownscanned: trueversion: "7.61.0",
UnknownUnknownUnknown},vulnerabilities: []
UnknownUnknownUnknown{},
UnknownUnknownUnknownresource: {{
UnknownUnknownUnknownformat: "apk",is_false_positive: false,
UnknownUnknownUnknownname: "scanelf",is_vulnerable: false,
UnknownUnknownUnknownversion: "1.2.2-r0",product: "libgcc",
UnknownUnknownUnknownarch: "x86_64",version: "6.3.0",
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:scanelf:1.2.2-r0",vulnerabilities: []
UnknownUnknownUnknownlicense: "GPL2",},
UnknownUnknownUnknownname_hash: "188f0ba2744e0b8219f7d042847741b8"{
UnknownUnknownUnknown},is_false_positive: false,
UnknownUnknownUnknownscanned: trueis_vulnerable: false,
UnknownUnknownUnknown},product: "libcrypto1.0",
UnknownUnknownUnknown{version: "1.0.2o",
UnknownUnknownUnknownresource: {vulnerabilities: []
UnknownUnknownUnknownformat: "apk",},
UnknownUnknownUnknownname: "musl-utils",{
UnknownUnknownUnknownversion: "1.1.16-r14",is_false_positive: false,
UnknownUnknownUnknownarch: "x86_64",is_vulnerable: false,
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:musl-utils:1.1.16-r14",product: "libssl1.0",
UnknownUnknownUnknownlicense: "MIT,BSD,GPL2+",version: "1.0.2o",
UnknownUnknownUnknownname_hash: "4b2ade9208c55350a22700b3706c4b3d"vulnerabilities: []
UnknownUnknownUnknown},},
UnknownUnknownUnknownscanned: true{
UnknownUnknownUnknown},is_false_positive: false,
UnknownUnknownUnknown{is_vulnerable: false,
UnknownUnknownUnknownresource: {product: "openssl",
UnknownUnknownUnknownformat: "apk",version: "1.0.2o",
UnknownUnknownUnknownname: "libc-utils",vulnerabilities: []
UnknownUnknownUnknownversion: "0.7.1-r0",},
UnknownUnknownUnknownarch: "x86_64",{
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libc-utils:0.7.1-r0",is_false_positive: false,
UnknownUnknownUnknownlicense: "BSD",is_vulnerable: true,
UnknownUnknownUnknownname_hash: "49688b358622b3b0377f507e04ea5bfe"product: "pcre",
UnknownUnknownUnknown},version: "8.41",
UnknownUnknownUnknownscanned: truevulnerabilities: [
UnknownUnknownUnknown},{
UnknownUnknownUnknown{CVE-2017-11164: {
UnknownUnknownUnknownresource: {cveid: "CVE-2017-11164",
UnknownUnknownUnknownformat: "apk",cvss_access_complexity: "Low",
UnknownUnknownUnknownname: "ca-certificates",cvss_access_vector: "Network",
UnknownUnknownUnknownversion: "20161130-r2",cvss_authentication: "None required",
UnknownUnknownUnknownarch: "x86_64",cvss_availability_impact: "Complete",
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:ca-certificates:20161130-r2",cvss_base: 7.8,
UnknownUnknownUnknownlicense: "MPL,2.0,GPL2+",cvss_confidentiality_impact: "None",
UnknownUnknownUnknownname_hash: "7254f6aafc64c401975b544e0163895f"cvss_exploit: 10.0,
UnknownUnknownUnknown},cvss_impact: 6.9,
UnknownUnknownUnknownscanned: truecvss_integrity_impact: "None",
UnknownUnknownUnknown},cvss_vector: [
UnknownUnknownUnknown{AV:N,
UnknownUnknownUnknownresource: {AC:L,
UnknownUnknownUnknownformat: "apk",Au:N,
UnknownUnknownUnknownname: "libssh2",C:N,
UnknownUnknownUnknownversion: "1.8.0-r1",I:N,
UnknownUnknownUnknownarch: "x86_64",A:C
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libssh2:1.8.0-r1",],
UnknownUnknownUnknownlicense: "BSD",cweid: "CWE-399",
UnknownUnknownUnknownname_hash: "ace22c88c94171d5ebb16b958ffc85b7"mod_date: "17-07-2017",
UnknownUnknownUnknown},pub_date: "10-07-2017",
UnknownUnknownUnknownscanned: truesummary: "In PCRE 8.41, the OP_KETRMAX feature in the match function in pcre_exec.c allows stack exhaustion (uncontrolled recursion) when processing a crafted regular expression."
UnknownUnknownUnknown},}
UnknownUnknownUnknown{},
UnknownUnknownUnknownresource: {{
UnknownUnknownUnknownformat: "apk",BID-99575: {
UnknownUnknownUnknownname: "libcurl",bugtraq_id: 99575,
UnknownUnknownUnknownversion: "7.61.1-r0",class: "Unknown",
UnknownUnknownUnknownarch: "x86_64",cve: [
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libcurl:7.61.1-r0",CVE-2017-11164
UnknownUnknownUnknownlicense: "MIT",],
UnknownUnknownUnknownname_hash: "38ca70323c0bcf7f6b280900d11fb1c2"local: "yes",
UnknownUnknownUnknown},remote: "no",
UnknownUnknownUnknownscanned: truetitle: "PCRE 'pcre_exec.c' Local Denial of Service Vulnerability"
UnknownUnknownUnknown},}
UnknownUnknownUnknown{},
UnknownUnknownUnknownresource: {{
UnknownUnknownUnknownformat: "apk",BID-101688: {
UnknownUnknownUnknownname: "curl",bugtraq_id: 101688,
UnknownUnknownUnknownversion: "7.61.1-r0",class: "Boundary Condition Error",
UnknownUnknownUnknownarch: "x86_64",cve: [
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:curl:7.61.1-r0",CVE-2017-16231
UnknownUnknownUnknownlicense: "MIT",],
UnknownUnknownUnknownname_hash: "f6e57c9de709e45feb0d955351f53548"local: "yes",
UnknownUnknownUnknown},remote: "no",
UnknownUnknownUnknownscanned: truetitle: "PCRE CVE-2017-16231 Local Stack Buffer Overflow Vulnerability"
UnknownUnknownUnknown},}
UnknownUnknownUnknown{}
UnknownUnknownUnknownresource: {]
UnknownUnknownUnknownformat: "apk",},
UnknownUnknownUnknownname: "libgcc",{
UnknownUnknownUnknownversion: "6.3.0-r4",is_false_positive: false,
UnknownUnknownUnknownarch: "x86_64",is_vulnerable: false,
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libgcc:6.3.0-r4",product: "libbz2",
UnknownUnknownUnknownlicense: "GPL,LGPL",version: "1.0.6",
UnknownUnknownUnknownname_hash: "adf6408c028e2d47c60128fa2537e8d5"vulnerabilities: []
UnknownUnknownUnknown},},
UnknownUnknownUnknownscanned: true{
UnknownUnknownUnknown},is_false_positive: false,
UnknownUnknownUnknown{is_vulnerable: false,
UnknownUnknownUnknownresource: {product: "perl",
UnknownUnknownUnknownformat: "apk",version: "5.24.4",
UnknownUnknownUnknownname: "libcrypto1.0",vulnerabilities: []
UnknownUnknownUnknownversion: "1.0.2o-r1",},
UnknownUnknownUnknownarch: "x86_64",{
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libcrypto1.0:1.0.2o-r1",is_false_positive: false,
UnknownUnknownUnknownlicense: "openssl",is_vulnerable: false,
UnknownUnknownUnknownname_hash: "cf5a49707631f360bd9f60e24f667e04"product: "tzdata",
UnknownUnknownUnknown},version: "2017a",
UnknownUnknownUnknownscanned: truevulnerabilities: []
UnknownUnknownUnknown},}
UnknownUnknownUnknown{],
UnknownUnknownUnknownresource: {total_os_packages: 25,
UnknownUnknownUnknownformat: "apk",vuln_os_packages: 2
UnknownUnknownUnknownname: "libssl1.0",},
UnknownUnknownUnknownversion: "1.0.2o-r1",prog_lang_dependencies: {
UnknownUnknownUnknownarch: "x86_64",dependencies_details: {
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libssl1.0:1.0.2o-r1",java: [],
UnknownUnknownUnknownlicense: "openssl",js: [],
UnknownUnknownUnknownname_hash: "add4918a4d51992b9c867a0c183ef76c"nodejs: [],
UnknownUnknownUnknown},php: [],
UnknownUnknownUnknownscanned: truepython: [],
UnknownUnknownUnknown},ruby: []
UnknownUnknownUnknown{},
UnknownUnknownUnknownresource: {vuln_dependencies: 0
UnknownUnknownUnknownformat: "apk",}
UnknownUnknownUnknownname: "openssl",},
UnknownUnknownUnknownversion: "1.0.2o-r1",status: "Completed",
UnknownUnknownUnknownarch: "x86_64",timestamp: "2018-10-01 06:35:12.963609"
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:openssl:1.0.2o-r1",}
UnknownUnknownUnknownlicense: "openssl",]
UnknownUnknownUnknownname_hash: "50955d4b2031271f8fda1764c1a66ac3"Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownscanned: trueUnknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknown{Unknown
UnknownUnknownUnknownresource: {Unknown
UnknownUnknownUnknownformat: "apk",Unknown
UnknownUnknownUnknownname: "pcre",Unknown
UnknownUnknownUnknownversion: "8.41-r0",Unknown
UnknownUnknownUnknownarch: "x86_64",Unknown
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:pcre:8.41-r0",Unknown
UnknownUnknownUnknownlicense: "BSD",Unknown
UnknownUnknownUnknownname_hash: "824b14fdb13de951aa971bccb92ddf75"Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownscanned: trueUnknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknown{Unknown
UnknownUnknownUnknownresource: {Unknown
UnknownUnknownUnknownformat: "apk",Unknown
UnknownUnknownUnknownname: "libbz2",Unknown
UnknownUnknownUnknownversion: "1.0.6-r5",Unknown
UnknownUnknownUnknownarch: "x86_64",Unknown
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:libbz2:1.0.6-r5",Unknown
UnknownUnknownUnknownlicense: "BSD",Unknown
UnknownUnknownUnknownname_hash: "b727b954f1d698e4cf975a1ca5af46de"Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownscanned: true,Unknown
UnknownUnknownUnknownvulnerabilities: [Unknown
UnknownUnknownUnknown{Unknown
UnknownUnknownUnknownname: "CVE-2016-3189",Unknown
UnknownUnknownUnknowndescription: "Use-after-free vulnerability in bzip2recover in bzip2 1.0.6 allows remote attackers to cause a denial of service (crash) via a crafted bzip2 file, related to block ends set to before the start of the block.",Unknown
UnknownUnknownUnknownnvd_score: 4.3,Unknown
UnknownUnknownUnknownnvd_score_version: "CVSS v2",Unknown
UnknownUnknownUnknownnvd_vectors: "AV:N/AC:M/Au:N/C:N/I:N/A:P",Unknown
UnknownUnknownUnknownnvd_severity: "medium",Unknown
UnknownUnknownUnknownnvd_url: "https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-3189",Unknown
UnknownUnknownUnknownvendor_score: 4.3,Unknown
UnknownUnknownUnknownvendor_score_version: "CVSS v2",Unknown
UnknownUnknownUnknownvendor_vectors: "AV:N/AC:M/Au:N/C:N/I:N/A:P",Unknown
UnknownUnknownUnknownvendor_severity: "medium",Unknown
UnknownUnknownUnknownpublish_date: "2016-06-30",Unknown
UnknownUnknownUnknownmodification_date: "2017-08-21",Unknown
UnknownUnknownUnknownnvd_score_v3: 6.5,Unknown
UnknownUnknownUnknownnvd_vectors_v3: "CVSS:3.0/AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H",Unknown
UnknownUnknownUnknownnvd_severity_v3: "medium"Unknown
UnknownUnknownUnknown}Unknown
UnknownUnknownUnknown]Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknown{Unknown
UnknownUnknownUnknownresource: {Unknown
UnknownUnknownUnknownformat: "apk",Unknown
UnknownUnknownUnknownname: "perl",Unknown
UnknownUnknownUnknownversion: "5.24.4-r1",Unknown
UnknownUnknownUnknownarch: "x86_64",Unknown
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:perl:5.24.4-r1",Unknown
UnknownUnknownUnknownlicense: "Artistic,GPL2",Unknown
UnknownUnknownUnknownname_hash: "f83a0aa1f9ca0f7dd5994445ba7d9e80"Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownscanned: trueUnknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknown{Unknown
UnknownUnknownUnknownresource: {Unknown
UnknownUnknownUnknownformat: "apk",Unknown
UnknownUnknownUnknownname: "tzdata",Unknown
UnknownUnknownUnknownversion: "2017a-r0",Unknown
UnknownUnknownUnknownarch: "x86_64",Unknown
UnknownUnknownUnknowncpe: "pkg:/alpine:3.6.3:tzdata:2017a-r0",Unknown
UnknownUnknownUnknownlicense: "Public,Domain",Unknown
UnknownUnknownUnknownname_hash: "6eeb5462e24fbf0c7c56435301a67bf2"Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownscanned: trueUnknown
UnknownUnknownUnknown}Unknown
UnknownUnknownUnknown],Unknown
UnknownUnknownUnknownimage_assurance_results: {Unknown
UnknownUnknownUnknownchecks_performed: [Unknown
UnknownUnknownUnknown{Unknown
UnknownUnknownUnknownpolicy_id: 1,Unknown
UnknownUnknownUnknownpolicy_name: "Default",Unknown
UnknownUnknownUnknowncontrol: "max_severity",Unknown
UnknownUnknownUnknownmaximum_severity_allowed: "high",Unknown
UnknownUnknownUnknownmaximum_severity_found: "medium"Unknown
UnknownUnknownUnknown}Unknown
UnknownUnknownUnknown]Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownvulnerability_summary: {Unknown
UnknownUnknownUnknowntotal: 2,Unknown
UnknownUnknownUnknownmedium: 2,Unknown
UnknownUnknownUnknownscore_average: 4.3,Unknown
UnknownUnknownUnknownmax_score: 4.3Unknown
UnknownUnknownUnknown},Unknown
UnknownUnknownUnknownscan_options: {},Unknown
UnknownUnknownUnknowninitiating_user: "token",Unknown
UnknownUnknownUnknowndata_date: 1538462844Unknown
UnknownUnknownUnknown}Unknown

376 rows

Sources & further reading

  1. Trivy ecosystem supply-chain advisory
  2. Trivy artifact signature verification
  3. Trivy scanner selection and exit codes
  4. Trivy database configuration
  5. Trivy finding filters
  6. Trivy vulnerability coverage and advisory sources
  7. Trivy Operator vulnerability reports
  8. Kyverno image validation
  9. Anchore Engine lifecycle
  10. MicroScanner replacement notice
  11. Trivy conversion of saved JSON reports
  12. Trivy container image target and platforms
  13. Trivy Operator
  14. Grype documentation
  15. Recovered historical source
  16. Container Scan: historical workbook

Spotted something that needs another look?

Help improve this page →