プライバシーとセキュリティ
ドキュメント作成中
一部の内容はまだ不完全な場合があります。
ThinkTerm は、あなたについても、あなたのマシンについても、使い方についても何も収集しません。テレメトリーも、分析も、トラッカーもなく、そうしたデータを受け取るサーバーをプロジェクトは持っていません。1 つの更新確認を除けば、ThinkTerm がネットワークに送るものはすべて、あなたが始めたものです。
何もしなくても送られるもの
更新確認だけです。デスクトップアプリが動いているあいだ、GitHub のリリース API に新しいリリースがあるかを問い合わせます。起動からおよそ 10 秒後(記録に残る直近の確認が頻度より古いとき)、その後は同じだけの時間がたつたびです。頻度は 設定 › ソフトウェアアップデート の 確認の頻度(12 時間ごと、毎日、毎週)で、その行を操作するまでは check_for_updates_interval_seconds です。既定は 12 時間です。コマンドラインツール、TUI、セッションサーバーが自分から確認することはありません。設定 › ソフトウェアアップデート の アップデートを確認 は、押したときに同じリクエストを送ります。
このリクエストは匿名です。あなたが THINKTERM_UPDATE_TOKEN を設定しない限り資格情報は載りません。この変数はプライベートなフォークに届くときにしか役立ちません。ThinkTerm 自身のコードは GITHUB_TOKEN を読まないので、ほかのツールのために export したトークンが、あなたが実行していない確認で送られることはありません。インストールスクリプトはこれを読み、アップデートはそのスクリプトを実行します。後述を参照してください。GitHub はこのリクエストをほかのリクエストと同じように見ますが、ThinkTerm の作り手には見えません。
設定 › ソフトウェアアップデート の アップデートを自動確認 スイッチで止められます。そのスイッチを操作するまでは、設定に check_for_updates = false と書いても止まります。変更は 1 分以内に反映されます。この 2 つは 設定、更新の流れの残りは アップデート を参照してください。
使ったときに送られるもの
| あなたがすること | 送り先 |
|---|---|
| SSH、Mosh、ThinkTerm Connect で接続する | 接続先のホスト |
OS を検出 や リモートのプログラムを識別 がオンのホストに接続する(新しいホストではどちらもオン) | 同じ接続を通ってそのホストへ。ディストリビューションの確認。またはそこの ~/.config/thinkterm/ へのシェル統合のコピーと、それを読み込む 1 行のログインシェルの起動ファイルへの追加。以後そのシェルは、コマンドを始めるたびにそのコマンドラインを ThinkTerm に伝える |
| Web 上の画像を表示するノートを開く | 画像のアドレスが指すサーバー |
設定で アップデートを確認 を押す、または thinkterm update --check を実行する | GitHub のリリース API。バックグラウンドの確認と同じ匿名のリクエスト |
| ThinkTerm のない ThinkTerm Connect ホストに接続し、インストールに同意する | このマシンから GitHub へ(同意したあとだけ)。リリースを調べ、署名付きのインストールスクリプトを取得して、同じ SSH 接続でホストに送る。そのあとホストが SSH のユーザーとして、GitHub からリリースを ~/.local にダウンロードする |
| リモートサーバーの更新に同意する | インストールと同じ。ホストで何が変わるかを示す質問がひとつだけあり、それに yes と答えたあとに行われる。それより前には何も調べない。サーバーの再起動は別の質問 |
thinkterm update を実行する、または アップデートをインストール を押す | GitHub へ。最新のリリースを調べるためのリリース API、インストールスクリプト、そしてリリースのアーカイブ(GitHub がリダイレクトで自前のストレージから配信する。GitHub が遅いときはミラーが配信することもある。下記を参照) |
| ブラウザアクセスを有効にする | あなたが作ったリンクを開いたブラウザ |
| 内蔵 tailnet をオンにする | 参加して参加し続けるため、Tailscale の制御サーバー、または Control server に設定したサーバーへ。tailnet のマシンへの接続はそれを通り、Tailscale のリレーサーバーが運ぶこともある |
ブラウザアクセスで ほかのマシンに接続 を有効にし、ページからマシンを開く | あなたが指定したマシン。サーバーから SSH で接続される。そこに ThinkTerm のインストールや更新が必要なときは、できればサーバーが自分のプログラムをその接続越しにコピーし、そうでなければそのホストが GitHub からインストールスクリプトとリリースをダウンロードする |
アップデートをインストール と thinkterm update は、あなたの環境でインストールスクリプトを実行します。スクリプトは GITHUB_TOKEN が設定されていればそれを読んでリクエストに付けて送りますが、アーカイブを自分でダウンロードしなければならないときだけです。ThinkTerm がすでにアーカイブを取得して検証していれば、スクリプトはダウンロードしません。GitHub がそのアーカイブのチェックサムを記録している限り、ThinkTerm はそうします。
このページでリリースのアーカイブ(Windows ではインストーラー)が GitHub から来ると書いているところでは、代わりにミラーから来ることもあります。ミラーとは、GitHub のダウンロードを中継する、ほかの誰かが運営するホストです。ダウンロード元 が既定の 自動 のとき、そしてインストールスクリプトでは、GitHub が遅いかつながらないときにだけミラーを試します。ミラーには、GitHub と同じように、あなたのアドレスとどのリリースをダウンロードしたかが見えます。アップデートをインストール と thinkterm update が実行するリリースの照会とインストールスクリプトは常に GitHub から来ます。トークンがミラーに送られることはなく、トークンが設定されていればミラーはまったく使われません。また、ミラーが送ってきたものを照合できるチェックサムを GitHub が記録しているときだけミラーを使います。設定 › ソフトウェアアップデート の GitHub(直接)、またはスクリプトの --mirror direct で、すべてのダウンロードを GitHub だけにできます。ThinkTerm がリモートサーバーにインストールまたは更新するときは、インストールスクリプトとリリース情報を ThinkTerm 自身が取得し、SSH でホストに送ります。ダウンロード元 が 自動 なら、これらもミラーから来ることがありますが、ThinkTerm に組み込まれた鍵で検証できる署名があるものだけです。検証に通らないスクリプトは ThinkTerm に同梱のコピーに置き換えられ、検証されていないものがホストで実行されることはありません。ホストはリリースのアーカイブを自分でダウンロードし、取得元は上のルールに従って GitHub またはミラーです。システムのプロキシや環境が指定するプロキシがあれば、更新のリクエストはそれを通ります。
ノートの Web 上の画像は既定で読み込まれ、読み込むとそのサーバーにあなたのアドレスが伝わります。どの Web ページでも同じことです。note_remote_images_enabled = false で止められます。
プラグインはあなたがインストールしたプログラムで、ほかのプログラムと同じようにネットワークを使えます。たとえば ThinkTerm のソースにある Stocks プラグインは、Yahoo Finance から相場を取得します。ダウンロードにプラグインは含まれていません。プラグイン を参照してください。
アプリを初めて開いたときに出るセットアップのページは、この一覧に何も加えません。このコンピュータの中で Herdr のセッション、WezTerm の設定、コードエディタ・コーディングエージェント・cmux が最後に作業したフォルダを探しますが、そのどれもどこにも送りません。読むのは、それらのプログラムがすでに書き出したものだけです。Herdr のセッションファイル(Windows 以外では、Herdr 自身のローカルソケットを通じた「どのセッションが動いているか」の問い合わせも)、WezTerm の設定ファイル、各エディタの最近使ったフォルダの一覧、そして Claude Code、Codex、Pi、cmux が残している作業フォルダの記録です。エージェントのセッションファイルからは、フォルダと日付だけを取り、交わされた内容は取りません。フォルダの中身を見に行くことはしません。インポートを選ぶ前に macOS が書類やデスクトップへのアクセスを尋ねることになりかねないからです。
このマシンに保存されるもの
ThinkTerm は状態をあなたのユーザーアカウントに保存します。Space、Project、Thread、SSH ホスト帳、スニペット、最近のコマンド、各種設定です。それぞれがどのシステムでどこに置かれるかは 設定 にあります。ノートの Vault はあなたが選んだフォルダーで、中身は普通の Markdown ファイルです。
端末の出力はアプリかセッションサーバーのメモリにあります。ディスクに書き出す設定がひとつあり、デスクトップアプリが動いているマシンでは既定でオンです。設定 › 一般 › 開き直したときにペインの内容を戻す です。ThinkTerm のターミナルが正常な手順で止まるとき — ターミナルごとアプリを終了した、シャットダウンやログアウト、セッションサーバーの停止 — 各ローカルペインのメイン画面とスクロールバック(最大 10,000 行)が、ターミナル状態ディレクトリの kept-output に保存され、次回新しいシェルの上に戻せるようになります。記録はレイアウトが戻るとすぐに削除され、Thread が再び開かれなければ 15 日後に削除されます。設定をオフにするとすべて削除されます。書き込む前に、パスワード、トークン、秘密鍵らしき文字列は • に置き換えられ、アドレスにそれらを含むリンクは取り除かれます。これはパターンの照合なので、あらゆる秘密を見抜けるわけではありません。ペインに表示されていたものは、平文でディスクにあると考えてください。デスクトップアプリのないマシン、たとえばリモートホストでは、そこで thinkterm cli restore-output on を実行するまで何も保存されません。restore-output off でオフに戻せます。設定 を参照してください。
設定 › ワークスペース › システム通知 は既定でオンです。ThinkTerm がバックグラウンドにあるあいだ、Thread が終わったとき、あなたを待ち始めたとき、エラーで止まったときに、システムへ通知を渡します。中身は Thread の名前、その状態、そこで動いているプログラムが伝えた内容です。そのあとはほかのアプリの通知と同じようにシステムが表示し保持するので、ロック画面に出ることもあります。Thread の名前やプログラムが伝える内容をそこに出したくなければ、このスイッチをオフにするか、通知してほしくない場面を外してください。スイッチの下で 完了、対応待ち、エラー を別々に選べます。
macOS と Linux では、特に大事なファイルはあなただけが読めるモード 0600 で書き込まれます。
- 保存した SSH パスワードを暗号化する鍵、
secret.key - スニペットのファイル
- 書き出したバックアップのファイル
- ブラウザ用リスナーのトークンファイルと、その証明書と秘密鍵
- ブラウザのページが追加したマシンと、そのために保存したパスワードを持つ
web_machines.json 開き直したときにペインの内容を戻すが残す記録。あなただけが開けるフォルダに置かれます- 内蔵 tailnet の設定
tailnet.json。その認証キーとノードの鍵は同じsecret.keyで暗号化されています - ThinkTerm が新しく作るノート(フォルダー側が独自のモードを与える場合を除く)
これでマシン上のほかのアカウントは防げますが、あなたとして動くもの — 同期クライアント、バックアップ処理、プラグイン — は防げません。それらは 0600 のファイルを ThinkTerm と同じように難なく読みます。保存したパスワードにとってそれが何を意味するかは リモート で説明しています。
thinkterm tailnet up --serve-ssh を使うと、tailnet のマシンからこのマシン自身の sshd に届くようになります。sshd からはそれらが 127.0.0.1 や ::1 からの接続に見えるので、ローカルの接続を信頼する規則はそれらにも当てはまります。ほかにこれをオンにするものはありません。リモート を参照してください。
Windows には相当するモードがないため、これらのファイルは置かれたフォルダーの権限を引き継ぎます。既定のユーザープロファイルなら、あなた、SYSTEM、Administrators グループです。資格情報を移動プロファイルに入れないため(一部のドメインでは、サインアウト時に Windows がそれをプロファイルサーバーへコピーします)、SSH ホスト帳とその鍵、web_machines.json は %LOCALAPPDATA%\ThinkTerm\ssh\ に、ブラウザ用リスナーの証明書は %LOCALAPPDATA%\thinkterm\web-tls\ に置かれます。
ブラウザのページ
ブラウザアクセスは、あなたがオンにするまでオフです。オンにすると、ページ、スクリプト、フォントはすべてあなた自身のマシンから配信されます。ページがほかの誰かにリクエストを送ることはなく、使われ方が収集されることもありません。
ブラウザは、あなたが発行したトークンで入室し、トークンはリンクの一部として届きます。ページは読み込まれるとすぐにトークンをアドレスバーから取り除き、そのタブの sessionStorage に保持します。タブを閉じるとブラウザはそれを破棄します。リンクを持つ人はそのマシンであなたとしてシェルを持つことになるので、SSH 鍵と同じ資格情報です。
サーバーがトークンをディスクに保存するのは token_file が設定されている場合だけで、そうでなければメモリにあり、再起動で忘れられます。トークンごとに書き込まれるのはトークンの SHA-256 ダイジェストで、トークンそのものではありません — そのためファイルをコピーされても誰も入れません。あわせて、名前、作成日時、有効期限、最終使用日時、最後に使ったブラウザの大まかな説明("iPhone · Safari" など)が書かれます。どのデバイスのアドレスも記録されず、サーバーのログに残るのは、誰が使ったかではなく、どのトークンで入室したかです。
自己署名証明書が作られるのは、自前の証明書なしでリスナーをループバック以外にバインドしたときだけです。証明書にはマシンのホスト名とアドレスが書かれ、そのポートに接続した人なら誰でも見られます。証明書とはそういうものです。
ページはあなたの選択 — 言語、テーマ、フォントサイズ、配色、表示していた Space、パネルの幅、パレットの最近の選択、開き直すべきほかのマシン(thinkterm.machines の下) — をブラウザの localStorage、つまりそのデバイスに保存します。サイトのデータを消去すれば忘れられます。ポートに誰が届くか、証明書の確かめ方は ウェブアクセス を参照してください。
ページはサーバーを通じてほかのマシンを開くこともできます。これは既定でオフです。設定 › Web の ほかのマシンに接続 がすべてのリスナーでオンにし、デスクトップのないサーバーでは web_servers のリスナーに relay = true を設定します。オフにすると、すでに開いているマシンは数秒で切れます。オンのとき接続するのはサーバーで、SSH を使い、サーバー自身の鍵、SSH エージェントの鍵、サーバー自身の ~/.ssh/config を使います。デスクトップのホスト帳に保存したホストも並び、パスワードを保存してあるホストには尋ねることなくそのパスワードでサインインします。つまりページはそのサーバーの SSH 設定が届く先ならどこへでも届き、任意のホストとポートを自分で追加することもできます。トークンはもともとサーバー上のシェルを与え、そこから同じ鍵を使えるので、これで増えるアクセスはありません。ただし、これがオンのときにリンクが漏れると、サーバーだけでなくそれらのマシンにも届きます。ホストが尋ねること — パスワード、ホスト鍵を信頼するか、そこに ThinkTerm をインストールするか — はページであなたに尋ねられ、サーバーを通じて答えます。保存するよう求めたパスワードや鍵のパスフレーズは、デスクトップが保存する秘密情報の隣の web_machines.json に、サーバー上で暗号化して保存されます。新しいホストを追加するページのフォームに入力したパスワードも同じように保存され、ホストへの ThinkTerm のインストールに yes と答えたことも保存されます。この接続はエンドツーエンドではありません。SSH セッションはブラウザではなくサーバーで終わるので、ブラウザとホストのあいだでやり取りされるものはサーバーを通ります。残りは ウェブアクセス を参照してください。
macOS の許可ダイアログ
macOS は、プログラムがしたことをそれを起動したアプリに帰属させます。ThinkTerm はシェルを起動し、シェルはあなたが実行するすべてを起動するので、保護されたものに触れるコマンド — 連絡先が保存されたフォルダーを find がたどる、カメラを開くツールを使う — は ThinkTerm の名前でダイアログを出します。ダイアログの文面もそう書いています:An application launched via ThinkTerm would like to access…。ThinkTerm 自体には、連絡先、カメラ、位置情報などに手を伸ばすコードはありません。
バックグラウンドのセッションサーバーに置いたローカル端末は、アプリではなくそのサーバーが起動し、サーバーは自分の名前 thinkterm-mux-server でアクセスを求めます。ThinkTerm に許可済みのフォルダーでも、サーバーに対してもう一度許可が要ることがあります。どちらが拒否されたかを ThinkTerm がどう伝えるかは 設定 を参照してください。
macOS では、設定 › 権限 で、プログラムが何かを求める前に、そのプログラムが持っている権限を確認できます。フルディスクアクセス、画面とシステムオーディオの録音、マイク、カメラ のそれぞれが、許可済み・未許可・拒否・未確認・不明のどれかで表示されます。ターミナルがアプリとセッションサーバーのどちらの名義で動いているかに合わせて読み取ります。見るだけで macOS がダイアログを出すことはありません。特に注意が要るのはフルディスクアクセスです。許可すると、ターミナルのどのプログラムも、macOS に確認されることなく他のアプリのデータを読み書きできます。設定 を参照してください。
プログラムが出力するリンクと貼り付け
ターミナルのプログラムは、どんな文字の裏にも好きなアドレスを仕込んだリンクを出力できます。貼り付けるテキストに改行が含まれていれば、到着した行から順にコマンドが実行されることもあります。ThinkTerm はどちらも、実行する前に確認します。
リンクをクリックすると、Web ページ、つまり http または https のアドレスはすぐにブラウザで開きます。それ以外のアドレス — ファイル、mailto:、ssh://、アプリ独自のスキーム、スキームのない文字列 — は、先にアドレスを表示する小さなメニューが出て、別のアプリで開く か キャンセル を選びます。ゼロ幅スペースや文字の向きを反転させる制御文字など、見えない文字を含むアドレスはまったく開かれません。メニューには見えない文字がコードポイントで示され、開きませんでした:安全でないリンクです と出ます。システムのオープナーに渡す対象は、リンクでもパスでも、ダッシュで始まるものは拒否されます。open や xdg-open がオプションとして解釈してしまうためです。そうした名前のファイルは ./-name または完全なパスで書けます。ThinkTerm のログには、リンクを開いたことは残りますが、そのアドレスは残りません。
設定 › ターミナル › 改行を含む貼り付けの前に確認 は既定でオフです。オンにすると、改行を含む貼り付けは、先に それでも貼り付ける か キャンセル を尋ねます。ただし対象は、ブラケットペーストを要求していないプログラム、つまり到着した行から順に実行してしまうものだけです。zsh のように貼り付けをひとまとまりで受け取るシェルは対象外で、判別できないペインも尋ねられません。
プラグイン
プラグインはあなたとして、あなたの権限で動きます。新しいプラグインは、あなたが許可するまでオフのままです — 設定やブラウザの設定で 許可 を押すか、thinkterm plugin enable を実行します — 別のディレクトリに移すと、もう一度尋ねられます。許可したあとも、ThinkTerm はサイドバーの外には何も表示しませんが、プログラム自体を囲むサンドボックスはありません。ファイルを読み、ネットワークを使い、ほかのプログラムを実行でき、SSH で接続した端末の隣では、そのホストで同じことをするよう ThinkTerm に頼むこともできます。ほかのプログラムをインストールするときと同じように扱ってください。詳しくは プラグイン を参照してください。
セキュリティ上の問題を報告する
GitHub の非公開の脆弱性報告で、非公開に報告してください。リポジトリの Security タブを開いて Report a vulnerability を選ぶか、github.com/RoversX/ThinkTerm/security/advisories/new に直接進みます。公開の issue、discussion、pull request は開かないでください。
できるだけ次の内容を添えてください。
- バージョン(
thinkterm -Vの出力)とオペレーティングシステム - 関係する部分 — デスクトップアプリ、セッションサーバー、ブラウザアクセス、SSH や Mosh の接続、プラグインサーバー
- 再現手順、または概念実証
- 攻撃者に何ができるか、そのために先に何が必要か
1 週間以内に返信があるはずです。複雑な問題の修正にはそれ以上かかることもあり、進み具合はお知らせします。修正がリリースされるとアドバイザリーが公開され、名前を出したくない場合を除いてあなたの名前が記されます。それまでは詳細を公開しないでください。
サポートされるのは最新のリリースだけで、修正は次のリリースに入ります。報告する前に、最新版でも問題が起きることを確かめてください。
対象になるもの
リポジトリのコードはすべて対象で、ThinkTerm が WezTerm から受け継いだコードも含まれます。問題が WezTerm にも影響する場合はそう書いてください。上流にも報告できるようにするためです。
次のものは ThinkTerm の脆弱性ではありません。
- インストールしたプラグインにできること。あなたがインストールし、あなたとして動くプログラムです。
- 有効なブラウザトークンをすでに持つ人、あなたの ThinkTerm のデータを読める人、あなたとしてログインできる人によるアクセス。トークンと、保存したパスワードを守る鍵は資格情報です。
- ThinkTerm が実行するだけのプログラム、たとえばシェル、
ssh、moshの問題。
ほかの入手元のビルド
ここまでの内容は、ThinkTerm のソースと、ThinkTerm 自身のリリース手順で GitHub に公開されたビルドについてのものです。ほかの場所で入手したビルドは、違う動きをするよう変更されているかもしれません。
