macOS App Sandboxについて（Flutterを書いていたら気になったので）調べた

## 結論
答えは[ここ（公式ドキュメント）](https://developer.apple.com/documentation/xcode/configuring-the-macos-app-sandbox)に書いてあった。
以下要約。google翻訳した。
> App Sandboxは、 macOSが提供し、カーネルレベルで強制するアクセス制御テクノロジです。サンドボックスの主な機能は、ユーザーが侵害されたアプリを実行した場合に、システムとユーザーのデータへの損害を抑えることです。サンドボックスはアプリに対する攻撃を防ぐことはできませんが、アプリが適切に機能するために必要な最小限の権限セットに制限することで、攻撃が成功した場合に引き起こされる被害を軽減します。

macOSのセキュリティの１つ。
Mac App Store を通じてmacOSアプリを配布するには、App Sandbox 機能を有効にする必要がある。
つまりApp Sandbox の権限許可がないと、端末の通信、カメラやマイクなどの機能、ファイルへのアクセスなどは使えないということだ。

知っておいて損はなさそうだ。

## そもそもサンドボックスとは何か
[こちら](https://eset-info.canon-its.jp/malware_info/special/detail/201117.html)に詳しく書かれていた。

引用すると、以下のようになる。
> - Sandbox とは、隔離された領域でプログラムを実行する技術のこと
>   - 問題発生時においてもほかのプログラムに影響を及ぼさない
>   - ファイルの読み書き、マイクやカメラへのアクセス等が要求される際、明示的許可がない場合はサンドボックス内で実行されるプログラムによるアクセスを制限する
> - 受信メールをサンドボックスで解析し、マルウェアを検知するのは代表的な例
> - モバイル端末ではiOSやAndroidといったOSが、アプリをサンドボックス内で実行するように設計されている
>     - 公式のアプリストアからダウンロードしたアプリであっても、サードパーティが開発したアプリは不具合が含まれる可能性があるため、セキュリティリスクが懸念される。そのリスクをOS側で防御する、という思想となっているのだ

## Flutterにおける macOS App Sandbox
Flutterプロジェクト内で記述されているファイルは２つある。
- `DebugProfile.entitlements`
- `Release.entitlements`
名前の通り、DebugとReleaseでサンドボックスの設定を分けることができるらしい。
初期の中身は今の通り。

```DebugProfile.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.app-sandbox</key>
	<true/>
	<key>com.apple.security.cs.allow-jit</key>
	<true/>
	<key>com.apple.security.network.server</key>
	<true/>
</dict>
</plist>
```

```Release.entitlements
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>com.apple.security.app-sandbox</key>
	<true/>
</dict>
</plist>
```

中身はxmlで記述されている。
`<dict> </dict>`内に記述していくようだ。
記述する内容については、[こちら（公式APIドキュメント）](https://developer.apple.com/documentation/security/app_sandbox)に記載されていた。

## App Sandbox API について
要約して以下にまとめた。値は全てboolean (true or false)。

#### 必須項目
| key |　説明 |
| :--: | :--: |
| com.apple.security.app-sandbox | Sandboxそのものを使用するか |

#### Network
| key |　説明 |
| :--: | :--: |
| com.apple.security.network.server | 受信ネットワーク接続をリッスンできるか |
| com.apple.security.network.client | 発信ネットワーク接続を開くことができるか |

#### Hardware
| key |　説明 |
| :--: | :--: |
| com.apple.security.device.camera | 内蔵・外部カメラを使用できるかどうか |
| com.apple.security.device.microphone | マイクを使用できるかどうか |
| com.apple.security.device.usb | USB デバイスを使用できるかどうか |
| com.apple.security.print | ドキュメントを印刷できるかどうか |
| com.apple.security.device.bluetooth | Bluetooth デバイスを使用できるかどうか |

#### App Data
| key |　説明 |
| :--: | :--: |
| com.apple.security.personal-information.addressbook | 連絡先に読み取り/書き込みできるかどうか |
| com.apple.security.personal-information.location | 位置情報にアクセスできるかどうか |
| com.apple.security.personal-information.calendars | カレンダーに読み取り/書き込みできるかどうか |

#### File Access
| key |　説明 |
| :--: | :--: |
| com.apple.security.files.user-selected.read-only | ユーザーが [開く] ダイアログまたは [保存] ダイアログを使用して選択したファイルに対してアプリが読み取り専用アクセスできるかどうか |
| com.apple.security.files.user-selected.read-write | ユーザーが [開く] または [保存] ダイアログを使用して選択したファイルに対してアプリが読み取り/書き込みアクセスできるかどうか |
| com.apple.security.files.downloads.read-only | downloads フォルダーへの読み取り専用アクセス権を持っているかどうか |
| com.apple.security.files.downloads.read-write | downloads フォルダーへの読み取り/書き込みアクセス権を持っているかどうか |
| com.apple.security.assets.pictures.read-only | pictures フォルダーへの読み取り専用アクセス権を持っているかどうか |
| com.apple.security.assets.pictures.read-write | pictures フォルダーへの読み取り/書き込みアクセス権を持っているかどうか |
| com.apple.security.assets.music.read-only | Music フォルダーに読み取り専用アクセスできるかどうか |
| com.apple.security.assets.music.read-write |  Music フォルダーへの読み取り/書き込みアクセスを許可できるかどうか |
| com.apple.security.assets.movies.read-only | Movies フォルダーへの読み取り専用アクセス権を持っているかどうか |
| com.apple.security.assets.movies.read-write | Movies フォルダーへの読み取り/書き込みアクセス権を持っているかどうか |

## NSAppDataUsageDescription
まだBeta版だが、下記もある。型はString。
| key |　説明 |
| :--: | :--: |
| NSAppDataUsageDescription | アプリが他のアプリのサンドボックス コンテナー内のファイルにアクセスする必要がある理由をユーザーに伝えるメッセージ |

以上。また何かあれば追記します。