セキュリティと検証
最終更新日:2026年8月11日
Comoji は アクセシビリティ と 入力監視 の権限を求めます。これは macOS でもっとも踏み込んだ 2 つの権限で、「信じてください、すべてローカルです」では答えになりません。このページは、私たちの言葉を鵜呑みにしなくて済むようにするためのものです。以下に、アプリが接続しうるすべてのホスト、それぞれのきっかけ、そして入力中の Comoji を自分のマシンで観察するための正確なコマンドを載せています。
要点はこうです:キー入力が Mac の外に出ることはありません。 私たちにも、ほかの誰にも送られません。Comoji にはアカウントも、テレメトリも、アナリティクスも、クラッシュレポーターもありません。ネットワークリクエストは下に挙げる 4 つだけで、GIF ピッカー自体の検索ボックス以外で入力した内容は、どれにも含まれません。
手順を追って確認したい方は、Comoji がローカルであることをステップごとに確かめる方法 で、スクリーンショットとコピー&ペーストできるコマンドを使って同じことを説明しています。
それぞれの権限の用途
macOS の権限ダイアログは、アプリがどの権限を求めているかは教えてくれても、それで何をするかは教えてくれません。そこで、正確に説明します:
入力監視
- 用途:
:lizのようなコロンで始まるトークンを監視するキーボードイベントタップです。文字はメモリ上の小さなバッファにたまり、トークンが終わった瞬間(スペース、Esc、別の場所のクリック、候補の確定)に破棄されます。 - 使わない用途: 入力内容の記録、保存、送信。バッファはディスクに書き込まれず、ログにも残らず、どこにも送られません。キー入力を扱うコードにネットワーク API やリモート URL が現れると、アプリ自身のテストスイートがビルドを失敗させます。
- まったく監視しないもの: パスワード用のセキュアなテキストフィールド、パスワードマネージャ・ターミナル・リモート/仮想マシンクライアントを含む組み込みの除外リスト、そして環境設定 › プライバシー で自分で追加したアプリや Web サイト。
アクセシビリティ
- 用途: キーボードフォーカスのあるテキストフィールドと、画面上のカーソルの位置を macOS に問い合わせ、候補のポップアップを正しい場所に出すこと。そして、選んだ絵文字をそのフィールドに入力すること(疑似的なバックスペースと一瞬のクリップボードのペーストを使い、その後で元のクリップボードを復元します)。
- 使わない用途: フィールドの内容、書類、メッセージ、ほかのウインドウを読み取ること。
ネットワーク接続先の完全な一覧
これが一覧のすべてです。ここにないホストに Comoji が接続しているのを見つけたら、それはバグです。support@comoji.io までぜひお知らせください。
storage.googleapis.com
- 内容: アップデートフィード(Sparkle の appcast)と新しいバージョンの DMG。どちらも Comoji の Firebase Storage バケットにあります。
- タイミング: バックグラウンドでのアップデートの確認とダウンロード、およびメニュー項目「アップデートを確認…」。環境設定で「Comoji を最新の状態に保つ」をオフにすると、自分で確認したときだけ接続します。
- リクエストに含まれるもの: 単純な GET リクエストです。Sparkle のユーザエージェントには、アプリ名と使用中のバージョンが含まれます。
fonts.gstatic.com
- 内容: アプリに同梱されていないステッカーのアートワーク(Google の Noto Animated Emoji)。
- タイミング: /sticker ピッカーで、同梱されていないステッカーを選んだとき。初回使用後は Mac にキャッシュされるので、ステッカーごとに 1 回だけです。
- リクエストに含まれるもの: 絵文字のコードポイントで名前が付いた画像ファイル 1 つに対する、単純な GET リクエストです。
api.giphy.com
- 内容: /gif ピッカーの GIF 検索とトレンドの結果。
- タイミング: /gif を開いたときと、そのピッカーで検索語を入力するたび。自動では接続しません。/gif を使わなければリクエストもありません。
- リクエストに含まれるもの: GIF ピッカーの検索フィールドに入力したテキストと、Comoji の GIPHY API キー、そして Comoji を英語以外の言語で使っている場合は、結果をその言語に合わせるための言語コード(例: ja)だけです。Mac のほかの場所で入力した内容は一切含まれません。
*.giphy.com
- 内容: GIPHY の CDN(media0〜media4.giphy.com)から取得する GIF ファイルそのもの。
- タイミング: すでにリクエストした検索結果から GIF を表示または挿入するとき。
- リクエストに含まれるもの: 検索結果が示した GIF の正確な URL に対する、単純な GET リクエストです。
ほかには何もありません
アナリティクスのエンドポイントも、テレメトリも、エラーレポートも、ライセンスサーバも、アカウントシステムもありません。Comoji をインストールして、/gif も /sticker も開かず、自動アップデートの確認をオフにすれば、アプリは起動しているあいだ 一度も ネットワークリクエストを行いません。
この一覧は、アプリの説明にとどまりません。アプリが従うルールです。すべての URL がソースコードに書かれているわけではなく、GIF ファイルそのものは GIPHY の検索レスポンスが指定します。そうした取得はすべて、リクエストの前に上の一覧と照合され、一致しなければ破棄されます。リダイレクトも同じように確認されるので、「代わりにこちらへ」と応答するサーバが別の場所に誘導することもできません。検索レスポンスが改ざんや乗っ取りを受けても、このページに載っていないホストに Comoji を接続させることはできません。
次のホスト名もアプリ内に含まれていますが、Comoji がそれらを取得することはありません。URL を macOS に渡し、あなたのブラウザ がページを読み込みます:www.comoji.io, www.mattsenter.com, www.senter.net, www.stockcar.app, www.premail.pro, www.burly.click, www.beeready.buzz, www.highwire.news, www.orga.bot, www.weatherling.app, www.seedmatrix.com。
自分で確かめる方法
以下のコマンドはすべて読み取り専用で、安全に実行できます。Comoji を起動した状態で、ターミナルに貼り付けてください。(開発版をインストールした場合、プロセス名は Comoji ではなく ComojiDev です。)
1. 入力中の接続を観察する
まず、Comoji が実際に起動していることを確認し、プロセス ID を取得します:
pgrep -x Comoji数字が返ってくるはずです。何も返ってこない場合は Comoji が起動していません(メニューバーアプリなので、Dock ではなくメニューバーを確認してください)。その状態だと、以下のコマンドは Comoji が通信しているかどうかに関係なく「接続なし」と報告してしまいます。まず PID を取得してください。そうしないと、残りの手順は何も証明しません。
lsof は、プロセスが開いているネットワークソケットを一覧表示します。メッセージを開いて :fire と入力し、Tab キーを何度か押してから、次を実行します:
lsof -nP -i -a -p "$(pgrep -x Comoji)"何も出力されないはずです。出力がないということは、プロセスがネットワーク接続を開いていないということで、主張をそのまま直接テストしたことになります。
使いながら継続的に観察するには、別のターミナルウインドウでこれを実行し、ほかのアプリでしばらく入力してみてください:
while :; do
printf '%s ' "$(date +%T)"
lsof -nP -i -a -p "$(pgrep -x Comoji)" | tail -n +2 | awk '{print $9}' | paste -sd' ' -
echo
sleep 2
doneどれだけ入力しても、行は空のままです。次に /gif を開いて何か検索すると、api.giphy.com と giphy.com の CDN ホストが現れます。現れるのはそのときだけです。
2. 送受信の合計バイト数
nettop はプロセスごとの累積トラフィックを表示するので、lsof のサンプリングの合間に起きた短時間の通信も捉えられます:
nettop -P -p "$(pgrep -x Comoji)"GIF ピッカーとステッカーピッカーには触れずに、数分間入力してみてください。bytes_in と bytes_out の列はゼロのままです。q を押すと終了します。
3. 配布されたバイナリからホスト名を読み出す
起動中のプロセスが接続できるのは、知っている場所だけです。ダウンロードしたアプリから、URL を直接取り出せます:
strings -a /Applications/Comoji.app/Contents/MacOS/Comoji \
| grep -Eo 'https?://[A-Za-z0-9._-]+' | sort -u
/usr/libexec/PlistBuddy -c 'Print :SUFeedURL' \
/Applications/Comoji.app/Contents/Info.plist実際に見える結果と食い違わないよう、正直に 2 点補足します。まず、api.giphy.com は完全な URL として保存されているのではなくホスト名から組み立てられるため、最初の一覧には表示されません。strings -a … | grep -Eo '[a-z0-9.-]*giphy\.com' で直接検索してください。このパターンはホスト名だけに一致するので、同じくバンドルに含まれている API キーは表示されません。次に、同梱の Sparkle アップデートフレームワークは、Contents/Frameworks/Sparkle.framework の中に独自のドキュメント URL(sparkle-project.org、andymatuschak.org)を含んでいます。これらはサードパーティライブラリ内の文字列であり、Comoji が接続するホストではありません。
4. ファイアウォールでブロックして、何が壊れるかを見る
もっとも確実なのは、送信方向のファイアウォールを使う方法です。LuLu は無料のオープンソース、Little Snitch は商用の定番です。どちらかをすべての送信接続で通知するように設定し、Comoji からの通信をすべて拒否してください。絵文字の補完は、もともとネットワークを必要としないので、これまでどおりずっと動き続けます。動かなくなるのは、アップデートの確認と、リモートのステッカーや GIF のアートワークだけです。
5. アプリが本当に私たちのもので、改変されていないことを確かめる
Comoji は Apple の Developer ID で署名され、Apple の公証を受けています。次のコマンドで、ディスク上のコピーが改ざんされていないことを確認できます:
codesign -dv --verbose=4 /Applications/Comoji.app
spctl -a -vvv -t exec /Applications/Comoji.app
codesign -d --entitlements - /Applications/Comoji.app私たちがやると決めたこと、やらないと決めたこと
当然の疑問は「なぜ全部オープンソースにしないのか」でしょう。推測ではなく答えそのものを判断していただけるよう、現在の立場を説明します。詳しい理由は、アーキテクチャ決定記録(docs/adr/0001-verifiable-local-processing.md)としてリポジトリに記録しています。
- 実施済み:ネットワーク接続先を正確に公開する。 上の一覧は、アプリの環境設定 › プライバシー にも表示されます。アプリのコンパイルに使う宣言と同じものから生成され、実行時にもそれに照らして強制されるので、他人のサーバからアプリに渡された URL であっても、公開されていないホストには到達できません。
- 実施済み:自分で検証するための手順。 このページと、リンク先の手順ガイドです。
- 実施済み:CI で主張を強制する。 すべてのプルリクエストとすべてのリリースで、macOS ランナー上でアプリのテストスイートが実行されます(
.github/workflows/app-ci.yml、さらに署名の前にrelease.ymlの中でも再度実行)。このスイートは実際のソースを走査し、このページで公開していないホストが現れた場合や、キー入力を扱うコードにネットワーク API やリモート URL が現れた場合に失敗します。どちらかのルールを破るビルドは、マージもリリースもできません。 - 現時点では見送り:入力処理部分だけのオープンソース化。 イベントタップ、トークンバッファ、マッチャーだけを公開すれば、信頼の証として意味があり、しかも商業的価値のない部分です。それでもまだ実施していないのは、立派な理由ではなく正直な理由からです。公開した一部のコードが公証済みバイナリの中身と同一だと証明できなければ、見かけほどの証明にはなりません。きちんとやるには再現可能ビルド(下記)が必要です。それよりもまず、実際にダウンロードしたバイナリそのものに対して行える検証を提供したいと考えています。この判断は見直す可能性があり、公開するとすれば入力処理部分が最初です。
- 現時点では見送り:再現可能ビルドと有償のセキュリティレビュー。 どちらも最も信頼性の高い選択肢ですが、どちらもこのプロジェクトの現在の収益を上回る費用がかかります。却下ではなく延期です。収益が見合うようになったら、第三者による有償レビューを受けて概要を公開するのが次のステップで、その結果はこのページで公開します。
ここに書かれた内容を検証して、このページと矛盾する点が見つかったら、support@comoji.io までメールしてください。ページとアプリのうち、間違っているほうを修正します。
Comoji が Mac にローカル保存するデータについては、プライバシーポリシー もご覧ください。