Skip to content

Docker Containers

ShadowMap finds Docker images published to public registries that appear to belong to your organization, then inspects them for leaked secrets, internal application code, and configuration that should never have left your perimeter. A single image accidentally pushed to a public Docker Hub repo can expose hardcoded database credentials, API keys baked into an ENV instruction, or your entire microservice architecture in its layer history.

Overview

Docker Containers

The Docker Containers module lists each discovered public image as a row keyed on publisher / image-name. Above the table you get a six-card metrics strip, an analytics panel (discovery trend, risk donut, top keywords, sources), and a tab bar that slices the queue by lifecycle state. The default landing tab is Needs Review — online images that have not yet been triaged or dismissed.

Every row links to a full investigation page with three tabs (Overview, Tags, Leaks), and a slide-in drawer gives you the same metadata plus comments without leaving the list. From the row, drawer, or detail page you can bookmark, comment, mark a false positive, or request a takedown.

Where this fits

Docker Containers is part of the Data Leaks module group, alongside Code Repositories, S3 Buckets, and Leaked Credentials. It answers a narrow but high-impact question: what of ours is sitting in a public container registry, and does it contain secrets?

How it works

These mechanics are not visible in the UI but determine what you see and how rows are ranked.

Discovery

ShadowMap continuously searches public Docker Hub for images that match your organization. Matching is keyword-driven: image names, publisher (account/organization) names, and image descriptions are compared against your configured brand names, domains, and keywords. The Keyword that triggered the match is stored on the finding and shown under the image name, so you always know why an image surfaced.

For every matched image, ShadowMap records the publisher, image name, pull (download) count, description, tag list, and per-tag Dockerfile layer history. It then scans the image contents for leaked secrets, which become the Leaks attached to the finding.

Source

The current source is Docker Hub (hub.docker.com). The publisher links out to hub.docker.com/u/<publisher> and the image links to hub.docker.com/r/<publisher>/<image>. The Sources chart in the analytics panel is future-proofed for additional registries, but Docker Hub is the only one populated today.

Confidence: is this really ours?

Public registries are full of unrelated images that happen to share a word with your brand. Each finding carries a Confidence rating — High, Moderate, or Low — reflecting how strongly ShadowMap believes the image belongs to your organization (strength of the keyword match, publisher association, and references inside the image).

A hidden but important rule: findings with a confidence score of zero are never shown. A global filter (confidence_score != 0) excludes them from every list, tab count, and metric on this page. In practice this means the queue is pre-filtered to plausibly-yours images; the High/Moderate/Low rating then helps you decide how aggressively to act.

Risk: how bad is it if it is ours?

Risk — High, Medium, or Low — is the severity of what was found inside the image, independent of confidence. An image with leaked credentials or private keys ranks higher than one containing only a public, non-sensitive base. Risk is what the default sort prioritises.

Read the two ratings together

Confidence answers "is this ours?"; Risk answers "how dangerous is the exposure?". A High Risk / High Confidence image — a confirmed-yours image with secrets in it — is your top priority. A High Risk / Low Confidence row warrants a quick ownership check before you invest in a takedown.

Default ranking

The list sorts by Risk descending by default, using a fixed severity order rather than alphabetical: high → medium → low → informational → everything else. Within the same risk band, rows are tiebroken by confidence score (highest first), so the most-likely-yours, most-dangerous images float to the top. Clicking any sortable column header overrides this with a single-column sort.

Leaks: the actual secrets

The headline value of this module is the Leaks tab. ShadowMap runs secret-detection rules across the files inside each image and records every hit: the detection rule that fired, the offending value, the file path, the exact line and line number, and (where available) the commit author and email. Each leak has its own online/takendown status. The With Leaks metric counts how many of your online images contain at least one detected secret — this is usually the number to act on first.

Status, tabs, and the takedown lifecycle

Each image has a lifecycle Status (online or takendown) and a separate is_bad_image flag for analyst-dismissed false positives. The tabs combine these:

TabWhat it shows
Needs ReviewOnline images, not dismissed — the live exposure queue (default)
Takedown On-GoingImages with an active takedown request that has not yet completed
Taken DownImages whose status is takendown (no longer publicly available)
False PositivesImages dismissed via "Mark as False Positive" (is_bad_image)
AllOnline + Taken Down + False Positives combined

