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

17 KiB
Raw Blame History

Ασφάλεια του Argo CD

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

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

Το Argo CD είναι μια πλατφόρμα 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:

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:

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

Επιθέσεις στο Public API / UI

Αν διαθέτεις credentials του Argo CD ή ένα εκτεθειμένο instance, ξεκίνα από τη συνηθισμένη επιφάνεια API:

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, τις επιλογές 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:

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:

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.

Πρακτικοί έλεγχοι:

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

Ενδιαφέρουσες ενδείξεις:

  • Το 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:

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

Ελάχιστη κακόβουλη είσοδος Kustomize που απαιτείται για την ενεργοποίηση της επεξεργασίας Helm:

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:

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:

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, δώστε προτεραιότητα στα εξής:

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.

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

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