Как скомпилировать инфраструктуру безопасности Apple?

Я пытаюсь скомпилировать собственную копию Apple Security.framework, в частности версии 55471.14.18, которая была включена в OS X 10.9.5 и исходный код которой можно загрузить с https://opensource.apple.com/tarballs/Security . /Безопасность-55471.14.18.tar.gz .

Я использую копию Mac OS X 10.9.5 на виртуальной машине. Xcode 6.2 был установлен и xcode-select --installотдельно запущен для получения системных заголовков.


В файле readme, включенном в исходную загрузку, говорится:

Чтобы построить этот проект в среде Darwin (в отличие от сборки собственными силами в Apple), используйте стиль сборки Darwin. Если вы строите с помощью Xcode, выберите «Darwin» во всплывающем окне «Активный стиль сборки». Если вы строите из командной строки, укажите стиль сборки следующим образом:

% xcodebuild -buildstyle установка Дарвина

Но когда я запускаю данную команду, мне говорят:

xcodebuild: error: option '-buildstyle' is no longer supported

Поскольку моя копия Xcode была актуальной на момент выпуска этого кода, я не уверен, что делать с этой ошибкой. Я решил проигнорировать это и продолжить с помощью стандартной xcodebuildкоманды.


Первую проблему, с которой я столкнулся, было легко исправить, но я беспокоюсь, что упускаю что-то большее. Компилятор жалуется:

/Users/Jonathan/Desktop/Security-55471.14.18/libsecurity_utilities/lib/macho++.cpp:39:18: error: 
unused variable 'MAX_ARCH_COUNT' [-Werror,-Wunused-const-variable]
static const int MAX_ARCH_COUNT = 100;

Поскольку переменная, как сообщается, в любом случае не используется, я просто открыл файл и закомментировал строку static const int MAX_ARCH_COUNT = 100;.


К сожалению, здесь я столкнулся с кирпичной стеной. Xcodebuild, похоже, хочет использовать всевозможные заголовки, которых нет в моей системе или которые включены в проект. Например:

/Users/Jonathan/Desktop/Security-55471.14.18/libsecurity_utilities/lib/mach++.cpp:33:10: fatal error: 
      'bootstrap_priv.h' file not found
#include <bootstrap_priv.h>

Эти заголовки тоже с открытым исходным кодом, и я знаю, где их найти! Bootstrap_priv.h, например, является частью launchd; версию OS X 10.9.5 можно загрузить с https://opensource.apple.com/tarballs/launchd/launchd-842.92.1.tar.gz .

Однако я не понимаю, куда я должен поместить эти заголовки, чтобы компилятор их нашел! Что я пробовал:

  • Копируем проект launchd в /usr/include/
  • Копирование проекта launchd в корень проекта безопасности
  • Копирование только Bootstrap_priv.h в /usr/include/
  • Копирование только bootstrap_priv.h в корень проекта безопасности
  • Копирование только bootstrap_priv.h в каталог проекта/libsecurity_utilities/lib/

Эта последняя попытка действительно позволила мне обойти ошибку (и увидеть следующий отсутствующий заголовок IOPMLibPrivate.h), но я совершенно уверен, что это не то, что я должен делать! Поскольку я продолжаю добавлять заголовки в случайные места в проекте, другие исходные файлы застревают, обнаруживая заголовки, которые я уже скопировал в другом месте. Некоторые из самих заголовков застревают таким образом, ожидая другого относительного пути для зависимостей, чем тот, который, по-видимому, нужен основному проекту.


Я чувствую себя здесь крайне не в своей тарелке! Куда на самом деле должны идти эти файлы заголовков, и что означает эта -buildstyleопция, которую я должен включить, но которую нельзя запустить? Ничего из этого нигде не задокументировано!

