macOS Keychain
Основні ключові ланцюжки
Ключовий ланцюжок користувача (
~/Library/Keychains/login.keycahin-db
), який використовується для зберігання користувацьких облікових даних, таких як паролі додатків, паролі для Інтернету, сертифікати, паролі мережі та користувацькі пари ключів.Системний ключовий ланцюжок (
/Library/Keychains/System.keychain
), який зберігає системні облікові дані, такі як паролі WiFi, кореневі сертифікати системи, приватні ключі системи та паролі додатків системи.
Доступ до ключового ланцюжка паролів
Ці файли, хоча і не мають вбудованого захисту і можуть бути завантажені, зашифровані і вимагають пароль чистого тексту користувача для розшифрування. Інструмент, такий як Chainbreaker, може бути використаний для розшифрування.
Захист записів ключового ланцюжка
ACLs
Кожен запис у ключовому ланцюжку керується Списками керування доступом (ACLs), які вказують, хто може виконувати різні дії з записом ключового ланцюжка, включаючи:
ACLAuhtorizationExportClear: Дозволяє власнику отримати чіткий текст секрету.
ACLAuhtorizationExportWrapped: Дозволяє власнику отримати чіткий текст, зашифрований іншим наданим паролем.
ACLAuhtorizationAny: Дозволяє власнику виконувати будь-яку дію.
ACL супроводжується списком довірених додатків, які можуть виконувати ці дії без підказки. Це може бути:
N
il
(не потрібно авторизації, всі довірені)Порожній список (ніхто не довіряється)
Список конкретних додатків.
Також запис може містити ключ ACLAuthorizationPartitionID
, який використовується для ідентифікації teamid, apple, та cdhash.
Якщо вказано teamid, то для доступу до значення запису без підказки використовуваний додаток повинен мати той самий teamid.
Якщо вказано apple, то додаток повинен бути підписаний Apple.
Якщо вказано cdhash, то додаток повинен мати конкретний cdhash.
Створення запису ключового ланцюжка
Коли створюється новий запис за допомогою Keychain Access.app
, застосовуються наступні правила:
Усі додатки можуть шифрувати.
Жоден додаток не може експортувати/розшифровувати (без підказки користувача).
Усі додатки можуть бачити перевірку цілісності.
Жоден додаток не може змінювати ACL.
PartitionID встановлено на
apple
.
Коли додаток створює запис у ключовому ланцюжку, правила трохи відрізняються:
Усі додатки можуть шифрувати.
Тільки створюючий додаток (або будь-які інші додатки, які явно додані) можуть експортувати/розшифровувати (без підказки користувача).
Усі додатки можуть бачити перевірку цілісності.
Жоден додаток не може змінювати ACL.
PartitionID встановлено на
teamid:[teamID тут]
.
Доступ до ключового ланцюжка
security
security
APIs
Перелік ключів та витягування секретів, які не викличуть запиту, можна виконати за допомогою інструменту LockSmith
Перелік та отримання інформації про кожен запис у ключниці:
API
SecItemCopyMatching
надає інформацію про кожен запис, і є деякі атрибути, які можна встановити при його використанні:kSecReturnData
: Якщо true, спробує розшифрувати дані (встановіть false, щоб уникнути можливих спливаючих вікон)kSecReturnRef
: Отримати також посилання на елемент ключниці (встановіть true у випадку, якщо пізніше ви побачите, що можете розшифрувати без спливаючого вікна)kSecReturnAttributes
: Отримати метадані про записиkSecMatchLimit
: Скільки результатів повернутиkSecClass
: Який тип запису у ключниці
Отримання ACLs кожного запису:
За допомогою API
SecAccessCopyACLList
ви можете отримати ACL для елемента ключниці, і він поверне список ACL (наприклад,ACLAuhtorizationExportClear
та інші раніше згадані), де кожен список має:Опис
Список довірених додатків. Це може бути:
Додаток: /Applications/Slack.app
Бінарний файл: /usr/libexec/airportd
Група: group://AirPort
Експорт даних:
API
SecKeychainItemCopyContent
отримує текстAPI
SecItemExport
експортує ключі та сертифікати, але можливо доведеться встановити паролі для експорту вмісту зашифрованим
І ось вимоги, щоб мати можливість експортувати секрет без запиту:
Якщо 1+ довірених додатків перелічено:
Потрібні відповідні авторизації (
Nil
, або бути частиною списку дозволених додатків у авторизації для доступу до конфіденційної інформації)Потрібно, щоб кодовий підпис відповідав PartitionID
Потрібно, щоб кодовий підпис відповідав кодовому підпису одного довіреного додатку (або бути членом відповідної групи KeychainAccessGroup)
Якщо всі додатки довірені:
Потрібні відповідні авторизації
Потрібно, щоб кодовий підпис відповідав PartitionID
Якщо немає PartitionID, тоді це не потрібно
Отже, якщо перелічено 1 додаток, вам потрібно впровадити код у цей додаток.
Якщо в PartitionID вказано apple, ви можете отримати до нього доступ за допомогою osascript
, щоб отримати доступ до всього, що довіряє всім додаткам з apple в PartitionID. Python
також може бути використаний для цього.
Два додаткові атрибути
Невидимий: Це булевий прапорець для приховування запису від UI додатка Keychain
Загальний: Це для зберігання метаданих (тому це НЕ ШИФРОВАНО)
Компанія Microsoft зберігала в чистому тексті всі оновлювальні токени для доступу до чутливих кінцевих точок.
Посилання
Last updated