解き放たれしソフトウェア

GNU/LinuxなどFLOSSについて書いてみるつもり

「えっ! 私の tarball 小さすぎ!?」 本当は怖い CDN サービス

ダウンロードする地域によってソース tarball のファイルが異なるという OpenVPN のウェブサイトのバグです。

おそらくは、間違えた tarball をアップロードして、しれっと挿し替えてアップロードし直してリリースしたところ、間違えた tarball が残っているミラーサーバがあったという事故。

OpenVPN はウェブサイトに Cloudflare という CDN サービスを利用しているようです。 だから、ダウンロードするクライアント側が名乗る地域によって実際のサーバを変えることで、より近くて速いサーバが自動的に選ばれるようになっています。

本来は、CDN サーバはファイルが挿し替えられたら同期して新しいファイルをコピーして分散させねばなりません。 ところが、旧ファイルが残っていたといったところでしょう。

昔ならば、ドメインネームが同じ=実際のサーバも同じ、だと思ってもほぼ差し支えありませんでした。 それが、DNS ラウンドロビンのように、同じドメインネームでも異なる IP アドレスに分散させる手法が増えました。 さらに今は、IP アドレスが同じでも、異なるサーバに分散させることも可能になりました。 それが、現在の異常に膨大なネットワークトラフィックとサーバ負荷を解決するための舞台裏なのです。 YoutubeGoogle をはじめ、物凄いアクセスと転送量をこなすウェブサービスでは普通になっています。例えば、世界中の無数の人々が google.com にアクセスしていますが、人それぞれに応対するサーバが異なっているのに、多くの人は「同じサービスを受けている」と思っているわけです。気づかないけれども実は、担当営業所も担当従業員も異なっている、みたいな世界です。

さて、著名なフリーソフトウェアでは一般的に、tarball のハッシュ値も記載するなどしてファイルが正しいか検証する手段を提供します。 OpenVPN の場合は、 GnuPG でサインしてあり、偽の tarball がクラッカーによりしこまれることを防止しています。

Gentoo Linux」では、ダウンロードした tarball が正しいか検証するために Manifest ファイル内にハッシュ値を格納しており、 Portage などのパッケージマネージャは自動的に検証するようになっています。

さて、Manifest ファイルは誰が造るかといえば勿論、パッケージメンテナです。( # ebuild foo-bar-1234.ebuild manifest )

さあさあ恐ろしいことに、パッケージメンテナが、手元にダウンロードした tarball が正しいか検証することを怠って Manifest を作成したらどうなるでしょうか。

Gentoo だけの話ではありません。DebianFedora などのバイナリでパッケージを配布するディストリビューションならば、パッケージメンテナが手元でビルドした成果物を配布します。 だから、メンテナが検証を怠ったら、恐ろしいことになります。

Upstream(ソフトウェア制作者)の担当者の作業ミスなだけでしたというのであっても、本来はポイントリリースで(バージョンナンバーを上げて)リリースし直すべきところを、しれっと挿し替えて黙っているということも不可能ではありません。 そうなると、どこぞではバグっている tarball が気づかれずに用いられたままという恐ろしいこともありえます。

さらに、誰かが、ウェブサーバをクラックするなどして tarball を挿し替えてマルウェア化させたら、どうなるでしょうか。

クラッカーがウェブサイトまで改竄して偽ファイルのハッシュ値を掲載してしまったらどうしようもありませんが、そこまで手の込んだことでなければ、ダウンロードした当人がひと手間かけて検証したらこうした事態は防げるのですよ。

そして通常は、エンドユーザは Upstream からダウンロードするのではなくてディストリビューションリポジトリからインストールします。そして、パッケージが正しいかはパッケージマネージャが自動的に検証してくれるので、多くのエンドユーザは気にも留めません。 つまり、パッケージメンテナが代わりに検証してくれるからです。

パッケージメンテナは、検証作業を決して怠るな、ということです。