Это не совсем уместно в вопросе, но поскольку я подозреваю, что кто-то спросит... моя конечная цель - перенести некоторые новые шифры SSL на эту старую версию Security.framework, чтобы Mavericks мог взаимодействовать с современным сеть! Смогу ли я на самом деле заставить этот код работать — открытый вопрос, но одно за другим — просто заставить оригинал скомпилироваться — это необходимый первый шаг!
Глядя на вопрос, вам нужно потратить время на управление и создание проектов на основе c. Чтобы вы знали достаточно, чтобы отладить это самостоятельно. ответ здесь был бы слишком длинным b
Текущие включения cpp находятся в /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/chronoтаком состоянии, что стоит попробовать. Также есть способ добавить включаемые пути к компилятору: stackoverflow.com/questions/5846804/… но все это кажется не по теме и подходит для stackoverflow
На самом деле я не научился программировать на разных ОС и делать сборки по мере необходимости. Для сборок, возможно, посмотрите на macports и посмотрите, как это работает, и исправьте некоторые из их билетов. Homebrew также может быть возможен
Обычно, если у вас есть файл xcodeproj, вы можете открыть его в xcode, перейти к настройкам сборки и добавить его в пути поиска заголовков. Кажется, что xcodeproj действительно входит в состав пакета, так что вы можете попробовать это. Я также заинтересован в том, чтобы продолжить ваши поиски новых шифров! Пожалуйста, опубликуйте что-нибудь, если вы добьетесь какого-либо прогресса.
(продолжение) Хотя я считаю, что для использования Mavericks с современной сетью может быть проще полностью обойти собственный безопасный транспорт и просто использовать openssl. Вы можете связать большинство инструментов командной строки с openssl, и любой браузер, не поддерживающий Safari, использует собственную реализацию ssl (boringssl, openssl и т. д.).
@ 1110101001 Спасибо! Не знаю, почему я изначально так настроился на использование командной строки! Это позволило мне значительно продвинуться в процессе компиляции, хотя я все еще получаю некоторые ошибки, связанные с необъявленными объектами. Сегодня я также нашел кое-что, что одновременно разочаровывает и обнадеживает: кто-то еще получил это для компиляции, но я не могу воспроизвести его с помощью SDK. github.com/samdmarshall/OSXPrivateSDK/blob/master/OpenSource.md
@ 1110101001 Я согласен с инструментами с открытым исходным кодом — я хочу исправить приложения Mac с графическим интерфейсом, которые используют безопасный транспорт Apple. Apple Mail, NetNewsWire, различные виджеты Dashboard и т. д. имеют проблемы с SSL.
> Я все еще получаю сообщения об ошибках, связанных с необъявленными объектами. Какую ошибку вы получаете? Являются ли эти символы частью дополнительных заголовков или они полностью отсутствуют? В том проекте, на который вы ссылаетесь, упоминается, что они не пробовали его с security.framework. Возможно, стоит открыть вопрос на этой странице, поскольку у них может быть больше опыта в отладке этого.
Также это может быть сумасшествием, но в крайнем случае вы можете попробовать настроить какой-нибудь прокси-сервер TLS, а затем перехватывать/ретранслировать запросы. Конечно, это не очень элегантно, так как вы, по сути, используете MITM для своей собственной системы, и вам нужно будет добавить свой собственный корневой сертификат. Немного более чистый вариант, когда вы заранее знаете домены, к которым подключаетесь, может заключаться в бинарном исправлении вашей цели, чтобы она подключалась через простой http к домену, которым вы управляете, который вы затем можете ретранслировать. Насколько легко это сделать, зависит от конкретного приложения, на которое вы ориентируетесь.

Ответы (1)

Это оказалось намного сложнее, чем, я думаю, правильно подходит для формата вопросов и ответов на этом сайте. Тем не менее, я не хотел оставлять этот вопрос висящим, так как я получил структуру для создания, своего рода.

Этот репозиторий должен быть полностью собран в 10.9.5 с последней совместимой версией xCode и с использованием SDK 10.9. https://github.com/Wowfunhappy/Wowfunhappy-Mavericks-Security-Framework

