Зачем dylib Free Pascal нужны переменные окружения DYLD? - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть приложение Mac, в основном построенное на XCode, в котором используется динамическая библиотека (dylib), созданная с помощью Free Pascal через Lazarus. Когда я включил функцию Apple «Hardened Runtime», dylib перестал работать, пока я не установил опцию «Разрешить переменные среды DYLD». Это описано как «Позволяет приложению воздействовать на переменные среды DYLD, которые можно использовать для внедрения кода в процесс». Этот бит внедрения кода звучит как то, чего я бы хотел избежать Любая идея, почему это происходит или что я могу с этим поделать?


Чтобы ответить на некоторые вопросы, заданные в комментарии:

Я точно не знаю, что не получилось, так как я не писал dylib. Возможно, он пытался поговорить с сервером через Интернет. Все, что я знаю сейчас, - это то, что он вернул неожиданный и бесполезный код ошибки.

Приложение вызывает функции в dylib, используя dlopen и dlsym. Dylib находится в подкаталоге Contents / Frameworks приложения. Приложение не устанавливает переменные окружения ни в Info.plist, ни в коде.

otool -L вывод для dylib:

@rpath/lib<redacted>.dylib (compatibility version 0.0.0, current version 0.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 22.0.0)
/usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1226.10.1)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1258.1.0)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1259.0.0)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1404.47.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 48.0.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 728.13.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)

otool -L вывод для основного исполняемого файла:

/System/Library/Frameworks/Security.framework/Versions/A/Security (compatibility version 1.0.0, current version 58286.251.4)
/System/Library/Frameworks/AVFoundation.framework/Versions/A/AVFoundation (compatibility version 1.0.0, current version 2.0.0)
/System/Library/Frameworks/AudioToolbox.framework/Versions/A/AudioToolbox (compatibility version 1.0.0, current version 492.0.0)
/System/Library/Frameworks/Accelerate.framework/Versions/A/Accelerate (compatibility version 1.0.0, current version 4.0.0)
/System/Library/Frameworks/CoreMedia.framework/Versions/A/CoreMedia (compatibility version 1.0.0, current version 1.0.0)
@rpath/Quesa.framework/Versions/A/Quesa (compatibility version 1.6.0, current version 2.0.0)
@executable_path/../Frameworks/Ming.framework/Versions/A/Ming (compatibility version 0.0.0, current version 0.0.0)
@rpath/SBEngineLib4.framework/Versions/A/SBEngineLib4 (compatibility version 1.0.0, current version 1.0.0)
/System/Library/Frameworks/Quartz.framework/Versions/A/Quartz (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 274.22.0)
/System/Library/Frameworks/ApplicationServices.framework/Versions/A/ApplicationServices (compatibility version 1.0.0, current version 50.1.0)
/System/Library/Frameworks/Carbon.framework/Versions/A/Carbon (compatibility version 2.0.0, current version 158.0.0)
/System/Library/Frameworks/Cocoa.framework/Versions/A/Cocoa (compatibility version 1.0.0, current version 23.0.0)
/System/Library/Frameworks/AddressBook.framework/Versions/A/AddressBook (compatibility version 1.0.0, current version 1893.0.0)
/System/Library/Frameworks/SystemConfiguration.framework/Versions/A/SystemConfiguration (compatibility version 1.0.0, current version 963.250.1)
/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit (compatibility version 1.0.0, current version 275.0.0)
/System/Library/Frameworks/WebKit.framework/Versions/A/WebKit (compatibility version 1.0.0, current version 607.1.40)
/System/Library/Frameworks/Foundation.framework/Versions/C/Foundation (compatibility version 300.0.0, current version 1570.15.0)
/usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)
/usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 400.9.4)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1252.250.1)
/System/Library/Frameworks/AppKit.framework/Versions/C/AppKit (compatibility version 45.0.0, current version 1671.40.118)
/System/Library/Frameworks/CoreFoundation.framework/Versions/A/CoreFoundation (compatibility version 150.0.0, current version 1570.15.0)
/System/Library/Frameworks/CoreServices.framework/Versions/A/CoreServices (compatibility version 1.0.0, current version 944.3.0)
/System/Library/Frameworks/CoreVideo.framework/Versions/A/CoreVideo (compatibility version 1.2.0, current version 1.5.0)
/System/Library/Frameworks/QuartzCore.framework/Versions/A/QuartzCore (compatibility version 1.2.0, current version 1.11.0)

Обновление: я установил точку останова на dlopen и обнаружил, что рассматриваемый dylib пытался открыть другой dylib, libiconv.dylib, по имени, а не по полному пути. Оказывается, что происходит сбой в закаленной среде выполнения без специального разрешения.

1 Ответ

1 голос
/ 17 апреля 2019

Дилиб Free Pascal, по-видимому, делает dlopen("libiconv.dylib", ...) только с именем файла и без пути.Это зависит от поиска dyld в $LD_LIBRARY_PATH, $DYLD_LIBRARY_PATH, текущем рабочем каталоге и $DYLD_FALLBACK_LIBRARY_PATH (или, если последний не определен, $HOME/lib, /usr/local/lib и /usr/lib).

Однако dyld нигде не будет искать закаленные процессы времени выполнения без разрешения Разрешать переменные среды DYLD.Работать будут только полные пути.

Dylib придется либо как-то изменить (если вы можете), либо вам нужно будет включить Allow DYLD Environment Variables, несмотря на риски (которые я не считаю особеннотяжелая степень).

...