セキュリティー

オートアップグレードの仕組みの考察

2010年6月2日

少し前、Twitterで複数の方々と議論したことですが、WordPressやConcrete5では、新しいバージョンが出たときに、FTPなどでアップロードすることでアップデートするのではなく、管理画面でボタンひとつでできるとの事。こういった機能があることがモダンなCMSの基準のひとつではないかとの事でした。

こういった機能は魅力的で、さまざまな層のユーザーを獲得できる可能性を秘めています。一方で、こういった機能を用いるとセキュリティーの問題がどうしても発生します。CMSをインストールするサーバーでは、各実行ファイルを読み書き可能な設定(777とか666とか)にする必要があり、サーバー管理の基本から離れてしまいます。ただ、個人のブログなど、そういった厳密なサーバー管理よりも利便性のほうがより優先されるようなケースも有るので、このあたりはユーザー側の選択に任せるという考え方も有ります。

セキュリティー上の問題は、新しいバージョンのファイルを配布する側にも発生しえます。例えば、サーバーにアップロードした配布ファイルを悪意のある人物に書き換えられるとか、中間者攻撃で悪意のあるファイルがユーザーの側に渡ってしまうとかです。あるCMSで実際にこういった攻撃がなされたこもあります。こういった攻撃が成功すると、該当のCMSを使用している複数のサーバーに攻撃コードを挿入されてしまうので、非常に危険です。

こういった攻撃をさけるために、MD5やSHA1などのハッシュ値を公開するということが良く行われます。ユーザーの側では、受け取ったファイルのハッシュ値が公表されているものと同一かどうかを調べることで、そのファイルが信用できるかどうか判断できるわけです。ただし、中間者攻撃を受けるとハッシュ値も書き換えられてしまいますので、平文ではなく、SSLなどを使ってハッシュ値のやり取りを行う必要があります。

SSLを用いてハッシュ値を公表して、ユーザーの側に利用してもらおうとすると、二つの敷居をまたがなければなりません。つまり、ハッシュ値を公表する側と、ユーザー側の両方でSSLが利用できることが必要です。

現在のところ、Jeans CMSの運営と管理にはsourceforge.jpの提供する機能だけを用いています。sourceforge.jpでは、ログインした状態でないとhttpsが使えません。またユーザーの側でも、OpenSSLなどがインストールされていないサーバーでJeansを利用するケースも多いと想像されます。私自身も、その一人です。

ですので、SSLを使わずにこういった攻撃を回避することができないか、考えてみました。
2010-06-01-upgrade.gif
4つの段階に分けて、この仕組みを説明します。

1)ユーザーの登録
 各ユーザーは、まず登録することが必要です。サーバー(サーバー1とする)に登録すると、IDとsaltという、共にランダムに生成された値が返ってきます。サーバー1とユーザーの両方で、これらの値を保存しておきます(ユーザーの側では、Jeans CMSが自動的に保存)。

2)新しいファイルの公開
 Jeans CMSを運営する側(私達モデレータ)では、新規バージョンの公開の際、サーバーにファイルをアップロードしますが、このサーバーには上の1で述べたものとは別のものを利用します(サーバー2とする)。サーバー1には、ファイルのハッシュ値をアップロードします。

3)新しいファイルのハッシュ値の取得。
 ユーザーがJeansをアップグレードする際、まずハッシュ値を取得します(Jeansが自動的に行う)。このとき、1で得たIDを元に、サーバー1に接続します。サーバー1では、新しいファイルのハッシュ値と、保存されているユーザーごとのsaltを用いて、個別のハッシュ値(salted hash)を作成して、ユーザーに返します。

4)新しいファイルの取得と、信頼性の確認
 ユーザーはサーバー2からファイルをダウンロードします(Jeansが自動的に行う)。1で保存してあったsaltを元に、ファイルのハッシュ値を計算します。この値と、3で得た値が合致していることを確認し、ファイルの展開を行います。

1の登録を済ませた後では、悪意のある人物が攻撃を成功させるためには、サーバー1とサーバー2の両方を乗っ取る必要があります。片方のサーバーの乗っ取りや、中間者攻撃だけでは、攻撃は成功しないはずです。

コメント

Kat (2010年6月2日 09:19:36)

サーバー1ではIDの保存にはそのハッシュを、saltの保存にはmcryptを用いて暗号化(IDを鍵に利用)してSQLテーブルに保存しておくことができる。こうしておけば、万一テーブルの内容が漏れても、問題は起きにくい。

mishimax (2010年6月3日 00:53:46)

WordPress はどんな実装なんでしょうね。きいてみれば分かることなんでしょうか。

Katsumi (2010年6月3日 04:06:42)

ソースコードを見れば、分かるはずですね。かなり規模の大きなツールなので、該当部分のコードを探すのが大変かもしれませんが。また、折を見て、調べてみます。

コメント送信