"Takedown On-Going" is computed across the takedown system, not stored on the image — it reflects whether a takedown request for this image exists and is still in flight.

Understanding the data

Each row in the table shows the following. The Image column is always visible; the rest can be toggled with the column customizer in the page header.

ColumnDescription
Imagepublisher / image-name, linked to the detail page. The matching keyword appears beneath it.
SourceThe registry the image was found on (currently Docker Hub).
RiskSeverity of the exposure inside the image: High, Medium, or Low.
ConfidenceLikelihood the image belongs to you: High, Moderate, or Low.
StatusLifecycle state: Online or Taken Down.
TakedownCurrent takedown-request state for the image, if any.
DownloadsPull count on the registry, abbreviated (e.g. 12.4K, 3.1M). A high pull count means the image — and any secrets in it — has been widely fetched.
Last SeenWhen ShadowMap last verified the image, shown as relative time (e.g. "3 days ago").

Sortable columns are Source, Risk, Confidence, Downloads, and Last Seen.

Downloads matter for response

Treat any secret found in a high-pull-count image as compromised the moment you see it. Even after the image is deleted, anyone who pulled it retains a local copy of every layer — rotation, not deletion, is the real remediation.

The filter bar supports field-based filters that combine with AND/OR logic, plus a free-text keyword search across image data. Available filter fields:

FilterFilters on
SourceRegistry source
RiskHigh / Medium / Low
ConfidenceHigh / Moderate / Low
StatusOnline / Taken Down
KeywordThe keyword that matched the image (substring match)
PublisherThe publishing account/organization
First SeenDiscovery date — backs the "New This Week" drill-down
BookmarkedLimit to bookmarked images

Two extra controls sit beside the filter bar:

  • Bookmarked (star toggle) — show only images you have bookmarked.
  • Export — generate an Excel export of the current result set. The export honours your active filters, sort column, and search term, so the file matches exactly what is on screen.

Metrics strip

Six clickable KPI cards summarise posture. Clicking a card drills the list into the matching view:

CardCountsClick navigates to
Total OnlineOnline, non-dismissed imagesNeeds Review
High RiskOnline images with High riskNeeds Review, filtered to Risk = High
With LeaksOnline images containing at least one detected secretNeeds Review
New This WeekImages first seen in the last 7 days (any status)All, filtered to First Seen ≥ 7 days ago
Pending TakedownsImages with an active, incomplete takedown requestTakedown On-Going
Taken DownImages with status Taken DownTaken Down

The analytics panel below adds a six-month Container Discovery Trend line chart, a Risk Distribution donut, and Top Keywords / Sources bar lists. Both the metrics strip and analytics panel can be collapsed from the page header.

Detail view

Clicking an image (or "Open full page" from the drawer) opens its investigation page, titled publisher / image-name. The header carries status, risk, and confidence badges, a View on Docker Hub link, and the action menu (see Taking action). It has three tabs.

Overview tab

A two-card layout:

  • Image Details — Publisher (linked to their registry profile), Image Name, Source, Risk, Confidence, Status, Downloads, the matching Keyword, First Seen, and Last Seen.
  • Description — the image's published description/overview, useful for confirming ownership and intent.

Tags tab

Lists every tag (version) of the image — latest, v1.2.3, dev, and so on. For each tag you get the tag name, size in MB, who last updated it, the last-pushed time, and the layer hash. Clicking a tag opens the layer view for that tag.

The layer view renders the tag's Dockerfile instruction history in order, with syntax highlighting on Dockerfile keywords (FROM, RUN, COPY, ENV, EXPOSE, ADD, etc.), flags, and quoted strings. Layers that look sensitive — ENV lines referencing keys/secrets/passwords/tokens, or COPY/ADD instructions that pull in .env or credentials files (with COPY also flagging .key and .pem files) — are flagged with a red warning marker and highlighted border. This is where you find how a secret got baked in.

Leaks tab

The list of detected secrets in the image. A left sidebar summarises leaks by Status and by Detection Rule; the main column shows one card per leak with:

  • Status (online / taken down) and the Rule that detected it
  • Author and Email where available
  • The File path the secret was found in
  • The Offender — the matched secret value — rendered in red
  • The exact line content and line number
  • A last-seen timestamp

