Grey Wizard
Grey Wizard

Hackowanie git'a

Git - rozproszony system kontroli wersji. Przez wielu uwielbiany dzięki mnogości funkcji, które w prosty sposób mogą zostać wykorzystane również w nieetycznych celach.

Edycja historii

Edycja historii jest bardzo przydatną funkcją z punktu widzenia cyberbezpieczeństwa. Wyobraźmy sobie następującą sytuację - strona internetowa była rozbudowywana przez jedną osobę, repozytorium, było trzymane w gicie. Mimo tego, że jest to uważane za zły nawyk, w repozytorium były trzymane hasła. Projekt się rozrósł, do pomocy przyszła druga osoba.

W tej sytuacji trzymanie haseł w repozytorium (np. do usług Amazona) wydaje się skrajnie nieodpowiedzialne. Oczywiście, można usunąć hasła i stworzyć nowe repozytorium bez nich, jednak powoduje to pożegnanie się z historią zmian. W tym przypadku przychodzi nam z pomocą git. Poniższy skrypt usunie z historii plik passwords.txt:

plik, który zamierzamy usunąć z historii

UNSAFE_FILE=passwords.txt

identyfikator commita od którego edytujemy historię, w naszym przypadku będzie to pierwszy commit

FIRST_COMMIT=$(git rev-list HEAD | tail -n 1)

czyszczenie historii lokalnie

git filter-branch --index-filter 'git rm --cached --ignore-unmatch ${UNSAFE_FILE}' ${FIRST_COMMIT}..HEAD

git push --force

Na uwagę zasługuje fakt, że oprócz usuwania wrażliwych danych z repozytorium można usunąć również kluczowe pliki. Warto się przed tym zabezpieczyć blokując możliwość wykonywania komendy  git push z flagą --force

Publikowanie zmian w imieniu kolegi

Inną ciekawą funkcją git'a jest możliwość publikowania zmian jako ktokolwiek.

Łatwo wyobrazić sobie potencjalny żart przy projekcie nad którym pracuje cały zespół. W jaki sposób wykonać taki atak? Po pierwsze musimy uzyskać adres e-mail kolegi oraz jego imię. Mając dostęp do komputera ofiary, te dane wyciągniemy za pomocą poleceń:

git config user.name

git config user.emailJednak w naszym przypadku nie mamy dostępu do komputera ofiary, jedynie dostęp do repozytorium. Te wszystkie dane są zawarte w repozytorium, więc wystarczy odpowiednie polecenie:

git log

Korzystając z przełącznika --author można dodatkowo zawęzić listę wyświetlanych wyników, dla przykładu:

git log --author="jane"

Wykonanie polecenia git log, spowoduje wyświetlenie listy commitów w następującej formie:

commit e5f70869bbb5914cf8836829d30ac8187bcb774b

Author: jdoe <jane.doe@company.com>

Date: Fri Mar 10 10:13:56 2017 +0100

Update README.txt

W tym momencie mamy już wszystkie niezbędne dane potrzebne do wykonania ataku. Przeanalizujmy poniższy skrypt:

TMP_GIT_NAME=jane

TMP_GIT_EMAIL=jane.doe@greywizard.com

OLD_GIT_NAME=$(git config user.name)

OLD_GIT_EMAIL=$(git config user.email)

git config user.name ${TMP_GIT_NAME}

git config user.email ${TMP_GIT_EMAIL}

git add .

git commit -m "My important changes"

git push

git config user.name ${OLD_GIT_NAME}

git config user.email ${OLD_GIT_EMAIL}

Dwie pierwsze linie to definicja zmiennych, które odpowiadają ustawieniom informacji personalnych ofiary ataku. Dwie kolejne linie to pobranie aktualnych ustawień git'a, potem mamy podmianę ustawień na dane ofiary, opublikowanie zmian i finalnie przywrócenie danych początkowych. Atak w realizacji jest skrajnie prosty i nie wymaga szczególnej wiedzy, ba, nie wymaga od nas korzystania ze specjalistycznych narzędzi.

Możliwości ataku

Atakujący, który posiadł dostęp do repozytorium, może w powyższy sposób wprowadzić do kodu własnego backdoor'a bez wzbudzania podejrzeń zespołu pracującego nad projektem, finalnie przejmując dostęp do maszyny produkcyjnej.

Podpisywanie commit'ów kluczem GPG

W celu zabezpieczenia się przed takim atakiem należy podpisywać commit'y kluczem GPG. Commit podpisany nieprawidłowym kluczem zostanie odpowiednio oznaczony, np. na Github'ie.

__

Zmiana autora istniejących commit'ów

Git nie tylko pozwala publikować zmiany w imieniu kolegi, pozwala również stać się autorem zmian kolegi, które już wcześniej zostały opublikowane. Przygotujmy skrypt '~/change-author.sh' i wklejmy do niego poniższy kod:

!/bin/sh

git filter-branch --env-filter '

OLD_GIT_EMAIL="john.doe@company.com"

NEW_GIT_NAME="Jane Doe"

NEW_GIT_NAME="jane.doe@company.com"

if [ "$GIT_COMMITTER_EMAIL" = "$OLD_GIT_EMAIL" ]

then

export GIT_COMMITTER_NAME="$NEW_GIT_NAME"

export GIT_COMMITTER_EMAIL="$NEW_GIT_NAME"

fi

if [ "$GIT_AUTHOR_EMAIL" = "$OLD_GIT_EMAIL" ]

then

export GIT_AUTHOR_NAME="$NEW_GIT_NAME"

export GIT_AUTHOR_EMAIL="$NEW_GIT_NAME"

fi

' --tag-name-filter cat -- --branches --tags

Podmiana autora sprowadzi się teraz do wykonania komend:

git clone --bare https://github.com/user/repo.git

cd repo.git

~/change-author.sh

git push --force --tags origin 'refs/heads/*'

W celu ochrony przed takim atakiem powinniśmy skorzystać protected branches na Githubie.

Źródła:

Podpisywanie commit'ów kluczem GPG - oficjalny blog github'a

Jak podpisywać commit'y kluczem GPG

Generowanie nowego klucza GPG

Dodawanie klucza GPG do konta na github'ie

Andrzej Prałat
Grey Wizard
×

Dla mediów

Podaj nam dane kontaktowe,
na które automatycznie wyślemy materiały.

Dziękujemy