諸事情によりD-STAR界隈とは一切関わりたくないと思っているのですが、流石にこれは放置できない話なので日記の記事としてまとめます。
レピータ管理団体及び JARL・D-STAR委員会等が提供しているプログラム以外を接続されているユーザー の皆様へにある、以下の記述。
生存確認の要求側のパケットの例 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... に対する応答パケットが、本来であれば上記の要求に対しては赤字で示したマジックナンバーが 仕様書で示された手順(パケット毎に異なる任意の数値で、ゾーンレピータとGWとの通信で送られた パケットの識別として使われ、この数値を返送して届いたことを認識する。)に準拠していない例です。(実際の返答パケットです。) 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........... この応答例では、仕様書によれば0000を返す必要があるのですが、0097を返しています。 この値が仕様書に準拠していないため、届いた確認が取れず、次の処理に進めません。 このため、全てのxchangeの転送が出来ないことになります。また、この応答例では、これ以外にも 問題があり、本来10バイトで返答しているにもかかわらず。18バイト送ってきています。 (最後に赤で示した8バイトです。) この手法は、バッファオーバーフローと呼ばれる典型的なハッキングの手法の 一つです。 |
0097の値に関しては知りませんが、クラッキングでもバッファオーバーフローでもないです。
- Ethernetの仕様に従い、runt packet避けのpaddingを付けているだけ
- マトモなTCP/IPスタックを搭載した現代のOSにおいては、paddingがあっても全く問題にならない
- そもそもクラッキングの意図は無い
というだけの話。ここから後は長いので、お急ぎなら話のキモとなるrunt packetをgoogleとかで調べておけば十分。
データ長に問題がないことはIPヘッダ及びUDPヘッダを読めば明白で、生存確認の要求側のマシン上でtcpdumpを実行すればこのような結果になるのも当然。証拠?コードを書かずとも、システムに含まれるコマンドだけで確認可能。
マシンを二台…ここではemeraude(192.168.0.141, Linux)とframboise(192.168.0.144, OpenBSD)を用意して、emeraude上でtcpdumpを動かしてログを取るとこんな感じ。
root@emeraude:/home/uaa# tcpdump -XX -i br0 \(udp\) and \(port 1234\) tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on br0, link-type EN10MB (Ethernet), snapshot length 262144 bytes 09:06:55.048855 IP 192.168.0.144.2003 > 192.168.0.141.1234: UDP, length 4 0x0000: 9673 a468 f7ff 00e0 4c66 0532 0800 4500 .s.h....Lf.2..E. 0x0010: 0020 1cd7 0000 4011 db88 c0a8 0090 c0a8 ......@......... 0x0020: 008d 07d3 04d2 000c ae57 6161 610a 0000 .........Waaa... 0x0030: 0000 0000 0000 0000 0000 0000 ............ 09:06:59.786391 IP 192.168.0.141.34123 > 192.168.0.144.1234: UDP, length 4 0x0000: 00e0 4c66 0532 9673 a468 f7ff 0800 4500 ..Lf.2.s.h....E. 0x0010: 0020 3ed7 4000 4011 7988 c0a8 008d c0a8 ..>.@.@.y....... 0x0020: 0090 854b 04d2 000c 828b 6262 620a ...K......bbb. |
一つ目のパケットはframboiseからecho aaa | nc -u 192.168.0.141 1234でemeraudeへ送られてきたもの、二つ目はemeraudeからecho bbb | nc -u 192.168.0.144 1234でframboiseに送ったもの。
一つ目のパケットが適当そうなので分解してみると、
- 9673 a468 f7ff 宛先(emeraude)のMAC address (6byte)
- 00e0 4c66 0532 送信元(framboise)のMAC address (6byte)
- 0800 イーサネットタイプ (2byte)
- 4500 0020 1cd7 0000 4011 db88 c0a8 0090 c0a8 008d 07d3 04d2 000c ae57 6161 610a IPパケット(32byte)
- 0000 0000 0000 0000 0000 0000 0000 padding (14byte)
6+6+2+32+14=60byteで、これにFCSの4byteが付加されて合計64byte。詳細はWikipediaのイーサネットフレームの項などを参照。そして14byteのpaddingがあるにも関わらずtcpdumpの表示では"UDP, length 4"となっている点にも御注目。echo aaaないしecho bbbで3文字送っていても改行コードが付くので4byte、これは意図した通り。
生存確認の要求側のパケットの例がどのようなtcpdumpのオプションなりネットワークインタフェースなりを使ってログを取ったのかはこちらでは不明…悪意を持って伏せている可能性もありそう。何であれ、知識と経験が豊富なOM達が集うD-STAR委員会が、Ethernet上を流れる小さなIPパケットをダンプしてバッファオーバーフローと呼ばれる典型的なハッキングの手法と言うのであれば何を根拠としてそう判断したのか是非とも示して頂きたいところ。研鑽に努めよと言い放つなら、尚更。
これに加え、rpi-xchange(rpi-GW)およびxchange(CentOS)への不適切アクセスでも「意図的に行っているとは思いませんが、このアクセス方法は、典型的なハッキングの手法のバッファーオーバーフローですので、至急修正して頂くようお願いします。」という文言も引っかかる。runt packet避けの、デバイスドライバやコントローラにおける意図的な処理…例えばLinux用RTL8139のドライバ、8139too.cでのpaddingをEthernetの仕様に反してでも外せ、というのだろうか?
(おまけ)
framboise# tcpdump -XX -i re0 udp and \(port 1234\) tcpdump: listening on re0, link-type EN10MB 09:06:55.046650 192.168.0.144.2003 > 192.168.0.141.1234: udp 4 0000: 4500 0020 1cd7 0000 4011 0000 c0a8 0090 E.. ....@....... 0010: c0a8 008d 07d3 04d2 000c 828b 6161 610a ............aaa. 09:06:59.784278 192.168.0.141.34123 > 192.168.0.144.1234: udp 4 (DF) 0000: 4500 0020 3ed7 4000 4011 7988 c0a8 008d E.. >.@.@.y..... 0010: c0a8 0090 854b 04d2 000c 2ede 6262 620a .....K......bbb. 0020: 0000 0000 0000 0000 0000 0000 0000 .............. |
emeraudeだけでなくframboiseでも同時にtcpdumpを動かしてみたのですが、OpenBSDのtcpdumpって-XX非対応なんですかね…-Xと等価な動きになっています。あと、SLIP接続すれば当然ですがpaddingは無いです。MAC addressも無いですけど。
root@slackware-vm2:/home/uaa# tcpdump -XX -i sl0 \(udp\) and \(port 1234\) tcpdump: verbose output suppressed, use -v[v]... for full protocol decode listening on sl0, link-type RAW (Raw IP), snapshot length 262144 bytes 12:45:07.140325 IP 192.168.200.1.4424 > 192.168.200.2.1234: UDP, length 4 0x0000: 4500 0020 05de 0000 4011 639a c0a8 c801 E.......@.c..... 0x0010: c0a8 c802 1148 04d2 000c 15fb 6161 610a .....H......aaa. 12:45:16.826180 IP 192.168.200.2.54082 > 192.168.200.1.1234: UDP, length 4 0x0000: 4500 0020 df1d 4000 4011 4a5a c0a8 c802 E.....@.@.JZ.... 0x0010: c0a8 c801 d342 04d2 000c 51ff 6262 620a .....B....Q.bbb. |
framboise# tcpdump -XX -i tun0 \(udp\) and \(port 1234\) tcpdump: listening on tun0, link-type LOOP 12:45:00.394831 192.168.200.1.4424 > 192.168.200.2.1234: udp 4 0000: 4500 0020 05de 0000 4011 639a c0a8 c801 E.. ....@.c..... 0010: c0a8 c802 1148 04d2 000c 15fb 6161 610a .....H......aaa. 12:45:10.092035 192.168.200.2.54082 > 192.168.200.1.1234: udp 4 (DF) 0000: 4500 0020 df1d 4000 4011 4a5a c0a8 c802 E.. ..@.@.JZ.... 0010: c0a8 c801 d342 04d2 000c 51ff 6262 620a .....B....Q.bbb. |
シリアルポートを使用する都合上、emeraudeの代わりにOpenBox上のLinux仮想マシンを使ってしまいましたがこれは問題にならないでしょう。SLIPはLinux側は標準のslattach、OpenBSD側は拙作のsliptunで構成しています。56.1kg(14:55)
23-Sep-2024補足:「rpi-xchange(rpi-GW)およびxchange(CentOS)への不適切アクセス」を掲載していたD-STAR技術情報はすべての記事を消してしまっているようなので、こちらにweb archiveへのリンクを張っておきます。
これとは別件で、D-STARで使用するAMBE-2020のspeech rate/FEC rateを調べておりました。speech=2400bps/FEC=1200bpsにおけるAMBE-2020の設定は二つあり、FECにblock codeを使うか、convolutional codeを使うかという違いがありまして、どちらを使うかについてはD-STARの仕様書にも記載はありません。D-STAR技術情報の記事によれば「D-STARで使用されいていますAMBE2020のFECのコードは、"block code"です。」だそうですが…こういう重要な情報を消してしまうことに対しては、愚行、と言うしかなさそうです。
なお、AMBE-3003のマニュアルでは「This rate is interoperable with DSTAR.」と注釈があるので、設定値に迷わないで済むようになっています。