# Ασφάλεια του Argo CD {{#include ../banners/hacktricks-training.md}} ## Βασικές πληροφορίες Το [Argo CD](https://argo-cd.readthedocs.io/) είναι μια πλατφόρμα continuous delivery GitOps για Kubernetes. Παρακολουθεί Git repositories, δημιουργεί Kubernetes manifests με εργαλεία όπως τα Helm, Kustomize, Jsonnet ή config management plugins και συγχρονίζει την κατάσταση του ενεργού cluster με την επιθυμητή κατάσταση που είναι αποθηκευμένη στο Git. Από την οπτική γωνία ενός attacker, αντιμετωπίστε το Argo CD ως **deployment engine με Kubernetes credentials**. Ένα χρήσιμο compromise του Argo CD μπορεί να οδηγήσει σε: - Πρόσβαση σε private Git repositories και repository credentials. - Πρόσβαση σε Kubernetes cluster secrets που χρησιμοποιούνται από το Argo CD. - Εκτέλεση κώδικα κατά τη δημιουργία manifests στο `argocd-repo-server`. - Μη εξουσιοδοτημένο deployment Kubernetes objects μέσω trusted Git repositories, Argo CD applications ή χειραγώγησης του cache. ## Αρχιτεκτονική και ενδιαφέροντα components Συνηθισμένα Kubernetes objects και services: ```bash 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 ``` Ενδιαφέρουσες υπηρεσίες: - **`argocd-server`**: public API, web UI, CLI API, authentication και authorization. - **`argocd-application-controller`**: συγκρίνει την επιθυμητή και την τρέχουσα κατάσταση και, στη συνέχεια, εφαρμόζει resources στο Kubernetes. - **`argocd-repo-server`**: κάνει clone repositories, αποθηκεύει Git data σε cache και εκτελεί Helm/Kustomize/Jsonnet/plugins για τη δημιουργία manifests. Το προεπιλεγμένο gRPC port είναι το **8081**. - **`argocd-redis`**: cache για application, manifest και Git reference data. Το προεπιλεγμένο Redis port είναι το **6379**. - **`argocd-applicationset-controller`**: δημιουργεί Argo CD `Application` objects από generators όπως Git, SCM, clusters και pull requests. Από ένα compromised pod ή ένα internal network segment, ελέγξτε την internal reachability: ```bash nc -vz 443 nc -vz 8081 nc -vz 6379 ``` ## Επιθέσεις στο Public API / UI Αν διαθέτεις credentials του Argo CD ή ένα εκτεθειμένο instance, ξεκίνα από τη συνηθισμένη επιφάνεια API: ```bash argocd login 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 ``` Χρήσιμες διαδρομές επίθεσης: - **Application write access**: τροποποιήστε τα `source.repoURL`, `source.path`, τις τιμές Helm, τις επιλογές Kustomize, τις ρυθμίσεις plugin ή τις επιλογές συγχρονισμού, ώστε το Argo CD να κάνει deploy manifests που ελέγχει ο attacker. - **Project misconfiguration**: τα αντικείμενα `AppProject` μπορεί να επιτρέπουν ευρέα `sourceRepos`, ευρείς `destinations`, μη ασφαλές `clusterResourceWhitelist` ή ανεπαρκείς περιορισμούς namespace. - **Repository credential abuse**: τα repository secrets, τα διαπιστευτήρια GitHub App, τα SSH keys και τα tokens μπορεί να επιτρέπουν push σε trusted repos ή την προσθήκη κακόβουλων dependencies. - **Cluster credential abuse**: τα cluster secrets μπορεί να περιέχουν bearer tokens ή ρυθμίσεις exec-provider που χρησιμοποιούνται από το Argo CD για deploy στα target clusters. - **Local admin / project tokens**: τα Argo CD tokens μεγάλης διάρκειας μπορούν να επαναχρησιμοποιηθούν μέσω του API, εκτός αν ανακληθούν ή λήξουν. Enumerate τη configuration από το Kubernetes όταν έχετε cluster read access: ```bash 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` και τα δικαιώματα του service account που χρησιμοποιεί ο application controller. Συνηθισμένες τοποθεσίες για payloads: - Ακατέργαστο Kubernetes YAML κάτω από ένα application path. - Πρότυπα Helm chart και `values.yaml`. - Kustomize overlays, remote bases και generators. - Είσοδος Jsonnet ή config management plugin. - Αρχεία generator του ApplicationSet που δημιουργούν ή ενημερώνουν αντικείμενα `Application`. Ελέγξτε αν η εφαρμογή χρησιμοποιεί automated sync, pruning, self-heal, sync windows ή manual approvals: ```bash 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` Μην υποθέτετε ότι το public Argo CD API είναι η μοναδική επιφάνεια επίθεσης. Τα εσωτερικά components του Argo CD επικοινωνούν με το `argocd-repo-server` μέσω gRPC. Αν αυθαίρετα pods μπορούν να συνδεθούν στο repo-server, requests που ελέγχονται από τον attacker και προέρχονται από το εσωτερικό μπορούν να παρακάμψουν τους ελέγχους που εφαρμόζονται κανονικά από το `argocd-server`. Πρακτικοί έλεγχοι: ```bash kubectl get svc -n argocd argocd-repo-server -o yaml kubectl get endpoints -n argocd argocd-repo-server -o wide nc -vz 8081 ``` Ενδιαφέρουσες ενδείξεις: - Το gRPC endpoint του repo-server είναι προσβάσιμο από pods εκτός Argo CD. - Τα NetworkPolicies απουσιάζουν ή επιτρέπουν μόνο allow-list για το egress χωρίς να αρνούνται το ingress. - Το repo-server έχει πρόσβαση σε custom config management plugins, εργαλεία decryption ή περιεχόμενο repositories από πολλαπλούς tenants. - Το Redis είναι προσβάσιμο από pods εκτός Argo CD, επιτρέποντας την επιθεώρηση ή την παραποίηση της cache, εάν τα credentials είναι διαθέσιμα ή δεν απαιτούνται. ## Unauthenticated Repo-Server RCE μέσω Kustomize Options Τον Ιούλιο του 2026, η Synacktiv αποκάλυψε μια αλυσίδα εκτέλεσης κώδικα χωρίς authentication στο `repo-server` του Argo CD, όταν ένας attacker μπορεί να έχει πρόσβαση στην εσωτερική gRPC service. Η επίθεση καταχράται την άμεση πρόσβαση στο `/repository.RepoServerService/GenerateManifest` και σε attacker-controlled `KustomizeOptions`. Το επικίνδυνο primitive είναι η εξαναγκασμένη κλωνοποίηση περιεχομένου repository που ελέγχεται από τον attacker από το repo-server και η εκτέλεση του Kustomize με υποστήριξη Helm: ```bash kustomize build --enable-helm --helm-command ./payload.sh ``` Ελάχιστη κακόβουλη είσοδος Kustomize που απαιτείται για την ενεργοποίηση της επεξεργασίας Helm: ```yaml helmCharts: - name: pwn version: 0.0.1 ``` Γιατί αυτό λειτουργεί: - Το `argocd-repo-server` κάνει clone το repository πριν από το rendering. - Το `--helm-command ./payload.sh` επιλύεται σε σχέση με το cloned repository. - Η εκτέλεση κώδικα δεν απαιτεί injection shell metacharacters, εάν ο attacker μπορεί να ελέγξει το rendered repository και τις επιλογές build του Kustomize. Κατά τη disclosure της Synacktiv την 1η Ιουλίου 2026, αναφέρθηκε ότι το issue δεν είχε official fix ή CVE. Αντιμετωπίστε το πρώτα ως ζήτημα network exposure: η exploitation απαιτεί reachability στη θύρα gRPC του εσωτερικού repo-server. ## Redis Cache Poisoning για την ανάπτυξη Manifests Μετά την εκτέλεση κώδικα στο `argocd-repo-server` ή μετά από άμεση πρόσβαση στο Redis με valid credentials, ελέγξτε τα Redis-backed cache entries. Το Argo CD αποθηκεύει συνήθως gzip-compressed JSON values. Ενδιαφέροντα key prefixes: ```text 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. Τροποποιεί τη σχετική καταχώριση cache manifest `mfst|...` ώστε να περιλαμβάνει ένα Kubernetes manifest ελεγχόμενο από τον attacker. 2. Τροποποιεί τη σχετική αντιστοίχιση `git-refs|...`, ώστε το Argo CD να πιστεύει ότι το branch μετακινήθηκε και στη συνέχεια να εκτελεί reconcile στην cached revision. Impact: - Με ενεργοποιημένο το Auto Sync, το Argo CD ενδέχεται να εφαρμόσει αυτόματα το poisoned cached manifest. - Χωρίς Auto Sync, το payload μπορεί και πάλι να εφαρμοστεί όταν ένας χρήστης κάνει manual sync στην application. - Το τελικό impact περιορίζεται από το destination της target application και τα Kubernetes permissions που είναι διαθέσιμα στο Argo CD. ## ApplicationSet Attacks Το ApplicationSet είναι ιδιαίτερα ευαίσθητο, επειδή δημιουργεί ή ενημερώνει αντικείμενα `Application` από το generator output. Review: ```bash kubectl get applicationsets.argoproj.io -A -o yaml kubectl get appprojects.argoproj.io -A -o yaml ``` Ενδιαφέροντα patterns: - Git generators που διαβάζουν αρχεία εγγράψιμα από attacker και ελέγχουν app names, paths, projects ή destinations. - Pull request generators για public 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, δώστε προτεραιότητα στα εξής: ```bash 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. - Εξαγάγετε credentials repository από 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 Σημαντικοί έλεγχοι: - Περιορίστε τη θύρα **8081** του `argocd-repo-server` και τη θύρα **6379** του Redis με NetworkPolicies, ώστε να μπορούν να έχουν πρόσβαση μόνο τα αναμενόμενα Argo CD components. - Σε Helm deployments, επαληθεύστε ότι οι network policies δημιουργούνται πράγματι. Οι τιμές του Argo CD Helm chart έχουν ιστορικά ορίσει τη δημιουργία network policy των components ως disabled. - Διατηρήστε το `argocd-server` ως το authenticated entry point. Οι internal services δεν πρέπει να είναι προσβάσιμες από αυθαίρετα 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 και την απρόσμενη πρόσβαση σε keys `mfst|` / `git-refs|`. - Κάντε rotate τα Argo CD local users, τα project tokens, τα repository credentials και τα cluster credentials μετά από compromise. Χρήσιμες εντολές: ```bash 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 στο CodeQL Για Go services που χρησιμοποιούν gRPC/REST handlers, τα προεπιλεγμένα CodeQL remote sources ενδέχεται να παραλείπουν flows αφού το raw input έχει γίνει unmarshaled σε typed request objects. Ένα χρήσιμο model για services τύπου Argo CD είναι: - Receiver type όπως `Server` ή `Service`. - Η πρώτη παράμετρος είναι `context.Context`. - Η δεύτερη παράμετρος είναι ένα typed request object. Model αυτή τη δεύτερη παράμετρο ως remote source και πρόσθεσε custom sinks για arguments των `exec.Command` / `exec.CommandContext`. Αυτό βοηθά στον εντοπισμό flows από internal API request fields προς command execution helpers. ## References - [Synacktiv - Εντοπίστηκε στο Octopus Trap: Unauthenticated RCE στο Argo CD με CodeQL](https://www.synacktiv.com/en/publications/caught-in-the-octopus-trap-unauthenticated-rce-in-argo-cd-with-codeql) - [Argo CD docs - Security considerations](https://argo-cd.readthedocs.io/en/stable/operator-manual/security/) - [Argo CD docs - High Availability](https://argo-cd.readthedocs.io/en/stable/operator-manual/high_availability/) - [Argo CD docs - repo-server command reference](https://argo-cd.readthedocs.io/en/stable/operator-manual/server-commands/argocd-repo-server/) - [Argo CD - repo-server NetworkPolicy manifest](https://github.com/argoproj/argo-cd/blob/master/manifests/base/repo-server/argocd-repo-server-network-policy.yaml) - [Argo CD docs - metrics](https://argo-cd.readthedocs.io/en/latest/operator-manual/metrics/) - [Argo Helm - chart values reference](https://github.com/argoproj/argo-helm/blob/main/charts/argo-cd/README.md) - [Kustomize - Helm chart generator example](https://github.com/kubernetes-sigs/kustomize/blob/master/examples/chart.md) {{#include ../banners/hacktricks-training.md}}