The Conforma CLI (ec) is a Go binary that verifies software supply chain
artifacts. It validates container image signatures, verifies SLSA provenance
attestations, and evaluates OPA/Rego policies against those attestations to
determine whether artifacts meet compliance requirements.
The CLI operates in three modes:
- CLI mode (primary): one-shot evaluation invoked by CI pipelines and
developers. The main commands are
ec validate image(verifies container images against policy),ec validate input(verifies arbitrary JSON/YAML against policy), andec validate vsa(validates Verification Summary Attestations). Additional subcommands:ec validate policy(validate policy bundles),ec fetch,ec inspect,ec opa,ec sigstore,ec track,ec compare. - Server mode: a persistent HTTP server (
ec validate input --server) that exposes a REST API for policy evaluation. Evaluators are initialized at startup with policy source configuration, but actual policy bundle downloads occur on first evaluation (cached viasync.OnceValues). The server accepts input documents over HTTP and returns evaluation results. - Acceptance test mode: instrumented binary with test infrastructure (Cucumber/Gherkin via Godog, Testcontainers, WireMock).
In the Konflux CI/CD platform, the CLI runs inside a Tekton task
(verify-enterprise-contract) at two gates:
- Integration testing (post-build): validates a Snapshot against the EnterpriseContractPolicy (ECP) referenced by the user's IntegrationTestScenario.
- Release gating (pre-release): validates a Snapshot against the ECP specified in the ReleasePlanAdmission (RPA) in the managed namespace.
The CLI is built with CGO_ENABLED=0 for portability. It is distributed as an
OCI image (quay.io/conforma/cli, registry.redhat.io/rhtas/ec-rhel9) and as
a Tekton task bundle (quay.io/conforma/tekton-task).
The CLI interacts with several external systems at runtime:
| System | Interaction |
|---|---|
| OCI registries (Quay, registry.redhat.io) | Pull policy bundles, data sources, images, attestations, SBOMs |
| Sigstore (cosign, Rekor, Fulcio, TUF) | Verify image/attestation signatures, keyless verification, transparency log checks |
| Kubernetes API server | Resolve ECP custom resources, fetch public keys from Secrets |
| Git hosting (GitHub, GitLab) | Download policy configuration from git repos |
| OPA/Conftest engine (embedded) | Evaluate Rego policies against attestation data |
Key direct dependencies: sigstore/cosign, sigstore/rekor,
sigstore/sigstore, open-policy-agent/opa, open-policy-agent/conftest,
google/go-containerregistry (via conforma/go-containerregistry fork),
in-toto/in-toto-golang, conforma/go-gather, conforma/crds.
Assets are the things the system protects, produces, or depends on.
| Asset | Description | Sensitivity |
|---|---|---|
| Evaluation result | The pass/fail verdict and detailed report. The primary output -- a false "pass" means a non-compliant artifact reaches production. | Critical |
| Image/attestation signatures | Cosign signatures and DSSE-wrapped attestations on container images. Prove provenance and integrity. | High |
| Signing keys | Public keys used to verify signatures (from ECP or K8s Secrets). Private keys used to sign VSAs. Compromise allows forged attestations or VSAs. | Critical |
| Policy bundles | OCI-bundled Rego rules downloaded at evaluation time. Substitution or tampering changes what is enforced. | High |
| Policy data sources | External data (trusted task lists, allowed registries, vulnerability thresholds) merged into the OPA data tree. Manipulation weakens policy rules. | High |
| EnterpriseContractPolicy (ECP) | Declarative policy configuration (sources, keys, identity, exclusions). Controls what is verified and how. | High |
| SLSA provenance attestations | In-toto attestation content consumed by Rego rules. Crafted content can evade rule logic. | High |
| VSA (Verification Summary Attestation) | Signed record that an image was validated. Forged or expired VSAs can skip re-validation. | High |
| OCI registry credentials | Implicit credentials used to pull images, policy bundles, and data sources. Leakage enables supply chain attacks. | High |
| Temporary files | Work directories (ec-work-*), server-mode input files, OPA bundle caches. May contain attestation data, policy content, or evaluation artifacts. |
Medium |
| Server-mode state | Loaded evaluators, in-flight evaluation contexts, request/response data. | Medium |
Each entry point is a place where data crosses a trust boundary into the CLI. The trust level indicates who controls the data.
| Entry point | Trust level | Description |
|---|---|---|
--policy / -p |
Varies | ECP reference: K8s name, file path, git URL, or inline JSON. In integration tests, user-controlled. In release gate, SRE-controlled. |
--image / --images |
User-controlled | Image references or Snapshot spec. Determines what is validated. |
--public-key / -k |
Varies | Overrides the key from ECP. In Konflux, set by the Tekton task (from K8s Secret). |
--rekor-url / -r |
Varies | Rekor URL for transparency log checks. In Konflux, set by collect-keyless-params. |
--ignore-rekor |
Varies | Disables Rekor transparency log checks. Set to true in Konflux pipelines for traditional signing verification. Set to false for keyless verification by the collect-keyless-params pipeline task (not enforced at the CLI level). |
--skip-image-sig-check |
User-controlled (integration) | Skips image signature verification entirely. |
--skip-att-sig-check |
User-controlled (integration) | Skips attestation signature verification. Unverified attestation content flows to all policy rules. |
--effective-time |
Varies | Controls time-based rule evaluation. Can demote time-gated violations from failures to warnings. |
--allow-past-effective-time |
Varies | Defaults to false. When false, prevents past dates in --effective-time. CLI-level guard against effective-time manipulation. |
--extra-rule-data |
Varies | Merges additional key=value pairs into policy rule data. Pipeline parameter in Tekton task. |
--strict / -s |
Varies | When false, CLI returns exit code 0 regardless of violations. |
--vsa-signing-key |
Operator-controlled | Private key for signing VSAs. File path or K8s Secret reference. (ec validate image only) |
--vsa-upload |
Operator-controlled | Storage backends for VSA upload (Rekor, local filesystem). (ec validate image only) |
--filter-type |
User-controlled | Selects policy filtering mode. |
--workers |
User-controlled | Number of concurrent validation workers. |
| Entry point | Trust level | Description |
|---|---|---|
| Policy bundle download | Depends on ECP config | Rego policies downloaded as OCI artifacts from spec.sources[].policy URLs. Content determines what rules are enforced. |
| Data source download | Depends on ECP config | Policy data downloaded from spec.sources[].data URLs. Merged into OPA data tree via deep merge. |
| Image manifest/config fetch | Untrusted (attacker-controlled image) | Image metadata pulled from registry. Parsed by go-containerregistry. |
| Attestation fetch | Untrusted (attacker-controlled image) | DSSE-wrapped attestations fetched alongside images. Parsed and signature-verified before policy evaluation. |
| SBOM fetch | Untrusted (attacker-controlled image) | Software Bill of Materials fetched via custom OPA builtins (ec.oci.*). Parsed by CycloneDX/SPDX libraries. |
| VSA fetch | Semi-trusted | VSAs retrieved from Rekor or local storage. Must be signature-verified and within expiration window. |
| Entry point | Trust level | Description |
|---|---|---|
| Cosign verification | Trusted infrastructure | Signature verification via cosign libraries. Relies on correct key/certificate configuration. |
| Rekor transparency log | Trusted infrastructure | Transparency log queries/uploads. Subject to network availability and TLS. |
| Fulcio CA / TUF root | Trusted infrastructure | Certificate authority and trust root for keyless verification. |
| TUF mirror | Trusted infrastructure | Distributes root of trust metadata. URL from cluster ConfigMap. |
| Entry point | Trust level | Description |
|---|---|---|
| ECP custom resource | SRE-controlled (release) / User-controlled (integration) | Policy configuration fetched from K8s API. |
| Public key from Secret | Platform-controlled | Signing key read from k8s://openshift-pipelines/public-key. |
| Cluster ConfigMap | Platform-controlled | cluster-config in konflux-info namespace provides OIDC issuer, Rekor URL, TUF mirror. |
| Entry point | Trust level | Description |
|---|---|---|
POST /v1/validate/input |
Network caller | Accepts JSON/YAML body (up to 80MB). Written to temp file, evaluated against pre-loaded policies. |
GET /live |
Network caller | Liveness probe. Always returns 200. |
GET /ready |
Network caller | Readiness probe. Returns 200 when evaluators are initialized (policy downloads may still be pending until first evaluation). |
Server mode has no built-in authentication, authorization, or rate limiting.
The server binds to 127.0.0.1 by default but can be configured to 0.0.0.0.
The CLI registers custom OPA builtins that extend the Rego evaluation environment:
| Builtin | Description | Trust boundary |
|---|---|---|
ec.sigstore.verify_image |
Verifies image signatures from within Rego. Accepts sigstore opts from policy rule data. | Rego rules control parameters passed to signature verification. |
ec.sigstore.verify_attestation |
Verifies attestation signatures from within Rego. Same parameter trust issue. | Same as above. |
ec.oci.* (image_manifest, image_manifests, image_index, image_files, image_tag_refs, image_referrers, blob, blob_files, descriptor, parsed_blob) |
Fetch OCI manifests, blobs, indexes, and image metadata. Require registry network access. | All bypass OPA network sandbox (by design -- need registry access). |
ec.purl.* |
Package URL parsing/validation. | Input from attestation content (untrusted). |
| Entry point | Trust level | Description |
|---|---|---|
spec.sources[].ruleData |
Depends on ECP ownership | Becomes data.rule_data__configuration__ in OPA. Controls thresholds, allowed lists, trusted tasks. |
spec.sources[].config |
Depends on ECP ownership | Include/exclude rules, volatile exclusions with time bounds. |
| Data source deep merge | Depends on data source ownership | External data merged into OPA data.* namespace. rule_data__configuration__ takes precedence over rule_data. New keys can be injected if absent from CLI config structs. |
--extra-rule-data merge |
Depends on pipeline parameter control | Merges key=value pairs into each source's ruleData. Values are resolved via GetPolicyConfig (can reference K8s, files, git, inline JSON). |
| Entry point | Trust level | Description |
|---|---|---|
--vsa-public-key |
Operator-controlled | Public key used to verify VSA signatures. File path or K8s Secret reference. |
--fallback-public-key |
Operator-controlled | Public key used for fallback image validation when VSA validation fails. This is a different key from the VSA verification key, used for a fundamentally different validation mode (full image signature verification). |
--no-fallback |
Operator-controlled | Disables fallback to full image validation when VSA validation fails. When set, a VSA validation failure is final with no image validation retry. Fallback is enabled by default. |
--ignore-signature-verification |
Operator-controlled | Skips VSA signature verification entirely. Parallels --skip-att-sig-check for attestations. |
--vsa-retrieval |
Operator-controlled | Controls how VSAs are retrieved (e.g., from Rekor or local storage). |
The --ignore-signature-verification flag is a direct bypass mechanism for VSA
signature checking. When enabled, unverified VSAs are accepted, removing the
primary control against threats CA-6 (VSA-based validation skip) and CR-2 (VSA
signing key compromise). Deployments relying on VSA trust should restrict access
to this flag.
| ID | Threat | Impact | Likelihood | Existing Mitigation |
|---|---|---|---|---|
| SC-1 | Compromised policy bundle: attacker substitutes a malicious Rego policy bundle at the OCI registry, causing the CLI to enforce weakened rules. | Critical -- all validation is bypassed. | Low -- requires compromising the registry or OCI push credentials. | Policy bundles can be pinned by digest (POLICY_BUNDLE_DIGEST task param). TLS required for downloads (isSecure check). OCI registries require authentication for push. |
| SC-2 | Compromised data source: attacker modifies external data source content (e.g., trusted task list, allowed registry prefixes) to weaken policy enforcement. | High -- specific rules are weakened. | Medium -- data sources may be in repos with broader write access than the policy repo. | Data sources are fetched over TLS. Content is deep-merged into the OPA data tree: nested map keys are merged recursively, but non-map values at the same key path are overwritten by the later source. |
| SC-3 | Dependency compromise: a transitive dependency (cosign, OPA, go-containerregistry, etc.) is compromised, introducing vulnerabilities in signature verification or policy evaluation. | Critical -- undermines core verification logic. | Low -- major open-source projects with active security review. | Renovate for dependency updates. go.sum integrity verification. CGO_ENABLED=0 reduces native dependency surface. |
| SC-4 | Tekton task bundle substitution: attacker replaces the EC Tekton task bundle with a modified version that changes CLI invocation flags. | Critical -- attacker controls all CLI parameters. | Low -- task bundles are digest-pinned and managed by platform team. Trusted Tasks policy validates task provenance. | Task bundle digest pinning. Trusted Tasks verification in policy rules. |
| SC-5 | Git-based policy source tampering: policy configuration fetched via git URL (github.com/user/repo) could be modified between fetches if not pinned to a specific ref/commit. |
High -- policy config changes without detection. | Medium -- depends on whether git refs are pinned. | Git URLs support ?ref= pinning. |
| ID | Threat | Impact | Likelihood | Existing Mitigation |
|---|---|---|---|---|
| IV-1 | Malformed OCI manifest/image: crafted image metadata causes parsing errors in go-containerregistry that result in fail-open behavior. | High -- validation skipped for unparseable images. | Low -- go-containerregistry is mature and well-tested. | Errors during image processing propagate as failures, not silent passes. |
| IV-2 | Crafted attestation content: attacker controls build pipeline (PaC definitions in their repo) and produces attestation content that technically satisfies Rego rule predicates but doesn't represent real compliance. | High -- rules pass but compliance is illusory. | Medium -- attacker controls source repo and build pipeline definition. Tekton Chains independently generates attestations from pipeline results, but the user controls what results the pipeline produces. | Chains generates attestations independently of user code. SLSA provenance structure is defined by Chains, not the user. Policy rules validate specific attestation fields. |
| IV-3 | Type confusion in Rego evaluation: OPA's dynamic typing means attestation fields with unexpected types (string vs. array vs. object) could cause rules to silently fail to match. | Medium -- individual rules may not fire, but this doesn't bypass signature verification. | Medium -- depends on rule implementation robustness in the policy repo. | This is primarily a policy repo concern, but the CLI's data marshaling layer should preserve types faithfully. |
| IV-4 | Snapshot manipulation: the --images or --snapshot input determines which images are validated. If an attacker can influence the Snapshot content, they could omit non-compliant components. |
High -- non-compliant images skip validation entirely. | Low in Konflux -- Snapshots are created by the Integration Service from the Global Candidate List, not by the user. | Snapshot creation is a platform function. The SINGLE_COMPONENT task param reduces scope but is set by the pipeline, not the user. |
| IV-5 | Server-mode input parsing: the HTTP evaluation endpoint accepts up to 80MB of JSON/YAML, written to a temp file. Malformed input could cause excessive resource consumption. | Medium -- denial of service on the server instance. | Medium -- server has body size limits but no rate limiting. | 80MB body limit. 90-second evaluation timeout. Read/write timeouts on the HTTP server. Recovery middleware catches panics. |
| ID | Threat | Impact | Likelihood | Existing Mitigation |
|---|---|---|---|---|
| CA-1 | --strict=false bypass: setting strict to false causes the CLI to return exit code 0 regardless of policy violations. |
High -- validation failures are silently ignored. | Low at release gate -- this parameter is set by the Tekton task definition, which the user does not control in the managed namespace. High at integration gate -- user controls IntegrationTestScenario. | Two-gate architecture: even if integration tests are bypassed, the release gate re-validates with SRE-controlled parameters. |
| CA-2 | --effective-time manipulation: setting effective time to a past or future date can demote time-gated rule violations from failures to warnings, or activate/deactivate rules with effective_on dates. |
High -- security rules with effective dates can be silently demoted. | Low at release gate -- parameter set by Tekton task. | In Konflux, defaults to "now". The task definition controls this value for release pipelines. --allow-past-effective-time defaults to false, rejecting past dates at the CLI level as defense-in-depth. |
| CA-3 | --skip-image-sig-check / --skip-att-sig-check: skipping signature verification allows unverified content to flow through all policy rules. Critically, --skip-att-sig-check makes the skip invisible in the JSON report (no violation, no field indicating the skip). |
Critical -- all attestation-based rules evaluate unverified content. | Low at release gate -- these are Tekton task parameters controlled by the platform. | Two-gate architecture. These flags are integration-test-only bypasses in default Konflux. |
| CA-4 | --extra-rule-data injection: this parameter merges key=value pairs into ruleData for every policy source. Values are resolved via GetPolicyConfig, which supports K8s, file, git, and inline JSON references. An attacker who controls this parameter could override thresholds or inject new data keys. |
High -- weakens specific policy rules by changing their data inputs. | Low at release gate -- EXTRA_RULE_DATA is a pipeline parameter. Medium at integration gate -- user controls ITS params. |
The merge operates on the top-level ruleData object. Existing keys in ruleData are overwritten (not deep-merged), which is both a risk and a constraint. |
| CA-5 | Policy configuration from user-controlled source: the --policy flag accepts K8s references, file paths, git URLs, and inline JSON. In integration testing, the user chooses the ECP, which means they can point to a permissive policy. |
Critical -- user defines what is enforced. | Integration: certain (by design). Release: not applicable (RPA controls the ECP). | The two-gate architecture is the mitigation. Integration testing uses user-controlled ECP by design. The release gate uses SRE-controlled ECP. |
| CA-6 | VSA-based validation skip: if an attacker can forge or inject a valid-looking VSA, the CLI will skip re-validation for that image. | High -- policy enforcement bypassed for the lifetime of the VSA. | Low -- VSAs require DSSE signature verification. The signing key must match. Expiration limits the window. | DSSE signing is mandatory for VSAs. Configurable expiration (default 7 days, production typically 24h). |
| ID | Threat | Impact | Likelihood | Existing Mitigation |
|---|---|---|---|---|
| NW-1 | MITM on registry traffic: attacker intercepts OCI registry connections to serve modified policy bundles, data sources, or attestations. | Critical -- attacker controls verification inputs. | Low -- all OCI registry traffic uses TLS. | isSecure() rejects plaintext HTTP sources. TLS certificate validation via Go's standard library. |
| NW-2 | Registry unavailability: OCI registry or sigstore infrastructure is unavailable, preventing validation from completing. | Medium -- build/release pipeline stalls. | Medium -- depends on registry/service uptime. | Retry with exponential backoff (via oras-go retry transport). Timeout configuration. |
| NW-3 | Unauthenticated network exposure in server mode: if the server binds to 0.0.0.0, the unauthenticated HTTP API is accessible from any network. An attacker on the same network could submit evaluation requests or probe policy configuration. |
Medium -- unauthorized policy evaluation, potential information disclosure of policy configuration. | Low -- default binding is 127.0.0.1. Documentation warns about production use without a reverse proxy. |
Default localhost binding. Server documentation recommends reverse proxy or network policy for production. |
| NW-4 | Custom OPA builtins bypass network sandbox: the ec.oci.* builtins make HTTP requests to OCI registries, intentionally bypassing OPA's network restrictions (AllowNet). A policy rule could use these to exfiltrate data. |
Low -- only affects what Rego rules can access, not the CLI's own verification logic. | Low -- standard policy rules are reviewed. Custom Rego requires explicit configuration. | By design: builtins need registry access. Standard OPA builtins (http.send, etc.) are sandboxed. |
| ID | Threat | Impact | Likelihood | Existing Mitigation |
|---|---|---|---|---|
| CR-1 | Signing key compromise: the cosign key pair used by Tekton Chains is compromised, allowing forged signatures on arbitrary attestations. | Critical -- all signature-based verification is meaningless. | Low -- keys are per-cluster, stored in platform-managed Secrets, and not accessible from tenant namespaces. | Per-cluster key pairs. Namespace isolation. Key rotation procedures. |
| CR-2 | VSA signing key compromise: the private key used to sign VSAs is compromised, allowing forged VSAs that skip validation. | High -- validation bypassed for forged VSAs until expiration. | Low -- key access restricted to the operator configuring VSA generation. | Key management is operator responsibility. VSA expiration limits blast radius. |
| CR-3 | Weak or misconfigured keyless verification: overly broad certificate identity regex or OIDC issuer patterns could accept signatures from unintended signers. | High -- signatures from unauthorized sources are accepted. | Low -- these parameters are typically set by the Tekton task from cluster configuration. | Certificate identity and OIDC issuer can be exact strings or regexps. Platform sets these from the cluster ConfigMap. |
| ID | Threat | Impact | Likelihood | Existing Mitigation |
|---|---|---|---|---|
| RT-1 | Denial of service via large input: server mode accepts up to 80MB request bodies. Concurrent large requests could exhaust memory or disk. | Medium -- server instance becomes unresponsive. | Medium -- no rate limiting or concurrent request limits. | 80MB body size limit. 90-second evaluation timeout. Temp files cleaned up after each request. |
| RT-2 | Stale policies in server mode: policies are loaded once at startup. Policy changes require a server restart. A long-running server may enforce outdated policies. | Medium -- new policy rules or data are not applied until restart. | Medium -- depends on operational procedures. | Documented behavior: "Restart the server to pick up policy changes." |
| RT-3 | Temp file leakage: server-mode input files and ec-work-* directories may contain sensitive data (attestation content, policy configuration). |
Low -- temp files are cleaned up after each request/evaluation. | Low -- files are created with default permissions, removed on completion. Setting EC_DEBUG env var preserves work directories for inspection. |
defer os.Remove(tmpPath) in handler. Config files written with 0444 (world-readable) permissions; see mitigation #10 for the recommendation to restrict to 0600. |
| RT-4 | Panic recovery exposes internal state: the recovery middleware catches panics and returns a generic error, but stack traces are logged. | Low -- stack traces go to server logs, not to the HTTP response. | Low -- panics are exceptional. | Recovery middleware returns generic "internal server error". Stack trace logged at error level (not returned to caller). |
| Threat | Rationale |
|---|---|
| Local privilege escalation | The CLI runs as an unprivileged process in a Tekton task pod. It does not have elevated privileges, setuid bits, or capability requirements. Container isolation provides the boundary. |
| Acceptance test mode exploitation | Test mode is not deployed in production. The instrumented binary is used only in development/CI environments. Attack surface does not extend to production. |
| OPA/Conftest engine vulnerabilities | OPA is a mature, widely-deployed policy engine with active security review. Bugs are possible but are upstream concerns, not specific to the CLI's threat model. The CLI tracks upstream releases via Renovate. |
| Operator misconfiguration | Operators who misconfigure the ECP (wrong key, permissive exclusions, etc.) introduce risk, but this is an operational concern, not a software vulnerability. The CLI faithfully enforces whatever policy it is given. |
| Physical access to build infrastructure | Out of scope. Assumes standard datacenter/cloud physical security. |
| Side-channel attacks on cryptographic operations | The CLI uses Go's standard crypto libraries and cosign. Side-channel resistance is an upstream concern. The CLI does not implement custom cryptography. |
| Concurrent evaluation race conditions | The worker pool model uses channels for communication. Workers operate on independent components with component-scoped caches. No shared mutable state between workers. |
-
Data source provenance: policy bundles can be pinned by digest, but data sources (e.g.,
oci::quay.io/conforma/policy-data:latest) are typically fetched by tag. Should data source integrity be verified independently (e.g., signature on data bundles)? -
--skip-*-sig-checkvisibility: when signature checks are skipped, this fact is not represented in the JSON output report. Should the report include a field indicating that signature verification was skipped, so downstream consumers (and release pipelines) can detect it? -
Server mode hardening: the server has no authentication, authorization, or rate limiting. If server mode is intended for production use, what hardening is expected to be provided by the deployment environment vs. built into the CLI?
-
VSA trust chain: VSAs are signed with a key provided by the operator. How is trust in the VSA signing key established? Is there a chain of trust back to the platform's signing infrastructure?
-
Custom OPA builtin parameter trust: the
ec.sigstore.verify_imageandec.sigstore.verify_attestationbuiltins accept sigstore configuration options from Rego rule data. The serialization path between CLI config structs and what builtins accept has known gaps (e.g.,rekor_public_keyparsed but not serialized). Are there other fields where this mismatch exists? -
EXTRA_RULE_DATAscope at release gate: the Tekton task exposesEXTRA_RULE_DATAas a parameter with an empty default. In release pipelines, is this parameter ever populated? If so, who controls its value? -
Effective time in release pipelines: the
EFFECTIVE_TIMEtask parameter defaults to"now". Can release pipeline configurations override this, and if so, through what mechanism? -
Data source deep merge completeness: the OPA deep merge recursively merges nested maps but overwrites non-map values at the same key path. Is the set of config struct fields serialized by the CLI complete enough that no security-relevant fields can be overwritten or injected via deep merge?
Initial draft produced on 2026-07-22 from the following sources:
- Codebase inspection: conforma/cli repository, including
cmd/validate/image.go,cmd/validate/input.go,internal/server/,internal/signature/,internal/downloader/,internal/rego/,internal/evaluator/,internal/policy/,internal/validate/vsa/,AGENTS.md,go.mod. - Jira stories: EC-2001 (ec-cli threat model scope and acceptance criteria), EC-2003 (ec-policies threat model, for cross-reference).
- Red team investigation materials: EC-1807 epic investigation instructions, which document the attacker profile, Konflux architecture, trust boundaries, and known findings from the EC-1840 red team assessment.
- Architecture knowledge: Konflux CI/CD platform architecture including the two-namespace security model, Tekton Chains attestation generation, Integration Service Snapshot creation, and Release Service gating.
- Design documents:
internal/evaluator/DESIGN.md(rule filtering),internal/validate/vsa/DESIGN.md(VSA design rationale).
Validated on 2026-08-05 against conforma/cli at commit a915bcfe. File paths,
package names, entry points, OPA builtin registrations, server mode
configuration, and dependency references were cross-referenced with the actual
codebase.
This document follows the wg-agentic-sdlc 8-section threat model schema as specified in EC-2001.
-
Report signature skip status: add a field to the JSON output report indicating whether image signature and/or attestation signature verification was skipped. This makes the skip visible to downstream consumers, enabling detection and rejection of reports where verification was skipped. (Addresses CA-3, open question 2.)
-
Data source integrity verification: support digest-pinning or signature verification for data source OCI bundles, not just policy bundles. Data sources directly control what policy rules enforce (trusted tasks, allowed registries, thresholds). (Addresses SC-2, open question 1.)
-
Audit serialization gaps in OPA builtins: systematically compare the fields parsed by
parseCheckOptsin the sigstore builtins against the fields serialized bySigstoreOpts. Any field that is parsed but not serialized represents an injection vector via data source deep merge. (Addresses open question 5.) -
Pin data sources by digest in release ECPs: operational recommendation for Konflux release engineering. Data sources in release-gate ECPs should reference OCI bundles by digest, not by mutable tags like
:latest. (Addresses SC-2.)
-
Server mode authentication: if server mode is intended for production deployments beyond localhost, add support for authentication (e.g., mTLS, bearer token) or clearly document that a reverse proxy with authentication is required. (Addresses NW-3, RT-1, open question 3.)
-
Rate limiting in server mode: add configurable rate limiting and concurrent request limits to prevent resource exhaustion from large or frequent requests. (Addresses RT-1.)
-
EXTRA_RULE_DATAauditing: log or report what extra rule data was injected, so that release pipeline audits can detect unexpected data manipulation. (Addresses CA-4, open question 6.) -
Effective time constraints: consider restricting
--effective-timeto values within a bounded window (e.g., +/- 24 hours from now) at the release gate, or logging when a non-"now"value is used. (Addresses CA-2.)
-
Server mode policy reload: add a mechanism to reload policies without restarting the server (e.g., SIGHUP handler, reload endpoint), so that long-running servers can pick up policy changes. (Addresses RT-2.)
-
Temp file permissions: ensure server-mode temp files are created with restrictive permissions (0600) rather than relying on umask. (Addresses RT-3.)
-
Document custom builtin network access: clearly document that
ec.oci.*builtins bypass OPA'sAllowNetrestrictions by design, so that policy authors understand the security implications when writing custom rules. (Addresses NW-4.)