Most recent
navigate open esc close Corpus index built 2026-06-07 23:58 UTC

← All reference

Reference

29. Workflow Orchestration (K8s-Native)

Source: https://github.com/nuclide-research/AI-LLM-Infrastructure-OSINT/blob/main/shodan/queries/29-workflow-orchestration

NuClide Research · 2026-05-27 Pre-assessment OSINT complete. Survey: IN PROGRESS.

K8s-native workflow orchestration platforms expose REST APIs and UI dashboards that carry full pipeline state, resolved parameters (including credentials), artifact access, and in misconfigured deployments, unauthenticated container execution.


Argo Workflows

Auth posture: Tier A* — --auth-mode=server disables all credential requirements. The official quickstart manifest explicitly ships both --auth-mode=server and --auth-mode=client (hybrid), preserving unauthenticated access on the development path. Binary default (v3.0+) is client (safe), but the quickstart path is the dominant exposure vector.

Confirmed population: ~3,000 unauth instances (E.V.A Security, November 2024 internet scan via /api/v1/userinfo probe).

Source: gatekeeper.go explicitly appends empty string to authorizations when no header is present — server mode always matches, regardless of input. The bypass is by design for the server auth mode.

Shodan QueryNotesFP Risk
port:2746 http.title:"Argo"Canonical port (Argo-exclusive) + correct page title. Primary dork.Low
http.html:"assets/favicon/favicon-32x32.png" "noindex"Distinctive HTML body strings. Catches reverse-proxied instances (no port lock).Low
ssl.cert.issuer.cn:"Argo Workflows"Default self-signed cert issuer. Confirmed Shodan-indexable.Low
"gitTag" "gitTreeState" "compiler" "platform"Unique field combination from /api/v1/version JSON response.Low
port:2746 "argoproj"JS bundle string + port lock. Secondary.Low
port:2746 http.title:"Argo Workflows"WRONG — hits docs/readthedocs sites, not live servers. Live page title is "Argo". Do not use.High

⚠️ Nuclei template argo-workflows-unauth.yaml has incorrect shodan-query: title:"Argo Workflows" in metadata. The correct live-server title is "Argo".

Verification Probe

Single request, definitive — no false-positive risk:

# Unauth detection — server mode confirmed if serviceAccountName is non-empty
curl -sk https://TARGET:2746/api/v1/userinfo | jq .

# Response: server mode (UNAUTH)
{"serviceAccountName":"argo-server","serviceAccountNamespace":"argo","subject":"system:serviceaccount:argo:argo-server","issuer":"kubernetes/serviceaccount"}

# Response: auth enforced
{}

Fingerprint (aimap — not yet implemented as of 2026-05-27)

Port:     2746
Probe:    GET /api/v1/version
Match:    status=200 AND body_contains("gitTag") AND body_contains("gitTreeState") AND body_contains("compiler")
Auth:     GET /api/v1/userinfo → json_field serviceAccountName non-empty
DeepEnum: namespace sweep (argo, kubeflow, ml-pipeline, training, data-science, mlflow)
          CVE-2026-28229 probe (Authorization: Bearer nothing → /api/v1/workflow-templates/{ns})
          version extraction → CVE window classification

High-Value Endpoints (Unauth Instances)

EndpointSeverityData
POST /api/v1/workflows/{namespace}CRITICALArbitrary container execution — cryptominer entry point (Intezer 2021)
POST .../pods/{pod}/execCRITICALUnauthenticated exec into running pods; argo-server SA has pods/exec cluster-wide
GET /api/v1/workflows/{namespace}HIGHFull spec + status.nodes resolved values; credentials passed as params appear in plaintext
GET .../logHIGHContainer stdout/stderr including credentials printed by pipeline steps
/artifacts/ all endpointsHIGHFull artifact download (model weights, datasets, pipeline outputs) via server’s S3/GCS credentials
GET /api/v1/workflow-templates/{namespace}HIGHTemplate definitions; CVE-2026-28229: Authorization: Bearer nothing exfils embedded K8s secrets
GET /api/v1/userinfoLOWConfirms unauth; leaks SA identity
GET /metricsLOWWorkflow counts, version, queue depths; argo_workflows_info label contains version string

CVE Coverage

CVEImpactThreshold
GHSA-rc7p-gmvh-xfx2 (no CVE)Server-mode unauth → arbitrary container execAll versions with --auth-mode=server
CVE-2026-28229 / GHSA-56px-hm34-xqj5Authorization: Bearer nothing exfils ALL WorkflowTemplates incl. embedded secrets< 3.7.11 / < 4.0.2
CVE-2024-53862 / GHSA-h36c-m3rf-34h9Fake token retrieves all archived workflows< 3.6.2 / 3.5.13
CVE-2025-62156 / CVE-2025-66626ZipSlip RCE chain in artifact extraction; symlink bypass of patched fix< 3.6.14 / 3.7.5
CVE-2026-31892 / GHSA-3wf5-g532-rcrrpodSpecPatch bypasses Strict/Secure template reference mode → privileged container< 3.7.11 / 4.0.2
GHSA-jcc8-g2q4-9fxqUnauthenticated webhook OOM DoS via /api/v1/events/ — pre-auth, pre-sig-verify body load< 3.7.14 / 4.0.5

