Kiedy aplikacje są podpisane kodem, jakie części pakietu .app zawierają podpis?

13

W Mountain Lion wiem, że niektóre aplikacje, w tym wszystkie aplikacje w Mac App Store, są podpisane cyfrowo przez programistę, więc jeśli zostaną zmodyfikowane, podpis nie będzie się zgadzał i spowoduje to różnego rodzaju błędy (i sytuację będzie eskalować w następnej wersji systemu operacyjnego ...).

Moje pytanie brzmi: które części pakietu .app zawierają podpis? Jeśli byle co w Appname.app/Contents zmiany (w tym metadane, takie jak data modyfikacji dla Contents folder), czy to łamie podpis? Czy to tylko plik binarny w Contents/MacOS? Czy wykonawcy są włączeni do podpisu? The Resources? Co jako użytkownik końcowy mogę zhakować (jeśli w ogóle) bez łamania podpisu?

Daniel
źródło
Brzmi, jakbyś musiał rozpocząć testowanie i powiedz nam!
Adam Davis
Mogę i jeśli nikt nie zna odpowiedzi, zrobię to, ale jeśli ktoś już przetestował, nie muszę wymyślać koła.
Daniel
1
To koło mogłoby całkowicie użyj jednak pewnych ulepszeń. Myślę, że chromowane błystki są koniecznością, po pierwsze.
Adam Davis

Odpowiedzi:

13

TL; DR Do programisty należy wybór, które elementy aplikacji są podpisane i czy manipulowanie tymi elementami powoduje jakiekolwiek działania podczas uruchamiania aplikacji. Musisz użyć wersji próbnej i błędu, aby dowiedzieć się na podstawie aplikacji.

To w dużej mierze zależy od dewelopera, aby zdecydować, które elementy w ich pakiecie aplikacji są przedstawione w pieczęci, która zostanie podpisana przed dostarczeniem aplikacji. Wszystko, co znajduje się w pieczęci, jest skutecznie zabezpieczone przed manipulacją przez osoby niepowołane, ponieważ w większości przypadków niemożliwe jest zmodyfikowanie tych rzeczy bez zmiany sygnatur skrótu. Ale to nie oznacza, że ​​nie można ich modyfikować.

Przewodnik dla programistów Apple ma to do powiedzenia na temat tego, co powinieneś podpisać:

Powinieneś podpisywać każdy plik wykonywalny w swoim produkcie, w tym   aplikacje, narzędzia, ukryte narzędzia pomocnicze, narzędzia i tak dalej.   Podpisywanie pakietu aplikacji obejmuje jego zasoby, ale nie jego   podskładniki, takie jak narzędzia i wiązki cząstkowe. Każdy z nich musi być   podpisany niezależnie.

Jeśli twoja aplikacja składa się z dużej części interfejsu użytkownika z jednym lub więcej małym   narzędzia pomocnicze, które próbują przedstawić pojedynczą twarz użytkownikowi, możesz   uczynić je nieodróżnialnymi od podpisywania kodu, dając im wszystkie   dokładnie ten sam identyfikator podpisywania kodu. (Możesz to zrobić, upewniając się   że wszystkie mają taką samą wartość CFBundleIdentifier w swoich   Info.plist lub za pomocą opcji -i w poleceniu codeign na   przypisz ten sam identyfikator.) W takim przypadku wszystkie składniki programu   mieć dostęp do tych samych elementów pęku kluczy i zatwierdzać jako takie same   program. Zrób to tylko wtedy, gdy zaangażowane programy mają naprawdę tworzyć   pojedynczy podmiot, bez żadnych różnic.

Uniwersalny plik binarny (pakiet lub narzędzie) automatycznie ma indywidualny   sygnatury stosowane do każdego komponentu architektury. To są   niezależny, a zwykle tylko rodzima architektura na końcu   system użytkownika został zweryfikowany.

W przypadku pakietów instalacyjnych (pakiety .pkg i .mpkg) wszystko   jest niejawnie podpisane: archiwum CPIO zawierające ładunek,   Archiwum CPIO zawierające skrypty instalacyjne i zestawienie materiałów   (BOM) każdy ma hash zarejestrowany w nagłówku XAR i ten nagłówek w   kolej jest podpisana. Dlatego, jeśli zmodyfikujesz skrypt instalacyjny (dla   przykład) po podpisaniu pakietu, podpis będzie   nieważny.

Możesz także podpisać swoje wtyczki i biblioteki. Chociaż   nie jest obecnie wymagane, będzie w przyszłości, a nie ma   wadą posiadania podpisów na tych komponentach.

W zależności od sytuacji, codeign może dodać do twojego pliku wykonywalnego Mach-O   plik, dodaj do niego rozszerzone atrybuty lub utwórz nowe pliki w swoim   Katalog zawartości pakietu. Żaden z twoich innych plików nie jest modyfikowany.

Również stąd niekoniecznie jest prawdą, że posiadanie nieprawidłowego podpisu dla aplikacji oznacza, że ​​nie uda się jej uruchomić. Strona mówi:

To zależy od systemu lub programu, który jest uruchamiany lub ładowany   kod do decydowania, czy weryfikować podpis, a jeśli tak, to do   określić, jak ocenić wyniki tej weryfikacji.

Aplikacja może zezwolić na modyfikacje.

Najlepszym rozwiązaniem jest metoda prób i błędów w każdej aplikacji, którą próbujesz zmodyfikować. Może zadziałać, może nie. Nie można udzielić zawsze prawdziwej odpowiedzi.

Jeśli aplikacja została podpisana, możesz poszukać Contents/CodeResources plik lub Contents/_CodeSignature/CodeResources plik w pakiecie. Ten plik zawiera listę wszystkich podpisanych komponentów i ich oczekiwanych wartości mieszania w pakunku. Jest to dobre miejsce, aby zacząć rozumieć, jakie elementy aplikacji programista uważa za wystarczająco krytyczne, aby obserwować zmiany.

Ian C.
źródło
0

Mimo że pytanie odnosi się konkretnie do Mountain Lion, istnieje ważna zmiana w nowszej wersji macOS. W systemie MacOS 10.11 i nowszych podpisy, które nie obejmują całego kodu, są odrzucane.

Widzieć Uwaga techniczna TN2206 - MacOS Code Signing In Depth .

Gunnar
źródło