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.email
Jednak 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:

Brak komentarzy :

Prześlij komentarz