Version available from /api/v1/version → map every confirmed host to its CVE exposure window.

Namespace Targets on Confirmed Hosts

Query these namespaces in priority order: argo, kubeflow, ml-pipeline, training, data-science, mlflow, production, staging, minio

kubeflow and ml-pipeline namespaces carry the highest credential density (KFP v1 compiles directly to Argo; training jobs pass S3/GCS keys, MLflow tokens, and dataset paths as workflow parameters).

Shadow Sweep Ports (Every Confirmed Host)

PortServicePriorityNotes
2379etcdHIGHESTOpen etcd → /registry/secrets/ → SA tokens for every namespace → cluster takeover
9090PrometheusHIGH/api/v1/status/config leaks full scrape_configs + internal service topology
9100node_exporterHIGH/metrics — OS/HW/kernel info; typically world-reachable
6379RedisHIGHArgo uses Redis for DAG state offload; no-auth default common in Helm installs
9000/9001MinIOHIGHArtifact repository; prior survey baseline
10250kubeletHIGHRare; unauth kubelet = cluster-wide RCE
8080Argo CDMEDCo-deployed on same cluster; auth-on-default but same operator
3000GrafanaMEDkube-prometheus-stack companion
2375Docker daemonMEDPresent on bare-metal or DinD setups
9901Envoy adminMED/config_dump leaks full mesh topology on service-mesh clusters

Chain: Argo unauth → etcd open → /registry/secrets/argo/argo-server-token → K8s API authenticated as cluster-scoped SA → cluster-wide control. Etcd co-location upgrades Argo from data-exposure class to cluster-takeover class.

Cert-Pivot Notes (VisorGraph)

Three cert classes in production:

  1. CN=localhost self-signed — no pivot value; identifies unmanaged default-config install
  2. CN=Kubernetes Ingress Controller Fake Certificate — cluster-level pivot; same cert on all ingress-exposed services; SAN sweep finds Argo CD, Grafana, Prometheus on same cluster
  3. Operator-configured domain cert — high-value VisorGraph anchor; CN/SAN reveals org identity, internal DNS, may expose other services on wildcard

VisorGraph anchors: ssl.cert.issuer.cn:"Argo Workflows" (class 1), ingress fake cert fingerprint (class 2), operator domain from CN (class 3).

ML Operator Profile

Dominant user orgs: Intuit (creator/4,000+ engineers), BlackRock, TripAdvisor, Adobe, Cisco, NVIDIA, Tesla (CNCF end-user data). Production use grew 115% YoY (2022). Confirmed hosts are running real ML training pipelines, not sandboxes.

Credential patterns on exposed instances:

  • AWS accessKey/secretKey in artifact repository config or hardcoded in workflow parameters
  • GCS service account JSON key via serviceAccountKeySecret
  • MLflow tracking tokens (MLFLOW_TRACKING_TOKEN env var)
  • Database connection strings (feature store, metadata DB)
  • Private container registry pull secrets
  • Internal service DNS (mlflow.mlflow.svc.cluster.local, postgres.data.svc.cluster.local)

Reference


Temporal (Workflow Orchestration — not yet surveyed)

Port 7233 (gRPC), 8080 (web UI). GET /api/v1/cluster-info. Tier A*. Workflow history exposure. Survey pending.

Kubeflow / KServe (not yet surveyed)

K8s ingress profile — separate from cheap-VPS surface. /v1/models OpenAPI. Exposure dependent on ingress auth config. Survey pending.

Query Log

DateQueryHitsNotes
2026-05-31port:2746 http.title:"Argo"0Port 2746 Shodan-dark — self-signed TLS, “no data returned” on body
2026-05-31ssl.cert.issuer.cn:"Argo Workflows"0Default self-signed cert not indexed
2026-05-31"gitTag" "gitTreeState" "compiler" "platform"0API JSON not indexed (TLS body dark)
2026-05-31port:2746 "argoproj"0Same — port 2746 body dark
2026-05-31port:2746355”No data returned” on nearly all — confirms port dark
2026-05-31http.html:"assets/favicon/favicon-32x32.png" "noindex"154HIGH FP — not Argo-specific; first result is nginx HR portal
2026-05-31ssl:"Argo Workflows"221WORKING DORK — catches operator subdomain certs (argo-workflows.*); 119 unique IPs after dedup; US 199, JP 8, DE 6