HMTFTP: Authenticated Encrypted Trivial File Transfer Protocol (Internet-Draft)

Tech

layout: protocol_specification tone: professional_engineer audience: network_engineers_and_iot_developers protocol_focus: HMTFTP (draft-thompson-tftp-hmtftp) status: draft_analysis

本記事はGeminiの出力をプロンプト工学で整理した業務ドラフト(未検証)です。

HMTFTP: Authenticated Encrypted Trivial File Transfer Protocol (Internet-Draft)

【背景と設計目標】

IoTデバイスの非力なリソースでも動作するTFTPの軽量性を維持しつつ、AEAD暗号化により通信の機密性と整合性を確保することを目的とした新規プロトコル案。

TFTP(RFC 1350)は、認証や暗号化が一切存在しないため、信頼できないネットワーク上でのファームウェア更新等には利用できませんでした。HMTFTPは、TFTPの「オプション拡張(RFC 2347)」を利用し、ChaCha20-Poly1305などのAEAD(認証付き暗号)を統合することで、UDPベースのセキュアな転送を実現します。

【通信シーケンスと動作】

HMTFTPは、通常のTFTPリクエストに拡張オプション(hmtftp)を含めることから開始されます。鍵交換または事前共有鍵(PSK)に基づいてセッション鍵を生成し、以降のDATA/ACKパケットを暗号化・認証します。

sequenceDiagram
    participant "Client as HMTFTP Client"
    participant "Server as HMTFTP Server"
    Note over Client, Server: 事前共有鍵 (PSK) または ECDHによる鍵交換
    Client ->> Server: RRQ (filename, mode, "hmtftp" option)
    Server -->> Client: OACK (hmtftp_accept, nonce_salt)
    Note over Client, Server: セッション鍵の導出 (AEAD Key)
    Server ->> Client: DATA (Block #1, Auth Tag, Encrypted Payload)
    Client -->> Server: ACK (Block #1, Auth Tag)
    Server ->> Client: DATA (Block #2, Auth Tag, Encrypted Payload)
    Client -->> Server: ACK (Block #2, Auth Tag)
  1. リクエスト: クライアントが hmtftp オプションを含む読込/書込リクエストを送信。

  2. オプションネゴシエーション: サーバーが OACK で応答し、暗号化に使用するNonceのシード等を提示。

  3. データ転送: 各データブロックはAEADアルゴリズムで保護され、改ざん検知(Tag)と暗号化が行われる。

【データ構造 / パケットフォーマット】

HMTFTPのデータパケットは、従来のTFTPパケット構造のペイロード部分をAEAD構造に置き換えます。

 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 (3:DATA / 4:ACK)      |     Block # (2 bytes)         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|             Authentication Tag (128 bits / 16 bytes)          |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                                                               |
|             Encrypted Data Payload (Variable Length)          |
|                                                               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
  • Opcode (16bit): 03 (DATA) または 04 (ACK)。

  • Block # (16bit): ブロック番号。AEADのNonce生成のカウンタとしても利用。

  • Auth Tag (128bit): 改ざん防止用タグ。受信側はこのタグを検証してパケットの正当性を確認する。

  • Encrypted Data: 暗号化されたファイルデータ。

【技術的な特徴と比較】

既存のセキュア転送プロトコルとの比較を以下に示します。

機能 TFTP (RFC 1350) HMTFTP (Draft) HTTPS (TLS 1.3) SFTP (SSH)
トランスポート UDP UDP TCP / QUIC TCP
暗号化方式 なし AEAD (ChaCha20等) TLS (AES/ChaCha) SSH (AES等)
オーバーヘッド 極小 低 (IoT向け)
実装の複雑さ 非常に低い 中 (暗号ライブラリ依存) 非常に高い 非常に高い
HOL Blocking あり(Stop-and-Wait) あり(改善可能) なし(QUIC時) あり
  • HOL Blocking: 1ブロックごとにACKを待つTFTPの特性上、遅延の影響を受けやすいですが、Windowsizeオプション(RFC 7440)との併用で緩和可能です。

  • 0-RTT: PSKを利用する場合、初手から暗号化データの要求が可能。

  • MTU: 暗号化タグ(16バイト)の分、ペイロードサイズを調整する必要があります。

【セキュリティ考慮事項】

  1. リプレイ攻撃への耐性: ブロック番号とセッション固有のNonceを組み合わせることで、過去の有効なパケットの再送を排除します。

  2. ダウングレード攻撃: クライアントが hmtftp オプションを要求した際、サーバーがこれを無視して通常のTFTPとして応答した場合、クライアントは即座に通信を遮断しなければなりません。

  3. 前方秘匿性 (PFS): 単純なPSK運用ではPFSは得られません。PFSが必要な場合は、Ephemeral Diffie-Hellman (ECDHE) による鍵交換をネゴシエーションフェーズに組み込む必要があります。

【まとめと実装への影響】

ネットワークエンジニアや開発者が留意すべき3つのポイント:

  1. ライブラリの選定: 既存のTFTPスタックに、軽量暗号ライブラリ(WolfSSLやMbed TLSなど)を組み込む必要があるため、コードサイズが数KB〜数十KB増加します。

  2. MTUサイズの計算: IP/UDPヘッダ + TFTPヘッダ + AEADタグ(16B) を考慮し、フラグメンテーションが発生しないよう blksize オプションを適切に(例:1428バイト以下)設計してください。

  3. エラーハンドリングの厳格化: 認証タグの検証失敗(改ざん検知)時は、単なるパケットロスとして扱わず、セキュリティ・インシデントとしてログを記録し、セッションを破棄する実装が求められます。

ライセンス:本記事のテキスト/コードは特記なき限り CC BY 4.0 です。引用の際は出典URL(本ページ)を明記してください。
利用ポリシー もご参照ください。

コメント

タイトルとURLをコピーしました