以下の文章は本家ブログ記事の Security releases issued を訳したものです。

修正(8/19): 文の表現を一部修正(報告してくれたknzmさん、ありがとうございます)


本日、 Django の開発チームは複数のリリース、 Django 1.4.6, Django 1.5.2, と Django 1.6 beta 2 をセキュリティプロセスの一環として出しました。 PyPIダウンロードページ からダウンロードできます。

このリリースは 2 つのクロスサイトスクリプティング (XSS) 脆弱性に対処するものです: ひとつは、 Django の admin インタフェースが使うウィジェットにあるものです。 もう一つは、リダイレクト用の URL を検証するユーティリティ関数にあるものです。 この関数はよくログイン、ログアウト後に使われています。

この問題が抱えるリスクは限られたもので、すべての Django ユーザーに影響があるわけではありません。 リスクがあるか調べて、可能ならアップグレードするのが良いでしょう。

詳細については以下を参照してください。

問題: admin インタフェースでのクロスサイトスクリプティング (XSS)

Django の管理用アプリケーションである django.contrib.admin は、 CRUD (Create, Retrieval, Updating と Deleting) の機能を、信用できるユーザーにのみ 提供しています。これは自動で、カスタム可能なデータ操作用インタフェースです。

URLField (URL を保持するモデルフィールド) の値を表示する場合、 admin はこの値を安全なもの と扱います。しかしこれでは危険な値に正しく対処できません。 脆弱性を証明する (Proof-of-Concept: 概念実証) アプリケーションはすでに Django プロジェクト から提供されています。 これがどのように、管理用インタフェースで XSS が実行できる脆弱性になり得るかを説明します。

通常の Django での開発では、これは管理用インタフェースにしか影響を受けません。 誤った操作は django.contrib.admin のフォームウィジェットにのみ生じます。 しかし、他のアプリケーションも影響を受ける可能性があります。そのアプリケーションが admin インタフェースに提供されるフォームウィジェットを使っている場合です。

この問題の回避策として問題のウィジェット -- django.contrib.admin.widgets.AdminURLFieldWidget -- は修正されました。入力された URL を、潜在的にユーザによって提供される他の値と同じように扱うようになりました。 言い換えれば安全でないものと扱われるようになったということで、デフォルトでは Django の出力 エスケープの対象となったということです。

Łukasz Langa の報告に感謝します。

問題: is_safe_url を通した XSS の可能性

Django アプリケーションのよくあるパターンとして、クエリ文字パラメーター由来の URL を取得して、 ビューの処理が正常終了した場合にリダイレクト先として使うというものがあります。 このパターンは Django 自身でも使われており、例えば django.contrib.auth.views にある ログイン用ビューです。この場合は、ログイン成功後にユーザーをどこに送るかを決定するパラメーターを 受け取ります。

ユーティリティー関数 -- django.utils.http.is_safe_url() -- は URL が (完全修飾か相対 URL かに関わらず) 正しいホストであるかを検証するために提供されています。 悪意をもったクエリ文字による潜在的に危険なリダイレクトを回避するためのものです。

is_safe_url() 関数は HTTP か HTTPS URL で機能することを意図していました。しかし URL のパースする 方法によっては別スキームへのリダイレクトを許可してしまいます。例えば javascript: などです。 Django プロジェクトはこのメカニズムを利用して XSS 攻撃ができるかを知りませんが、 このような可能性はセキュリティレスポンスを出すには十分でした。

この問題の回避策として、 is_safe_url() 関数は HTTP か HTTPS 以外のスキームを正しく排除するよう 修正されました。

Nick Bruun の報告に感謝します。

影響のあるバージョン

URLField の XSS 問題は以下のバージョンの Django に影響します:

  • Django 1.5
  • Django 1.6 (現在はベータ版)
  • Django master 開発ブランチ

is_safe_url() の問題は以下のバージョンの Django に影響します:

  • Django 1.4
  • Django 1.5
  • Django 1.6 (現在はベータ版)
  • Django master 開発ブランチ

修正パッチ

上記の問題を修正するパッチは、 Django の master 開発ブランチ、 1.6, 1.5, 1.4 リリースブランチで適応済みです。 パッチは以下のチェンジセットから直接取得できます:

開発中の master ブランチ:

Django 1.6 リリースブランチ:

Django 1.5 リリースブランチ:

Django 1.4 リリースブランチ:

新しいリリースは以下にあります:

セキュリティ報告に関する一般的な注意事項

潜在的なセキュリティ問題の報告は、常に security@djangoproject.com から受けています。 Django の Trac や django-developers リストではありません。 詳細は セキュリティポリシー を見てください

Currently unrated
  • Share

Comments

There are currently no comments

New Comment

* Please fill all required form field, thanks!