Files
hacktricks-cloud/src/pentesting-ci-cd/argocd-security.md
T

16 KiB
Raw Blame History

Argo CD Security

{{#include ../banners/hacktricks-training.md}}

Βασικές Πληροφορίες

Argo CD είναι μια GitOps πλατφόρμα continuous delivery για Kubernetes. Παρακολουθεί Git repositories, αποδίδει Kubernetes manifests με εργαλεία όπως Helm, Kustomize, Jsonnet ή config management plugins, και συγχρονίζει το live cluster state με το desired state που είναι αποθηκευμένο στο Git.

Από την οπτική του attacker, αντιμετώπισε το Argo CD ως μια deployment engine με Kubernetes credentials. Ένας χρήσιμος compromise του Argo CD μπορεί να οδηγήσει σε:

  • Πρόσβαση σε private Git repositories και repository credentials.
  • Πρόσβαση σε Kubernetes cluster secrets που χρησιμοποιούνται από το Argo CD.
  • Manifest generation code execution στο argocd-repo-server.
  • Μη εξουσιοδοτημένο Kubernetes object deployment μέσω trusted Git repositories, Argo CD applications, ή cache manipulation.

Αρχιτεκτονική & Ενδιαφέροντα Components

Συνηθισμένα Kubernetes objects και services:

kubectl get pods,svc,endpoints,ingress -A | grep -iE 'argocd|argo-cd'
kubectl get applications,appprojects,applicationsets -A 2>/dev/null
kubectl get secrets,configmaps -n argocd 2>/dev/null
kubectl get networkpolicy -n argocd 2>/dev/null

Ενδιαφέροντες services:

  • argocd-server: public API, web UI, CLI API, authentication and authorization.
  • argocd-application-controller: συγκρίνει το desired και το live state, και μετά εφαρμόζει resources στο Kubernetes.
  • argocd-repo-server: κάνει clone repositories, αποθηκεύει Git data στην cache, και τρέχει Helm/Kustomize/Jsonnet/plugins για να δημιουργήσει manifests. Το default gRPC port είναι 8081.
  • argocd-redis: cache για application, manifest και Git reference data. Το default Redis port είναι 6379.
  • argocd-applicationset-controller: δημιουργεί Argo CD Application objects από generators όπως Git, SCM, clusters και pull requests.

Από ένα compromised pod ή internal network segment, έλεγξε το internal reachability:

nc -vz <argocd-server> 443
nc -vz <argocd-repo-server> 8081
nc -vz <argocd-redis> 6379

Public API / UI Attacks

Αν έχετε Argo CD credentials ή ένα exposed instance, ξεκινήστε με το κανονικό API surface:

argocd login <argocd-server>
argocd account get-user-info
argocd account list
argocd proj list
argocd app list
argocd repo list
argocd cluster list
argocd admin settings rbac can <subject> <action> <resource> <object>

Χρήσιμες διαδρομές επίθεσης:

  • Application write access: τροποποίησε source.repoURL, source.path, Helm values, Kustomize options, plugin settings ή sync options ώστε το Argo CD να κάνει deploy attacker-controlled manifests.
  • Project misconfiguration: τα AppProject objects μπορούν να επιτρέπουν ευρείς sourceRepos, ευρείς destinations, μη ασφαλή clusterResourceWhitelist, ή αδύναμους περιορισμούς namespace.
  • Repository credential abuse: repository secrets, GitHub App credentials, SSH keys και tokens μπορούν να επιτρέψουν push σε trusted repos ή την προσθήκη malicious dependencies.
  • Cluster credential abuse: cluster secrets μπορεί να περιέχουν bearer tokens ή exec-provider configuration που χρησιμοποιούνται από το Argo CD για deploy στα target clusters.
  • Local admin / project tokens: μακράς διάρκειας Argo CD tokens μπορούν να επαναχρησιμοποιηθούν μέσω του API, εκτός αν ανακληθούν ή λήξουν.

Απαρίθμησε τη διαμόρφωση από Kubernetes όταν έχεις cluster read access:

kubectl get applications.argoproj.io -A -o yaml
kubectl get appprojects.argoproj.io -A -o yaml
kubectl get applicationsets.argoproj.io -A -o yaml
kubectl get secrets -n argocd -o yaml | grep -nE 'repoURL|sshPrivateKey|password|bearerToken|githubApp|tlsClientCertData|tlsClientCertKey'
kubectl get cm -n argocd argocd-cm argocd-rbac-cm argocd-cmd-params-cm -o yaml

Κατάχρηση Αξιόπιστου Git Repository

Αν μπορείς να κάνεις push σε ένα repository που εμπιστεύεται το Argo CD, συνήθως μπορείς να επηρεάσεις τι γίνεται deployed. Ο αντίκτυπος εξαρτάται από τα όρια του AppProject και τα permissions του service account που χρησιμοποιεί ο application controller.

Συνηθισμένες θέσεις για payload:

  • Raw Kubernetes YAML κάτω από application path.
  • Helm chart templates και values.yaml.
  • Kustomize overlays, remote bases και generators.
  • Jsonnet ή input του config management plugin.
  • ApplicationSet generator files που δημιουργούν ή ενημερώνουν Application objects.

Έλεγξε αν το app χρησιμοποιεί automated sync, pruning, self-heal, sync windows ή manual approvals:

kubectl get applications.argoproj.io -A \
-o custom-columns='NS:.metadata.namespace,APP:.metadata.name,PROJECT:.spec.project,AUTOSYNC:.spec.syncPolicy.automated,REPO:.spec.source.repoURL,PATH:.spec.source.path,DEST:.spec.destination.server'

Άμεση κατάχρηση του argocd-repo-server

Μην υποθέτετε ότι το δημόσιο Argo CD API είναι η μόνη επιφάνεια επίθεσης. Τα εσωτερικά components του Argo CD επικοινωνούν με το argocd-repo-server μέσω gRPC. Αν arbitrary pods μπορούν να φτάσουν το repo-server, τα ελεγχόμενα από τον attacker εσωτερικά requests μπορεί να παρακάμψουν ελέγχους που κανονικά επιβάλλονται από το argocd-server.

Practical checks:

kubectl get svc -n argocd argocd-repo-server -o yaml
kubectl get endpoints -n argocd argocd-repo-server -o wide
nc -vz <argocd-repo-server> 8081

Ενδιαφέροντα σημάδια:

  • Το repo-server gRPC endpoint είναι προσβάσιμο από μη-Argo CD pods.
  • Τα NetworkPolicies λείπουν ή επιτρέπουν μόνο allow-list egress χωρίς να αρνούνται ingress.
  • Το repo-server έχει πρόσβαση σε custom config management plugins, decryption tools, ή repository content από πολλαπλούς tenants.
  • Το Redis είναι προσβάσιμο από μη-Argo CD pods, επιτρέποντας cache inspection ή tampering αν τα credentials είναι διαθέσιμα ή δεν απαιτούνται.

Unauthenticated Repo-Server RCE via Kustomize Options

Τον Ιούλιο του 2026, η Synacktiv δημοσίευσε μια unauthenticated chain εκτέλεσης κώδικα στο repo-server του Argo CD, όταν ένας attacker μπορεί να φτάσει την internal gRPC service. Η attack εκμεταλλεύεται direct access στο /repository.RepoServerService/GenerateManifest και attacker-controlled KustomizeOptions.

Το επικίνδυνο primitive είναι να εξαναγκαστεί το repo-server να κάνει clone attacker-controlled repository content και να τρέξει Kustomize με υποστήριξη Helm:

kustomize build <attacker_repo_path> --enable-helm --helm-command ./payload.sh

Ελάχιστο malicious Kustomize input χρειάζεται για να ενεργοποιηθεί η επεξεργασία Helm:

helmCharts:
- name: pwn
version: 0.0.1

Γιατί αυτό λειτουργεί:

  • Το argocd-repo-server κλωνοποιεί το repository πριν από το rendering.
  • Το --helm-command ./payload.sh επιλύεται relative προς το κλωνοποιημένο repository.
  • Το code execution δεν απαιτεί shell metacharacter injection αν ο attacker μπορεί να ελέγξει το rendered repository και τα Kustomize build options.

Τη στιγμή της δημοσιοποίησης της Synacktiv στις 1 Ιουλίου 2026, ανέφεραν ότι το issue δεν είχε επίσημο fix ή CVE. Αντιμετώπισέ το πρώτα ως network-exposure issue: το exploitation απαιτεί reachability προς το εσωτερικό repo-server gRPC port.

Redis Cache Poisoning to Deploy Manifests

Μετά από code execution στο argocd-repo-server, ή μετά από direct access στο Redis με valid credentials, εξέτασε τα Redis-backed cache entries. Το Argo CD συνήθως αποθηκεύει gzip-compressed JSON values.

Interesting key prefixes:

mfst|...       # cached rendered manifests
git-refs|...   # Git branch/ref to commit mappings
app|...        # application resource/cache data
cluster|...    # cluster cache information

Η επίθεση cache poisoning που περιγράφει η Synacktiv εκμεταλλεύεται δύο κομμάτια state:

  1. Τροποποίησε το σχετικό mfst|... manifest cache entry ώστε να περιλαμβάνει ένα Kubernetes manifest που ελέγχει ο attacker.
  2. Τροποποίησε το σχετικό git-refs|... mapping ώστε το Argo CD να πιστεύει ότι το branch μετακινήθηκε και μετά να reconciles back to το cached revision.

Επίπτωση:

  • Με ενεργοποιημένο Auto Sync, το Argo CD μπορεί να εφαρμόσει αυτόματα το poisoned cached manifest.
  • Χωρίς Auto Sync, το payload μπορεί να εφαρμοστεί ακόμα και όταν ένας user κάνει manual sync την application.
  • Η τελική επίπτωση περιορίζεται από το destination της target application και τα Kubernetes permissions που είναι διαθέσιμα στο Argo CD.

ApplicationSet Attacks

Το ApplicationSet είναι ιδιαίτερα ευαίσθητο επειδή δημιουργεί ή ενημερώνει Application objects από το generator output.

Review:

kubectl get applicationsets.argoproj.io -A -o yaml
kubectl get appprojects.argoproj.io -A -o yaml

Ενδιαφέροντα patterns:

  • Git generators που διαβάζουν attacker-writable αρχεία που ελέγχουν app names, paths, projects ή destinations.
  • Pull request generators για δημόσια repositories όπου untrusted contributors μπορούν να επηρεάσουν τα generated applications.
  • Template fields που επιτρέπουν broad destination clusters/namespaces.
  • AppProjects που επιτρέπουν sourceRepos: ["*"] ή broad destinations.
  • Generated applications που κληρονομούν automated sync και pruning.

Post-Exploitation

Από ένα Argo CD pod shell, δώσε προτεραιότητα στα εξής:

env
cat /proc/1/environ 2>/dev/null | tr '\0' '\n'
find /var/run/secrets /app/config -type f -maxdepth 4 2>/dev/null
mount | grep -E 'secret|token|config'

Χρήσιμοι στόχοι:

  • Κλέψε REDIS_PASSWORD ή Redis TLS/client υλικό.
  • Εξήγαγε repository credentials από mounted secrets ή Argo CD Kubernetes secrets.
  • Εντόπισε cluster credentials που χρησιμοποιούνται από το Argo CD.
  • Διάβασε generated manifests και plugin output που μπορεί να περιέχουν injected secrets.
  • Έλεγξε αν custom plugins, SOPS, Helm secrets, Vault plugins ή cloud CLIs εκθέτουν decryption keys και cloud credentials.

Detection & Hardening

Σημαντικοί έλεγχοι:

  • Περιορίστε το argocd-repo-server port 8081 και το Redis port 6379 με NetworkPolicies ώστε μόνο τα αναμενόμενα Argo CD components να μπορούν να τα προσεγγίσουν.
  • Σε Helm deployments, επαληθεύστε ότι τα network policies δημιουργούνται όντως. Τα Argo CD Helm chart values ιστορικά είχαν προεπιλογή το component network policy creation σε disabled.
  • Κρατήστε το argocd-server ως το authenticated entry point. Εσωτερικές υπηρεσίες δεν πρέπει να είναι reachable από arbitrary workloads.
  • Απενεργοποιήστε αχρησιμοποίητα config management tools και plugins.
  • Περιορίστε τα AppProject sourceRepos, destinations, namespace permissions και cluster-scoped resources.
  • Αποφύγετε την αποθήκευση broad repository credentials όπου ένας low-privileged Argo CD user μπορεί να προκαλέσει επαναχρησιμοποίησή τους.
  • Παρακολουθείτε repo-server requests, Kustomize build options, plugin executions, Redis writes και απροσδόκητη πρόσβαση σε mfst| / git-refs| keys.
  • Περιστρέψτε Argo CD local users, project tokens, repository credentials και cluster credentials μετά από compromise.

Χρήσιμες εντολές:

kubectl get networkpolicy -n argocd
kubectl get networkpolicy -A | grep -i argocd
kubectl describe networkpolicy -n argocd argocd-repo-server-network-policy 2>/dev/null
kubectl describe networkpolicy -n argocd argocd-redis-network-policy 2>/dev/null

Σημείωση Static Analysis: Typed API Requests in CodeQL

Για Go services που χρησιμοποιούν gRPC/REST handlers, τα default CodeQL remote sources μπορεί να χάσουν flows μόλις το raw input έχει unmarshaled σε typed request objects. Ένα χρήσιμο model για Argo CD-style services είναι:

  • Receiver type όπως Server ή Service.
  • Πρώτο parameter είναι context.Context.
  • Δεύτερο parameter είναι ένα typed request object.

Μοντελοποίησε αυτό το δεύτερο parameter ως remote source και πρόσθεσε custom sinks για τα exec.Command / exec.CommandContext arguments. Αυτό βοηθά να βρεθούν flows από internal API request fields προς command execution helpers.

References