macOS Keychain
Główne Keychainy
Keychain Użytkownika (
~/Library/Keychains/login.keycahin-db
), który jest używany do przechowywania poświadczeń specyficznych dla użytkownika, takich jak hasła aplikacji, hasła internetowe, certyfikaty generowane przez użytkownika, hasła sieciowe oraz klucze publiczne/prywatne generowane przez użytkownika.Keychain Systemowy (
/Library/Keychains/System.keychain
), który przechowuje poświadczenia systemowe, takie jak hasła WiFi, certyfikaty główne systemu, prywatne klucze systemowe oraz hasła aplikacji systemowych.
Dostęp do Keychainu z Hasłem
Te pliki, mimo że nie mają wbudowanej ochrony i mogą być pobrane, są szyfrowane i wymagają czystego hasła użytkownika do odszyfrowania. Narzędzie takie jak Chainbreaker może być użyte do odszyfrowania.
Ochrona Wpisów w Keychainie
ACL
Każdy wpis w keychainie jest regulowany przez Listy Kontroli Dostępu (ACL), które określają, kto może wykonywać różne działania na wpisie w keychainie, w tym:
ACLAuhtorizationExportClear: Pozwala posiadaczowi uzyskać czysty tekst sekretu.
ACLAuhtorizationExportWrapped: Pozwala posiadaczowi uzyskać czysty tekst zaszyfrowany innym podanym hasłem.
ACLAuhtorizationAny: Pozwala posiadaczowi wykonać dowolne działanie.
ACL są dodatkowo wspierane przez listę zaufanych aplikacji, które mogą wykonywać te działania bez wywoływania monitu. Może to być:
N
il
(brak wymaganej autoryzacji, wszyscy są zaufani)Pusta lista (nikt nie jest zaufany)
Lista konkretnych aplikacji.
Wpis może również zawierać klucz ACLAuthorizationPartitionID
, który służy do identyfikacji teamid, apple, i cdhash.
Jeśli teamid jest określony, to aby uzyskać dostęp do wartości wpisu bez monitu, używana aplikacja musi mieć to samo teamid.
Jeśli apple jest określony, to aplikacja musi być podpisana przez Apple.
Jeśli cdhash jest wskazany, to aplikacja musi mieć konkretny cdhash.
Tworzenie Wpisu w Keychainie
Gdy nowy wpis jest tworzony za pomocą Keychain Access.app
, obowiązują następujące zasady:
Wszystkie aplikacje mogą szyfrować.
Żadne aplikacje nie mogą eksportować/odszyfrowywać (bez wywoływania monitu użytkownika).
Wszystkie aplikacje mogą zobaczyć kontrolę integralności.
Żadne aplikacje nie mogą zmieniać ACL.
partitionID jest ustawione na
apple
.
Gdy aplikacja tworzy wpis w keychainie, zasady są nieco inne:
Wszystkie aplikacje mogą szyfrować.
Tylko tworząca aplikacja (lub inne aplikacje wyraźnie dodane) mogą eksportować/odszyfrowywać (bez wywoływania monitu użytkownika).
Wszystkie aplikacje mogą zobaczyć kontrolę integralności.
Żadne aplikacje nie mogą zmieniać ACL.
partitionID jest ustawione na
teamid:[teamID here]
.
Uzyskiwanie Dostępu do Keychainu
security
security
APIs
Enumeracja i zrzut keychain sekretów, które nie wygenerują powiadomienia, można wykonać za pomocą narzędzia LockSmith
Lista i uzyskanie informacji o każdym wpisie w keychain:
API
SecItemCopyMatching
daje informacje o każdym wpisie i są pewne atrybuty, które można ustawić podczas jego używania:kSecReturnData
: Jeśli prawda, spróbuje odszyfrować dane (ustaw na fałsz, aby uniknąć potencjalnych wyskakujących okienek)kSecReturnRef
: Uzyskaj również odniesienie do elementu keychain (ustaw na prawda, jeśli później zobaczysz, że możesz odszyfrować bez wyskakującego okienka)kSecReturnAttributes
: Uzyskaj metadane o wpisachkSecMatchLimit
: Ile wyników zwrócićkSecClass
: Jaki rodzaj wpisu w keychain
Uzyskaj ACL każdego wpisu:
Za pomocą API
SecAccessCopyACLList
możesz uzyskać ACL dla elementu keychain, a zwróci listę ACL (takich jakACLAuhtorizationExportClear
i inne wcześniej wspomniane), gdzie każda lista ma:Opis
Lista Zaufanych Aplikacji. To może być:
Aplikacja: /Applications/Slack.app
Binarny: /usr/libexec/airportd
Grupa: group://AirPort
Eksportuj dane:
API
SecKeychainItemCopyContent
uzyskuje tekst jawnyAPI
SecItemExport
eksportuje klucze i certyfikaty, ale może być konieczne ustawienie haseł do eksportu zawartości w formie zaszyfrowanej
A oto wymagania, aby móc eksportować sekret bez powiadomienia:
Jeśli 1+ zaufane aplikacje wymienione:
Potrzebne odpowiednie autoryzacje (
Nil
, lub być częścią dozwolonej listy aplikacji w autoryzacji do uzyskania dostępu do sekretnej informacji)Potrzebny podpis kodu, aby pasował do PartitionID
Potrzebny podpis kodu, aby pasował do jednego zaufanego programu (lub być członkiem odpowiedniej grupy KeychainAccessGroup)
Jeśli wszystkie aplikacje zaufane:
Potrzebne odpowiednie autoryzacje
Potrzebny podpis kodu, aby pasował do PartitionID
Jeśli brak PartitionID, to nie jest potrzebne
Dlatego, jeśli jest 1 aplikacja wymieniona, musisz wstrzyknąć kod w tę aplikację.
Jeśli apple jest wskazane w partitionID, możesz uzyskać do niego dostęp za pomocą osascript
, więc wszystko, co ufa wszystkim aplikacjom z apple w partitionID. Python
również może być użyty do tego.
Dwa dodatkowe atrybuty
Niewidoczny: To booleanowy znacznik, aby ukryć wpis z aplikacji UI Keychain
Ogólny: To do przechowywania metadanych (więc NIE JEST ZASZYFROWANY)
Microsoft przechowywał w formie jawnej wszystkie tokeny odświeżania do uzyskania dostępu do wrażliwego punktu końcowego.
Referencje
Last updated