Results load incrementally as you scroll. If a container has no detected secrets the tab shows "No leaks found".

Taking action

The following actions are available from the row, the detail-page drawer/header, and the bulk action bar:

ActionEffect
BookmarkFlag the image for quick retrieval via the Bookmarked filter.
CommentAdd internal notes, free-text or from a comment template.
Mark as False PositiveMove the image to the False Positives tab (is_bad_image). Use this when the image is not actually yours.
Remove from False PositivesRestore a dismissed image back to the active queue.
Pin / UnpinPin an important image for quick reference. Pin is offered on images that are not dismissed; Unpin appears once an image is pinned.
Request TakedownSubmit a takedown request through ShadowMap's takedown service to get the public image removed.
Share via integrationPush the finding to a connected integration (e.g. ServiceNow CMDB, Jira, Slack). Available from the detail page.

Selecting rows with the checkboxes reveals a bulk action bar supporting Bookmark, False Positive, and (where permitted) Takedown across the whole selection at once.

Keyboard shortcuts

On the list, j / k move the drawer to the next / previous image, s bookmarks the open image, Space selects it, and Esc closes the drawer.

Request Takedown is only shown to users whose role permits takedowns. See Takedowns for how requests are dispatched and tracked, and Roles & Permissions for who can trigger them.

When you confirm a leaked-secret finding is genuinely yours:

  1. Verify ownership. Check the publisher, description, and layer history against what you actually publish. Dismiss the image as a false positive if it is not yours.
  2. Inspect the layers. Open the Tags tab, click the affected tag to open its layer view (or run docker history --no-trunc <image> locally) to find exactly which instruction introduced the secret.
  3. Rotate every exposed credential. Any value in the Leaks tab must be treated as compromised — anyone who pulled the image has a permanent copy. Deleting the image does not undo this.
  4. Make the image private or delete it. Remove public access on the registry once credentials are rotated.
  5. Fix the pipeline. Determine how the image went public and stop it recurring — use multi-stage builds and runtime secret injection so secrets never reach a layer.
  6. Audit adjacent images. If one CI/CD image leaked, check the rest of the publisher's images for the same mistake.

Common questions

Why does an image show up that clearly is not ours? Discovery is keyword-based, so an unrelated image sharing a brand word can match. That is what Confidence is for — Low-confidence rows are exactly the ones to sanity-check. If it is not yours, "Mark as False Positive" removes it from the active queue and teaches the system.

What is the difference between Risk and Confidence? Confidence is the probability the image belongs to your organization. Risk is the severity of what was found inside it. They are scored independently; prioritise High Risk + High Confidence first.

Why is the "With Leaks" number smaller than "Total Online"? "Total Online" counts every online image attributed to you; "With Leaks" counts only those where the secret scanner found at least one credential or key. The latter is your true remediation backlog.

An image is marked Taken Down — am I safe? The image is no longer publicly available, which removes the ongoing exposure. It does not un-leak secrets that were already pulled. Always rotate credentials found in a taken-down image.

Does deleting the image remove the risk? No. Container layers are content-addressable and cached locally by anyone who pulled the image. Rotation of every exposed secret is the only reliable remediation; deletion just stops new exposure.

Why can't I see the Request Takedown button? Takedown actions are permission-gated. If your role does not include takedown rights, the button is hidden on the row, drawer, and detail page. Ask an administrator or see Roles & Permissions.

Can I get these findings out of the dashboard? Yes — use Export for an Excel file matching your current filters and sort, push individual findings through Share via integration, or include the module in scheduled Reports.

  • Code Repositories — the same class of secret-leak detection applied to public source-code repos; container leaks and repo leaks often trace back to the same pipeline mistake.
  • S3 Buckets — public cloud storage exposing your files and configuration.
  • Leaked Credentials — credentials surfaced from breaches and leaks; pair with the secrets you rotate from container findings.
  • Data Leaks Overview — the full Data Leaks queue and how its sources fit together.
  • Takedowns — how takedown requests from this module are dispatched and tracked.
  • Exports — formats, filtering behaviour, and delivery for exported findings.

ShadowMap - External Attack Surface Management