传输网络ID检查

Proposal 147
Closed
Author zzz
Created 2019-02-28
Last Updated 2019-08-13
Target Version 0.9.42
Implemented In 0.9.42

概述

NTCP2(提案111)在会话请求阶段不拒绝来自不同网络ID的连接。 当前必须在会话确认阶段拒绝连接,当Bob检查Alice的RI时。

同样,SSU在会话请求阶段不拒绝来自不同网络ID的连接。 当前必须在会话确认阶段之后拒绝连接,当Bob检查Alice的RI时。

此提案更改了两种传输的会话请求阶段,以一种向后兼容的方式纳入网络ID。

动机

应当尽快拒绝来自错误网络的连接,并将其对等方列入黑名单。

目标

  • 防止测试网和分叉网络的交叉污染

  • 在NTCP2和SSU握手中添加网络ID

  • 对于NTCP2, 接收方(入站连接)应能够识别网络ID不同, 以便可以将对等方的IP列入黑名单。

  • 对于SSU, 接收方(入站连接)无法在会话请求阶段将其列入黑名单,因为 入站IP可能被伪装。更改握手的加密足够。

  • 防止从错误的网络重新播种

  • 必须向后兼容

非目标

  • NTCP 1不再使用,因此不会更改。

设计

对于NTCP2, 对值进行XOR运算只会导致加密失败, 接收方没有足够的信息来将发起者列入黑名单, 因此不推荐这种方法。

对于SSU, 我们将在会话请求中的某个位置对网络ID进行XOR运算。 由于这必须是向后兼容的,我们将XOR运算(id - 2) 因此对于当前网络ID值2,它将是一个无操作。

规范

文档

为有效网络ID值添加以下规范:

用途NetID编号
保留0
保留1
当前网络(默认)2
保留未来网络3 - 15
分叉和测试网络16 - 254
保留255

更改默认值的Java I2P配置为"router.networkID=nnn"。 更好地记录这个设置,并鼓励分叉和测试网络将该设置添加到他们的配置中。 鼓励其他实现对这个选项进行实现和文档记录。

NTCP2

在会话请求消息中使用选项(字节0)的第一个保留字节来包含当前为2的网络ID。 它包含网络ID。 如果非零,接收方应检查其与本地网络ID的最低有效字节是否一致。 如果不匹配,接收方应立即断开连接并将发起者的IP列入黑名单。

SSU

对于SSU,在HMAC-MD5计算中加入一个((netid - 2) « 8)的XOR。

现有:

HMAC-MD5(encryptedPayload + IV + (payloadLength ^ protocolVersion), macKey)

  '+'表示附加,'^'表示异或。
  payloadLength是一个2字节无符号整数
  protocolVersion是一个字节0x00

新的:

HMAC-MD5(encryptedPayload + IV + (payloadLength ^ protocolVersion ^ ((netid - 2) << 8)), macKey)

  '+'表示附加,'^'表示异或,'<<'表示左移。
  payloadLength是一个2字节无符号整数,big endian
  protocolVersion是两个字节0x0000,big endian
  netid是一个2字节无符号整数,big endian,合法值为2-254

重新播种

在重新获取su3文件时添加一个参数?netid=nnn。 更新重新播种软件以检查netid。如果存在且不等于"2", 应当拒绝获取,并给出错误代码,可能是403。 为重新播种软件添加配置选项,以便为测试或分叉网络配置备用netid。

注意事项

我们无法强制测试网络和分叉更改网络ID。 我们能做的最好的事情是文档记录和沟通。 如果我们确实发现与其他网络的交叉污染,我们应该尝试 联系开发人员或运营者,解释更改网络ID的重要性。

问题

迁移

对于当前的网络ID值2,这是向后兼容的。 如果有人在运行不同网络ID值的网络(测试或其他), 此更改则不向后兼容。 然而,我们不知道有谁在这样做。 如果仅仅是一个测试网络,这不是一个问题,只需同时更新所有路由器。