本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。
draft-jmoore-tsvwg-hmtftp: Authenticated Encrypted TFTP (HMTFTP)
【背景と設計目標】
TFTPの軽量性を維持しつつ、AEAD暗号化によりIoTデバイスのセキュアなファームウェア更新と認証を最小限のオーバーヘッドで実現する。RFC 1350(TFTP)との互換性を考慮しつつ、DTLSよりもフットプリントを抑えたセキュアなファイル転送を目的とする。
【通信シーケンスと動作】
HMTFTPは、通常のTFTPオプション拡張(RFC 2347)を利用してセキュリティ・パラメータを交渉し、その後のデータ転送をAEAD(Authenticated Encryption with Associated Data)で保護します。
sequenceDiagram
participant "Client as HMTFTP Client"
participant "Server as HMTFTP Server"
Note over Client, Server: 1. Negotiation Phase
Client ->> Server: RRQ (filename, mode, hmtftp_opt)
Server -->> Client: OACK (hmtftp_params, nonce_s)
Note over Client, Server: 2. Encrypted Data Transfer
Client ->> Server: ACK (nonce_c)
Server ->> Client: DATA_ENC (Block 1, Ciphertext, Tag)
Client ->> Server: ACK_ENC (Block 1, Tag)
Note over Client, Server: 3. Termination
Server ->> Client: DATA_ENC (Last Block, Tag)
Client ->> Server: ACK_ENC (Last Block, Tag)
交渉フェーズ:
RRQ/WRQパケットのオプションフィールドで暗号アルゴリズム(例:ChaCha20-Poly1305)とNonceの交換を行います。暗号化転送: 共有鍵(事前に配布またはPSK)に基づき、各データブロックをAEADで暗号化。転送毎にインクリメントされるカウンターをNonceに含め、リプレイ攻撃を防ぎます。
【データ構造 / パケットフォーマット】
HMTFTPの暗号化データパケット(DATA_ENC)は、標準のTFTPヘッダーを拡張し、認証タグとNonceインデックスを収容します。
0 1 2 3 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Opcode (DATA_ENC: 0x0007) | Block # | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Nonce / Counter (4-8 bytes) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | | | Encrypted Payload (Variable) | | | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | Authentication Tag (AEAD Tag) | | (e.g., 16 bytes) | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
【技術的な特徴と比較】
HMTFTPは、フルスタックのDTLSを実装できない極低リソースのマイコン(MCU)向けに最適化されています。
| 特徴 | TFTP (RFC 1350) | TFTP over DTLS (RFC 9032) | HMTFTP (Draft) |
|---|---|---|---|
| 暗号化方式 | なし | TLS 1.2/1.3 レコード層 | AEAD (Direct) |
| ハンドシェイク | 不要 | 複雑 (複数往復) | 軽量 (Option拡張) |
| オーバーヘッド | 最小 | 高 (DTLSヘッダー等) | 中 (Tag/Nonceのみ) |
| PFS (前方秘匿性) | なし | あり (鍵交換による) | 実装に依存 (PSK/ECDH) |
| 主な用途 | 閉域網ブート | 一般的なセキュア転送 | IoT/組み込み更新 |
AEADの採用: ChaCha20-Poly1305やAES-GCMをサポートし、完全性と機密性を1つのプリミティブで担保。
0-RTTに近い動作: 鍵が共有済み(PSK)であれば、初回のRRQ/WRQから保護を開始可能。
【セキュリティ考慮事項】
リプレイ攻撃耐性: 各ブロック番号および暗号化コンテキストに紐づくNonce(カウンター)により、パケットの再送や順序入れ替えによる攻撃を検知します。
ダウングレード攻撃: クライアントがHMTFTPオプションを要求した際、サーバーがそれを無視して標準TFTPで応答した場合、クライアントは即座に接続を遮断しなければなりません。
鍵管理: 事前共有鍵(PSK)の運用が中心となるため、デバイス毎のユニークな鍵管理(KMSの利用)が推奨されます。
【まとめと実装への影響】
リソース制約への適合性: DTLSの実装が困難な数KB〜数十KBのRAMしか持たないデバイスにおいて、実用的なセキュリティ層を提供します。
既存インフラとの共存: ポート番号はTFTP(69)を流用可能ですが、ファイアウォールやIDSが「未知のOpcode」や「暗号化されたペイロード」をアノマリとして検知する可能性があるため、ネットワークポリシーの調整が必要です。
MTUの考慮: AEADタグ(通常16バイト)とNonceの付与により、有効なペイロードサイズが減少します。UDPフラグメンテーションを避けるため、
blksizeオプションの適切な設計が不可欠です。

