tom@home.htb:~$

Blog o HTB

6 November 2020

Repozitář, historie konfigurace a deployment trust

Úvod a kontext

Článek o otevřeném .git řeší první fázi problému: jak se útočník dostane ke zdrojákům, zálohám nebo starým commitům. Tady jde o druhou fázi. Co se stane ve chvíli, kdy repozitář nebo historická konfigurace nejsou jen zdroj informací, ale přímo řídí nasazení, správu nebo privilegovanou automatiku.

Právě to je důvod, proč kompromitace vývojového prostředí často nekončí u úniku tajemství. Jakmile produkce čte konfiguraci z pracovního adresáře, administrátor spouští git pull pod sudo, Tomcat Manager používá heslo z dávno smazaného commitu nebo provozní konfigurace pod /etc pořád obsahuje .git, mění se verzovací historie v aktivní útokovou plochu.

Kdy repozitář přestává být jen archiv zdrojáků

Bezpečnostně jsou nejrizikovější hlavně tyto vzory:

Klíčová otázka tedy nezní jen unikl repozitář?, ale hlavně co všechno mu prostředí věří.

Typické scénáře zneužití

1. Repozitář přímo ovládá běžící aplikaci

Na Bitlabu nestačilo, že GitLab odhalil zdrojáky. Důležité bylo až to, že kompromitovaný uživatel mohl změnit soubor profile/index.php a aplikace tuto změnu prakticky sama převzala. Ve chvíli, kdy je repo současně zdroj pravdy i zdroj běžícího kódu, není potřeba hledat samostatné RCE v aplikaci. Stačí změnit to, co se má spustit.

To je jeden z nejnebezpečnějších provozních antipatternů: vývojový přístup se tím přímo mění v produkční code execution.

2. Historie pořád obsahuje živé tajemství

Seal ukazuje jiný problém. Uniklý tomcat-users.xml nebyl v aktuálním stavu aplikace, ale v historii projektu. Bezpečnostně je to ale téměř totéž, jako kdyby tam ležel dnes. Jakmile stejné heslo stále funguje v Tomcat Manageru, historie repozitáře není „starý odpad“, ale aktivní credential store.

Stejný princip se opakoval i jinde:

To je důležitý rozdíl proti běžnému úniku zdrojáku. Historie neukazuje jen to, jak vývoj probíhal. Často uchovává přesně ta tajemství, která už administrátor považuje za dávno odstraněná.

3. Privilegovaná automatika důvěřuje writable repozitáři

Na Bitlabu byl root ve skutečnosti až důsledkem toho, že administrativní sudo git pull běžel nad repozitářem, do kterého mohl zapisovat kompromitovaný uživatel. Jakmile je writable i .git/hooks, nejde o nevinný update, ale o spuštění cizí logiky s vyššími právy.

Podobný princip se objevuje i mimo čistý Git:

Nejde tedy jen o hooky. Jde o celý vzorec mohu měnit to, čemu později věří privilegovaná automatika.

Co při auditu skutečně hledat

U podobných prostředí je užitečné jít po konkrétních otázkách.

Kde všude je přítomná historie

Co z historie zůstává platné

Kdo může měnit vstup do deploymentu

Jaká je skutečná hranice mezi vývojem a produkcí

Praktické signály, že je prostředí nebezpečně navržené

Mezi varovné indikátory patří hlavně:

Každý jednotlivý bod ještě nemusí znamenat kompromitaci. Ale jejich kombinace obvykle znamená, že vývojová vrstva už není oddělená od produkční důvěry.

Obrana a hardening

1. Oddělit repozitář od runtime

Produkce by ideálně neměla běžet z working tree. Bezpečnější model je buildnout artefakt mimo cílový host a nasazovat jen to, co má skutečně běžet.

2. Nenechávat .git v produkci

To platí i pro konfigurační adresáře. .git pod /etc, v backup adresáři nebo ve webrootu znamená, že na cíli leží nejen současný stav, ale i historie změn a často i stará tajemství.

3. Rotovat tajemství po každém úniku z historie

Smazání z posledního commitu nic neřeší. Pokud se jednou heslo objevilo v repozitáři a existuje šance, že se k němu někdo dostal, je potřeba ho považovat za kompromitované.

4. Zakázat privilegované operace nad writable repozitářem

sudo git pull, root build, automatické načítání hooků nebo playbooků z adresáře, který může měnit neprivilegovaný účet, je potřeba považovat za designovou chybu, ne za administrativní pohodlí.

5. Auditovat deployment trust chain

Nestačí kontrolovat aplikaci samotnou. Je potřeba projít i to, odkud se berou:

Právě tudy často vede kratší cesta k privilegovanému kódu než přes samotnou aplikaci.

Shrnutí klíčových poznatků

Co si odnést do praxe

tags: git - repo - deployment - ci-cd - config - secrets