Linux の sysctl net.ipv4. icmp_echo_ignore_broadcasts / macOS (XNU) sysctl net.inet.icmp.bmcastecho の実装を読む

Linuxsysctl net.ipv4. icmp_echo_ignore_broadcasts と、 macOS / XNU の sysctl net.inet.icmp.bmcastecho の実装を調べたエントリです

何の sysctl ですか?

Linuxsysctl net.ipv4. icmp_echo_ignore_broadcastsCIS BenchmarksSmurf 攻撃対策として取り上げられています。

www.cisecurity.org

Smurf 攻撃とは何ですか?

Smurf 攻撃自体の説明は他のサイトで確認してください

ja.wikipedia.org

SMURF攻撃とは、攻撃者が標的となるサーバーをInternet Control Message Protocol(ICMP)パケットで圧倒させようとする分散サービス妨害(DDoS)攻撃です。1つまたは複数のコンピューターネットワークに対して、標的のデバイスのスプーフィングIPアドレスでリクエストを行うことにより、コンピューターネットワークは標的サーバーに応答し、初期攻撃トラフィックを増幅し、潜在的に標的を圧倒し、アクセス不能にします。この攻撃ベクトルは一般に、解決された脆弱性と見なされており、もはや流行していません。

引用: https://www.cloudflare.com/ja-jp/learning/ddos/smurf-ddos-attack

sysctl net.ipv4. icmp_echo_ignore_broadcasts の詳細

sysctl net.ipv4. icmp_echo_ignore_broadcasts あるいは /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts の説明を、Red Hat Cusotmer Portal から引用します。

icmp_echo_ignore_all 及び icmp_echo_ignore_broadcasts — 各ホストからの ICMP ECHO パケット、もしくはブロードキャスト及びマルチキャストのアドレスを起点とする ICMP ECHO パケットのみを無視することをそれぞれカーネルに許可します。0 の値は、カーネルによる応答を許可し、1 の値はパケットを無視します。

引用: https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/6/html/deployment_guide/s2-proc-dir-sys

macOS / XNU にも同様の sysctl 設定はあるのか?

macOS ( XNU ) では、Linux と同様に機能する sysctl として sysctl net.inet.icmp.bmcastecho が用意されています。なお、bmcastechoBroadcast Multicast Echo の略称のようです。

sysctl の実装を読もう

Smurf 攻撃の sysctl の設定方法を取り扱った記事はたくさんありますが、実装 (= カーネルのソース) まで踏み込んでるエントリは無いようなので、調べて見ましょう。

macOS ( XNU ) のソースも調べてました

続きを読む

UNIX Domain Socket の SO_SNDBUF, SO_RCVBUF についての覚書 (2) - macOS XNU のnet.local.stream.sendspace 周辺のソースを読む

hiboma.hatenadiary.jp

このエントリの続きです。

このエントリの内容

macOSカーネル ( XNU ) をソースで sysctl net.local.stream.sendspace の周辺のコードを眺める内容です。

私はBSD系のカーネルに馴染みがないので、手探りで調べつつ内容を書き記した内容になります。詳細・正確な記述・説明を読みたい場合は、別のサイトや文献を当たってください。

続きを読む

UNIX Domain Socket の SO_SNDBUF, SO_RCVBUF についての覚書

macOSLinuxUNIX Domain Socket の SO_SNDBUF, SO_RCVBUF について調べていた。

経緯

会社で @kurotaky のトラブルシューティングの相談を受けた際の覚書。

下記のように UNIX Domain Socket を挟んで IPC しているコードがあり、macOSLinux で挙動が違っているのを調べていた。Linux では Go Ethereum が送ってくるデータを全部読み出せるが、macOS だと一部 ( 8192 バイト 注1 ) しか読み出せないとのことだった。

Ruby のコード <----- UNIX Domain Socket -----> Go Ethereum

色々調べてみたところ、macOS / LinuxUNIX Domain Socket のデフォルトの SO_SNDBUF, SO_RCVBUF (注2) が違うことで、Ruby 側で 1回の recvmsg(2) で取り出せるデータのサイズが異なっているのが問題だったようだ。

続きを読む