セキュリティとプライバシー、
審査のために。
Gnistaは、コーディングエージェントを見守り、ノッチから応答できるようにするMacのアプリです。このページは、会社のMacに入れる前にそれを審査する方のためのものです。何を読み、何を送り、何かがうまくいかないときにどうなるか。
更新:
要点
- Macの上で動きます。アカウントも、テレメトリも、アナリティクスもありません。
- 誰のセッションも、コードも、プロンプトも、Macの外に出ません。
- 通信は下に挙げるものだけ。それ以外はありません。
- 自分から何かを承認することは決してありません。迷ったときは、エージェントが自身の確認画面で確認を求めます。
- Developer IDで署名され、Appleの公証を受け、Hardened Runtimeでビルドされています。
Gnistaが読むもの
- エージェントのフックからのイベント。小さなヘルパーが、Application Support内のGnistaのフォルダにあるUnixソケット越しに送ります。ローカルのみで、ネットワークで待ち受けるのは、コンテナをオンにしたときの、パスワードを求めるMacのループバック上のポート一つだけです。リモートマシンのイベントは、ユーザ自身のsshを通って、Mac上の専用のソケットに届きます。
- エージェント自身のセッションファイルと設定ファイル。それぞれの場所にあるものを、タイトル、進捗、コスト、プランの上限のために読みます。
- Gnista専用のキーチェーン項目。ライセンスキーと試用期間の開始日を保存します(開始日は環境設定にも保存します)。同期はしません。
- 許可がある場合だけ:目的のターミナルのタブやエディタのウインドウを前面に出すための、オートメーションとアクセシビリティ。どちらも任意です。
決してしないこと
- ほかのアプリのキーチェーン項目や、認証情報を読むこと。
- ポートを探ったり、ネットワークをスキャンしたりすること。
- テレメトリやアナリティクスをどこかのサービスに送ること。アカウントもありません。クラッシュレポートは、ユーザが同意したときか、組織が
CrashReportsModeをalwaysにしたときだけ送ります。 - エージェントの設定ファイルの、自分の項目以外を変えること。設定ファイルは先にバックアップし、書式とキーの順序はそのまま保ち、エージェントの接続を解除するとGnistaの行だけがきっちり消えます。
すべての通信
| 接続先 | 通信 | タイミングと送る内容 |
|---|---|---|
gnista.sh | アップデートの確認 | 自動アップデートがオンの間、1日1回ほど。ほかの通信と同じくIPアドレスが含まれ、Gnistaのバージョンを送ります。Macのプロファイル情報は送りません。 |
github.com | ダウンロード:アップデート、Linux用ヘルパー | 確認でアップデートが見つかったときはそのアップデート、リモートマシンを接続していて必要な場合は、このバージョンとそのプロセッサ用のLinux用ヘルパー。どちらもGnistaの公開ダウンロード(github.com/BlixtDunder/gnista-downloads、配信元はrelease-assets.githubusercontent.com)から取得します。ほかの通信と同じくIPアドレスが含まれます。どれもGnistaの鍵で署名されている場合だけ使います。 |
report.gnista.sh | ライセンス、クラッシュレポート | ライセンス:キーをアクティベートするとき(キーと、アクティベーションのラベルとしてMacの名前)、その後は週1回ほどの確認、そしてキーを削除するときに、そのMacの枠を空けるため(どちらもキーとこのMacのアクティベーションID)。Gnistaの中継サーバはそれだけを販売事業者(merchant of record)のCreemに渡し、ライセンスに関しては、アドレスごとのリクエスト数(ソルト付きハッシュで、翌日には消える)のほかは何も残しません。エージェント、プロジェクト、使用量については何も送りません。クラッシュレポート:Gnistaまたはそのヘルパーがクラッシュした後だけ、しかもユーザが同意したか、常に送ると選んだか、組織がCrashReportsModeをalwaysにした場合だけ:エラーの内容、発生した日時とGnistaのコード内の場所、スレッドのキューの名前、読み込んでいたライブラリの名前とアドレス、GnistaとmacOSのバージョン、Macの機種とプロセッサのアーキテクチャ、クラッシュレポート用に作られたランダムなID。ユーザ名、ファイルパス、プロジェクト、プロンプト、コードは含みません。スウェーデンにあるGnistaの中継サーバが、Gnistaのチームにメールで届け、コピーは残しません。 |
ssh | リモートマシン | 設定 ▸ リモートで接続したマシンだけ。ユーザ自身のsshとssh設定(ポッドならkubectl)を通して:ヘルパーとエージェントのフックのセットアップ、エージェントのイベントをMacへ、応答をそのマシンへ運ぶ接続(接続がmanualのときはなし)、そしてクリックしたときのエージェントのtmuxペインの表示。Gnistaのチームには何も届きません。 |
ampcode.com | Ampのスレッド | 行にAmpのセッションがある場合だけ:GnistaはAmp自身のCLI(amp threads export、amp threads usage、amp usage)を、ユーザのアカウントでサインインした状態で実行し、それがAmpからスレッド、そのコスト、アカウントのクレジットを読み取ります。Gnista独自のものは何も加えず、Gnistaのチームには何も届きません。 |
raw.githubusercontent.com | モデル価格 | 「使用量」をオンにした場合だけ:LiteLLMの公開モデル価格表を、多くても1日1回。ただのダウンロードで、利用者に関することは何も送りません。 |
自動アップデートをオフにすると(またはMDMでAutomaticUpdatesをfalseにすると)、アップデートの確認は止まります。試用期間にはネットへの接続は何も要らず、個人ライセンスのキーは一度アクティベートすればオフラインでも使えます。チームのキーは、最後の確認から30日を超えて公開されたビルドを使うために、ときどき確認が必要です。RemoteMachinesAllowedをfalseにすると、すべてのトンネルが閉じ、誰もサーバを接続できなくなります。
承認が安全側に倒れる仕組み
Gnistaでの応答は設定で、Claude Code、Codex、OpenCodeなど、ノッチからの応答を受け付けるエージェントが対象です。リクエストが許可されるのは、人が許可したときだけ。しかも「許可」は、押せるようになるまで0.5秒待ちます。初期設定で承認されるものはありません。
- Gnistaで応答がない場合:Claude Codeは同時に自身の確認画面も表示し、先に応答されたほうが有効になります。ほかのエージェントにはリクエストが戻り、いつもどおり自身の確認画面で確認を求めます。タブへ行けばすぐに、ノッチが閉じていれば10秒後に、ノッチを開いていても長くて45秒後に。
- Gnistaが起動していない場合:フックは誰も待ち受けていないことを確かめ、すぐに戻ります。エージェントは自身の確認画面で確認を求めます。
- Gnistaがロックされている場合(試用期間が終わり、ライセンスがない):すべてのリクエストを、待たずにそのまま返します。
- フックがエージェントを止めることはありません:状態を伝えるフックは約30msで戻り、いつもきれいに終了します。
- リモートマシン:そのマシンのヘルパーがノッチからの応答を待つのは、Gnistaでの応答がオンの間だけです。そのマシンのroot権限を持つ人は誰でも、その承認に応答できます。マシンを接続すると、設定にもそう表示されます。
- 社内のルール:チームプランなら、MDMでGnistaでの応答をオフにしたり、一部のエージェントに限ったりできます。MDMでGnistaををご覧ください。
リモートマシン
Gnistaは、サーバ、コンテナ、Kubernetesのポッドで動くエージェントを表示し、ノッチから応答できます。誰かがマシンを接続するまではオフのままで、RemoteMachinesAllowedをfalseにするとオフのままになります。
- ユーザ自身のssh:GnistaはMacの
sshを、ユーザのssh設定、鍵、エージェントで、ユーザ本人と同じように実行します。パスワードや鍵は保存しません。ログインに人の操作(パスワード、2FA)が必要なときは、「ログイン」がそのためにターミナルを開きます。ポッドにはユーザ自身のkubectlを使います。 - 署名されたヘルパー、rootもデーモンも不要:Gnistaはヘルパーをそのマシンのユーザのホームの
~/.gnistaにコピーし、Macと同じように、そこのエージェントの設定ファイルに自分の行を加えます。Linux用のヘルパーはGnistaの鍵で署名されており、署名が一致しないものをGnistaは受け付けません。公開鍵はgnista.sh/downloads/linux/gnista-linux.pubにあります。root権限は要らず、サービスもインストールせず、エージェントのフックが呼び出したときだけ動きます。 - Macごとに一つのソケット:マシンを接続した各Macには、そのマシン上に専用のソケットができ、そのユーザだけが読めます。Mac上のコンテナはMacのループバック上のポートを通してそこへ届き、どの接続もランダムなパスワードで始めなければなりません。パスワードは、それをマウントするコンテナのために
~/.gnista/containersに保存されます。 - 接続解除すると、そのマシンのエージェントの設定ファイルからGnistaの行を取り除き、
~/.gnistaを削除します。ほかのMacがまだ使っている場合は除きます。
セキュリティツールがトンネルを検出する場合
マシンごとに接続の設定があり、チームプランなら、MDMのRemoteConnectionですべてのMacに設定できます:
- 自動(
automatic):Gnista自身のssh接続が、マシンのソケットをMacへ転送します。サーバがソケットを転送しない場合は、パスワードを求めるそのループバック上のポートを使い、何も転送しない場合は、転送なしと同じように動きます。 - 転送なし(
relay):転送は一切しません。Kubernetesのポッドと同じように、ヘルパーがフックのメッセージを、普通のsshコマンドの入出力に乗せて運びます。 - 自分の ssh 経由(
manual):Gnistaは接続を開きません。「設定」がヘルパーを一度インストールし、ユーザのssh設定に加えるRemoteForwardの行を示します。その後は、ユーザ自身のsshセッションがエージェントのイベントを運びます。サーバのsshd_configにStreamLocalBindUnlink yesがあれば、切れたセッションの後のセッションもすぐに接続できます。
Macに残すもの
Application Support内の自分のフォルダに、最近終わったセッション、最新のプランの上限、モデルの価格表、変更したエージェントの設定ファイルのバックアップ、まだ送っていないクラッシュレポート(30日後に削除)、ダウンロードしたLinux用のヘルパー、ユーザが作ったエージェント、モデル、ジャンプのルールのファイル。設定は環境設定ドメインsh.gnista.Gnistaに、ライセンスキーと試用期間の開始日はGnista専用のキーチェーン項目に保存し、試用期間の開始日は環境設定にも保存します。設定ですべてのエージェントの接続を解除すると、各設定ファイルから自分の行を削除します。
署名とアップデート
GnistaはDeveloper IDで署名され、Appleの公証を受け、Hardened Runtimeでビルドされています。そのため警告なしに開き、macOSは改変されていないことを確認します。Gnistaはgnista.shでアップデートを見つけ、Sparkle経由でGitHub上のGnistaの公開ダウンロードから取得します。アップデートはどれも私たちのEdDSA鍵で署名されています。署名が一致しないアップデートを、Gnistaは受け付けません。
サンドボックス化はされておらず、それはできません。エージェントのファイルを読み、設定ファイルを編集する必要があるからです。Mac App Storeにないのも同じ理由です。
ご質問
審査に必要なことで、ここにないものがありますか? support@gnista.shまでご連絡ください。ウェブサイトと購入については:プライバシー。