このページは、自分で確かめたい人のためのものです。各コンポーネントについて、何を守り、何を守らないかを書いています。
各デバイスにクライアント、コミュニティごとにハブ(Outpost)が1つ。ハブには Tor v3 onion service としてしか到達できず、クライアント間は MLS によるエンドツーエンド暗号化です。ハブは、読めないメッセージを順序づけ、一時的に保管し、転送します。中央サーバーはなく、データの経路に GiBSeS のコンポーネントはありません。
Outpost とクライアントは Tor 経由でしか通信しません。Outpost は v3 onion service を公開します。アドレスはサービスの鍵から導かれるため、PC のネットワークや IP が変わっても同じままで、ルーターのポートを開ける必要もありません。Tor Project による Rust 製の Tor 実装 Arti をバイナリに組み込んでいるので、別途 Tor プロセスをインストールする必要はありません。
Web 版は、Tor で通信する小さなローカルプログラムのインターフェースを、ブラウザで開いたものです。リモートの Web サーバーはありません。ブラウザが話す相手はあなたのパソコン上のプログラムだけで、そのプログラムが Tor 経由でメッセージを Outpost に届けます。
すべての会話は、1対1であっても RFC 9420 に基づく MLS グループで、OpenMLS で実装しています。スイート:鍵交換に X25519、暗号化に ChaCha20-Poly1305、署名に Ed25519。テキスト、写真、ボイスメッセージ、ファイル、さらに添付ファイルの名前と種類も、デバイス上で暗号化されます。
MLS はフォワードセキュリティとポストコンプロマイズセキュリティを提供します。今日盗まれた鍵では昨日の通信は復号できず、鍵の更新後は明日の通信も復号できません。守るのは送受信中のメッセージで、スマートフォンにすでに保存された履歴ではありません。履歴はローカルデータベースの暗号化とアプリのロック(PIN または生体認証)で守られます。
テスト用メッセージにセンチネル文字列を埋め込んで検証しました。ハブのデータ内での出現はゼロでした。
グループに参加した人は過去の履歴を読めません。退出した人や削除された人は、その後に書かれたものを読めません。100人のテストでは、メンバー1人の削除で 8.7 KB のコミットが 6.5 ms で生成されました。
Outpost の鍵は、参加時に招待によって固定されます。個人 ID(QR または32文字のコード)には鍵のフィンガープリントが含まれます。誰かが(ハブも含めて)それを差し替えようとすると、アプリは送信を止め、全画面で警告を表示します。2人で60桁のセキュリティコードか QR を照合できます。コミュニティごとに別の ID と別の鍵を持ちます。
この表は最後まで読んでください。Outpost に、つまりその管理者に当てはまる内容です。
| データ | ハブに見える? |
|---|---|
| テキスト、写真、ボイスメッセージ、ファイル、添付ファイルの名前と種類 | いいえ |
| 会議の音声と映像(両モード) | はい |
| クライアントの IP | いいえ(Tor)。高画質モードの会議参加者を除く |
| クライアントから見たハブの IP | いいえ(onion)。高画質モードの会議参加者を除く |
| メンバー一覧(鍵とラベルつき、非公開のメンバーも含む) | はい |
| 各自が選んだ公開範囲 | はい |
| 誰がどのルームにいるか、ルーム名 | はい |
| 1対1チャットで誰が誰に書いているか | はい |
| ルームに誰がコンテンツをアップロードしたか | はい |
| 各自がいつ、どれくらいの頻度で接続しているか | はい |
| メッセージのサイズ | はい |
| ルームから誰が誰とプライベートチャットを始めたか | はい |
GiBSeS にはこれらのどれも見えません。サーバー、アカウント、テレメトリ、クラッシュレポート、オンラインアクティベーションを持たないからです。「自分の ID を知っている人にだけ表示」にした人も、参加したルームのメンバーには見えます。
受信者がオフラインなら、暗号化されたメッセージは最大30日間(変更可)Outpost に残り、その後期限切れになります。配信されるとすぐに削除されます。Outpost は中継だけを行い、メッセージのアーカイブは持ちません。ディスクに残るのはメンバーとルームの一覧、未受信のキューで、運営者のパスワード(Argon2id)で保存時暗号化されたフォルダに入っています。1対1チャットでは「待機中」「配信済み」「期限切れ」が表示されます。添付ファイルは分割して送られ、中断しても再開でき、1件あたり最大 100 MB です。
Android や iOS のプッシュサービスを通る通知はありません。モードは2つ。バックグラウンドでの確認なし(デフォルト)か、Tor 経由で15、30、60、240分ごとに定期確認し、内容を含まないローカル通知を出すか。Android では省電力機能が確認を遅らせることがあります。iOS ではシステムがバックグラウンド動作を制限するため、完全に受信できるのはアプリを開いているときです。
通話は1対1でも、約10人までのグループでも、Tor を通りハブを経由します。ハブはメモリ上で転送するだけで、ディスクには書き込みません。遅延は onion の2区間分です。体感できる遅れがあり、普通の電話よりトランシーバーに近い感覚です。相手につながらない場合は不在着信になり、ボイスメッセージを残せます。軽量な画面共有も使えます。
オプションのコンポーネントで、デフォルトではオフです。ハブ上で SFU(Selective Forwarding Unit)として動きます。メディアは転送中は暗号化されていますが、SFU は転送のために復号します。つまり、どちらのモードでもハブには会議の音声と映像が見えます。SFrame は使っていません。ビデオについては、ハブ、つまりその管理者を信頼することになります。
メディアは Tor を通り、Outpost がリレーとして転送します。onion 回線の帯域と遅延に収まるよう低解像度です。IP は一切露出しません。参加者のものもハブのものも。追加のネットワーク設定も不要です。
クライアントと Outpost を Tor の外で WebRTC で直接接続します。暗号化は DTLS-SRTP、TURN も含まれます。ハブにパブリック IP と、開いたポートが1つか2つ必要です。証明書は自己署名で、そのフィンガープリントとアドレスは Tor 経由でクライアントに届きます。外部サービスは使いません。参加者の IP が見えるのはコミュニティの Outpost だけで、ほかの参加者には見えません。参加者にはハブの IP がわかります。他の直接接続と同じく、各自のネットワークプロバイダーには、そのアドレスへの接続があることが見えます。
ビデオでどちらのモードを選んでも、チャットは常に Tor を通ります。
ハブが行う重い暗号処理はわずかです。暗号化されたメッセージを転送し、MLS のコミットを順序づけるだけです。本当の負荷はディスク(最大30日分の添付ファイルのキュー)と Tor の帯域です。作業用ディスクは SSD にしてください。キューは絶えず書き込みます。計測したノードの定常時の RAM 使用量は 34〜46 MB でした。
| コミュニティ | 推奨構成 |
|---|---|
| 約25人まで | 電源の入ったPCかノートPC、RAM 4 GB、SSD の空き 32 GB |
| 約25〜100人 | パソコンかミニPC、RAM 8 GB、SSD 64〜128 GB |
| 100人超 | 複数の Outpost |
| 高画質ビデオ、参加者5人 | ハブの上り約 10 Mbit/s、パブリック IP、ポート1〜2個 |
| 高画質ビデオ、参加者10人 | ハブの上り約 45 Mbit/s、8 GB のパソコン |
| 保護モードのビデオ | 追加のネットワーク要件なし。画質は Tor の帯域に制限されます |
Outpost は Windows 10/11 x64 と Linux x86_64 に対応。自動起動し、電源を入れてから3分以内にオンラインになります。チャットなら家庭用の数 Mbit/s の上り回線で十分です。実際の限界はハードウェアではなく Tor の遅延です。
クライアントと Outpost は Rust で書かれています。Tor には Arti、暗号化には OpenMLS を使っています。Outpost は単一のバイナリで、インストールも管理者権限も不要です。