전송 네트워크 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로부터의 연결을 거부하지 않습니다. 연결은 현재 밥이 앨리스의 RI를 확인할 때 세션 확인 단계 이후에 거부되어야 합니다.

이 제안서는 두 전송 모두에서 네트워크 ID를 기존 버전과 호환되는 방식으로 세션 요청 단계에 통합하도록 변경합니다.

동기

잘못된 네트워크로부터의 연결은 최대한 빨리 거부되어야 하며, 해당 피어는 블랙리스트에 등록되어야 합니다.

목표

  • 테스트 네트워크와 포크된 네트워크의 교차 오염 방지

  • NTCP2 및 SSU 핸드셰이크에 네트워크 ID 추가

  • NTCP2의 경우, 수신자(수신 연결)는 네트워크 ID가 다르다는 것을 식별할 수 있어야 하며, 피어의 IP를 블랙리스트에 추가할 수 있어야 합니다.

  • SSU의 경우, 수신자는 세션 요청 단계에서 블랙리스트에 추가할 수 없습니다. 왜냐하면 수신 IP가 스푸핑될 수 있기 때문입니다. 핸드셰이크의 암호화를 변경하는 것이 충분합니다.

  • 잘못된 네트워크로부터의 리시드 방지

  • 기존 버전과 호환 가능해야 함

비목표

  • NTCP1은 더 이상 사용되지 않으므로 변경되지 않을 것입니다.

설계

NTCP2의 경우, 값을 XOR하는 것은 암호화가 실패하게 만들 뿐이며, 수신자가 발신자를 블랙리스트에 올릴 충분한 정보를 가지지 않게 되므로, 이 접근 방식은 선호되지 않습니다.

SSU의 경우, 세션 요청의 어디에선가 네트워크 ID를 XOR할 것입니다. 이는 역호환 가능해야 하므로, 현재 네트워크 ID 값인 2에 대해서 아무 것도 하지 않도록 (id - 2)를 XOR할 것입니다.

규격

문서화

다음은 유효한 네트워크 ID 값의 명세입니다:

사용법NetID 번호
예약됨0
예약됨1
현재 네트워크 (기본)2
예약된 미래 네트워크3 - 15
포크 및 테스트 네트워크16 - 254
예약됨255

Java I2P 구성에서 기본값을 변경하려면 “router.networkID=nnn"를 사용합니다. 이 설정을 구성에 추가하도록 포크 및 테스트 네트워크를 권장하고, 이 옵션을 구현하고 문서화하도록 다른 구현을 권장합니다.

NTCP2

옵션의 첫 번째 예약 바이트 (바이트 0)를 현재 네트워크 ID인 2를 포함하도록 세션 요청 메시지에 사용합니다. 이는 네트워크 ID를 포함합니다. 0이 아닌 경우, 수신자는 로컬 네트워크 ID의 가장 낮은 바이트와 대조해야 합니다. 일치하지 않으면, 수신자는 즉시 연결을 끊고 발신자의 IP를 블랙리스트에 추가해야 합니다.

SSU

SSU의 경우, HMAC-MD5 계산에 ((netid - 2) « 8)을 XOR으로 추가합니다.

기존:

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

  '+'는 덧붙임을, '^'는 배타적 OR를 의미합니다.
  payloadLength는 2바이트 부호 없는 정수입니다
  protocolVersion은 한 바이트 0x00입니다

새로운:

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

  '+'는 덧붙임을, '^'는 배타적 OR를, '<<'는 왼쪽 이동을 의미합니다.
  payloadLength는 2바이트 부호 없는 정수, 빅 엔디언입니다
  protocolVersion은 두 바이트 0x0000, 빅 엔디언입니다
  netid는 2바이트 무부호 정수, 빅 엔디언이며, 합법적 값은 2-254입니다

리시딩

리시드 su3 파일을 가져올 때 ?netid=nnn 매개변수를 추가합니다. 리시드 소프트웨어를 업데이트하여 netid를 확인하도록 합니다. netid가 존재하고 “2"와 같지 않으면, 가져오기가 오류 코드로 거부되어야 합니다, 아마도 403 오류 코드로. 리시드 소프트웨어에 테스트 또는 포크된 네트워크에 대한 대체 netid를 구성할 수 있는 구성 옵션을 추가합니다.

주의 사항

테스트 네트워크와 포크가 네트워크 ID를 변경하도록 강요할 수는 없습니다. 우리가 할 수 있는 최선은 문서화와 소통입니다. 다른 네트워크와의 교차 오염을 발견하면, 네트워크 ID 변경의 중요성을 설명하기 위해 개발자나 운영자에게 연락을 시도해야 합니다.

문제점

마이그레이션

이 변경은 현재 네트워크 ID 값 2에 대해서는 역호환 가능합니다. 다른 네트워크 ID 값을 사용하는 네트워크(테스트 또는 기타)가 운영 중인 경우, 이 변경은 역호환되지 않습니다. 그러나 우리가 아는 한, 그러한 네트워크는 없습니다. 테스트 네트워크인 경우에는 문제가 아닙니다, 모든 라우터를 한 번에 업데이트하기만 하면 됩니다.