emphereio/deph CVE reachability

Which container CVEs are in your execution path vs just noise. A dependency-graph layer that complements your scanner.

View on GitHub

Trust Signals

Scorecard Score
not yet scored
Maintenance Recency
Activelast commit Jun 26, 2026
License
MIT

Pinned Snippet

workflow.ymlSHA-pinned
uses: emphereio/deph-action@387c92cfd5a27a11a0684e47fbb2781459f845ac # v0.1.4

tags can be moved; commit SHAs can't. why a SHA?

namedescriptionrequireddefault
imageImage to analyze. A local image name already built on the runner (auto-saved to a tarball and scanned), or a registry reference deph pulls directly. Run this after the image is built.yes
image-digestContent digest to bind the verdict to — e.g. the digest output of docker/build-push-action (its steps.<id>.outputs.digest). If empty, the action resolves the best available digest and records how strong that binding is (digest_kind).no""
deph-versiondeph release tag to download (from emphereio/deph-dist releases).nov0.1.5
deph-tokenToken used to download the deph release binary. Leave empty to use the workflow's github.token. Set a PAT only if the deph repo is private.no""
severityOptional severity filter passed to deph (e.g. critical,high).no""
vexOptional VEX document path(s) passed to deph for suppression.no""
probeRuntime probe (Linux runners only): off | startup | dynamic. 'startup' runs the image and observes what loads at startup (eBPF). 'dynamic' also attaches eBPF uprobes to vulnerable functions and drives the entrypoint to confirm CVEs reachable by execution. Needs a root-capable runner with Docker (GitHub-hosted ubuntu works; the action uses sudo automatically). It runs your image, so point it at your own builds.nooff
probe-timeoutProbe window, e.g. 30s. Only used when probe is not off.no30s
fail-onGate the job on in-path findings: none | any-reachable | reachable-high | reachable-critical. Always fails LAST, after artifacts are uploaded.nonone
upload-sarifUpload a reachable-only SARIF to the code-scanning tab. Opt-in; runs a second scan pass. SARIF is not the canonical report (verdict.json is).nofalse
upload-sbomEmit a CycloneDX SBOM (with deph reachability/VEX enrichment). Opt-in; runs a second scan pass since deph formats are mutually exclusive.nofalse
comment-on-prSticky PR comment: auto (comment on pull_request events) | always | off.noauto
output-directoryDirectory where the report artifacts are written.nodeph-report
upload-artifactUpload the report directory as a workflow artifact.notrue
artifact-nameName of the uploaded artifact.nodeph-report
retention-daysDays to retain the uploaded report artifact (GitHub artifact retention / TTL). "0" uses the repository default; otherwise 1–90.no0
remediateRemediation plan: off | plan. 'plan' turns the scan into a ranked fix plan (which upgrade clears which reachable CVEs) and, on PRs, posts it as a sticky comment. With no llm-model it posts the deterministic plan; with one it adds AI narration and freshness checks.nooff
modescan | investigate | context. 'investigate' answers `question` against an existing `report` JSON; 'context' runs the AI analyst triage (exploitable-here / verify / unlikely-here) over the reachable set. Both skip scanning — the @deph PR bot calls these.noscan
questionQuestion to answer when mode=investigate.no""
reportPath to an existing deph report JSON for mode=investigate.no""
historyPrior conversation as a JSON array of {role: user|assistant, content} turns, for follow-up questions. Must be pre-filtered to trusted authors + the bot's own replies; the agent re-sanitizes (role/length/count caps) and treats it as data, not commands.no""
actormode=authorize: the username invoking deph (e.g. the PR comment author).no""
actor-associationmode=authorize: the actor's author_association (OWNER/MEMBER/COLLABORATOR/...).no""
policy-filePath to the access policy (default .deph.yml then .github/deph.yml).no""
comments-filePath to the PR's issue-comments JSON (from `gh api`). The action builds the conversation history from it with the tested trusted-author/marked-reply filter, so the consumer doesn't hand-roll it. Alternative to passing `history` directly.no""
current-comment-idThe triggering comment id, excluded from history (used with comments-file).no""
llm-base-urlOpenAI-compatible base URL for the remediation model. Works with OpenAI, Anthropic (compat endpoint), OpenRouter, Groq, and local runtimes (Ollama, vLLM). The model is the user's choice; the tools are the contract.nohttps://api.openai.com/v1
llm-modelModel id for remediation. Empty disables AI; the deterministic plan still runs.no""
llm-api-keyAPI key for the LLM endpoint. Omit for keyless local servers.no""
token-budgetHard ceiling on total LLM tokens per AI invocation (prompt+completion). The agent stops and returns a partial answer once exceeded. "0" = unlimited. Cost guardrail.no0
max-tool-callsMax tool calls per AI invocation before the agent must answer. Bounds cost/loops.no32
max-output-tokensMax tokens the model may emit per turn.no8000
namedescription
report-jsonPath to the deph JSON report (source of truth).
verdict-jsonPath to the digest-bound deph-action verdict.
summary-markdownPath to the Markdown summary.
report-htmlPath to the self-contained HTML report.
sarifPath to the SARIF file, when upload-sarif is enabled.
sbom-cyclonedxPath to the CycloneDX SBOM, when upload-sbom is enabled.
image-digestThe digest the verdict is bound to.
total-cvesDistinct known CVEs found (deduped by CVE ID).
in-path-cvesCVEs deph found in the execution path.
linked-cvesCVEs linked/present but not fully traced.
not-found-in-path-cvesCVEs present but with no execution path found by deph.
gate-trippedtrue when fail-on policy matched (the job is failed in a later step).
deph-exit-codedeph scan exit code (0 clean, 1 findings, 2 error).
remediation-markdownPath to the remediation plan (mode=scan) or the investigation answer (mode=investigate).
answerThe investigation answer text (mode=investigate).
allowedmode=authorize: 'true' if the actor may invoke deph, per the access policy.
authz-reasonmode=authorize: why the access decision was made.