Сигурност на IOS приложения (част 12) -качване на данни от Keychain
В предишната статия разгледахме различни начини за анализиране на мрежовия трафик и api повиквания, които се извършват от IOS приложение. В тази статия ще разгледаме начини за качване на информация от Keychain хранилището на IOS устройство.
Автор: Пратик Джанчандани
В предишната статия разгледахме различни начини за анализиране на мрежовия трафик и api повиквания, които се извършват от IOS приложение. В тази статия ще разгледаме начини за качване на информация от Keychain хранилището на IOS устройство.
Според документацията на Apple, Keychain е защитен контейнер за съхраняване на чувствителна информация (потребителски имена, пароли, мрежови пароли, токени за удостоверяване на различни приложения). Вградените инструменти на операционната система на Apple съхраняват в Keychain пароли за Wifi мрежа, Vpn акаунти и т. н. Тези данни са криптирани и се съхраняват в базата данни sqlite във файла /private/var/Keychains/keychain-2.db. Разработчиците обикновено използват тази функция за съхраняване на акаунти, вместо да използват NSUserDefaults, plist файлове и т.н. Причината за това може да е, че разработчикът иска да съхранява информация за удостоверяване, така че потребителят да не въвежда идентификационни данни всеки път, когато отвори приложението. Данните за ключодържателя за всяко приложение се съхраняват извън пясъчника.
Също така е възможно да се споделят данни за ключодържател между приложения чрез групи за достъп до ключодържател. Тази група трябва да бъде дефинирана в момента, в който информацията се съхранява в ключодържателя. Най-добрият начин за съхраняване на информация в ключодържател е да използвате класа KeychainItemWrapper. Можете да намерите тестов проект на сайта за разработчици на Apple. Първо трябва да създадете екземпляр на класа.
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@”Password” accessGroup:nil];
Идентификаторът ще помогне в бъдеще при получаване на информация от ключодържателя. Ако искате да споделите информация за ключодържател с други приложения, трябва да дефинирате група за достъп. Приложения с една и съща група за достъп имат достъп до същата информация от ключодържателя.
KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@”Account Number” accessGroup:@”YOUR_APP_ID_HERE.com.yourcompany.GenericKeychainSuite”];
[keychainItemWrapper setObject:kSecClassGenericPassword forKey:(id)kSecClass]; [обвивка setObject:@"username" forKey:(id)kSecAttrAccount]; [keychainItemWrapper setObject:@"password"forKey:(id)kSecValueData]; [обвивка setObject:(id)kSecAttrAccessibleAlwaysThisDeviceOnly forKey:(id)kSecAttrAccessible];
Променливата kSecAttrAccessible се използва за контролиране на достъпа до данните от ключодържателя. Трябва да внимавате, когато използвате тази променлива. Както е посочено в документацията на Apple, променливата kSecAttrAccessible може да приема шест възможни стойности. По-долу е извадка от документацията.
Информацията за ключодържател не може да бъде достъпна след рестартиране на устройството, докато устройството не бъде отключено от потребителя. След първото отключване данните стават достъпни до следващото рестартиране. Препоръчително е да използвате тази константа за записи, до които имат достъп фонови приложения. Записите с този атрибут се мигрират към ново устройство, когато се използват криптирани резервни копия.
Константата може да се използва от iOS 4.0 и по-нова версия.
Декларирано в SecItem.h.
Към информация отkeychain не е достъпен след рестартиране на устройството, докато устройството не бъде отключено от потребителя. След първото отключване данните стават достъпни до следващото рестартиране. Препоръчително е да използвате тази константа за записи, до които имат достъп фонови приложения. Записите с тозиатрибут не се мигрираткъм ново устройство или нова инсталация. По този начин, след възстановяване на резервно копие, тези данни няма да съществуват.
Константата може да се използва от iOS 4.0 и по-нова версия.
Декларирано в SecItem.h.
Данните в ключодържателя ще бъдат винаги достъпни, дори ако устройството е заключено. Не се препоръчва използването на тази константа. Записите с този атрибут се мигрират към ново устройство, когато се използват криптирани резервни копия.
Константата може да се използва от iOS 4.0 и по-нова версия.
Декларирано в SecItem.h.
Данните в ключодържателя ще бъдат винаги достъпни, дори ако устройството е заключено. Не се препоръчва използването на тази константа. Записите с тозиатрибут не се мигрираткъм ново устройство или нова инсталация. По този начин, след възстановяване на резервно копие, тези данни няма да съществуват.
Константата може да се използва от iOS 4.0 и по-нова версия.
Декларирано в SecItem.h.
Данните ще бъдат достъпни само когато устройството е отключено от потребителя. Препоръчително е да използвате тази константа, когато трябва да разрешите достъп за приложения, работещи на преден план. Записите с този атрибут се мигрират към ново устройство, когато се използват криптирани резервни копия.
Константата може да се използва от iOS 4.0 и по-нова версия.
Декларирано в SecItem.h.
Данните ще бъдат налични само,когато устройството е отключено от потребителя. Препоръчително е да използвате тази константа, когато трябва да разрешите достъп за приложения, работещи на преден план. Записите с тозиатрибут не се мигрираткъм ново устройство или нова инсталация. По този начин, след възстановяване на резервно копие, тези данни няма да съществуват.
Константата може да се използва от iOS 4.0 и по-нова версия.
Декларирано в SecItem.h.
Използвайте следния код, за да получите информация от keychain.
NSString *accountName = [wrapper objectForKey:(id)kSecAttrAccount];
Анализ на взаимодействието на приложението с ключодържател с помощта на Snoop-it

