この記事では Django 1.5.4, 1.5.3 のセキュリティリリースについてお知らせします。 以下2つのブログ記事から一部抜粋、翻訳して掲載しています:


Django 1.5.4のセキュリティリリース (https://www.djangoproject.com/weblog/2013/sep/15/security/) について:

巨大なパスワードによるDOS攻撃

Django の認証フレームワーク(django.contrib.auth)はデフォルトのユーザーモデルと認証 バックエンドを備えており、ユーザー名とパスワードによって認証処理をします。 生の(ユーザー入力されたままの)パスワードはデータベースに保存されませんが、代わりにハッシュされた ものが保存されます。ハッシュの計算はユーザーがログインする度に行われます。 ハッシュ計算に使われる ハッシャー は、 PASSWORD_HASHERS 設定により指定されます。

Django デフォルトのハッシャーは PBKDF2 です。複雑なハッシュの計算ができる良さがあり、 効果的かつ独断的に有用です。これは最終的な結果を出す前に処理の反復を行うことで実現されています。 これによってブルートフォース攻撃への耐性が向上します。ハッシュ値に対応した プレーンテキストを見つけるために、攻撃者は何度もテキストをハッシュ化しなければなりません。

残念なことに、この複雑さは攻撃手法としても使われてしまいます。 Django は プレーンテキストパスワードの入力の、入力長に何の制限を持たせていません。 つまり攻撃者は単純に、任意の巨大 (でかつ、失敗するとわかっている) パスワードを送信し、 パスワードをチェックする過程で Django の走っているサーバーに高負荷のハッシュ計算を行わせます。 例えば PBKDF2 ハッシャーを使っている場合に 1MB のパスワードを送ると、計算にはおよそ1分ほど かかります。

巨大なパスワードを送りつづけることで DOS 攻撃を許してしまいます。高負荷のハッシュ計算によって サーバーリソースを占有されてしまうからです。

これは PDBKDF2 のような相対的に動作の遅いアルゴリズムに大して最も効果的です (もう一度言いますがPDBKDF2は Django の認証フレームワークのデフォルトで使用されています)。 この攻撃は他の、パスワード長に応じて計算時間が増大するハッシャーにも同様に有効です。

この問題の解決として、 Django の認証フレームワークはパスワードが 4096 バイトを超えると 自動で認証失敗とするようになりました。


Django1.5.3のセキュリティリリース (https://www.djangoproject.com/weblog/2013/sep/10/security-releases-issued/) について:

ssi テンプレートタグによるディレクトリトラバーサル問題

Django のテンプレート言語には、他のテンプレートを取り込んで描画する方法が2つあります:

  1. {% include %} タグはテンプレート名を受け取って、 Django のテンプレートを読み込む仕組み を利用します (これは他のテンプレートの読み込み同様、 TEMPLATE_DIRS 設定で特定された ディレクトリに制限されます)
  1. {% ssi %} タグ、ファイルパスを受け取って、そのファイルのコンテンツをテンプレートに 取り込みます (それがテンプレートならパース、描画も行います)。

ssi タグは TEMPLATE_DIRS に制限されないので、セキュリティ上のリスクに成り得ます。 ALLOWED_INCLUDE_ROOTS 設定は必須であり、 ssi が読めるファイルの場所を指定します。

問題に対する報告はDjangoのコアチームで確認されました。 それはALLOWED_INCLUDE_ROOTS 設定の 扱いにはディレクトリトラバーサルの脆弱性があるということです。 ssi へのパスを指定する際に、初めの部分を ALLOWED_INCLUDE_ROOTS 内のディレクトリへの 絶対パスにし、そこから相対パスを指定することで自由にアクセスできる、というものです。 例えば /var/includes を ALLOWED_INCLUDE_ROOTS に指定しているとして、以下のものは 許可されていました:

{% ssi '/var/includes/../../etc/passwd' %}

こうすると /etc/passwd がテンプレート出力に含まれていたでしょう。

ただし、この攻撃は特定の状況下でしか起こりえません。

  • 攻撃されるサイトに、1つ以上 ssi タグを使ったテンプレートがあり、サニタイズされていない ユーザー入力を ssi タグの引数として許可している場合
  • または攻撃者がサイトのテンプレートを変更できる場合

この問題に対応するため、 ssi タグは現在、 Python の os.path.abspath をファイルの絶対パス 特定に使っています。そしてそのパスが本当に ALLOWED_INCLUDE_ROOTS に許可されたディレクトリの 中かを検証します。

Rainer Koirikivi さんの報告に感謝します。

Currently unrated
  • Share

Comments

There are currently no comments

New Comment

* Please fill all required form field, thanks!