Заблокировать доступ приложения для чтения/записи к определенному файлу в OS X?

Предпосылка такова:

У меня есть приложение, в коде которого указано, что оно работает только в версиях OS X с 10.4 по 10.9.2. (Когда я пытаюсь установить его, он выдает сообщение «Эта версия ____ предназначена для Mac OS X 10.4–10.9.2».). Я обновился до 10.9.3, и разработчику просто нужно обновить приложение, чтобы исправить это ограничение в своем инструменте.

На самом деле я связываюсь с разработчиком, который говорит, что он «слишком занят», чтобы работать над приложением или выпускать обновление прямо сейчас.

Я понял, что приложение просто читает, /System/Library/CoreServices/SystemVersion.plistчтобы определить версию ОС, и мне удалось обойти его ограничение установщика, временно отредактировав файл с помощью этого руководства. Но после возврата значений plist к 10.9.3 и перезагрузки системы, чтобы начать (надеюсь) использовать приложение, я увидел, что оно даже проверяет SystemVersion.plistдаже запуск — не только во время установки.

Я беспокоюсь, что если я останусь SystemVersion.plistна 10.9.2 на неопределенный срок, это разрушит другие части системы, такие как обновления App Store и тому подобное.

Итак, моя идея сейчас состоит в том, чтобы попытаться найти какой-нибудь метод или инструмент, чтобы заблокировать возможность приложения даже читать полностью SystemVersion.plist — думайте об этом как о версии Little Snitch с «файловой системой» , если хотите — просто какой-то способ создать пользовательский правила для конкретных процессов, которые запрещают доступ на чтение и/или запись к определенным файлам/папкам в системе.

Возможно, это просто приведет к тому, что приложение выдаст ошибку и вообще не запустится (я мог бы проверить это, временно переместив файл plist в корзину всего на 30 секунд при попытке установить/запустить его) - но в любом случае, я думаю это действительно полезная вещь для мощных целей безопасности — точно так же, как настраиваемая блокировка доступа к сети для приложений в Little Snitch .

Так есть ли какой-нибудь замечательный сторонний инструмент или даже родной инструмент OS X / Xcode, который может это сделать? Любое понимание того, что вообще должно произойти в любом случае, с точки зрения системы/программирования? Настройка с помощью «Общий доступ и хурма» для файла в Finder позволяет мне контролировать доступ пользователей , но не процесс.

Какое значение в /Applications/APPNAME/Contents/info.plist для <key>LSMinimumSystemVersion</key>? Существует ли один?
Гах - на самом деле, это предварительное «приложение» (в любом случае не осознавал, что это было так, как оно находится в строке меню os x) - теперь попытается определить местоположение своих файлов и / или есть ли у него даже такой plist файл внутри него.
Обновление - в файле .prefpane, как в его основном файле, Info.plistтак и Info.plistво вложенном файле .app внутри, нет такой строки. В любом случае, изначально он проверялся в файле установщика, в установщике код для проверки версии ОС оказался в самом скомпилированном исполняемом файле Mac.
попытайтесь добавить в info.plist следующее: <key>LSMinimumSystemVersion</key><string>10.6</string> #посмотрите, поможет ли это. Я не даю ответа, потому что не уверен, что это сработает.
Проблема в том, что приложение также требует максимальной версии ОС. Справляется ли с этим LSMinimumSystemVersion или только минимум? На самом деле, приложение на самом деле указывает определенный диапазон (и я предполагаю, что оно обеспечивает соблюдение обоих концов, поскольку оно, безусловно, делает верхнее) - ах, и на самом деле я думаю, что помню, как пытался добавить эту строку со значением 10.9.3 в установщик .app файл (несколько дней назад), и это не сработало, поэтому я сейчас сделаю вывод, что это не сработает и с .prefPane! :/

Ответы (2)

Вы можете просто использовать встроенные функции песочницы Mac OS X.

Создайте собственный профиль, который ограничивает доступ к файлу SystemVersion.plist, используя следующий синтаксис:

(version 1)
(deny file* (literal "/System/Library/CoreServices/SystemVersion.plist"))
(allow default)

Сохраните это, например, как ~/myprofile.sb, а затем запустите свою программу следующим образом:

sandbox-exec -f ~/myprofile.sb "/Application/My Program.app/Contents/MacOS/My Program"
это звучит блестяще, но я только что понял, что на самом деле это предварительное «приложение» - интересно, можно ли его все еще использовать в песочнице?
Я думаю, вы могли бы просто запустить "open -a system\preferences" с помощью sandbox-exec для достижения этой цели.
Спасибо за это, я начну с того, что попробую его в установщике .app в качестве простого первого теста - я получаю сообщение об ошибке «несвязанная переменная: отрицать», хотя: /.
Проверьте в документации правильный синтаксис для всего файла политики или начните с одного из примеров. Я просто описывал особенности ограничения доступа к этому файлу.
Да, я погуглю, и я уверен, что решу это, спасибо за ваше руководство, и однажды / если я заработаю, поставлю +1 и отмечу ваш ответ как принятый, спасибо !!
Итак, в конце концов я получил код, работающий, но установщик моего приложения выдает сообщение «Прервать ловушку: 6». Я считаю, что это мера, чтобы не запускать, если он не может проверить SystemVersion.plist, как я подозревал, что может. Но, по крайней мере, теперь мы обрисовываем в общих чертах основную процедуру для этой действительно классной общей функции безопасности; это работало с другими приложениями просто отлично! Тем не менее, было бы неплохо опробовать вашу идею изолирования Системных настроек в песочнице. Но когда я попробовал это ( sandbox-exec -f ~/myprofile.sb "/Applications/System Preferences.app/Contents/MacOS/System Preferences"), он также выдал ловушку Abort 6 - есть идеи?
Вы пытались запустить Системные настройки только с профилем разрешения по умолчанию? (т.е. без отказа в доступе к файлу SystemVersion.plist) - Если это не приводит к сбою, мы знаем, что это связано именно с SystemVersion.plist. Идея состоит в том, чтобы позволить SystemVersion.plist быть именованным каналом, а не файлом. Другой конец этого канала будет отправлять исходное содержимое SystemVersion.plist при первом чтении и измененный номер версии во второй раз. Я не проверял это, поэтому я не знаю, будет ли это работать, но звучит правдоподобно.
Хорошее мышление - да, запуск с ним просто (allow default)отлично работает! Что хорошо (я думаю) - парень, ты пока на высоте! Вы гуру!!! Я тоже многому учусь, спасибо. Итак, перейдем к идее с именованными каналами (и снова я должен сначала проверить это на установщике приложения .app) — какие несколько команд я должен выполнить, чтобы настроить это? Немного погуглил и нуждаюсь в руководстве, как это сделать :). Спасибо. Я пока продолжу гуглить, но чувствую себя немного в глубоком конце (это действительно продвинутый, неясный материал) и, конечно же, не хочу все испортить ... в любом случае будет хорошо задокументировать все это.
Вы запускаете команду «mkfifo/Library/Preferences/SystemVersion.plist», чтобы создать fifo в файловой системе. Затем вы запускаете команду типа «cat originalversion > /Library/Preferences/SystemVersion.plist», чтобы отправить исходную версию файла, и аналогично снова с измененным файлом.
К сожалению, sandbox-exec помечен как устаревший в текущем выпуске Mojave. Кажется, что Apple не смогла сделать песочницу полезной, не сделав программы-песочницы бесполезными.

Приложение Hands Off имеет эту функцию:

Мониторинг доступа к диску

Приложения, присутствующие на вашем компьютере, могут свободно считывать, хранить или удалять информацию на вашем компьютере без вашего ведома. Используя Hands Off!, вы можете отслеживать и контролировать доступ к диску со стороны всех приложений, чтобы они не могли получить конфиденциальную информацию, стереть ваши данные или сохранить файлы cookie.

И это включает в себя функцию сетевого брандмауэра Little Snitch.

https://www.macworld.com/article/3190149/little-flocker-reincarnates-at-f-secure-in-free-beta.html :

Little Flocker, инструмент, который ограничивает доступ приложений и системных процессов к файлам без разрешения. Он не смог сообщить подробности, но недавно F-Secure, ведущая компания по разработке и анализу безопасности, объявила о покупке Little Flocker, которая была переименована в Xfence.

MacOS Catalina теперь имеет аналогичную функцию:

Защита данных

macOS Catalina согласовывает с вами, прежде чем разрешить приложению доступ к вашим данным в папках «Документы», «Рабочий стол» и «Загрузки»; айклауд диск; папки сторонних поставщиков облачных хранилищ; съемные медиа; и внешние объемы. Кроме того, вас спросят, прежде чем приложение сможет выполнить регистрацию ключей или сделать фото- или видеозапись вашего экрана.