Фигура 1: Интерфейс на тестово приложение
Въведете потребителско име и парола и ги запазете. Въведох потребителското име "Test User" и паролата "password". След това ще видите, че Snoop-it е открил промени, направени в ключодържателя и може да ни покаже информацията, която приложението записва в ключодържателя. Можем също да видим атрибутите за сигурност на съхранената информация.

Фигура 2: Процес на четене-запис на информация в ключодържател
Информацията, разкриваща потребителското име и паролата, е показана по-долу.
Фигура 3: Информация, разкриваща потребителско име и парола
Сега въведете номера на сметката си. Както можете да видите от фигурата по-долу, Snoop-it може да открие работа с ключодържател и тук.

Фигура 4: Следи от работа с ключодържател при промяна на параметъра на акаунта
Както можете да видите, Snoop-it може да открие взаимодействие с базата данни на ключодържателя, независимо дали става дума за четене, писане или изтриване на данни. Ако изтриете записи от ключодържателя чрез натискане на Reset, Snoop-it също ще отрази тези действия.
Снимка 5:Следи от изтриване на записи от ключодържател
Изтегляне на информация от Keychain чрез Keychain Dumper
Изтеглете двоичния файл на вашето устройство в папката /tmp и задайте разрешенията за изпълнение.

Фигура 6: Зареждане и настройка на разрешения за изпълнение за keychain_dumper
Уверете се, че файлът /private/var/Keychains/keychain-2.db може да се чете от всеки (т.е. файлът има зададен атрибут за четене от света).
Фигура 7: Задаване на разрешения за четене за файла /private/var/Keychains/keychain-2.db
Сега стартирайте двоичния файл.


Фигура 8: Информация, изхвърлена от ключодържател с помощта на Keychain Dumper
Както можете да видите от снимката по-горе, цялата информация беше качена (много потребителски имена и пароли). Например можете да видите, че приложението Mail съхранява потребителското име и паролата на вашия акаунт в ключодържател. По същия начин е възможно да намерите паролите на някои безжични мрежи, към които сте се свързвали преди това, както и много друга информация. По подразбиране се качват само групови пароли и пароли за интернет. По-подробна информация за използването може да бъде получена чрез използване на опцията "-h".

Фигура 9: Информация за ключовете, които могат да се използват при стартиране на Key Dumper
За да разтоварите цялата информация, използвайте клавиша "-a".

Фигура 10: Изтегляне на цялата информация от ключодържателя
В тази статия се уверихме, че качването на данни от Keychain е лесно като белене на круши. Въпреки че ключодържателят е много по-добър в защитата на чувствителни данни от NSUserDefaults или plist файлове, не е толкова трудно да се разбие този магазин.