16 KiB
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 CDApplicationobjects από 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: τα
AppProjectobjects μπορούν να επιτρέπουν ευρείς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 που δημιουργούν ή ενημερώνουν
Applicationobjects.
Έλεγξε αν το 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:
- Τροποποίησε το σχετικό
mfst|...manifest cache entry ώστε να περιλαμβάνει ένα Kubernetes manifest που ελέγχει ο attacker. - Τροποποίησε το σχετικό
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: ["*"]ή broaddestinations. - 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-serverport 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.
- Περιορίστε τα
AppProjectsourceRepos,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
- Synacktiv - Caught in the Octopus Trap: Unauthenticated RCE in Argo CD with CodeQL
- Argo CD docs - Security considerations
- Argo CD docs - High Availability
- Argo CD docs - repo-server command reference
- Argo CD - repo-server NetworkPolicy manifest
- Argo CD docs - metrics
- Argo Helm - chart values reference
- Kustomize - Helm chart generator example