Home > ブログ > 初めてOSSへパッチを出した時の話

ブログ

初めてOSSへパッチを出した時の話

先日のApache 2.4.49の脆弱性をみて、初めてOSSにパッチを出し、そしてバグを出した時のことを思い出したのでそのことを書いてみたいと思います。

以前勤めていた会社ではルーターを開発しており、そのソフトウェア開発をしていたことがあります。その中でIPv6用のVRRP(Virtual Router Redundancy Protocol)であるVRRPv3(*1)の実装を行った時期がありました。

当時、VRRPv3はまだRFC化されておらずドラフトが出たばかりの段階でした。このため、Ethereal(*2)もVRRPv3にはまだ対応しておらず、テスト時にどのみち必要になるし先に作っておくか、ということでEtherealにVRRPv3用のコードを追加しました。

当時の私はOSSへパッチを提供するということは考えたこともなかったので、自分が使うだけのつもりでいたのですが、同僚から「こういうのはパッチとして出した方がいい」ということでKAME Projectに関わっていたその同僚経由でパッチを提出してもらいました。たぶんこれが、初めてのOSSのパッチ提供だったと思います。

ところで、IPv6ではIPヘッダにチェックサムフィールドが無くなったので、上位プロトコルがチェックサムを計算する場合、Source IP、Destination IP等を含めた疑似ヘッダというものを作成し、それをチェックサムの計算対象に含めて計算します。

VRRPv3においても同様に疑似ヘッダを作成してチェックサムを計算する必要があるのですが、パッチを作成する際、IPv4(VRRPv2)の処理を流用して疑似ヘッダを含めずにチェックサムを計算するようにしてしまっていました。

その後、(ルーターの)VRRPv3の実装をしている最中に「そういえば、この前のパッチ、チェックサムの計算間違っていたな。。。」と思い出しチェックサム計算を修正したパッチを再提出しました。

その間にバグあり版のバージョンはリリースされておらず、修正パッチを入れたものがv0.9.3としてリリースされました。その時はリリースされるまでに修正が間に合ってよかったと安心していました。

ところで、その会社では毎年、Interop Tokyo(*3)に新機種や開発中の新バージョンのOSを出展しており(多分今もしているはずですが)、その年は他社のルーターとVRRPv3で相互接続するということが予定されていました。

無事VRRPv3の実装も終わりInteropの開催準備も始まったところで、現地の設営をしているメンバーからネットワーク構成を組んでみたがチェックサムエラーで相手方のルータのVRRPと接続できないと連絡がありました。Etherealによるパケット解析結果だとこちらのルータが出すパケットのチェックサムが誤っているとのことです。

QA(品質保証部)や評価部隊の人達に後ろに張付かれてかなり焦りながら現地から送られて来たデータを調べたところ、相手方のルーターがVRRPv3パケットのチェックサム計算に疑似ヘッダを含めていないIPv4と同じ方式で計算していることがわかり「ひょっとして。。。」と現地で使っているEtherealのバージョンを確認してもらったところ、修正パッチを出す前の不具合のあるnightly版であることがわかりました。先方の開発も不具合のあるnightly版を使って開発/テストしていたため、チェックサムの誤りに気付かなかったようです。

このことを現地に連絡して、相手方のルータのチェックサム処理の修正とEtherealの更新を行っていただき無事解決しました。

とりあえずこちら側に問題はなかったのでほっとしたやら、あまりにもしょぼいバグで恥ずかしかったやらと色んな思いでどっと疲れたのを覚えています。

(*1) RFC化されたVRRPv3では、IPv4/IPv6共通のプロトコルとなっていますが(RFC5798)、当時のdraftではVRRPv3はIPv6用のプロトコルでした。

(*2) 当時はWiresharkではなくまだEtherealでした。

(*3) ネットワーク機器の展示会。自動車でいうモーターショー的なもの。

投稿日:2021/10/22 01:39

タグ: OSS 与太話

Top

アーカイブ

タグ

Server (24) 作業実績 (17) PHP (15) プログラミング (15) ネットワーク (12) C (8) OpenSSL (8) C++ (7) PHP関連更新作業 (7) EC-CUBE (6) Webアプリ (6) Nginx (5) AWS (4) 書籍 (4) laravel (4) Linux (4) JavaScript (4) Rust (3) Vue.js (3) 与太話 (3) Symfony (2) Golang (2) OSS (1) MySQL (1) お知らせ (1) デモ (1) CreateJS (1) Apache (1)