ebtables ip/ip6 マッチの不具合

Bug #1331533 reported by T.Moris
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Ubuntu Japanese Kaizen Project
New
Undecided
Unassigned

Bug Description

ebtables (netfilter) の不具合についてご報告いたします。
ebtables の出力するログの内容が明らかに正しくありません。
Ubuntu 12.04 にて不具合を確認しました。

以下に例を示します。

前提:事前にブリッジ インターフェイス br0 を作成し、eth0 を参加させています。
# ebtables -A OUTPUT -o eth0 --log-prefix "ebtables:" --log-ip --log-ip6 -j ACCEPT

適当に br0 からパケットを送信し、下記のようなログを得ました。
プライベートに関わる箇所は加工しています。ご了承ください。
$ dmesg | grep ebtables
[5243446.752080] ebtables: IN= OUT=eth0 MAC source = 00:01:c0:09:b1:4f MAC dest = 01:00:5e:00:00:01 proto = 0x0800 IP SRC=8.0.70.192 IP DST=0.32.0.0, IP tos=0x00, IP proto=9
[5243446.752155] ebtables: IN= OUT=eth0 MAC source = 00:01:c0:09:b1:4f MAC dest = 33:33:00:00:00:01 proto = 0x86dd IPv6 SRC=c009:b14f:86dd:6000:0000:0020:0001:fe80 IPv6 DST=0000:0000:0000:XXXX:XXXX:XXXX:XXXX:ff02, IPv6 priority=0x3, Next Header=0

この 2 つのパケットの正体は何かと申しますと、Linux でブリッジを組んだときにローカルから勝手に定期的に(およそ 2 分間隔)発信される、マルチキャスト管理関係のパケットです。
前者が IPv4 マルチキャストの IGMPv2 Membership Query、後者が IPv6 マルチキャストの Multicast Listener Query です。
IPv4 の正しい内容は mac-dst=01:00:5e:00:00:01 ip-src=0.0.0.0 ip-dst=224.0.0.1 ip-proto=2
IPv6 の正しい内容は mac-dst=33:33:00:00:00:01 ip6-dst=ff02::1 ip6-proto=ICMPv6
となるはずなのですが、ログの内容が適切でないことがおわかりいただけるかと思います。

さて、ここで IPv6 のほうのログ内容に着目してみましょう。
SRC=c009:b14f:86dd:6000:0000:0020:0001:fe80
DST=0000:0000:0000:XXXX:XXXX:XXXX:XXXX:ff02
この中で、c009:b14f: は、mac-src=00:01:c0:09:b1:4f の下位の桁と一致しており、その次の :86dd: はこの Ethernet フレームの上位層が IPv6 であることを示す値 0x86dd と一致しています。
次の :6000:0000:0020:0001: は一見意味を見いだせませんが、最後の :fe80 は正しい送信元アドレスの先頭部分となっています。
よく観察すると、このぶった切れた送信元アドレスの続きは、ログの DST に続いています。0000:0000:0000:XXXX:XXXX:XXXX:XXXX: はまさに正しい送信元アドレス(の一部)です。
また、DST の最後の :ff02 は正しい送信先アドレスの一部と見て間違いないでしょう。

ログ出力の不具合については、カーネル ソースの net/bridge/netfilter/ebt_log.c 内の ebt_log_packet 関数に直接の原因があるらしいことは突き止めました。
この中で、次の行で L3 の先頭アドレスを取得しているのですが、これが L3 ではなく Ethernet フレームの先頭を指しているようなのです。
ih = skb_header_pointer(skb, 0, sizeof(_iph), &_iph);

それではどこをどのように修正すればよいのかということについては、私はカーネル プログラマではないのでわかりません。

加えて、ebtables の ip/ip6 マッチについても、同様の不具合があります。
上述の「ずれた」条件でルールを書いたら、マッチしてしまうのです。このように:
# ebtables -A OUTPUT -o eth0 -d 01:00:5e:00:00:01 -p ip --ip-src 8.0.70.192 --ip-dst 0.32.0.0 --ip-proto 9 -j DROP

こちらの原因は net/bridge/netfilter/ebt_ip.c の ebt_ip_mt 関数、
および同 ebt_ip6.c の ebt_ip6_mt 関数でしょうか。

今のところ filter テーブルの OUTPUT チェーンのみで実際にそのような不具合を確認しました。他にもあるかもしれません。

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.