<p><meta/>
layout: protocol_specification
tone: professional_engineer
audience: network_engineers_and_iot_developers
protocol_focus: HMTFTP (draft-thompson-tftp-hmtftp)
status: draft_analysis
</p>
<p>本記事は<strong>Geminiの出力をプロンプト工学で整理した業務ドラフト(未検証)</strong>です。</p>
<h1 class="wp-block-heading">HMTFTP: Authenticated Encrypted Trivial File Transfer Protocol (Internet-Draft)</h1>
<h3 class="wp-block-heading">【背景と設計目標】</h3>
<p>IoTデバイスの非力なリソースでも動作するTFTPの軽量性を維持しつつ、AEAD暗号化により通信の機密性と整合性を確保することを目的とした新規プロトコル案。</p>
<p>TFTP(RFC 1350)は、認証や暗号化が一切存在しないため、信頼できないネットワーク上でのファームウェア更新等には利用できませんでした。HMTFTPは、TFTPの「オプション拡張(RFC 2347)」を利用し、ChaCha20-Poly1305などのAEAD(認証付き暗号)を統合することで、UDPベースのセキュアな転送を実現します。</p>
<h3 class="wp-block-heading">【通信シーケンスと動作】</h3>
<p>HMTFTPは、通常のTFTPリクエストに拡張オプション(<code>hmtftp</code>)を含めることから開始されます。鍵交換または事前共有鍵(PSK)に基づいてセッション鍵を生成し、以降のDATA/ACKパケットを暗号化・認証します。</p>
<div class="wp-block-merpress-mermaidjs diagram-source-mermaid"><pre class="mermaid">
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)
</pre></div>
<ol class="wp-block-list">
<li><p><strong>リクエスト:</strong> クライアントが <code>hmtftp</code> オプションを含む読込/書込リクエストを送信。</p></li>
<li><p><strong>オプションネゴシエーション:</strong> サーバーが <code>OACK</code> で応答し、暗号化に使用するNonceのシード等を提示。</p></li>
<li><p><strong>データ転送:</strong> 各データブロックはAEADアルゴリズムで保護され、改ざん検知(Tag)と暗号化が行われる。</p></li>
</ol>
<h3 class="wp-block-heading">【データ構造 / パケットフォーマット】</h3>
<p>HMTFTPのデータパケットは、従来のTFTPパケット構造のペイロード部分をAEAD構造に置き換えます。</p>
<div class="codehilite">
<pre data-enlighter-language="generic"> 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) |
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
</pre>
</div>
<ul class="wp-block-list">
<li><p><strong>Opcode (16bit):</strong> <code>03</code> (DATA) または <code>04</code> (ACK)。</p></li>
<li><p><strong>Block # (16bit):</strong> ブロック番号。AEADのNonce生成のカウンタとしても利用。</p></li>
<li><p><strong>Auth Tag (128bit):</strong> 改ざん防止用タグ。受信側はこのタグを検証してパケットの正当性を確認する。</p></li>
<li><p><strong>Encrypted Data:</strong> 暗号化されたファイルデータ。</p></li>
</ul>
<h3 class="wp-block-heading">【技術的な特徴と比較】</h3>
<p>既存のセキュア転送プロトコルとの比較を以下に示します。</p>
<figure class="wp-block-table"><table>
<thead>
<tr>
<th style="text-align:left;">機能</th>
<th style="text-align:left;">TFTP (RFC 1350)</th>
<th style="text-align:left;"><strong>HMTFTP (Draft)</strong></th>
<th style="text-align:left;">HTTPS (TLS 1.3)</th>
<th style="text-align:left;">SFTP (SSH)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:left;"><strong>トランスポート</strong></td>
<td style="text-align:left;">UDP</td>
<td style="text-align:left;"><strong>UDP</strong></td>
<td style="text-align:left;">TCP / QUIC</td>
<td style="text-align:left;">TCP</td>
</tr>
<tr>
<td style="text-align:left;"><strong>暗号化方式</strong></td>
<td style="text-align:left;">なし</td>
<td style="text-align:left;"><strong>AEAD (ChaCha20等)</strong></td>
<td style="text-align:left;">TLS (AES/ChaCha)</td>
<td style="text-align:left;">SSH (AES等)</td>
</tr>
<tr>
<td style="text-align:left;"><strong>オーバーヘッド</strong></td>
<td style="text-align:left;">極小</td>
<td style="text-align:left;"><strong>低 (IoT向け)</strong></td>
<td style="text-align:left;">高</td>
<td style="text-align:left;">高</td>
</tr>
<tr>
<td style="text-align:left;"><strong>実装の複雑さ</strong></td>
<td style="text-align:left;">非常に低い</td>
<td style="text-align:left;"><strong>中 (暗号ライブラリ依存)</strong></td>
<td style="text-align:left;">非常に高い</td>
<td style="text-align:left;">非常に高い</td>
</tr>
<tr>
<td style="text-align:left;"><strong>HOL Blocking</strong></td>
<td style="text-align:left;">あり(Stop-and-Wait)</td>
<td style="text-align:left;"><strong>あり(改善可能)</strong></td>
<td style="text-align:left;">なし(QUIC時)</td>
<td style="text-align:left;">あり</td>
</tr>
</tbody>
</table></figure>
<ul class="wp-block-list">
<li><p><strong>HOL Blocking:</strong> 1ブロックごとにACKを待つTFTPの特性上、遅延の影響を受けやすいですが、Windowsizeオプション(RFC 7440)との併用で緩和可能です。</p></li>
<li><p><strong>0-RTT:</strong> PSKを利用する場合、初手から暗号化データの要求が可能。</p></li>
<li><p><strong>MTU:</strong> 暗号化タグ(16バイト)の分、ペイロードサイズを調整する必要があります。</p></li>
</ul>
<h3 class="wp-block-heading">【セキュリティ考慮事項】</h3>
<ol class="wp-block-list">
<li><p><strong>リプレイ攻撃への耐性:</strong> ブロック番号とセッション固有のNonceを組み合わせることで、過去の有効なパケットの再送を排除します。</p></li>
<li><p><strong>ダウングレード攻撃:</strong> クライアントが <code>hmtftp</code> オプションを要求した際、サーバーがこれを無視して通常のTFTPとして応答した場合、クライアントは即座に通信を遮断しなければなりません。</p></li>
<li><p><strong>前方秘匿性 (PFS):</strong> 単純なPSK運用ではPFSは得られません。PFSが必要な場合は、Ephemeral Diffie-Hellman (ECDHE) による鍵交換をネゴシエーションフェーズに組み込む必要があります。</p></li>
</ol>
<h3 class="wp-block-heading">【まとめと実装への影響】</h3>
<p>ネットワークエンジニアや開発者が留意すべき3つのポイント:</p>
<ol class="wp-block-list">
<li><p><strong>ライブラリの選定:</strong> 既存のTFTPスタックに、軽量暗号ライブラリ(WolfSSLやMbed TLSなど)を組み込む必要があるため、コードサイズが数KB〜数十KB増加します。</p></li>
<li><p><strong>MTUサイズの計算:</strong> IP/UDPヘッダ + TFTPヘッダ + <strong>AEADタグ(16B)</strong> を考慮し、フラグメンテーションが発生しないよう <code>blksize</code> オプションを適切に(例:1428バイト以下)設計してください。</p></li>
<li><p><strong>エラーハンドリングの厳格化:</strong> 認証タグの検証失敗(改ざん検知)時は、単なるパケットロスとして扱わず、セキュリティ・インシデントとしてログを記録し、セッションを破棄する実装が求められます。</p></li>
</ol>
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)
リクエスト: クライアントが hmtftp オプションを含む読込/書込リクエストを送信。
オプションネゴシエーション: サーバーが OACK で応答し、暗号化に使用するNonceのシード等を提示。
データ転送: 各データブロックは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バイト)の分、ペイロードサイズを調整する必要があります。
【セキュリティ考慮事項】
リプレイ攻撃への耐性: ブロック番号とセッション固有のNonceを組み合わせることで、過去の有効なパケットの再送を排除します。
ダウングレード攻撃: クライアントが hmtftp オプションを要求した際、サーバーがこれを無視して通常のTFTPとして応答した場合、クライアントは即座に通信を遮断しなければなりません。
前方秘匿性 (PFS): 単純なPSK運用ではPFSは得られません。PFSが必要な場合は、Ephemeral Diffie-Hellman (ECDHE) による鍵交換をネゴシエーションフェーズに組み込む必要があります。
【まとめと実装への影響】
ネットワークエンジニアや開発者が留意すべき3つのポイント:
ライブラリの選定: 既存のTFTPスタックに、軽量暗号ライブラリ(WolfSSLやMbed TLSなど)を組み込む必要があるため、コードサイズが数KB〜数十KB増加します。
MTUサイズの計算: IP/UDPヘッダ + TFTPヘッダ + AEADタグ(16B) を考慮し、フラグメンテーションが発生しないよう blksize オプションを適切に(例:1428バイト以下)設計してください。
エラーハンドリングの厳格化: 認証タグの検証失敗(改ざん検知)時は、単なるパケットロスとして扱わず、セキュリティ・インシデントとしてログを記録し、セッションを破棄する実装が求められます。
コメント