IOKit не разрешен в песочнице?

Я новичок в использовании IOKit и заметил, что я думаю, что песочница приводит к сбою.

Вот тест, который я пытаюсь (на Паскале), который отлично работает вне песочницы, но когда я включаю его, IOServiceOpen каждый раз возвращает ошибку kIOReturnNotPermitted.

IOKit небезопасен в песочнице для определенных сервисов? Я пытался получить некоторые скорости вращения вентилятора / температуру процессора, и я вижу, что в AppStore (в песочнице) есть несколько приложений, которые делают это, поэтому я считаю, что это возможно. Единственный, который я могу подтвердить, похоже, имеет службу XPC, связанную с приложением в качестве помощника, так что, может быть, это ключ к тому, чтобы заставить IOKit работать? Я пробовал в основном все права, и ни один из них, похоже, не помог.

Спасибо за любые ваши идеи.

procedure TestIOKit;
var
    err: kern_return_t;
    masterPort: mach_port_t;
    iterator: io_iterator_t;
    device: io_object_t;
    matchingDictionary: CFMutableDictionaryRef;
    conn: io_connect_t;
begin
    IOMasterPort(0, masterPort);
    matchingDictionary := IOServiceMatching('AppleSMC');
    err := IOServiceGetMatchingServices(masterPort, matchingDictionary, iterator);
    if err <> kIOReturnSuccess then
        writeln('IOServiceGetMatchingServices: ', err);

    device := IOIteratorNext(iterator);
    IOObjectRelease(iterator);
  if device = 0 then
        writeln('no smc found');

    err := IOServiceOpen(device, mach_task_self_, 0, conn);
  if err <> kIOReturnSuccess then
        writeln('IOServiceOpen: ', err);
end;

person GenericPtr    schedule 23.04.2014    source источник
comment
Если вы еще этого не сделали, откройте приложение Console и найдите sandbox. Вы должны получать сообщение с обратной трассировкой каждый раз, когда у вас есть нарушение песочницы.   -  person gaige    schedule 24.05.2014


Ответы (6)


Я обнаружил ту же проблему, пытаясь прочитать ключи SMC, чтобы получить температуру датчика и скорость вращения вентилятора изнутри OSX Yosemite «Today extension». Расширение необходимо поместить в песочницу, и я также получал ошибку kIOReturnNotPermitted каждый раз, когда пытался прочитать датчики температуры и вентилятора.

Единственный способ заставить его работать — это создать службу XPC, которая управляет всеми компонентами SMC, настроенную как агент запуска. Таким образом, изолированное приложение (расширение «сегодня») запрашивает у службы XPC все необходимые данные вместо того, чтобы напрямую связываться с IOKit.

Пока вроде работает нормально.

person Luis Glez    schedule 27.10.2014
comment
Я думал, что это, возможно, был ответ, но я не хотел заниматься изучением служб XPC, пока не был уверен. Спасибо! - person GenericPtr; 29.10.2014
comment
Разве нам не нужно сделать службу XPC изолированной? Я попробовал ваш ответ, но когда в службе XPC включена песочница, IOServiceOpen() не работает. Итак, одобрит ли Apple мое приложение, если у меня отключена песочница в службе XPC? или я что-то пропустил здесь? - person Bhumit Mehta; 27.01.2015
comment
Да, насколько я знаю, это должно быть песочница. Чтобы заставить его работать, мне пришлось добавить временное исключение в файл прав на обслуживание XPC: (com.apple.security.temporary-exception.mach-lookup.global-name: (String) «ваш идентификатор XPCService»). Он отлично работает, если вы не используете Mac App Store для распространения. Однако я не уверен, разрешено ли это для распространения MAS. - person Luis Glez; 27.01.2015
comment
Значит, с помощью песочницы нельзя получить данные о температуре датчиков и скорости вращения вентиляторов? есть ли другие способы получить эти значения, о которых вы знаете? - person Bhumit Mehta; 28.01.2015

Вам не нужен XPC (не уверен, что понимаю, что данный ответ также должен быть помещен в песочницу).

Вы можете использовать это временное право, хотя я не питаю никакой надежды на то, что Apple одобрит его для MAS — вам нужно будет обосновать его использование в iTunes connect. У меня похожая проблема, и это единственное «решение», которое я нашел до сих пор:

com.apple.security.temporary-exception.sbpl string (allow iokit-open)
person Rhys Lewis    schedule 01.02.2016

Я не вижу ответа от Луиса Глеза, предлагающего решение, но неверную информацию.

На самом деле в настоящее время нет способа получить доступ к этим функциям I/O Kit из изолированного приложения и они не будут одобрены Apple для App Store. Если вы проверите статус песочницы приложения от Луиса Глеза, вы увидите, что оно вообще не изолировано. Также он недоступен в App Store, и я предполагаю, что это причина.

Терминал:

codesign --display --entitlements - VitalStats.app

Недавно было обсуждение на форумах разработчиков, и кто-то из Apple подтвердил, что это невозможно.

https://devforums.apple.com/message/1082393#1082393

person Marc T.    schedule 25.09.2015

Решение очень простое. Вам нужно добавить несколько строк в права файла

<key>com.apple.security.temporary-exception.sbpl</key>
<array>
    <string>(allow iokit-open)</string>
    <string>(allow iokit-set-properties (iokit-property "ConsoleUID"))</string>
    <string>(allow mach-lookup (global-name "com.apple.AssetCacheLocatorService"))</string>
</array>

Скриншот

person nab0y4enko    schedule 15.08.2016
comment
...который не будет одобрен Apple для распространения MAS. - person Rhys Lewis; 23.12.2018

Мое приложение было просто отклонено за использование IOKit в целом. У кого-нибудь еще есть такая же проблема? Приложение было одобрено для 60 более ранних сборок, но внезапно у Apple возникли проблемы с этим. Я использую IOKit для чтения информации о батарее, такой как текущее напряжение и т. д.

Отклонено из-за 1.1.6 - Безопасность.

Спасибо за ваше предложение. В ходе проверки мы обнаружили, что ваше приложение не подходит для App Store.

Мы рекомендуем вам пересмотреть концепцию вашего приложения и оценить, можете ли вы включить другой контент и функции, чтобы привести его в соответствие с Руководством по проверке App Store.

person inexcitus    schedule 31.10.2018
comment
Да, мне не удалось создать концепцию, которая соответствовала бы правилам магазина приложений для чтения, мониторинга и управления скоростью и температурой вентилятора. - person Rhys Lewis; 17.02.2019

Для тех, кто все еще может искать ответ, в Catalina проблема может заключаться в том, что приложению сначала необходимо получить разрешение на мониторинг ввода, если оно не предоставлено или не отклонено - вы наверняка получите ошибку kIOReturnNotPermitted.

Чтобы проверить, так ли это, перейдите в «Системные настройки», «Конфиденциальность», выберите «Контроль ввода» и проверьте, разрешено ли ваше приложение.

После предоставления разрешения ошибка должна исчезнуть

person olegthesoundman    schedule 30.07.2020