Debian セキュリティ勧告

DLA-65-1 python-django -- LTS セキュリティ更新

報告日時:
2014-09-29
影響を受けるパッケージ:
python-django
危険性:
あり
参考セキュリティデータベース:
Mitre の CVE 辞書: CVE-2014-0480, CVE-2014-0481, CVE-2014-0482, CVE-2014-0483.
詳細:

この更新では reverse() が外部URLを生成する問題、 ファイルのアップロードに関するサービス拒否、 ミドルウェアのリモートユーザに関わる潜在的なセッションハイジャック問題、 管理用インターフェイスでのデータ漏洩に対処しています。

この更新は Debian LTS スポンサー http://www.freexian.com/services/debian-lts.html のおかげで実現しました。

  • CVE-2014-0480

    Django には補助関数 django.core.urlresolvers.reverse が収録され、view 関数やURLパターン名への参照からURLを生成するのによく利用されます。しかし、reverse() は連続する2つのスラッシュ文字 (//) から始まる入力を渡すことで他のホストへのスキームからの相対URLを生成するため、 reverse() の不安全な利用 (つまり、一般的な例を挙げるとエンドユーザがリダイレクト先を制御できる状況) を認識している攻撃者に任意のサイトへのリンク生成を許し、 フィッシング (phishing) その他の攻撃が可能になります。

    この問題を改善するためURLの逆転処理ではURLが連続する2つのスラッシュ文字 (//) で始まることのないよう、2つ目のスラッシュをURLエンコード形式 (F) に置き換えています。この方法によって意味は同一のまま、 スキームではなくドメインに対する相対URLを生成します。

  • CVE-2014-0481

    Django のファイルアップロード処理システムはデフォルト設定で、 既存のファイルと同一のディスク上のパス及び名前のファイルになります。 (ディスクに置かれる) ファイル名の終わりにアンダースコア (_) と整数値を付加することで新しい一意のファイル名を生成します。 既存のファイルと重ならない名前になるまで整数部は増やしていきます (つまり _1、_2、等)。

    この知識のある攻撃者はファイル名を共有する多数の小さなファイルを アップロードすることでファイル名生成の連続的な挙動を悪用できます。Django はその処理で、一意のファイル名を生成しようとするたびに延々と増えてゆく回数 os.stat() を呼び出すことになります。結果としてこういったアップロードでは、 比較的少ない回数であっても性能を著しく低下させる可能性があります。

    この問題を改善するため Django のファイルアップロードシステムはディスク上のファイル名衝突を避けるために 連続的な整数値を使うことはなくなり、 短い無作為の英数文字列を付加するようにすることで、 繰り返し衝突するファイル名を確実に多数生成する可能性を排除しています。

  • CVE-2014-0482

    Django はミドルウェア django.contrib.auth.middleware.RemoteUserMiddleware 及び認証目的で REMOTE_USER ヘッダを利用するその認証バックエンド django.contrib.auth.backends.RemoteUserBackend を提供しています。

    このミドルウェア及びバックエンドを利用している場合、 ある状況下で対応するログアウト/ログイン操作が介在することなく REMOTE_USER ヘッダに変更が発生した場合に、 あるユーザが別のユーザのセッションを受け取ってしまうことがあります。

    この問題を改善するため、明確なログアウトが行われることなく REMOTE_USER に変更があった場合には、このミドルウェアが新しい REMOTE_USER を受け付ける前にログアウトと続くログインを強制するようになっています。

  • CVE-2014-0483

    Django の管理用インターフェイス django.contrib.admin はポップアップウィンドウに関連項目の選択肢を表示する機能を提供します。 そのための仕組みは、 表示する関連性モデルを指定するURL及びクエリー文字列中の値、 及びその関連性を実装しているフィールドに依存します。 この仕組みはモデルクラス全体のレベルで権限確認を行います。

    しかし、この仕組みは指定されたフィールドが モデル間の関連性を実際に表しているものであるということを検証していません。 管理インターフェイスへのアクセス権限があり、 モデル構造と適切なURLについて十分に知識のあるユーザが、 アプリケーションの開発者がそういった方法での公開を意図していないフィールド等、 関係のないフィールドの値を表示するポップアップ表示を構成することが可能です。

    この問題を改善するため、この管理インターフェイスでは通常の権限確認に加え、 指定されたフィールドが管理者に登録されたモデルとの関連性を 実際に表しているかどうかを検証し、 真でない条件があれば例外を投げるようになっています。

Debian 6Squeezeでは、この問題は python-django バージョン 1.2.3-3+squeeze11 で修正されています。