Atlantis Security
Last updated
Last updated
Atlantis vam u osnovi pomaže da pokrenete terraform iz Pull zahteva sa vašeg git servera.
Idite na stranicu sa izdanjima Atlantisa na https://github.com/runatlantis/atlantis/releases i preuzmite onaj koji vam odgovara.
Kreirajte lični token (sa pristupom repozitorijumima) vašeg github korisnika
Izvršite ./atlantis testdrive
i on će kreirati demo repozitorijum koji možete koristiti da komunicirate sa atlantisom
Možete pristupiti web stranici na 127.0.0.1:4141
Atlantis podržava nekoliko git domaćina kao što su Github, Gitlab, Bitbucket i Azure DevOps. Međutim, da bi pristupao repozitorijumima na tim platformama i izvršavao akcije, potrebno je da imaju neki dodeljen privilegovan pristup (barem dozvole za pisanje). Dokumentacija podstiče da se kreira korisnik na ovim platformama specifično za Atlantisa, ali neki ljudi mogu koristiti lične naloge.
U svakom slučaju, sa perspektive napadača, nalog Atlantisa će biti veoma interesantan za kompromitovanje.
Atlantis opciono koristi Webhook tajne da validira da li su webhook-ovi koje prima od vašeg Git domaćina legitimni.
Jedan način da se potvrdi ovo je da se dozvole zahteve samo da dolaze sa IP adresa vašeg Git domaćina, ali jednostavniji način je korišćenje Webhook Tajne.
Imajte na umu da osim ako koristite privatni github ili bitbucket server, moraćete da izložite krajnje tačke webhook-ova Internetu.
Atlantis će izlagati webhook-ove tako da git server može slati informacije. Sa perspektive napadača bilo bi interesantno znati da li možete slati poruke.
Atlantis pokreće Terraform jednostavno izvršavanjem terraform plan
i apply
komandi na serveru na kojem je hostovan Atlantis. Baš kao kada pokrećete Terraform lokalno, Atlantisu su potrebni krediti za vaš specifičan provajder.
Na vama je kako ćete dostaviti kredite za vaš specifičan provajder Atlantisu:
Atlantis Helm Chart i AWS Fargate Modul imaju svoje mehanizme za kredite provajdera. Pročitajte njihovu dokumentaciju.
Ako pokrećete Atlantisa u oblaku, mnogi oblaci imaju načine da daju pristup cloud API-ju aplikacijama koje se izvršavaju na njima, npr:
AWS EC2 Uloge (Pretražite "EC2 Uloga")
Mnogi korisnici postavljaju okružne promenljive, npr. AWS_ACCESS_KEY
, gde se Atlants izvršava.
Drugi kreiraju neophodne konfiguracione fajlove, npr. ~/.aws/credentials
, gde se Atlants izvršava.
Koristite HashiCorp Vault Provajder da dobijete kredite provajdera.
Kontejner u kojem Atlantis radi će verovatno sadržati privilegovane kredite za provajdere (AWS, GCP, Github...) koje Atlantis upravlja putem Terraforma.
Podrazumevano, Atlantis će pokrenuti web stranicu na portu 4141 na localhost-u. Ova stranica vam omogućava samo da omogućite/onemogućite primenu Atlantisa i proverite status plana repozitorijuma i otključate ih (ne dozvoljava modifikacije, tako da nije toliko korisna).
Verovatno je nećete naći izloženu Internetu, ali izgleda da podrazumevano nije potrebno korisničko ime i lozinka za pristup (a ako jesu, atlantis
:atlantis
su podrazumevani).
Konfiguracija za atlantis server
može se specificirati putem zastavica komandne linije, okružnih promenljivih, konfiguracionog fajla ili kombinacijom ova tri.
Možete pronaći ovde listu zastavica podržanih od strane Atlantisa servera
Vrednosti se biraju po ovom redosledu:
Zastavice
Okružne Promenljive
Konfiguracioni Fajl
Imajte na umu da u konfiguraciji možete pronaći interesantne vrednosti kao što su tokeni i lozinke.
Neke konfiguracije utiču na način upravljanja repozitorijumima. Međutim, moguće je da svaki repozitorijum zahteva različite postavke, pa postoje načini da se specificira svaki repozitorijum. Ovo je prioritetni redosled:
Repozitorijum /atlantis.yml
fajl. Ovaj fajl se može koristiti da se specificira kako atlantis treba da tretira repozitorijum. Međutim, podrazumevano neke ključne vrednosti ne mogu biti specificirane ovde bez određenih zastavica koje to omogućavaju.
Verovatno je potrebno dozvoliti zastavicama poput allowed_overrides
ili allow_custom_workflows
Konfiguracija na Serveru: Možete je proslediti zastavicom --repo-config
i to je yaml koji konfiguriše nove postavke za svaki repozitorijum (podržani su regex-i)
Podrazumevane vrednosti
Atlantis omogućava da naznačite da li želite da PR odobri neko drugi (čak i ako to nije postavljeno u zaštiti grane) i/ili da bude spojiv
(zaštite grane su prošle) pre pokretanja primene. Sa aspekta bezbednosti, preporučljivo je postaviti oba opcije.
U slučaju da je allowed_overrides
True, ova podešavanja mogu biti prepisana na svakom projektu putem datoteke /atlantis.yml
.
Konfiguracija repozitorijuma može specificirati skripte koje će se izvršiti pre (pre workflow hooks) i nakon (post workflow hooks) izvršenja workflow-a.
Ne postoji opcija koja dozvoljava specificiranje ovih skripti u repo /atlantis.yml
datoteci.
U konfiguraciji repozitorijuma (konfiguracija na serverskoj strani) možete specificirati novi podrazumevani workflow, ili kreirati nove prilagođene workflow-e. Takođe možete specificirati koje repozitorijume mogu pristupiti novim generisanim.
Zatim, možete dozvoliti datoteci atlantis.yaml svakog repozitorijuma da specificira workflow koji će se koristiti.
Ako je zastavica konfiguracija na serverskoj strani allow_custom_workflows
postavljena na True, workflow-i mogu biti specificirani u atlantis.yaml
datoteci svakog repozitorijuma. Potencijalno je takođe potrebno da allowed_overrides
takođe specificira workflow
da bi prepisao workflow koji će biti korišćen.
Ovo će u osnovi omogućiti RCE na Atlantis serveru svakom korisniku koji može pristupiti tom repozitorijumu.
Atlantis podržava pokretanje server-side conftest polisa protiv izlaza plana. Uobičajene upotrebe ovog koraka uključuju:
Odbijanje korišćenja liste modula
Tvrdnje o atributima resursa prilikom kreiranja
Otkrivanje nenamernih brisanja resursa
Prevencija sigurnosnih rizika (tj. izlaganje sigurnih portova javnosti)
Možete proveriti kako da ga konfigurišete u dokumentaciji.
U dokumentaciji možete pronaći opcije koje možete koristiti za pokretanje Atlantisa:
Ako tokom eksploatacije naiđete na ovu grešku: Error: Error acquiring the state lock
Možete je popraviti pokretanjem:
Ako imate pristup za pisanje nad repozitorijumom, moći ćete da napravite novu granu na njemu i generišete PR. Ako možete izvršiti atlantis plan
(ili možda se automatski izvršava) moći ćete da izvršite udaljenu izvršnu kontrolu unutar Atlantisa servera.
To možete postići tako što ćete naterati Atlantisa da učita spoljni izvor podataka. Samo stavite payload kao što je prikazano u main.tf
fajlu:
Možete izvesti ovaj napad čak i na skriveniji način, prateći ove sugestije:
Umesto dodavanja rev šel direkt u terraform fajl, možete učitati spoljni resurs koji sadrži rev šel:
Možete pronaći rev shell kod na https://github.com/carlospolop/terraform_external_module_rev_shell/tree/main/modules
U spoljnom resursu, koristite ref funkciju da sakrijete terraform rev shell kod u grani unutar repozitorijuma, nešto poput: git@github.com:carlospolop/terraform_external_module_rev_shell//modules?ref=b401d2b
Umesto kreiranja PR-a ka masteru da biste pokrenuli Atlantis, napravite 2 grane (test1 i test2) i napravite PR od jedne ka drugoj. Kada završite napad, jednostavno uklonite PR i grane.
Možete izvući tajne korišćene od strane terraforma pokretanjem atlantis plan
(terraform plan
) ubacivanjem nečega poput ovoga u terraform fajl:
Ako imate pristup za pisanje nad repozitorijumom, moći ćete da kreirate novu granu na njemu i generišete PR. Ako možete izvršiti atlantis apply
, moći ćete da izvršite RCE unutar Atlantis servera.
Međutim, obično ćete morati da zaobiđete neka zaštitna podešavanja:
Mergeable: Ako je ova zaštita postavljena u Atlantisu, možete pokrenuti atlantis apply
samo ako je PR mergeable (što znači da je potrebno zaobići zaštitu grane).
Proverite potencijalne bypass-ove zaštite grane
Approved: Ako je ova zaštita postavljena u Atlantisu, neki drugi korisnik mora odobriti PR pre nego što možete pokrenuti atlantis apply
Podrazumevano možete zloupotrebiti Gitbot token za zaobilaženje ove zaštite
Pokretanje terraform apply
na zlonamerni Terraform fajl sa local-exec.
Samo se pobrinite da se neki payload poput sledećih završava u fajlu main.tf
:
Pratite predloge iz prethodne tehnike kako biste izvršili ovaj napad na diskretniji način.
Prilikom pokretanja atlantis plan
ili atlantis apply
, terraform se pokreće ispod, možete proslediti komande terraformu iz atlantisa komentarišući nešto poput:
Nešto što možete proslediti su env promenljive koje mogu biti korisne za zaobilaženje nekih zaštita. Proverite terraform env promenljive na https://www.terraform.io/cli/config/environment-variables
Pokretanje zlonamernih prilagođenih naredbi za izgradnju navedenih u datoteci atlantis.yaml
. Atlantis koristi datoteku atlantis.yaml
sa grane zahteva za povlačenje, ne sa master
grane.
Ova mogućnost je pomenuta u prethodnom odeljku:
Ako je zastava server side config postavljena na True, radni tokovi mogu biti navedeni u datoteci atlantis.yaml
svakog repozitorijuma. Potencijalno je takođe potrebno da allowed_overrides
takođe specificira i workflow
da bi se zamenio radni tok koji će biti korišćen.
Ovo će u osnovi omogućiti RCE na Atlantis serveru bilo kom korisniku koji može pristupiti tom repozitorijumu.
Ako je zastava konfiguracije sa serverske strane allowed_overrides
konfigurisana sa apply_requirements
, moguće je da repozitorijum izmeni zaštitu planiranja/primene kako bi je zaobišao.
Ako neko pošalje atlantis plan/apply
komentare na vaše validne zahteve za povlačenje, to će uzrokovati pokretanje terraforma kada to ne želite.
Osim toga, ako nemate konfigurisano u zaštiti grane da zatražite ponovnu procenu svakog zahteva za povlačenje kada se doda novi commit na nju, neko bi mogao napisati zlonamerne konfiguracije (proverite prethodne scenarije) u terraform konfiguraciji, pokrenuti atlantis plan/apply
i dobiti RCE.
Ovo je postavka u Github zaštiti grane:
Ako uspete ukrasti tajnu webhook-a koja se koristi ili ako se ne koristi nikakva tajna webhook-a, mogli biste pozvati Atlantis webhook i direktno pozvati atlantis komande.
Bitbucket Cloud ne podržava tajne webhook-a. To bi moglo omogućiti napadačima da falsifikuju zahteve sa Bitbucket-a. Proverite da li dozvoljavate samo IP adrese Bitbucket-a.
To znači da bi napadač mogao poslati lažne zahteve Atlantisu koji izgledaju kao da dolaze sa Bitbucket-a.
Ako specificirate --repo-allowlist
onda bi mogli samo lažirati zahteve koji se odnose na te repozitorijume, tako da bi najveća šteta koju bi mogli naneti bila plan/primena na vašim sopstvenim repozitorijumima.
Da biste to sprečili, dozvolite IP adrese Bitbucket-a (vidi Izlazne IPv4 adrese).
Ako ste uspeli da pristupite serveru ili ste barem dobili LFI, postoje neke zanimljive stvari koje biste trebali pokušati pročitati:
/home/atlantis/.git-credentials
Sadrži pristupne podatke za vcs
/atlantis-data/atlantis.db
Sadrži pristupne podatke za vcs sa više informacija
/atlantis-data/repos/<org_name>
/
<repo_name>/<pr_num>/<workspace>/<path_to_dir>/.terraform/terraform.tfstate
Terraform stanje datoteke
Primer: /atlantis-data/repos/ghOrg_/_myRepo/20/default/env/prod/.terraform/terraform.tfstate
/proc/1/environ
Env promenljive
/proc/[2-20]/cmdline
Komandna linija atlantis server
(može sadržati osetljive podatke)
Zato što bilo ko može komentarisati javne zahteve za povlačenje, čak i sa svim dostupnim sigurnosnim mitigacijama, i dalje je opasno pokretati Atlantis na javnim repozitorijumima bez odgovarajuće konfiguracije sigurnosnih postavki.
--allow-fork-prs
Ako radite na javnom repozitorijumu (što se ne preporučuje, vidi gore) ne biste trebali postaviti --allow-fork-prs
(podrazumevano je false) jer bilo ko može otvoriti zahtev za povlačenje sa svog forka ka vašem repozitorijumu.
--repo-allowlist
Atlantis zahteva da specificirate listu dozvoljenih repozitorijuma od kojih će prihvatiti webhook-ove putem zastave --repo-allowlist
. Na primer:
Specifični repozitorijumi: --repo-allowlist=github.com/runatlantis/atlantis,github.com/runatlantis/atlantis-tests
Ceo vaša organizacija: --repo-allowlist=github.com/runatlantis/*
Svi repozitorijumi u vašoj GitHub Enterprise instalaciji: --repo-allowlist=github.yourcompany.com/*
Svi repozitorijumi: --repo-allowlist=*
. Korisno kada ste u zaštićenoj mreži, ali opasno bez postavljanja tajne webhook-a.
Ova zastava osigurava da vaša instalacija Atlantisa nije korišćena sa repozitorijumima koje ne kontrolišete. Pogledajte atlantis server --help
za više detalja.
Ako su napadi koji podnose zahteve za povlačenje sa zlonamernim Terraform kodom u vašem modelu pretnji, morate biti svesni da odobrenja za terraform apply
nisu dovoljna. Moguće je pokrenuti zlonamerni kod u terraform plan
koristeći external
data source ili specificiranjem zlonamernog provajdera. Taj kod bi mogao da eksfiltrira vaše pristupne podatke.
Da biste to sprečili, možete:
Ugraditi provajdere u sliku Atlantisa ili host i zabraniti izlaz u produkciji.
Implementirati protokol registra provajdera interno i zabraniti javni izlaz, na taj način kontrolišete ko ima pristup za pisanje u registar.
Modifikujte konfiguraciju repozitorijuma na serverskoj strani plan
korak da validira protiv korišćenja zabranjenih provajdera ili data izvora ili PR-ova od korisnika koji nisu dozvoljeni. Takođe možete dodati dodatnu validaciju u ovom trenutku, npr. zahtevajući "thumbs-up" na PR pre nego što se dozvoli nastavak plan
-a. Conftest bi mogao biti od pomoći ovde.
Atlantis bi trebalo pokrenuti sa postavljenim tajnama webhook-a putem $ATLANTIS_GH_WEBHOOK_SECRET
/$ATLANTIS_GITLAB_WEBHOOK_SECRET
okruženjskih promenljivih. Čak i sa postavljenom zastavom --repo-allowlist
, bez tajne webhook-a, napadači bi mogli slati zahteve Atlantisu predstavljajući se kao repozitorijum koji je na listi dozvoljenih. Tajne webhook-a osiguravaju da zahtevi webhook-a zaista dolaze od vašeg VCS provajdera (GitHub ili GitLab).
Ako koristite Azure DevOps, umesto tajni webhook-a dodajte osnovno korisničko ime i lozinku.
Azure DevOps podržava slanje osnovnog autentikacionog zaglavlja u svim webhook događajima. To zahteva korišćenje HTTPS URL-a za lokaciju vašeg webhook-a.
Ako koristite tajne webhook-a, ali vaš saobraćaj ide preko HTTP-a, tajne webhook-a mogu biti ukradene. Omogućite SSL/HTTPS korišćenjem zastava --ssl-cert-file
i --ssl-key-file
.
Veoma je preporučljivo omogućiti autentikaciju na web servisu. Omogućite BasicAuth korišćenjem --web-basic-auth=true
i postavite korisničko ime i lozinku korišćenjem zastava --web-username=yourUsername
i --web-password=yourPassword
.
Takođe možete proslediti ove kao okruženjske promenljive ATLANTIS_WEB_BASIC_AUTH=true
ATLANTIS_WEB_USERNAME=yourUsername
i ATLANTIS_WEB_PASSWORD=yourPassword
.