|
Document of c-modernization-kit (porter) 1.0.0
|
porter の暗号化ありバージョンは、AES-256-GCM により ペイロードの機密性 と ヘッダを含む完全性検証 を提供しています。そのため、**参加ノードが限定され、設定ファイルや運用が適切に管理された閉域網で利用する分には、現時点でも大きな問題が出にくい構成** と考えてよいです。
一方で、より厳密な安全性を求める場合や、将来的に利用範囲を広げる場合には、**鍵管理**, 相手認証, ノンス生成, N:1 モードの受信前処理, 時刻依存のセッション採用 に改善余地があります。
特に次の点は、閉域網では直ちに致命的でない場合があるものの、設計上の注意点または改善候補として認識しておくのが望ましいです。
本レビューは、prod/porter/docs と prod/porter/libsrc/porter / prod/porter/include の実装をもとに、porter の UDP 系暗号化機能を対象に評価したものです。
前提は以下です。
N:1 モードでは、受信パケットの真正性を AES-GCM で検証する前に、session triplet を基に新規ピアを作成する。したがって、攻撃者は **正しい暗号鍵を持っていなくても**、service_id が一致する見かけ上のパケットを大量送信することで max_peers を枯渇させる余地がある。
GCM の安全性は 同一鍵でノンスを再利用しないこと を強く要求する。porter ではノンスが session_id + flags + seq_or_ack_num で構成される一方、session_id は暗号学的乱数ではなく rand() に依存している。さらに session_tv_sec / session_tv_nsec はノンスに含まれない。
このため、再起動条件が重なって session_id が再現され、seq_num が再び同じ値から進み始めると、**同一鍵・同一ノンスの再使用** が起こり得る設計になっている。
porter の暗号化は、「同じ encrypt_key を持っていること」を前提に通信を成立させる設計であり、TLS 証明書や署名鍵のような ピア固有の身元証明 を提供しない。
特にマルチキャストや N:1 モードでは、共有鍵を持つノード群を区別できず、**どの正規ノードが送ったのか** を暗号的には識別できない。
encrypt_key は設定ファイルに置かれる事前共有鍵であり、passphrase 形式を使う場合の鍵導出は SHA-256(passphrase) のみである。閉域網で設定ファイル管理を厳密に行うなら運用可能だが、salt も work factor もなく、KDF としては強くない。
docs 自身が認めている通り、health_timeout_ms = 0 の構成では、OS 時計が過去へ戻ると新セッションが旧セッション扱いされ、永続的に破棄され得る。
これは直接の暗号破りではないが、**時刻異常だけで復旧不能に近い状態へ入る** 可能性があるため、可用性上の運用制約として無視できない。
docs は明確に、ヘッダ 32 バイトは平文のまま AAD で保護すると説明している。
参照: prod/porter/docs/config.md:181-189
したがって、service_id, session_id, seq_num, ack_num, flags, payload_len などのメタデータは観測可能である。改ざんは検知できても、**通信内容の全体像が秘匿されるわけではない**。
docs / 実装には、鍵交換, 再ネゴシエーション, セッション鍵導出の仕組みが見当たらない。
参照: prod/porter/docs/config.md:181-192, prod/porter/libsrc/porter/protocol/config.c:372-444
これは直ちに問題というより設計上の前提であり、安全性を「鍵が漏れない限り」と表現する場合、**その鍵を長期に固定で使う設計** であることを併記するのが適切である。
porter の暗号化ありバージョンは、**ヘッダ改ざん検知** と ペイロード暗号化 を実装しており、閉域網でノードと設定を適切に管理して使うのであれば、現時点でも十分に実用的です。
ただし、より強い安全性や将来の拡張性を求めるのであれば、以下は改善候補として押さえておきたいです。
従って、porter の暗号化は 閉域網での利用において十分に有用 である一方、**より強い脅威モデルに耐えるためには追加改善の余地がある**、というのが妥当な評価です。