rpi-xchange(rpi-GW)およびxchange(CentOS)への不適切アクセス
現在確認していますrpi-xchangeおよびxchangeへの不適切アクセスの例です。(ブロックの対象にしています。)CentOS版では確認していませんが、xchangeに同じ現象があるものと思われます。
下記に、生存確認の例を示しておきます。他のパケットに関しても同じ手順で応答を返す必要があります。IPアドレスが分る部分は、xでマスクしてあります。
生存確認の要求側のパケットです。
07:46:45.668636 IP xx.x.x.xxx.60005 > xxx.xxx.xxx.xxx.50100: UDP, length 10
0x0000: 4500 0026 0fee 4000 4011 66d3 xxxx xxxx E..&..@.@.f.....
0x0010: xxxx xxxx ea65 c3b4 0012 c429 4453 5452 .....e.....)DSTR
0x0020: 0000 7312 0000 ..s...
不適切な応答パケットです。
07:46:45.723745 IP xxx.xxx.xxx.xxx.50100 > xx.x.x.xxx.60005: UDP, length 10
0x0000: 4500 0026 888f 0000 3e11 3032 xxxx xxxx E..&....>.02....
0x0010: xxxx xxxx c3b4 ea65 0012 825a 4453 5452 .......e...ZDSTR
0x0020: 0097 7212 0000 0000 0000 0000 0000 ..r...........
要求パケットの上記の表示の例では20バイト目と21バイト目が(実際のパケットの最初を0バイトとした場合の、4,5バイト目です)0000で要求しているにも関わらず応答では0097で応答しています。この後20ミリ秒待機しても、要求と同じ番号の正規のパケットが受け取れません。このため要求パケットに対して正規の応答が有ったとは見なされていません。この手順は、送信したパケットが相手に受け取られているかどうかの確認も兼ねています。(通常は、正常に処理されれば、次の要求パケットで番号を1づつ足していきます。)
また、応答パケットは10バイトで応答することになっています。(先の書き込みを見てください。)これに対して上記例では、udpヘッダー上では、18バイト(udpヘッダー長を含めますので10バイトのデーターの場合は、18バイトとなります)、またIPヘッダー上では、38バイトとなっており(IPヘッダー、udpヘッダーそしてデータを合わせた長さは38バイトです)となっており正しいのですが、実際に送信されてきているパケット長は、10バイトでなく18バイトとなっています。最後に8バイトを余分に付加されて送られてきています。意図的に行っているとは思いませんが、このアクセス方法は、典型的なハッキングの手法のバッファーオーバーフローですので、至急修正して頂くようお願いします。なお、パケットの最初の10バイトは、D-STARの仕様書に記載されていますので、これに従ってください。(この仕様は、アイコム社のレピータコントローラーとdsgwdの間の接続手順と同じです。)
これらの該当部分を赤字にしてあります。
ブロックされているかどうかは、rpi-xchangeのモニター画面(設定で変更していなければ、ブラウザーでポート20201にアクセスすれば見られます。StatusがNGになっていれば、ブロックされています。)ブロックを外すには、プログラムを修正の上、rpi-xchangeを再起動してください。
追記 11月28日 これまで見落としていたのですが、CentOS版でも同じアクセスを確認しました。この影響で音声が途切れる現象が発生しています。このため、上記手順を守っていない接続と応答に20ミリ秒以上かかる接続は、他の接続先への転送に支障が出るため、rpi-xchangeおよびxchangeのどちらも、ブロックする仕様に変更しました。なお、これらが満足していれば、接続は制限していません。
蛇足です。
D-STARの音声パケットは、20ミリ秒間隔で音声情報を転送しています。この音声情報を遅滞なく転送できなければ、音声が中断することになります。このため、音声パケットの受信確認が20ミリ秒以内に受け取れなければ、以後の音声情報の転送をブロックするように変更しました。なお、この処置は、xchange(rpi-xchangeも含む)との間の通信にだけの制限です。この制限を回避する為に下記のように変更してください。
xchange(rpi-xchange) <-ハンドシェイクあり->外部のプログラム
を
xchange(rpi-xchange) <-ハンドシェイクあり->同一セグメント内のプログラム<-ハンドシェイクなし->外部のプログラム
に変更して下さい。
下記に、生存確認の例を示しておきます。他のパケットに関しても同じ手順で応答を返す必要があります。IPアドレスが分る部分は、xでマスクしてあります。
生存確認の要求側のパケットです。
07:46:45.668636 IP xx.x.x.xxx.60005 > xxx.xxx.xxx.xxx.50100: UDP, length 10
0x0000: 4500 0026 0fee 4000 4011 66d3 xxxx xxxx E..&..@.@.f.....
0x0010: xxxx xxxx ea65 c3b4 0012 c429 4453 5452 .....e.....)DSTR
0x0020: 0000 7312 0000 ..s...
不適切な応答パケットです。
07:46:45.723745 IP xxx.xxx.xxx.xxx.50100 > xx.x.x.xxx.60005: UDP, length 10
0x0000: 4500 0026 888f 0000 3e11 3032 xxxx xxxx E..&....>.02....
0x0010: xxxx xxxx c3b4 ea65 0012 825a 4453 5452 .......e...ZDSTR
0x0020: 0097 7212 0000 0000 0000 0000 0000 ..r...........
要求パケットの上記の表示の例では20バイト目と21バイト目が(実際のパケットの最初を0バイトとした場合の、4,5バイト目です)0000で要求しているにも関わらず応答では0097で応答しています。この後20ミリ秒待機しても、要求と同じ番号の正規のパケットが受け取れません。このため要求パケットに対して正規の応答が有ったとは見なされていません。この手順は、送信したパケットが相手に受け取られているかどうかの確認も兼ねています。(通常は、正常に処理されれば、次の要求パケットで番号を1づつ足していきます。)
また、応答パケットは10バイトで応答することになっています。(先の書き込みを見てください。)これに対して上記例では、udpヘッダー上では、18バイト(udpヘッダー長を含めますので10バイトのデーターの場合は、18バイトとなります)、またIPヘッダー上では、38バイトとなっており(IPヘッダー、udpヘッダーそしてデータを合わせた長さは38バイトです)となっており正しいのですが、実際に送信されてきているパケット長は、10バイトでなく18バイトとなっています。最後に8バイトを余分に付加されて送られてきています。意図的に行っているとは思いませんが、このアクセス方法は、典型的なハッキングの手法のバッファーオーバーフローですので、至急修正して頂くようお願いします。なお、パケットの最初の10バイトは、D-STARの仕様書に記載されていますので、これに従ってください。(この仕様は、アイコム社のレピータコントローラーとdsgwdの間の接続手順と同じです。)
これらの該当部分を赤字にしてあります。
ブロックされているかどうかは、rpi-xchangeのモニター画面(設定で変更していなければ、ブラウザーでポート20201にアクセスすれば見られます。StatusがNGになっていれば、ブロックされています。)ブロックを外すには、プログラムを修正の上、rpi-xchangeを再起動してください。
追記 11月28日 これまで見落としていたのですが、CentOS版でも同じアクセスを確認しました。この影響で音声が途切れる現象が発生しています。このため、上記手順を守っていない接続と応答に20ミリ秒以上かかる接続は、他の接続先への転送に支障が出るため、rpi-xchangeおよびxchangeのどちらも、ブロックする仕様に変更しました。なお、これらが満足していれば、接続は制限していません。
蛇足です。
D-STARの音声パケットは、20ミリ秒間隔で音声情報を転送しています。この音声情報を遅滞なく転送できなければ、音声が中断することになります。このため、音声パケットの受信確認が20ミリ秒以内に受け取れなければ、以後の音声情報の転送をブロックするように変更しました。なお、この処置は、xchange(rpi-xchangeも含む)との間の通信にだけの制限です。この制限を回避する為に下記のように変更してください。
xchange(rpi-xchange) <-ハンドシェイクあり->外部のプログラム
を
xchange(rpi-xchange) <-ハンドシェイクあり->同一セグメント内のプログラム<-ハンドシェイクなし->外部のプログラム
に変更して下さい。