jimichi が守れないもの
メタデータの一部を隠す道具は、実力以上に信頼されがちです。ここにその限界を、はっきり書いておきます。
- メールボックス
- 2つのクライアントはエンドツーエンドの層のもとでやり取りするため、出口のメールボックスが持つのは、自分では読めない一定サイズのレコードだけです。それでもメールボックスは会話の両方のチェーンを見て、キューを通してそれらを結び付けます。見えるのは、put と取り出しのそれぞれの時刻、put の結果、レコードの種類と番号です。両方の入口の回線を見る観測者と組めば、2つのクライアントを結び付けられる可能性があります。それがどこまでうまくいくかは計測していません。エンドツーエンドの層を使わないクライアントのメッセージは、いまも出口に読まれます。
- 盗まれたクライアントの鍵
- ハッシュラチェットにはディフィー・ヘルマンの段階がないため、侵害からの回復はありません。ある方向の現在のチェーン鍵を手に入れた者は、新しいハンドシェイクまで、その方向のあとのレコードを読めます。過去のレコードは閉じたままです。クライアントの身元の秘密鍵を持つ者は、その名でハンドシェイクを行い、ハンドシェイクの最初のレコードを相手からのものとして偽造できます。それでリセットできるのは、存在しない、未確認の、または古くなったセッションだけで、過去のレコードはひとつも開けません。
- グローバルな観測者
- すべての回線を同時に見る攻撃者は、モデルの対象外です。
- 侵害された端末
- 動作中のスマートフォンやパソコンが乗っ取られていれば、jimichi は役に立ちません。使われていない状態で押収またはコピーされたコンテナのファイルは、モデルの対象です。暗号プリミティブの実装へのサイドチャネル攻撃も、モデルの対象外です。
- リレーのホストの root
- スワップされないようにロックされるのは鍵のバッファだけで、ロックは特権を持つ読み取りを防げません。リレーを動かすマシンの root に対して、プロセス単位の対策は効きません。
- 協調的なメモリ観測の範囲
- 鍵の実験が観測するのは、自発的に書き出した Object ペイロード内にある、選んだクライアントのセル鍵3つの正確なバイト列だけです。保護された元のバッファは、使用中もこの範囲の外です。一致がなくても、消去や特権を持つ読み取りへの耐性を示しません。
- 接続のタイミング
- 各チェーンはリレー間で自分の tcp 接続を開閉します。その瞬間はチェーン全体で一致し、グローバルな観測者から見えます。この研究の攻撃は、まだそれを計測していません。
- 能動的なタイミングの透かし
- 計測したタイミング透かし環境は、任意の能動攻撃への耐性やリレー周期のしきい値を示しません。主要指標には正しい指定と元のチェーンの応答性が必要です。75 ms で6本とも切断した結果は可用性の損失で、能動の誤指定と sham の指定も報告します。
- サービス拒否
- リレーは、ひとつのアドレスに回線、ハンドシェイク、チェーン確立の割り当て分までしか与えず、チェーンの存続時間に上限を設けます。共有の上限を埋めるほど多くのアドレスからの負荷、時間をかけてチェーン確立のタグのキャッシュを埋めること、ひとつのアドレスがリレーの組をいくつもふさいで、どのチェーンが残るかに影響すること、リレーを止めることは、防いでおらず、計測もしていません。どちらかのチェーンのどのリレーも、またメールボックスも、続けているあいだは会話を止められます。
- 強要
- クライアントのコンテナが与えるのはもっともらしい説明であって、免疫ではありません。どのコンテナにも領域が2つあるため、ソフトウェアを知っていて強要する側は、2つ目のパスワードを求めます。明かしたパスワードは、ファイルと合わせると、そのボリュームの身元の鍵、取り出し権限、連絡先カードを、コンテナが存在するかぎり渡してしまいます。
結果が当てはまらなくなるところ。
計測環境
- クラスタでは、リレーは1台のマシン上のコンテナです。相関攻撃の計測はクラスタでは行いません。すべてのリレーとすべてのクライアントをひとつのプロセスの中で動かし、ループバックでつなぎます。ネットワークの遅延、損失、ジッターは、再現もエミュレートもしていません。
- 運営者の分離は、チェーンの選択における不正なリレーの数としてだけモデル化しています。
- 相関攻撃は、真のフローのラベルがわかっている条件で動かしています。実際のネットワークに当てはめるには注意が必要です。
- データセットは合成です。メッセージのトラフィックは生成したもので、同じサイズのメッセージを指数分布の間隔で送ります。実際のユーザーから取得したものではありません。
- 遅延の計測には1ミリ秒より細かい時計が必要なため、windows のホストではなく linux で実行します。
- 相関攻撃の計測は、ホップ数と同じ数のリレーを固定の順序で使い、証明書もオニオン鍵の取り替えもなく、リレー間の回線は認証されず、アドレスごとの制限も無効にして行います。チェーンの選択は、トラフィックを流さずに別に計測します。
計測の範囲
- 基本の攻撃は受動的です。観測者が、入口の回線とリレー間の最後の回線で時間窓ごとのフレーム数を数え、その数を相関させます。対象は順方向だけです。auc が 0.5 に近いことは、この攻撃が失敗したことを示すだけで、より強い攻撃も失敗することを示すものではありません。
- 過去の c25519 系列 f0f1885 は暗号化したクライアントと入口のフロー1本を遅らせ、パディングを含む最後のリレーへの完成フレームを評価します。既知の開始時刻、共通のループバック時計、固定候補、限定したコードと時間差の探索を使います。主要指標は正しい帰属、開いた元のチェーン、専用プローブのエコーを合わせます。能動の誤指定と sham の指定を残し、75 ms では毎回6本とも切断しました。独立単位は反復ブロックです。同一ホスト、バックプレッシャー、切断が証拠に影響し、透かしなしの較正は透かしがある場合の誤帰属を制限しません。負荷は観測し、結果を見た除外はせず、効果を分離する実験もしていません。主要指標が観測ゼロでも、母集団で確率ゼロや安全な周期のしきい値を示しません。
- 失敗した試行、閉じた候補、空の候補も記録から除きません。チェーンを応答可能と数えるには、切断されず、専用のプローブが観測終了前にエコーで戻る必要があります。送信が正常に戻るだけでは配送を示しません。公開中の受動的な攻撃の表は、この能動的な実験の検出率を示しません。耐性の境界も確立していません。
- 接続のタイミングと学習型の相関器は未計測です。公開中のフローの結び付けの表は受動的な攻撃によるものです。チェーンの選択は計測済みで、コストのうち計測したのは往復遅延、帯域の倍率、プリミティブのベンチマークだけです。クライアントのセル鍵の協調的な系列は、限定した Object ペイロードの範囲で完了しました。外部からの取得、ディスク/スワップ/履歴、他の秘密値、記録した通信の復号は未計測で v0.4.0 より後です。残るリレー観測の全計測は v0.4.0 に必須ですが設計中で未実装、コンテナの計測は計画中です。
- 相関攻撃の計測は、最後のリレーがすべてのメッセージを送り返すエコーのトポロジーで行っています。メールボックスを通した2つのクライアントの会話は数値に含まれず、2つの入口とメールボックスからなるそのトポロジーの計測は計画中です。
- ラボでの会話の偽造は、具体的な鍵でオフラインの否認可能性を示すもので、何も計測しません。送信の否認可能性は計測していません。メッセージのセルとカバーのセルを見分ける識別器はありますが、計測しているのはすぐに転送するリレーで、この性質を主張する設定ではありません。セッションのあとに差し出すものが何もないことも、まだ計測していません。
メッセージと配達
- メッセージは1つのセルに収まる必要があります。3ホップでは最大 444 バイトです。それより長いメッセージはエラーで拒否され、送信されません。分割の仕組みも、サイズのクラスもありません。回線上の長さからメッセージについて何もわからないのは、メッセージが複数のセルにまたがらないからにすぎません。2つのクライアントのあいだでは、レコードの本文は最大 368 バイト、計測環境のメッセージの文字列は最大 363 バイトです。
- 配達は保証されません。一定レートでは、エンドツーエンドの層を使わないクライアントがキューに置くメッセージは最大 256 件で、キューが満杯のとき新しいメッセージはエラーなしで破棄されます。キューの中や送信途中のメッセージは、そのチェーンが閉じると失われます。確認応答も再送もありません。
- -peer のクライアントも、確実な配達は提供しません。put が拒否されてもメッセージが遅れるだけですが、メールボックスが保存したレコードはもう一度 put されません。そのため、メールボックスでの有効期間が切れたとき、キューが追い出されたとき、取り出しの応答の中で失われたときは、メッセージもそのレコードとともに失われます。put の結果がわからない本文はもう一度送られるため、重複が起こりえます。拒否をはさむと、メッセージの順序は保たれません。
- 連絡先ごとの分離はありません。-peer のクライアントは、プロセスごとに連絡先ひとつ、チェーンひとつ、キューひとつを持ち、2つ目の連絡先には2つ目のプロセスが必要です。連絡先ごとのチェーンとキューは計画中です。グループも複数の端末もありません。
メールボックスを通した会話
- メールボックスは会話の両方のチェーンを見て、キューを通してそれらを結び付けます。チェーンごとに見えるのは、暗号化されていない取り出し権限、put 先のキュー、それぞれの要求の時刻、put の結果、レコードの種類、その番号、同じレコードのコピーです。入口と組めば2人の関係の図が得られ、両方の入口の回線を見る観測者と組めば、相関攻撃で2つのクライアントを結び付けられる可能性があります。それがどこまでうまくいくかは計測していません。永続的な識別子を持たないキューと、連絡先ごとのチェーンは計画中です。
- -peer のクライアントの出口はメールボックスに固定されています。不正なメールボックスは、そのクライアントたちのすべての会話に加わり、不正な入口と組めばチェーンの両端を握ります。計測環境での確率は 1/4 です。そうしたメールボックスがプロトコルに従うとき経路について何を知るかは、プロトコルから導いています。-peer のクライアントの側では、中間のリレーだけがわかります。何を見て何を結び付けるかは計測していません。
- セッションの前の put はハンドシェイクのレコードだけを運ぶため、メールボックスにはハンドシェイクの瞬間が見えます。標準で有効なカバーの put では、クライアントは毎回の送信時刻にレコードを put し、送るメッセージがなければ空のレコードを置くので、メールボックスは本物のレコードと空のレコードを区別できません。カバーの put がなければ、本物のメッセージの瞬間と数も見えます。put が拒否されると、相手とメールボックスに、もう一方が取り出していないことがわかります。
- カバーの put では、どちらの側も毎回の送信時刻にレコードを1つ put し、1つ取り出すため、たまった分を減らすものがありません。チェーンの作り直しやプロセスの一時停止で、ある側が取り出さなかった回ごとに、相手のレコードがキューに1つ増え、相手のあとのレコードはすべて、その回数だけ長く待ちます。たまる量はキューの深さ(標準では 16 レコード)で抑えられます。それを超える put は拒否され、相手は送り直します。順序が入れ替わることもあります。そのため、レコードが余計に待つのは最大 16 回分、レート 200 ms なら 3.2 s です。
- メールボックスはレコードを渡すときにそれを消し、レコードのコピーが1つでも保存されたあとは、そのレコードをもう一度 put しません。保存されたコピーがすべて、受け取る側のチェーンとともに取り出しの応答の中で失われると、そのレコードは消えます。本物のメッセージならそのまま失われ、ハンドシェイクのレコードなら 60 s の待ちと新しいハンドシェイクが必要になります。ハンドシェイクのあとの開始側の最初のレコードが失われると、応答側は開始側の次のレコードが開くまで本物のメッセージを送りません。カバーの put がなければ、最大 30 s です。応答側には、そのレコードを求める手段がありません。
- 会話を止めていたリレーがやめれば、会話はチェーンの作り直しと新しいハンドシェイクで、約5分のうちに戻ります。10分のうちに3回応答を拒否するか、10分間チェーンがなければ、クライアントは終了します。
- メールボックスのキューは使い尽くされることがあります。追い出せないキューを n 個保つには、キューの有効期間ごとに短いチェーンの確立がおよそ n/2 回、または1つの要求を送る開いたチェーンが n 本必要で、最長 24 時間続きます。そうしたキューは新しい組の妨げになります。割り当て量の制限は計画中です。
- -peer のクライアントの身元と固定した連絡先は、プロセスのメモリにしかありません。どちらかのクライアントが再起動すると新しい身元になり、紹介をやり直す必要があります。クライアントのコンテナは実装済みですが、それを使って再起動のあとも身元を保つ -peer のクライアントは計画中です。
- 計測環境での紹介は、クラスタの api を信頼しています。クライアントのポッドのログを読み、そのポートを転送できる者は、最初の固定の前か、クライアントの再起動のあとに、どんな連絡先カードでも固定させられます。カードのハッシュを比べるのは人ではなくスクリプトです。固定のあとで別のカードを示されたクライアントは、それを拒否し、運営者が再起動するまで止まります。
- 計測環境のクライアントのログは、クラスタのノードのディスクに届きます。メッセージごとの行と1分ごとのカウンタの行から、メッセージの時刻と数がわかり、固定したカードのハッシュが、組になった2つのクライアントのログを結び付けます。
暗号とメモリ
- gost の実装は認証を受けた暗号モジュールではありません。アルゴリズムは同じで、規格のテストベクトルで確認していますが、保護クラスは主張しません。
- gost のライブラリは、作者のモジュールのミラーから取得し、バージョンを固定しています。そのコードが作者のリリースと同じかどうかは、独立した情報源ではまだ確認していません。
- 2つのスイートは混ざりません。リレーはひとつのスイートで動き、クライアントは別のスイートのアンカーやディスクリプタを拒否します。そのため gost と c25519 の利用者は別々のネットワークを作ります。両スイートでハンドシェイクの各メッセージは同じ大きさですが、平文 http のディスクリプタにはスイート名が残ります。
- 導出されるすべての鍵は、その交換のトランスクリプト、スイート、鍵の方式のバージョンに結び付けられています。ただし、トランスクリプトの中身が正しいことを支えているのは、wire と link のテストだけです。インターフェースが保証するのは、トランスクリプトなしでは鍵を導出できないことであって、トランスクリプトに必要なものがすべて入っていることではありません。チェーン確立と回線のハンドシェイクの形式モデルはありません。チェーン確立のモデルは計画中です。
- 回線は noise の対称状態遷移を使い、互換性を保つエンドツーエンドのプロファイルとトークン状態機械を共有します。標準 noise ベクトルは、暗号と固定の一時鍵入力だけを差し替えて、本番の回線の状態遷移を検査します。本番は xchacha または gost の独自のアルゴリズム構成を使うため、既存 noise との通信互換性や、その構成の証明は主張しません。
- 鍵の方式と回線のバージョンを取り決める仕組みはありません。互換性のない相手とはハンドシェイクが失敗し、fallback はありません。リレーとクライアントは一緒に更新します。リレー認証が有効な場合、相手の身元は交換に結び付けられ、異なる身元のバイト列を結び付けた相手は異なる鍵を導出します。
- ライブラリは go のヒープに鍵のコピーを持ちます。aead の作業鍵はチェーンまたは回線が続く間そこに残り、消去されることはありません。そのメモリが再利用されるまで残り続けます。secmem が守るのは自分のバッファだけです。
- 協調的な鍵の実験が探すのは、自発的な go 1.27.3 の書き出し1回を解析して得た Object ペイロード内にある、クライアントのセル鍵3つの正確に連続したバイト列だけです。スタック、グローバルデータ、ランタイムとシステムの領域、mmap のペイロードは範囲外で、保護された元のバッファも使用中から含まれません。完全な解析はヒープやプロセスの完全な網羅を意味せず、ランタイムがデータを通知なく省く場合もあります。
- none と all は複数のメモリ対策をまとめて変えます。一致の減少はバッファが観測範囲外に移ったためかもしれず、個々の対策やプロセスの保護強化の効果を分離しません。追加の一致は、ライブラリのコピーと、書き出しに伴うコンパイラやランタイムのコピーを区別できません。変換された鍵の状態も探索しません。一致がなくても、消去や消去期限を証明しません。
- 各時点は新しいプロセスと鍵を使い、動作中、後片付け成功直後、または単調時計で1秒以上後に観測します。独立した観測は鍵の寿命を追跡せず、自然な gc と実際の遅延はこの予定に属します。失敗、非対応、取得不能は除外し、一致ゼロには変えません。定めた全360観測を評価しました。c25519 の正確なバイト列は all でも close 後に観測されました。gost の close 後のゼロは消去を証明せず、変換した状態を排除しません。ホスト cpu の系列中30標本は3-33%、中央値11.5%、平均12.4%で、実験と他の負荷を分離できません。負荷による除外や性能の結論はありません。リレー、回線、確立、エンドツーエンド、ラチェット、コンテナの秘密値は未計測です。
- スワップされないようにロックされるのは secmem のバッファだけです。ヒープ上のコピーは通常のページにあり、スワップに書き出される可能性があります。プロセスのメモリ全体のロックは計画中です。
- メッセージの平文は、どこでも消去されません。クライアントは送ったメッセージも受け取った応答も消去せず、出口のリレーも自分が開いた平文を消去しません。どれも、そのメモリが再利用されるまでプロセスのメモリに残ります。これは鍵の素材ではなく、鍵のメモリを守る対策の対象外です。
- エンドツーエンドの層は noise のハンドシェイクの形をしていますが、noise そのものではありません。暗号インターフェースの上の kk ハンドシェイクの形式モデルはなく、gost での組み合わせは、c25519 で照合した検査用の仕組みで確かめています。
- -peer のクライアントは、身元の鍵、取り出し権限、現在のラチェットのチェーンを、プロセスが終わるまでロックされたメモリに保持し、どれもディスクに書きません。差し出した場合、身元の鍵で開けるのはこれからのハンドシェイクだけで、現在のチェーンで開けるのは、その方向のあとのレコードだけです。
- gost スイートでは、署名のたびに署名鍵のスカラーと使い捨ての数のコピーがヒープに残ります。windows のホストから証明書を発行する場合、発行のあいだ認証局の鍵は、ロックされておらずダンプ禁止もないプロセスのメモリに置かれます。
- チェーンの層の前方秘匿性が及ぶのは、リレーのオニオン鍵が生きているあいだまでです。リレーはこの鍵をタイマーで取り替え、その鍵を載せたディスクリプタがすべて期限切れになると古い鍵を解放します。隣のリレーが保存していたチェーン確立のセルを開けるのは、その鍵が最初に公開されてから、長くても取り替えの周期にディスクリプタの有効期間と時計の許容差を足した時間までです。リレーの設定で選べるこの時間の最小値は36分です。解放のあとに取得したリレーのメモリでは、そのセルは開けません。一時的な回線鍵がなければ、回線の記録だけでは読めません。
- 鍵の取り替えが及ばないものがあります。メモリが取得された時点で生きているチェーンのホップ鍵、プロセスと同じだけ生きる回線鍵、そして解放済みの鍵やチェーン確立の秘密についてライブラリがヒープに残したコピーです。この期間が守られるのは、取り替えが成功し、リレーが動ける場合だけです。スリープ中のホストや凍結されたプロセスは、再び動くまでメモリを保ち続けます。
- 鍵の取り替えはリレー自身が行うもので、クライアントは確認できません。ディスクリプタからわかるのは公開された鍵が変わったことで、古い鍵が解放されたことではありません。計測の基準構成は取り替えなしで動き、そこでは鍵が盗まれれば、稼働していた期間のそのリレーの層を開けます。
- 回線のフレーム鍵とチェーンのホップ鍵は、回線とチェーンが続くあいだ変わりません。ひとつのホップ鍵のもとでのセルの数を制限するのはカウンタの上限だけで、ひとつのフレーム鍵のもとでのフレームの数を制限するのはフレーム番号だけです。回線とチェーンの内部での鍵の取り替えは計画中です。
- セルの形式は一定サイズと再送防止を備えますが、完全な sphinx ではありません。チェーン内のリレーの位置を隠す仕組みは他にありません。
- パスワードから作る鍵は、gost のスイートのほうが c25519 よりオフラインで推測しやすくなっています。gost のスイートは、メモリを必要としない pbkdf2 と hmac-streebog-512 でパスワードを引き延ばします。tc26 の推奨にメモリを多く使う関数がないためです。c25519 は 64 mib の argon2id を使います。反復回数が argon2id の処理時間とそろうのは、計測環境の linux コンテナでの streebog の場合だけです。最適化した streebog、gpu、専用のハードウェアでは推測の費用はより小さく、どれだけ小さいかは計測していません。この鍵はクライアントのコンテナが使います。
リレーの認証
- クライアントは、トラストアンカー(認証局の公開鍵)で検証したバンドルからだけリレーの鍵を受け取り、バンドルを1つずつ検証します。検証に通らない一覧のリレーのバンドルは、入口がミラーから外したリレーとして数えます。入口自身のバンドルは検証に通る必要があり、通らなければクライアントはチェーンを作りません。クライアントの設定にあるアンカーを書き換えられる者が、クライアントがどのリレーを信頼するかを決めます。
- 認証局の鍵は、証明書を発行するあいだだけ存在します。その鍵を持つ者、つまり運営者か発行中に鍵を盗んだ者は、任意の名前とアドレスで自分の身元を証明でき、ネットワーク上の位置があればリレーをすり替えられます。別の認証局の証明書を持つリレーは、クライアントが計測環境のアンカーを持ち、リレーの認証が有効なあいだ、どのチェーンにも入りません。これは実際のリレーを使う lab のテストで確かめています。ただし、そうしたリレーを入口に引いたクライアントは、拒否する前にそのリレーへミラーを求めるため、そのリレーはクライアントのアドレスと起動の瞬間を知ります。無作為に選んだチェーンが鍵の持ち主のリレーに当たる頻度は、計算し、標本でも確かめています。それぞれのリレーが経路について何を知るかはプロトコルから導いており、何を見て何を結び付けるかは計測していません。過去のチェーンは、このすり替えでは開けません。
- 計測環境での証明書の発行は、運営者のクラスタへのアクセスを信頼しています。ホストまたはその docker ネットワークを支配する者は、発行中に認証局とリレーの間のやり取りを差し替え、そのリレーになりすますことができます。
- 失効の仕組みは、証明書の期限切れと、新しい認証局での再発行を伴うリレーの再起動のほかにありません。稼働中のリレーのメモリから取り出された署名鍵は、どちらか早いほうまで、そのリレーになりすませます。
- リレーのプロセスは証明書とロスターをそれぞれ一度だけ受け取り、リレーの鍵はプロセスのメモリにしかないため、再起動のたびに新しい発行が必要で、発行にはすべてのリレーの新しいプロセスが必要です。それまでクライアントはそのリレーを拒否し、そのリレーはチェーンを延ばしません。起動したばかりのリレーに運営者と同じアクセスを持つ者は、先に自分の認証局で証明書を発行できます。運営者のアンカーを持つクライアントはそのリレーを拒否し、再起動まで使えなくなります。
- 同じアクセスがあれば、運営者より先にリレーへロスターを送ることもできます。ロスターのリレー一覧は認証されていません。ただし、そのロスターはリレーを証明した認証局のアンカーを示す必要があり、相手として扱われるのは、そのアンカーでディスクリプタを検証できるリレーだけです。そのため、一覧からリレーを外すことはできても、加えることはできません。
- リレーは自分のディスクリプタを自分で公開し、ディレクトリはありません。そのため、リレーはロスターのリレーごとに違う鍵を見せ、その結果、入口が違うクライアントにも違う鍵を見せることができました。既定で有効な -consistency では、リレーは1分に1回互いのミラーを読み、各リレーが署名したすべてのディスクリプタを保持します。規則を破る2つのディスクリプタ、たとえば同じエポックの2つのオニオン鍵は、すべてのリレーとクライアントが自分のアンカーで検証できる証拠になり、そのリレーは全員から拒否されます。残るのは窓です。テストベッドでは、ローテーションが最初の正直なミラーに届いてから最長201秒のあいだ、2つの正直なミラーが隣り合うエポックを持つことがあり、それは16分に最大2回です。チェーン確立のセルを開けた鍵は、入口が2つのミラー群のどちらに属するかをリレーに教えます。窓の中で確立された回線ごとに1ビットです。拒否されたリレーは、各クライアントの一覧も1つ短くします。
- リレーの認証が有効な場合、チェーン確立と回線は、信頼アンカーが証明したリレーの身元に結び付けられます。kk 回線は両者の身元と、検証済みロスターを検索する開始リレーのアドレスを結び付けます。アドレスは検索用で、最初の認証済みデータフレームが開始側の最終鍵の所持を確認します。証明書のハッシュはトランスクリプトに含まれません。発行時にはアドレス、署名鍵、オニオン鍵の重複を調べますが、回線鍵は比べません。
- 証明書とディスクリプタには有効期間があるため、リレーとクライアントの時計のずれは許容範囲に収まっている必要があります。
リレー間の回線
- リレーの認証が有効な場合、クライアントと入口の回線は nk を使って入口を認証します。リレー間の回線は kk を使い、検証済みロスターのディスクリプタで双方を認証します。認証ありのリレーは nn と、未知または期限切れの kk 相手を fallback なしで拒否します。クライアントは入口に対して認証されず、nk 回線はロスターの一員であるとは主張しません。
- 応答側が開始側の最終鍵を確認するのは、最初のデータフレームが開いたときで、それまでアプリケーションデータを送りません。kk の最初のメッセージは再送可能で、応答側の静的鍵が漏れると偽造できます。チェーン確立のセルは含みません。バージョン、役割、kk のアドレス選択子は平文で見えます。両ハンドシェイクメッセージとデータフレームは同じ固定長です。
- リレーの認証を使わない基準構成は、チェーン確立のセルに書かれたどのアドレスにもチェーンを延ばし、リレー間の回線は認証されません。その回線がヘッダーを隠せる相手は、受動的な観測者だけです。この構成のクライアントは、すべてのホップの未検証の鍵を入口だけから受け取ります。この構成を認証ありの構成と比べる実験ブロックはありません。相関攻撃の計測も証明書なしで行います。
- すべてのリレーは、ロスターにあるリレーのうち手元にある検証済みバンドルをミラーとして持ちます。クライアントは入口にだけ問い合わせ、一覧にあるすべてのリレーのバンドルを求めるため、要求からチェーンはわかりません。入口はバンドルを書き換えられません。書き換えたバンドルは検証に通らず、外されたものとして数えられます。ただし、ミラーを渡さないことはできます。その場合クライアントは終了し、次の起動で別の入口を選びます。-peer のクライアントがそうするのは最初のチェーンの前だけで、作り直しのときは、10分後に終了するまで同じ入口に問い合わせ続けます。また入口には、クライアントがチェーンを準備する時点が見えます。ディスクリプタの要求がチェーン確立の前に来るためです。
- リレーが他のリレーのバンドルをミラーに載せるのは、自分の時計でそのバンドルが有効になってから、期限切れの2分6秒前までです。時計のずれが許容範囲内のクライアントでも、まだ有効と判断できるようにするためです。この期間の外では、そのリレーは入口が外したリレーとして数えられます。ディスクリプタそのものは期限が切れるまで保持し、そのリレーへのチェーンも延ばします。そのリレーが再起動したあとも、ミラーはディスクリプタの有効期間が終わるまで以前のバンドルを渡し、そのリレーを通るチェーンは確立に失敗します。新しいプロセスは別の回線鍵を持ち、回線のハンドシェイクを通らないためです。
- ロスターを導入する者が、リレーが情報ポートで問い合わせる先のホストを決めます。リレーは、保持しているディスクリプタの更新時期が来るたびにロスターの各アドレスへディスクリプタを要求し、相手のディスクリプタがないあいだ、または更新時期が来たままのあいだは、5秒の間隔をあけて巡回を繰り返します。相手がまだ署名し直していないディスクリプタを渡し続けている場合も、これに含まれます。ディスクリプタについては、ロスターのどのアドレスにも、5秒に1回を超えて問い合わせることはありません。-consistency では、リレーはさらに1分に1回、無作為に選んだ4つのロスターのリレーのミラーを専用のパスで読みます。ロスターは各ホストを一度しか挙げないため、この上限はホストごとにも成り立ちますが、表記ごとに限られます。複数の名前、または名前と ip アドレスで到達できるホストには、1回の巡回でそのアドレスごとに1つずつ要求が届きます。証明書の期限とともに記録が終わった相手には、それ以降、リレーが再起動するまで1分に1回問い合わせます。アドレスは ip アドレスと dns 名に限られ、応答はロスターのアンカーで検証できた場合だけ有効です。
チェーンの選択
- クライアントのリレー一覧は固定です。リレーを見つける仕組みはなく、どのリレーが存在するかを確定する、複数の者が署名したディレクトリもありません。チェーン確立のセルの大きさから、チェーンは c25519 で4ホップ、gost で3ホップまでです。
- 入口は、一覧にあるリレーのうち限られた数(標準では1つ)をミラーから外すことができ、検証に通らないバンドルも同じ上限の中で数えられます。チェーンは残りの中から選ばれます。不正な入口が正直なリレーを外すと、出口も不正である確率が上がります。
- 自分のディスクリプタを他のリレーに渡さないリレーは、他のリレーのミラーから消え、他のリレーはそのリレーへチェーンを延ばしません。クライアントが許す数より多くのリレーがそうすると、クライアントが受け入れるのは、渡さないリレー自身のミラーだけになります。5つのリレーのうち2つがそうし、許す数が1つの場合、確立できたチェーンはすべて、その2つのどちらかから入り、正直なリレーで終わります。この場合は計算し、標本でも確かめています。許す数を大きくすると、不正な入口が選択を誘導できる余地が広がります。
- 気に入らないチェーンを拒否したり切ったりするリレーは、どのチェーンが残るかを決められます。エンドツーエンドの層を使わないクライアントは失敗すると終了し、次の起動で新しいチェーンを選び、失敗を記録しないためです。この選択的なサービス拒否は、防いでおらず、計測もしていません。
- -peer のクライアントは、チェーンが終わっても終了せず、同じ入口を通して作り直します。まず同じチェーンを使い、そのチェーンを確立できないときだけ中間のリレーを選び直します。選び直しはプロセスごとに最大2回です。そのため、正直な中間のリレーを通るチェーンをすべて閉じる不正な入口でも、中間のリレーを選ばせられるのは最大3回です。計測環境で、メールボックスが正直で、残りの4つのうち2つが不正な場合、ミラーから正直なリレーを1つ外す不正な入口のもとで共謀相手が中間のリレーになる確率は、1回だけ選ぶ場合の 1/2 に対して 7/8 です。中間のリレーがわかれば、入口はクライアントがどのメールボックスを使うかも知ります。
- 選び直しは反対側からも起こせます。正直な中間のリレーを通る要求にすべて応答しない不正なメールボックスは、入口が正直なとき、1/3 ではなく 19/27 の確率で共謀相手を中間のリレーにできます。中間のリレーには入口が見えるため、メールボックスは自分のクライアントの入口を知ります。どちらの値も、選び方のすべての結果を数え上げて確かめています。
- この上限はプロセスごとです。10分間チェーンを作れないクライアントは終了し、新しいプロセスは新しい上限で新しい入口を選びます。身元も新しくなり、紹介をやり直す必要があります。どのプロセスが残るかは、計測していない同じ選択的なサービス拒否で決まります。
- ガードリレーはありません。エンドツーエンドの層を使わないクライアントはチェーンごとに、-peer のクライアントはプロセスごとに入口を選び直すため、入口と出口の両方が不正なチェーンが少なくともひとつあった確率は、クライアントが再起動するたびに上がります。
- リレーの統計カウンタは正確な合計値で、チェーンの識別子は含みません。しかしチェーンが少なければ、合計が個々のチェーンを表します。クライアントが2つの計測環境では、セルの数が増えていくリレーがそのクライアントたちのチェーンのリレーで、カウンタからは入口とメールボックスもわかります。リレーの出力を読める者には、それがわかります。
再送とセルの順序
- リレーは、自分が開いたチェーン確立のセルごとにタグを、そのセルを開けたオニオン鍵が生きているあいだ覚えていて、コピーを破棄します。ひとつの鍵のもとでのタグの数には上限があり、満杯になったリレーはタグを忘れる代わりに、その鍵での新しいチェーン確立を拒否します。拒否は次の鍵が公開されるまで、取り替えなしの構成では再起動まで続きます。チェーンを作れる者なら誰でも、時間をかけてキャッシュを埋められます。これはサービス拒否です。
- タグに鍵は含まれませんが、メモリダンプから、リレーが持っている鍵のもとで確立されたチェーン数の上限がわかり、オニオン鍵と保存されたチェーン確立のセルを合わせれば、そのリレーがそのチェーンを運んだことを確認できます。
- セルのカウンタは回線ごとに別の値を取り、厳密に連続します。コピー、欠落、順序の入れ替えはチェーンを閉じます。隣のリレーは、セルひとつでこれを起こせます。回線の途中にいる者は、認証された回線に自分のフレームを入れることはできませんが、フレームを壊すか接続を切れば、同じようにチェーンは閉じます。これはサービス拒否です。クライアントも応答をひとつずつ同じ規則で検査し、検査に通らない最初の応答でチェーンを閉じます。入口からのフレームが開けない場合も閉じますが、そうしたフレームは回線の途中にいる誰でも作れます。届かなかった応答は、待つことでしか分かりません。そのあと -peer のクライアントは同じ入口を通してチェーンを作り直し、10分のうちにそうした応答が3つあると終了します。2つのクライアントのあいだでは、メールボックスやリレーが書き換えたレコードは受け取る側で開かず、破棄されます。
リレーの制限
- 接続を受け入れるか拒否するかは、鍵合意の前に決まります。ひとつのアドレスが得られるのは、回線、ハンドシェイク、チェーン確立の割り当て分までです。共有の上限が使い切られると、リレーは新しい接続を拒否します。これはサービス拒否です。それぞれの枠が占有されるのは、長くても期限、アイドルタイムアウト、チェーンの存続時間が切れるまでです。
- リレーは相手がリレーかクライアントかを区別できません。回線の応答側が開始側を認証しないためです。また、どのリレーも入口になりうるため、すべてのリレーがアドレスごとの制限を持ちます。中間や出口のリレーでは、あるリレーを通ってきたチェーンはすべてそのリレーのひとつのアドレスから届き、アドレスひとつ分の割り当てを分け合います。同じ2つのリレーを同じ順序で通るチェーンを持つ他のクライアントの分まで、ひとつのクライアントが使い切ることができます。
- ひとつのアドレスは、そうした2つのリレーの順序つきの組を、割り当てを使い切ることで同時にいくつもふさいでおけます。割り当てはリレーごとに別々に数えられ、そのアドレス自身のチェーン1本は c25519 で最大3組、gost で最大2組を通ります。他のクライアントがいないネットワークでは、n 個の入口から入って c25519 で最大 3n 組、gost で最大 2n 組、リレーが5つなら 20 組のうち 15 組と 10 組です。ふさがった組を通るチェーンは確立に失敗します。エンドツーエンドの層を使わないクライアントは終了して別のチェーンを選び、-peer のクライアントでは、そうしたチェーンが2つ続くと2回の選び直しの1回になります。そのため、そのアドレスはどのチェーンが残るかに影響します。認証局の鍵を持ち、ロスターに不正なリレーを置いている者は、正直なリレー同士の組をふさいだまま、自分のリレーを通る組を空けておけます。それにかかるコストと、残ったチェーンのうちその者のリレーが占める割合がどこまで上がるかは、計測していません。計測は計画中です。
- 計測環境では、セル用ポートに届くのはクライアントとリレーのポッドだけです。これが効くのは、クラスタのネットワークプラグインがネットワークポリシーを適用する場合だけです。計測環境のクライアントは2つで、それぞれチェーンは1つなので、そこでは共有の割り当ては足りなくなりません。
タイミング
- 自分の時計での送信には、リレーの周期がクライアントより数パーセント短い必要があります。計測環境では 5% です。周期が等しいか長いと、取りこぼした送信を取り戻せず、いずれリレーのキューがあふれてチェーンが閉じます。
- 回線が守られるのは、その回線で送るリレーが対策を有効にしている場合だけです。クライアントはそれを確認できません。
- リレーはミキシングをしません。ランダムな遅延を加えず、セルをまとめて送ることもなく、チェーンの間でセルの順序を入れ替えることもありません。セルはすぐに転送されるか、自分の時計での送信では、到着した順に1周期に1フレームずつ送られます。リレーでのランダムな遅延とミキシングは計画中です。
- チェーン確立のセルはリレーの時計を待たずにすぐ送られ、すべての回線でチェーンの始まりを示します。
- 自分の時計での送信がないと、出口の応答は要求を処理した時点で送られます。メールボックスの応答の長さは一定ですが、要求ごとの処理は上限があるだけで一定ではなく、マイクロ秒単位の差が応答の瞬間に表れます。計測環境では、出口は自分の時計で送ります。
- チェーンは、アイドルタイムアウトのあとと存続時間の終わりに切断されます。エンドツーエンドの層を使わないクライアントはチェーンを作り直しません。クライアントのプロセスは終了し、次の起動で新しいチェーンを作ります。-peer のクライアントは同じ入口を通して作り直します。切断の瞬間はリレーのパラメータと最後のセルだけで決まります。存続時間が示すのはチェーンの経過時間だけで、それは接続を開いた時刻からすでにわかります。
否認可能性
- 送信の瞬間が隠れるのは、一定レートで送り、リレーが自分の時計で送る場合だけです。計測環境はそう設定しています。クライアントの標準である即時モードでは、ユーザーが送信した時点でセルが出ていき、カバートラフィックがなければ、データのセルはすべてメッセージです。リレーがすぐに転送する場合は、出口の応答の瞬間がセルの種類によって変わります。-peer のクライアントは毎回の送信時刻に要求を送りますが、メールボックスから送信の瞬間が隠れるのは、カバーの put を使い、セッションが確立したあと、相手が取り出しているあいだだけです。
- クライアント間の否認可能な認証は、オフラインのものだけです。ハンドシェイクは鍵合意だけでできていて、クライアントは署名鍵を持ちません。そのため受信者は、自分の鍵だけで、同じメッセージを含み、本物と同じ分布のトランスクリプトを作れます。トランスクリプトは、受信者の秘密鍵と合わせても、送信者が参加したことを第三者に証明しません。
- 証人のいるトランスクリプトには、これは当てはまりません。受信者と共謀するメールボックスや送信者の回線の観測者は、誰がいつその暗号文を送ったかを独立に記録しています。セッション中に受信者と組んで動く判定者に対するオンラインの否認可能性、メタデータの否認可能性、セッション前に侵害された送信者の端末についても主張しません。
- この議論は、テストで確かめている鍵合意の対称性と、トランスクリプトに他の乱数が含まれないことに基づいています。形式モデルはありません。
クライアントのコンテナ
- コンテナは一定サイズの1つのファイルで、ソルトと、封をした2つの領域からなります。ボリュームのない領域には、捨てた鍵で封をした空のボリュームが入り、ボリュームがどちらの領域に入るかは無作為です。ファイルには、暗号化した形も含めて、鍵素材が一切ありません。身元の鍵と取り出し権限は、開くたびにボリュームの鍵から導出します。それでも、ファイルとボリュームのパスワードがあれば両方を再現できるので、ファイルをパスワードと一緒に押収された場合の強度は、パスワードで守って保存した鍵と同じです。
- 主張していること:ある1つの状態のファイルと1つのボリュームのパスワードからは、2つ目のボリュームがあるかどうかはわかりません。これは、パスワードの引き延ばし、aead、鍵の導出について明示した仮定と、形式的な証明のない推論に基づくもので、2つ目のボリュームのパスワードが生成されたものである場合にかぎります。jimichi vault init はパスワードを自分で生成し、一度だけ表示します。端末の履歴やリダイレクトした出力は対象外です。-stdin で渡したパスワードも含め、人が選んだパスワードについては、どちらのスイートでも主張しません。そうしたパスワードは、オフラインでの推測が届く範囲にあるためです。gost では、引き延ばしにメモリが要らないため、推測の費用はさらに小さくなります。どれだけ小さいかは計測していません。パスワードのないファイルがランダムなバイト列と見分けられないことは、kuznyechik-mgm については証明されていない仮定に基づきます。ただし、押収した者には、そのファイルを指定するコマンドライン、パス、一定のサイズから、それがコンテナであることがわかります。隠れているのは、ボリュームが1つか2つかです。この主張を計測する識別器は計画中です。
- ファイルは作成時に一度だけ書き込まれ、開くときは読むだけなので、作成後のファイルの状態はバイト単位で同じです。別の日の押収、バックアップ、同期をいくつ集めても、1つの状態以上のことはわかりません。失敗のあとで書き込みをやり直しても、同じバイト列を書きます。残るのはファイルシステムです。mtime、ctime、作成時刻からはコンテナを作った時点が、atime からは開いた時点がわかります。ジャーナル、シャドウコピー、ウェアレベリング、trim が作成の痕跡をどれだけ残すかは計測していません。リンクの前に強制終了された作成が残した一時ファイルは、自分のソルトを持つ別のコンテナです。次の起動時に削除しますが、削除してもドライブ上のブロックは消えません。
- 2つ目のボリュームはもっともらしい説明であって、免疫ではありません。ソフトウェアを知っていて強要する側は、2つ目のパスワードを求めます。しかも、その説明がもっともらしいのは実際に使われているあいだだけで、メールボックスにある偽装用のキューが動いていないことや、偽装用の連絡先がまったく返事をしないことから見抜かれます。
- 明かしたボリュームは、導出によって、その身元の鍵と取り出し権限を、コンテナが存在するかぎり渡します。持ち主になりすまして連絡先とやり取りし、持ち主のキューのレコードを取り出して消し、持ち主が誰と話しているかを知ることができます。鍵の取り替えも失効もなく、抜け出すには両方の側で新しいコンテナを作るしかありません。パスワードを変えると身元が変わり、相手の側の固定は永続的なので、紹介をやり直すには相手の側にも新しいコンテナが必要です。連絡先を変えるときも、新しいコンテナ、新しい身元、新しい紹介が必要で、2つ目のボリュームの連絡先カードは作成の時点で必要です。
- 押収と押収のあいだにファイルに書き込める能動的な攻撃者は、どちらかの領域を壊したり、もう一方の領域を新しい空のボリュームに置き換えたりできます。書き換えられたボリュームは開きませんが、2つ目のボリュームの持ち主には、置き換えがパスワードの誤りと同じに見えます。同じ端末でコンテナを作り直すと、次の押収で、2つ目のボリュームがあったことがわかってしまいます。
- 動作中の端末については主張しません。パスワード、その引き延ばし、身元の鍵のコピーはヒープ上のライブラリのメモリに残り、スワップ、ページファイル、休止状態のファイルに書き出される可能性があります。これらの表現は協調的なセル鍵の実験の範囲外で、未計測です。gost では、端末そのもので開くのにかかる時間がボリュームを見分ける手がかりになりますが、鍵については何もわかりません。サイドチャネルはモデルの対象外です。
- -peer のクライアントはまだコンテナを使っていません。使うようになれば、それ固有の限界が生じます。取り出し権限が変わらなければキューも変わらないため、メールボックスはそのコンテナでのすべての起動を結び付けることになります。理由を問わず再起動すると、運営者がボリュームを開くまでクライアントは止まったままになり、ログの行の時刻からは起動と開いた時点がわかります。
- コンテナは、鍵の方式、引き延ばしのコスト、身元の導出に結び付いています。方式やコストを変えると以前のコンテナは開けなくなり、導出を変えると別の身元になります。移行の手段はありません。メッセージの履歴を持つ更新可能なコンテナは実装していません。それには、複数の状態に対する独自の対策が必要になります。