macOS常駐アプリを「安全に使える状態」にする方法と、検証の根拠 — 収集最小化・通信ゼロをコードで確認する
本記事はAIアシストで執筆し、人間が内容を確認しています。
主張には根拠を付けており、検証コマンドはすべて読者がそのまま実行できます。誇張はありません。
アクセシビリティ許可を要求するmacOS常駐アプリは、使う側から見ると「何をしているか分からない」のが不安の源だと思います。
自分のアプリConscio(メニューバーの文脈認識ナビゲーター)を動かし続ける中で、安全性をさらに高めるために、「主張ではなく、誰でも再実行できる検証」で裏づけを取る方針に変えた記録です。
対象アプリと前提
-
Conscio: メニューバー常駐・文脈認識・完全オフライン(端末内完結)・MIT・課金ゼロ
- GitHub: https://github.com/Andy234-andy/conscio
- 検証基準ドキュメント: https://github.com/Andy234-andy/conscio#readme (リポジトリ内
Conscio/SECURITY.md)
- v1.4.0現在、Apple Silicon (arm64) 向け、macOS 13+
常駐アプリの"安全面"はどこに出るか
Conscioが扱う権限とデータは次の4種類。ここを潰すのが設計の腕の見せ所です。
- アクセシビリティ許可 — フロントアプリの前面ウィンドウタイトル参照(強い権限)
- 保存データ — 習慣統計(アプリ名・秒数・回数)
- 通知 — 集中セッション報告などのユーザー宛て通知
- 配布物 — zipリリース(信頼問題)
強化したことと、その根拠
1) 収集データの最小化 —「保存しない」が安全
ディスクに書き出すのは1ファイルのみ(~/Library/Application Support/Conscio/habitstats.json)。中身は:
private struct UsageEntry: Codable {
var name: String // アプリ名のみ
var seconds: TimeInterval // 利用秒数のみ
}
文書タイトル・URL・本文・個人情報は一切保存せず、ウィンドウタイトル(activeDocument)はメモリ上でだけ使って:(a)本人画面への表示:(b)端末内NLP解析(NLTaggerはオフライン)。どちらも外へ出ません。
2) 通信ゼロ — コードレベルで確認可能
# 検証: 何も出力されなければ通信コードはゼロ
grep -rn -E "URLSession|dataTask|NWPathMonitor" --include="*.swift" Conscio/
この検索の実測値は件数0です。UIフレームワークの間接リンク(CFNetworkなど)は存在しますが、アプリ自身が通信を始めるコードはありません。
3) 通知への内容方針
通知は「アプリ名+集中分数」などの実データのみ。文書タイトルやURLを通知に載せない規則で、画面ロック時の通知センターでも内容が漏れません。さらにmacOSの仕様上、他アプリの通知抑制自体はOSが管理しているため「抑制した件数」という根拠のない数値は出さない方針に変えました(以前の記事から修正済み)。
4) 設定画面で「どこまで取っているか」を見せる
収集データの明細を、大きく主張する看板ではなく本体の設定画面に静的テキストで載せました:
保存内容: アプリ名・利用秒数・セッション回数のみ。文書タイトル・URL・個人情報は保存せず、通信コードは含みません(ソース監査済み)。
利用者はデータフォルダをFinderで開いて、実物のJSONも確認できます。
5) 配布物の信頼
- zipはarm64限定・ad-hoc署名 — 未検証バイナリを鵜呑みにしないでくださいという注意も添付
- 不安なら自前ビルドを推奨(手順はWikiで公開)
- リリースノートに必ずAI表明を含める(人間確認済みの明示)
正直な限界(主張しないこと)
- App Sandboxは使っていません — 他アプリのウィンドウタイトル参照AX APIは、サンドボックス実行では仕様上制限されるためです。この限界を隠さず、代替の「通信ゼロ+保存最小化+検証可能性」を明確化して説明しています。
- メモリ上には一瞬、ウィンドウタイトルが存在します(機能上不可避)。ディスク保存・送信はゼロ、との線引きが現実解と考えています。
- 通知・AXのパーミッション説明はmacOS側UIの表現に依存します。
すべての検証は他人にもできます
-
Conscio/SECURITY.md(リポジトリ内)に、検証コマンド一式が載っています - 構造体定義・保存先パス・通知フォーマットも同ページ参照
- Issuesで根拠への追加の質問も歓迎
まとめ
- 常駐アプリの安全性は「プロフィール文」ではなく「再現手順」で示す方が信頼されます
- 権限が強い機能程、使うデータを最小化し、露出経路(ディスク・ネット・通知・配布物)を1つずつ潰すのが結局は早道
- OSの仕様限界(サンドボックス×AX、通知センター管理)は、隠さず開示した方が信頼につながりました
関連:
- 第1回記事(アプリ本体の作り方): https://qiita.com/Atsuki33/items/9f1b6af7a9edc5b70968
- 第2回記事(放置ループで1日24進化): https://qiita.com/Atsuki33/items/041923a512b1c7b3328b
- リリース v1.4.0: https://github.com/Andy234-andy/conscio/releases/latest
本記事はAIアシストで執筆し、人間が内容を確認しています。
リポジトリ: https://github.com/Andy234-andy/conscio