Я использовал «Пути поиска пользовательской платформы» для добавления библиотек, но, поскольку это абсолютный, а не относительный путь, вам может потребоваться обновить его на вашем компьютере. Это должно быть тривиально, даже если это немного утомительно — все актуальные фреймворки включены в репозиторий Git. Эти фреймворки представляют собой комбинацию opensource.apple.com (предпочтительнее везде, где доступно по понятным причинам), реконструированного частного SDK samdmarshall и проекта Darling.

Созданный Framework, похоже, на самом деле не работает — замена его на моем жестком диске приводит к тому, что компьютер (к счастью, виртуальная машина) не может загружаться. Сначала я ожидал, что это будет проблема с подписью кода, но похоже, что проблема не в этом. Но, тем не менее, построил!

tl; dr Я не делал какой-то глупой оплошности, выпуски Apple с открытым исходным кодом практически невозможно построить без дополнительного реверс-инжиниринга. К счастью, эта работа по обратному инжинирингу в значительной степени была проделана различными проектами, но, по-видимому, не до такой степени, чтобы вы могли создать что-то, что действительно работает.

@ 1110101001 (Потому что вы просили обновления) Я последовал вашему совету с прокси-сервером, весь https-трафик теперь проходит через Squid, и он отлично работает! forums.macrumors.com/threads/…
Хорошая работа! (По какой-то причине stackexchange не уведомил меня о вашем упоминании). Возможно, вы сможете получить больше информации о причине сбоя загрузки, загрузившись в однопользовательском режиме. Но у меня есть ощущение, что, возможно, в версии платформы с открытым исходным кодом, которую они предоставляют, могут отсутствовать некоторые из необходимых частных функций.
Ух ты. Это исходное дерево, как известно, сложно скомпилировать, поскольку оно зависит от внутренних и частных инструментов, которые не были задокументированы/выпущены или реконструированы, насколько мне известно. Большое спасибо за посты
Вам когда-нибудь удавалось выяснить, какие отсутствующие символы препятствуют загрузке? Возможно, альтернативой компиляции всего Security.framework может быть просто скомпилировать, SecureTransportа затем выполнить некоторую магию повторного экспорта, чтобы символы в вашем коде переопределяли символы в системном Security.framework.
Хотя я подозреваю, что этого может быть недостаточно, поскольку слою какао потенциально может потребоваться знать о новых наборах шифров (не уверен на 100%). Как насчет альтернативной идеи: в предположении, что большинство приложений какао будут использовать NSURLConnection, вы используете свою собственную реализацию, которая использует ваш собственный openssl.
@ 1110101001 Я никогда не рассматривал это дальше этого момента. У меня было ощущение, что я уже проделал столько операций, чтобы вообще его построить, что шансы привести его в рабочее состояние были чрезвычайно малы, не говоря уже об обновлении наборов шифров. Чтобы усугубить ситуацию, причина, по которой я думал, что обновление фреймворка вообще возможно, заключалась в том, что Internezel сделал это для Leopard ( sourceforge.net/projects/leopard-webkit/files/… ), но с тех пор я слышал от пользователей Leopard что даже эта попытка была полусломанной.
@ 1110101001 Вместо этого я последовал вашему совету и настроил прокси-сервер mitm. Несмотря на то, что это кажется немного неуклюжим, это действительно работает очень хорошо! Время от времени я сталкиваюсь с приложением или утилитой, которая делает что-то раздражающее (например, учитывает настройки системного прокси, но не статус доверия доступа к связке ключей), но это не часто. Я разместил установочный пакет для этого на своем веб-сайте, и многие люди, судя по количеству загрузок, используют его! jonathanalland.com/old-osx-projects.html
@ 1110101001 Мне очень нравится идея swizzle, у меня мог бы быть плагин SIMBL, который просто делает это во всех приложениях! Я, вероятно, не буду возиться с этим, так как у меня работает настройка прокси, но это хороший вариант. (Кроме того, у меня сейчас немного меньше свободного времени, чем в разгар пандемии.)