SIPがオフのmacOSでもセキュアな権限を使いたいメモ
TL;DR
osascript -e 'id of app "アプリ名"'
で対象のバンドルIDを確認した後、tccplus add 権限名 バンドルID
で直接付与すればOK
概要
最近のmacOSにおいて、マイクやカメラなどの一部の権限はアプリ側の権限リクエストダイアログを許可する形でしか付与できない仕組みとなっています。
(他の一般的な権限と異なり、設定から直接付与しようとしてもApps that have requested access to your microphone will appear here.
(マイクの場合)のような表示が出るのみで付与することは出来ません)
ところが、SIP(システム整合性保護)が無効の環境ではリクエストを強制的に拒否(というか破棄?)するようで、正規のフローでは許可すること自体が(おそらく)出来ません。
本来であればSIPを有効に戻せばそれだけで解決できる(こともある)問題ではありますが、様々な理由(?)によりSIPを有効に戻すことが難しい環境においてはそれ以外の方法で権限を付与する必要があります。
tccplus
はそれを行える方法の一つで、TCCフレームワークの内部APIを直接呼び出すことで権限を付与しているようです。
要件
SIPが無効にされていること
公式のREADMEを見た感じ、SIPが有効ではこの方法は使えないようです(それはそう)
対応したバージョンのmacOSであること
あまりにもアバウトですが、リポジトリ自体に何も記載がないため...
一応、わたしの手元ではVenturaで問題なく動いていました。
参考記事ではSonoma上でも問題なく動いていたようなので、当分は特に気にする必要もないかと思います。
下限についてもはっきりとしたことは言えませんが、おそらくTCCが強化されたMojaveあたりかと思われます(未検証, ただしこれ以前ではそもそも使う必要がないはず...)
手順
対象アプリのバンドルIDを特定する
参考記事やREADMEではplistから直接読み取る方法を挙げていますが、個人的にはosascript
を用いた方法が簡単でいいかなと思います。
osascript -e 'id of app "アプリ名"'
で標準出力にバンドルIDが返されます。
tccplusを用いて権限を付与する
tccplus add 権限名 バンドルID
を実行するだけで付与できます。(superuserである必要はありません)
権限一覧
- All
- Accessibility
- AddressBook
- AppleEvents
- Calendar
- Camera
- ContactsFull
- ContactsLimited
- DeveloperTool
- ListenEvent
- Liverpool
- Location
- MediaLibrary
- Microphone
- Motion
- Photos
- PhotosAdd
- PostEvent
- Reminders
- ScreenCapture
- ShareKit
- SinaWeibo
- Siri
- SpeechRecognition
- SystemPolicyAllFiles
- SystemPolicyDesktopFolder
- SystemPolicyDeveloperFiles
- SystemPolicyDocumentsFolder
- SystemPolicyDownloadsFolder
- SystemPolicyNetworkVolumes
- SystemPolicyRemovableVolumes
- SystemPolicySysAdminFiles
- TencentWeibo
- Ubiquity
- Willow
(権限名については公式リポジトリやヘルプでも確認できます。)
これだけでアプリに任意の権限を直接付与することができます。
おまけ
grant() {
tccplus add "$2" "$(osascript -e "id of app \"$1\"")"
}
みたいな関数を任意のシェルのrcファイルで定義しておくとgrant アプリ名 権限名
で付与できて便利かもしれません?
さいごに
沼らせるためにわざとやってますか???????????????????????????????????????????
せめて通知くらいしてくれてもいいと思うの...
参考
Discussion