SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
Знакомство с 
codesign 
Гуменный Руслан
Подписывание кода 
• гарантировать то, что код не был изменен 
• идентифицировать источник кода (разработчика 
или того, кто его подписал) 
• определить, что код имеет право выполнять 
определенные задачи (доступ в keychain, доступ 
в iCloud, …)
Public Key Cryptography 
Суть шифрования с открытым ключом заключается в том, 
что для шифрования данных используется один ключ 
(открытый), а для расшифрования другой (закрытый) 
(поэтому такие системы часто называют ассиметричными).
Сертификат
Сертификат 
публичный ключ + описание
Сертификат
RSA 
• данные зашифрованные при помощи открытого 
ключа, могут быть расшифрованы только при 
помощи закрытого 
• данные зашифрованные при помощи закрытого 
ключа, могут быть расшифрованы только при 
помощи открытого
Цифровая подпись 
Сочетание зашифрованной контрольной суммы (digest) и 
цифрового сертификата
Проверка цифровой 
подписи
Provisioning profile 
Назначение — не допустить запуск кода не разрешенного 
Apple 
• связывает разработчиков и устройства c 
командой (Development Team) 
• определяет, что может делать код 
(entitlements) 
• формируется Apple и изначально подписан
Provisioning profile 
Внутри лежит xml, который можно извлечь командой: 
cms -D -i embedded.mobileprovision
Provisioning profile 
<key>DeveloperCertificates</key> 
<array> 
<data>…</data> 
</array> 
<key>Entitlements</key> 
<dict> 
<key>com.apple.developer.team-identifier</key> 
<string>6TWG7MTXRP</string> 
<key>get-task-allow</key> 
<true/> 
</dict> 
<key>ProvisionedDevices</key> 
<array> 
<string>324a5b08c19f3f8f3c2d65e9432be21069e47e41</string> 
</array> 
developer/distribution certificates (.cer file) в 
base64
Поле DeveloperCertificates 
-----BEGIN CERTIFICATE----- 
MIIFmTC.... 
-----END CERTIFICATE----- 
openssl x509 -text -in tmp.pem.
Что нужно для подписи 
• developer или distribution сертификат 
• приватный ключ для сертификата 
• provisioning profile в котором есть используемый 
сертификат
Что подписываем 
• бинарник основного приложения 
• динамические библиотеки
IPA 
unzip Orders -d Payload
IPA 
Интересные файлы: 
• embedded.mobileprovision 
• PkgInfo 
• _CodeSignature/CodeResources 
• ResourcesRules.plist
PkgInfo 
Является наследием OS X 
Содержит байты {65, 80, 80, 76, 63, 63, 63, 63} 
или строку "APPL????"
CodeResources … 
<dict> 
<key>files</key> 
<dict> 
<key>AppIcon60x60@2x.png</key> 
<data> 
LuxPgpygBTlxoj9r3S14ZCEdwU8= 
</data> 
<key>Assets.car</key> 
<data> 
dJ4xkjYAgGJQMKMCXZOe3q8FgBA= 
…. 
</dict> 
<key>rules</key> 
<dict> 
<key>.*</key> 
<true/> 
<key>Info.plist</key> 
SHA-1 hashes
ResourceRules.plist 
… 
<dict> 
<key>rules</key> 
<dict> 
<key>.*</key> 
<true/> 
<key>Info.plist</key> 
<dict> 
<key>omit</key> 
<true/> 
<key>weight</key> 
<real>10</real> 
</dict> 
<key>ResourceRules.plist</key> 
<dict> 
<key>omit</key> 
<true/> 
<key>weight</key> 
<real>100</real> 
</dict> 
</dict> 
</dict> 
…
Бинарный файл 
• Fat binary (склейка нескольких архитектур, 
armv7, armv7s, arm64) 
• Мach-O (описывает одну архитектуру) 
• Каждая архитектура подписывается отдельно
Fat
Mach-O 
• mach-O состоит из секций 
• подпись лежит в секции LC_CODE_SIGNATURE 
• подпись тоже состоит из секций, которые 
называются blobs
Blobs 
• Requirements 
• Entitlements 
• Code Directory 
• CMS
Requirements Blob 
• размер 12 байт 
• хранит magic-строку
Entitlements Blob 
<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:// 
www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
<key>com.apple.developer.team-identifier</key> 
<string>6TWG7MTXRP</string> 
<key>keychain-access-groups</key> 
<array> 
<string>6TWG7MTXRP.*</string> 
</array> 
<key>application-identifier</key> 
<string>6TWG7MTXRP.*</string> 
<key>get-task-allow</key> 
<true/> 
</dict> 
</plist>
Code Directory Blob 
• хеш от entitlements blob 
• хеш от requirements blob 
• хеш файла CodeResources 
• хеш файл Info.plist 
• набор хешей бинарника разбитого на секции по 
4096 байт
CMS Blob 
• Цифровая подпись (зашифрованный хеш + 
сетрификат) для Code Directory Blob
Команда codesign 
Команда codesign используется для создания, 
проверки и отображения подписей кода. 
http://opensource.apple.com/tarballs/ 
• security_systemkeychain/ 
• libsecurityd 
• libsecurity_utilities 
• libsecurity_cdsa_client 
• libsecurity_cdsa_utilities 
• libsecurity_codesigning
Утилита codesign 
Подписать сборку: 
codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ 
Apts.app/Apts" 
-f удалять существующую подпись 
-s идентификатор сертификата (developer/distribution) 
Получить список идентификаторов: 
security find-identity -v -p codesigning 
1) D5B28E0000920A4C86ED025CBEA94AF8FA88755D "iPhone Developer: Ruslan Gumenniy (J362LCRMQS)" 
2) 60855F0569C7595362202CDDE4E5B1671A1E86CC "iPhone Distribution: e-Legion (96GT47C53G)" 
3) 5BB0183A7B66911A2E36D75E26137456B3A90258 "iPhone Developer: Ruslan Gumenniy (9P8FPFW4PQ)"
Типовые задачи 
• проверить, что AdHoc сборка может запускаться 
на устройстве 
• переподписать сборку с новым сертификатом 
• внедрить свой код
Проверка IPA 
• распаковать ipa как zip файл 
• открыть файл embedded.mobileprovision и найти 
секцию ProvisionedDevices 
• убедиться, что в секции ProvisionedDevices есть 
UDID устройства на которое производится 
установка
Проверка IPA 
Установить плагин для Quick Look 
https://github.com/chockenberry/Provisioning 
https://github.com/ealeksandrov/ProvisionQL
Переподписывание сборки 
• распаковать IPA 
• заменить файл embedded.mobileprovision тем, 
который будет подходить для приватного ключа 
используемого при переподписи 
• удалить файл CodeResources 
• взывать codesign 
• запаковать в ZIP и изменить расширение на IPA
Переподписывание сборки 
#!/bin/sh 
rm Application.resigned.ipa 
rm -rf output 
mkdir output 
unzip ipa/Apts.ipa -d output/extracted > /dev/null 2>&1 
rm -rf Payload/*.app/_CodeSignature 2> /dev/null | true 
/usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ 
Apts.app/Apts" 
/usr/bin/xcrun -sdk iphoneos PackageApplication -v Payload/*.app -o 
“Application.resigned.ipa" --embed ../../support_files/embedded.mobileprovision
Внедрение кода 
• 6-й xCode позволяет собирать динамические 
библиотеки для iOS (раньше надо было править 
конфигурационные файлы xCode) 
• можно собрать динамическую библиотеку dylib и 
сделать так, чтобы приложение загружало ее при 
старте 
https://github.com/fanruten/mach-patcher/
Внедрение кода 
Чтобы не указывать абсолютный путь, можно использовать 
@executable_path/inferno.dylib
Внедрение кода 
• распаковать IPA 
• заменить файл embedded.mobileprovision тем, который будет 
подходить для приватного ключа используемого при 
переподписи 
• удалить файл CodeResources 
• скопировать dylib в бандл 
• модифицировать бинарник (внедрить dylib) 
• взывать codesign для бинарника и dylib 
• запаковать в ZIP и изменить расширение на IPA
Внедрение кода 
#!/bin/sh 
rm Application.resigned.ipa 
rm -rf output 
mkdir output 
unzip ipa/Apts.ipa -d output/extracted > /dev/null 2>&1 
rm -rf Payload/*.app/_CodeSignature 2> /dev/null | true 
mach-patcher Payload/*.app/Artique @executable_path/inferno.dylib 
cp ../../support_files/inferno.dylib Payload/*.app/ 
/usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 Payload/*.app/ 
inferno.dylib 
/usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/Apts.app/Apts" 
/usr/bin/xcrun -sdk iphoneos PackageApplication -v Payload/*.app -o “Application.resigned.ipa" -- 
embed ../../support_files/embedded.mobileprovision
IPA из AppStore 
• зашифрованные 
• можно расшифровать при помощи устройства с 
jailbreak используя Clutch 
• после расшифровки получим IPA, который можно 
подписать и ставить на устройства
IPA из AppStore
Спасибо за внимание 
fanruten@gmail.com 
ruslan.gumenniy@e-legion.com

Weitere ähnliche Inhalte

Ähnlich wie #MBLTdev: Знакомство с codesign (e-Legion)

Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорьdrupalconf
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов ИгорьPVasili
 
Построение защищенного Интернет-периметра
Построение защищенного Интернет-периметраПостроение защищенного Интернет-периметра
Построение защищенного Интернет-периметраCisco Russia
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Yandex
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Yandex
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayAndrey Rebrov
 
Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиAvivi Academy
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияSQALab
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...it-people
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй этоRoman Dvornov
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеKaspersky
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NETPositive Hack Days
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...Cisco Russia
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspbGonchik Tsymzhitov
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформуVadim Kruchkov
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Yandex
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Yandex
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Ontico
 

Ähnlich wie #MBLTdev: Знакомство с codesign (e-Legion) (20)

Easy authcache 2 кеширование для pro родионов игорь
Easy authcache 2   кеширование для pro родионов игорьEasy authcache 2   кеширование для pro родионов игорь
Easy authcache 2 кеширование для pro родионов игорь
 
Easy authcache 2 кэширование для pro. Родионов Игорь
Easy authcache 2   кэширование для pro. Родионов ИгорьEasy authcache 2   кэширование для pro. Родионов Игорь
Easy authcache 2 кэширование для pro. Родионов Игорь
 
Построение защищенного Интернет-периметра
Построение защищенного Интернет-периметраПостроение защищенного Интернет-периметра
Построение защищенного Интернет-периметра
 
Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"Юрий Василевский "Автоматизация в XCode"
Юрий Василевский "Автоматизация в XCode"
 
Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»Юрий Василевский «Автоматизация в XCode»
Юрий Василевский «Автоматизация в XCode»
 
Building deployment pipeline - DevOps way
Building deployment pipeline - DevOps wayBuilding deployment pipeline - DevOps way
Building deployment pipeline - DevOps way
 
Популярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схемиПопулярні способи зломів та шахрайські схеми
Популярні способи зломів та шахрайські схеми
 
Использование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестированияИспользование Open Source инструментов для автоматизации тестирования
Использование Open Source инструментов для автоматизации тестирования
 
"Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно..."Девопс - это не только для программистов. Практические примеры из жизни одно...
"Девопс - это не только для программистов. Практические примеры из жизни одно...
 
Инструментируй это
Инструментируй этоИнструментируй это
Инструментируй это
 
SAP hands on lab_ru
SAP hands on lab_ruSAP hands on lab_ru
SAP hands on lab_ru
 
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетикеАлександр Коротин. Безопасность систем управления турбинами в электроэнергетике
Александр Коротин. Безопасность систем управления турбинами в электроэнергетике
 
Взломать сайт на ASP.NET
Взломать сайт на ASP.NETВзломать сайт на ASP.NET
Взломать сайт на ASP.NET
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...Практические примеры использования API в инфраструктурных продуктах Cisco для...
Практические примеры использования API в инфраструктурных продуктах Cisco для...
 
Jiramania презентации @augspb
Jiramania презентации   @augspbJiramania презентации   @augspb
Jiramania презентации @augspb
 
Как превратить приложение в платформу
Как превратить приложение в платформуКак превратить приложение в платформу
Как превратить приложение в платформу
 
Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"Леонид Васильев "Python в инфраструктуре поиска"
Леонид Васильев "Python в инфраструктуре поиска"
 
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
Подходы и технологии, используемые в разработке iOS-клиента Viber, Кирилл Лаш...
 
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
Микросервисы: опыт использования в нагруженном проекте / Вадим Мадисон (М-Тех)
 

Mehr von e-Legion

MBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, PureMBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, Puree-Legion
 
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricaMBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricae-Legion
 
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba MobileMBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba Mobilee-Legion
 
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha RestoranyMBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha Restoranye-Legion
 
MBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500StartupsMBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500Startupse-Legion
 
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, AviasalesMBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, Aviasalese-Legion
 
MBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank OnlineMBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank Onlinee-Legion
 
Rx Java architecture
Rx Java architectureRx Java architecture
Rx Java architecturee-Legion
 
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, SpotifyMBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, Spotifye-Legion
 
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, WunderlistMBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, Wunderliste-Legion
 
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, SoundcloudMBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, Soundcloude-Legion
 
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&CoMBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&Coe-Legion
 
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, PostforpostMBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, Postforposte-Legion
 
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, ParallelsMBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, Parallelse-Legion
 
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITMBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITe-Legion
 
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, LitresMBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, Litrese-Legion
 
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box e-Legion
 
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, MicrosoftMBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, Microsofte-Legion
 
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank e-Legion
 

Mehr von e-Legion (20)

MBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, PureMBLT16: Elena Rydkina, Pure
MBLT16: Elena Rydkina, Pure
 
MBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetricaMBLT16: Alexander Lukin, AppMetrica
MBLT16: Alexander Lukin, AppMetrica
 
MBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba MobileMBLT16: Vincent Wu, Alibaba Mobile
MBLT16: Vincent Wu, Alibaba Mobile
 
MBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha RestoranyMBLT16: Dmitriy Geranin, Afisha Restorany
MBLT16: Dmitriy Geranin, Afisha Restorany
 
MBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500StartupsMBLT16: Marvin Liao, 500Startups
MBLT16: Marvin Liao, 500Startups
 
MBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, AviasalesMBLT16: Andrey Maslak, Aviasales
MBLT16: Andrey Maslak, Aviasales
 
MBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank OnlineMBLT16: Andrey Bakalenko, Sberbank Online
MBLT16: Andrey Bakalenko, Sberbank Online
 
Rx Java architecture
Rx Java architectureRx Java architecture
Rx Java architecture
 
Rx java
Rx javaRx java
Rx java
 
MBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, SpotifyMBLTDev15: Hector Zarate, Spotify
MBLTDev15: Hector Zarate, Spotify
 
MBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, WunderlistMBLTDev15: Cesar Valiente, Wunderlist
MBLTDev15: Cesar Valiente, Wunderlist
 
MBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, SoundcloudMBLTDev15: Brigit Lyons, Soundcloud
MBLTDev15: Brigit Lyons, Soundcloud
 
MBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&CoMBLTDev15: Egor Tolstoy, Rambler&Co
MBLTDev15: Egor Tolstoy, Rambler&Co
 
MBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, PostforpostMBLTDev15: Alexander Orlov, Postforpost
MBLTDev15: Alexander Orlov, Postforpost
 
MBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, ParallelsMBLTDev15: Artemiy Sobolev, Parallels
MBLTDev15: Artemiy Sobolev, Parallels
 
MBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DITMBLTDev15: Alexander Dimchenko, DIT
MBLTDev15: Alexander Dimchenko, DIT
 
MBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, LitresMBLTDev: Evgeny Lisovsky, Litres
MBLTDev: Evgeny Lisovsky, Litres
 
MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box MBLTDev: Alexander Dimchenko, Bright Box
MBLTDev: Alexander Dimchenko, Bright Box
 
MBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, MicrosoftMBLTDev15: Konstantin Goldshtein, Microsoft
MBLTDev15: Konstantin Goldshtein, Microsoft
 
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
MBLTDev15: Anna Mikhina, Maxim Evdokimov, Tinkoff Bank
 

#MBLTdev: Знакомство с codesign (e-Legion)

  • 1. Знакомство с codesign Гуменный Руслан
  • 2. Подписывание кода • гарантировать то, что код не был изменен • идентифицировать источник кода (разработчика или того, кто его подписал) • определить, что код имеет право выполнять определенные задачи (доступ в keychain, доступ в iCloud, …)
  • 3. Public Key Cryptography Суть шифрования с открытым ключом заключается в том, что для шифрования данных используется один ключ (открытый), а для расшифрования другой (закрытый) (поэтому такие системы часто называют ассиметричными).
  • 7. RSA • данные зашифрованные при помощи открытого ключа, могут быть расшифрованы только при помощи закрытого • данные зашифрованные при помощи закрытого ключа, могут быть расшифрованы только при помощи открытого
  • 8. Цифровая подпись Сочетание зашифрованной контрольной суммы (digest) и цифрового сертификата
  • 10. Provisioning profile Назначение — не допустить запуск кода не разрешенного Apple • связывает разработчиков и устройства c командой (Development Team) • определяет, что может делать код (entitlements) • формируется Apple и изначально подписан
  • 11. Provisioning profile Внутри лежит xml, который можно извлечь командой: cms -D -i embedded.mobileprovision
  • 12. Provisioning profile <key>DeveloperCertificates</key> <array> <data>…</data> </array> <key>Entitlements</key> <dict> <key>com.apple.developer.team-identifier</key> <string>6TWG7MTXRP</string> <key>get-task-allow</key> <true/> </dict> <key>ProvisionedDevices</key> <array> <string>324a5b08c19f3f8f3c2d65e9432be21069e47e41</string> </array> developer/distribution certificates (.cer file) в base64
  • 13. Поле DeveloperCertificates -----BEGIN CERTIFICATE----- MIIFmTC.... -----END CERTIFICATE----- openssl x509 -text -in tmp.pem.
  • 14. Что нужно для подписи • developer или distribution сертификат • приватный ключ для сертификата • provisioning profile в котором есть используемый сертификат
  • 15. Что подписываем • бинарник основного приложения • динамические библиотеки
  • 16. IPA unzip Orders -d Payload
  • 17. IPA Интересные файлы: • embedded.mobileprovision • PkgInfo • _CodeSignature/CodeResources • ResourcesRules.plist
  • 18. PkgInfo Является наследием OS X Содержит байты {65, 80, 80, 76, 63, 63, 63, 63} или строку "APPL????"
  • 19. CodeResources … <dict> <key>files</key> <dict> <key>AppIcon60x60@2x.png</key> <data> LuxPgpygBTlxoj9r3S14ZCEdwU8= </data> <key>Assets.car</key> <data> dJ4xkjYAgGJQMKMCXZOe3q8FgBA= …. </dict> <key>rules</key> <dict> <key>.*</key> <true/> <key>Info.plist</key> SHA-1 hashes
  • 20. ResourceRules.plist … <dict> <key>rules</key> <dict> <key>.*</key> <true/> <key>Info.plist</key> <dict> <key>omit</key> <true/> <key>weight</key> <real>10</real> </dict> <key>ResourceRules.plist</key> <dict> <key>omit</key> <true/> <key>weight</key> <real>100</real> </dict> </dict> </dict> …
  • 21. Бинарный файл • Fat binary (склейка нескольких архитектур, armv7, armv7s, arm64) • Мach-O (описывает одну архитектуру) • Каждая архитектура подписывается отдельно
  • 22. Fat
  • 23. Mach-O • mach-O состоит из секций • подпись лежит в секции LC_CODE_SIGNATURE • подпись тоже состоит из секций, которые называются blobs
  • 24. Blobs • Requirements • Entitlements • Code Directory • CMS
  • 25. Requirements Blob • размер 12 байт • хранит magic-строку
  • 26. Entitlements Blob <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http:// www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>com.apple.developer.team-identifier</key> <string>6TWG7MTXRP</string> <key>keychain-access-groups</key> <array> <string>6TWG7MTXRP.*</string> </array> <key>application-identifier</key> <string>6TWG7MTXRP.*</string> <key>get-task-allow</key> <true/> </dict> </plist>
  • 27. Code Directory Blob • хеш от entitlements blob • хеш от requirements blob • хеш файла CodeResources • хеш файл Info.plist • набор хешей бинарника разбитого на секции по 4096 байт
  • 28. CMS Blob • Цифровая подпись (зашифрованный хеш + сетрификат) для Code Directory Blob
  • 29. Команда codesign Команда codesign используется для создания, проверки и отображения подписей кода. http://opensource.apple.com/tarballs/ • security_systemkeychain/ • libsecurityd • libsecurity_utilities • libsecurity_cdsa_client • libsecurity_cdsa_utilities • libsecurity_codesigning
  • 30. Утилита codesign Подписать сборку: codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ Apts.app/Apts" -f удалять существующую подпись -s идентификатор сертификата (developer/distribution) Получить список идентификаторов: security find-identity -v -p codesigning 1) D5B28E0000920A4C86ED025CBEA94AF8FA88755D "iPhone Developer: Ruslan Gumenniy (J362LCRMQS)" 2) 60855F0569C7595362202CDDE4E5B1671A1E86CC "iPhone Distribution: e-Legion (96GT47C53G)" 3) 5BB0183A7B66911A2E36D75E26137456B3A90258 "iPhone Developer: Ruslan Gumenniy (9P8FPFW4PQ)"
  • 31. Типовые задачи • проверить, что AdHoc сборка может запускаться на устройстве • переподписать сборку с новым сертификатом • внедрить свой код
  • 32. Проверка IPA • распаковать ipa как zip файл • открыть файл embedded.mobileprovision и найти секцию ProvisionedDevices • убедиться, что в секции ProvisionedDevices есть UDID устройства на которое производится установка
  • 33. Проверка IPA Установить плагин для Quick Look https://github.com/chockenberry/Provisioning https://github.com/ealeksandrov/ProvisionQL
  • 34. Переподписывание сборки • распаковать IPA • заменить файл embedded.mobileprovision тем, который будет подходить для приватного ключа используемого при переподписи • удалить файл CodeResources • взывать codesign • запаковать в ZIP и изменить расширение на IPA
  • 35. Переподписывание сборки #!/bin/sh rm Application.resigned.ipa rm -rf output mkdir output unzip ipa/Apts.ipa -d output/extracted > /dev/null 2>&1 rm -rf Payload/*.app/_CodeSignature 2> /dev/null | true /usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/ Apts.app/Apts" /usr/bin/xcrun -sdk iphoneos PackageApplication -v Payload/*.app -o “Application.resigned.ipa" --embed ../../support_files/embedded.mobileprovision
  • 36. Внедрение кода • 6-й xCode позволяет собирать динамические библиотеки для iOS (раньше надо было править конфигурационные файлы xCode) • можно собрать динамическую библиотеку dylib и сделать так, чтобы приложение загружало ее при старте https://github.com/fanruten/mach-patcher/
  • 37. Внедрение кода Чтобы не указывать абсолютный путь, можно использовать @executable_path/inferno.dylib
  • 38. Внедрение кода • распаковать IPA • заменить файл embedded.mobileprovision тем, который будет подходить для приватного ключа используемого при переподписи • удалить файл CodeResources • скопировать dylib в бандл • модифицировать бинарник (внедрить dylib) • взывать codesign для бинарника и dylib • запаковать в ZIP и изменить расширение на IPA
  • 39. Внедрение кода #!/bin/sh rm Application.resigned.ipa rm -rf output mkdir output unzip ipa/Apts.ipa -d output/extracted > /dev/null 2>&1 rm -rf Payload/*.app/_CodeSignature 2> /dev/null | true mach-patcher Payload/*.app/Artique @executable_path/inferno.dylib cp ../../support_files/inferno.dylib Payload/*.app/ /usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 Payload/*.app/ inferno.dylib /usr/bin/codesign -f -s DEEF9D402F5FFC986C86FCDC236090C6186FE6E9 "Payload/Apts.app/Apts" /usr/bin/xcrun -sdk iphoneos PackageApplication -v Payload/*.app -o “Application.resigned.ipa" -- embed ../../support_files/embedded.mobileprovision
  • 40. IPA из AppStore • зашифрованные • можно расшифровать при помощи устройства с jailbreak используя Clutch • после расшифровки получим IPA, который можно подписать и ставить на устройства
  • 42. Спасибо за внимание fanruten@gmail.com ruslan.gumenniy@e-legion.com