djangoの脆弱性 CVE-2021-32052(HTTP Header Injection) 修正内容確認した

IT

※この記事で知り得たことを悪用することは禁止とします。

djangoの脆弱性を見かけましたので挙動を確認してみました。

django概要

Django は変転の激しいニュースルーム環境で開発された経緯から、よくある Web 開発タスクを迅速かつ簡単化するように設計されました。ここでは Django による データベースを使った Web アプリケーション開発をざっと見てみましょう。

Django の概要 https://docs.djangoproject.com/ja/3.2/intro/overview/

脆弱性概要

python3.9.5と脆弱なdjangoを使用している場合、URLValidatorが改行文字をチェックしないためHTTP Header Injectionの可能性があります。

対象バージョン

  • 3.2.2未満
  • 3.1.10未満
  • 2.2.22未満

修正方法は上記以上のバージョンに上げることです。

脆弱性情報は以下を参考にしています。

Snyk Vulnerability Database | Snyk
High severity (7.3) HTTP Header Injection in django | CVE-2021-32052

動作検証

※ローカル環境で再現しています。

検証用のコードです。

githubのテストコードを参考にしました。

Fixed #32713, Fixed CVE-2021-32052 -- Prevented newlines and tabs fro… · django/django@e1e81aa
…m being accepted in URLValidator on Python 3.9.5+. In Python 3.9.5+ urllib.parse() automatically removes ASCII newlines and tabs from URLs . Unfortunately it...

URLValidatorが使用できない文字列を検知した場合は例外が発生します。

検知しなかった場合はリダイレクト処理に移ります。

python3.9.5 + django3.2.1(脆弱)

djangoが3.2.1であることを確認します。

pythonが3.9.5であることを確認します。

サーバを起動し、アクセスします。

改行のチェックが行われないため、チェックが素通りしてリダイレクトされています。

python3.9.5 + django3.2.2(脆弱ではない)

djangoを3.2.2にアップデートします。

再度サーバを起動します。

サーバへアクセスすると、ValidationErrorとなりました。

python3.6.9 + django3.2.1(脆弱ではない)

pythonは3.6.9を使用します。

djangoは3.2.1を使用します。

再度サーバを起動してアクセスします。

「python3.9.5 + django3.2.2」の時と同様にValidationErrorとなりました。

個人的な不明点なぐり書き

python3.9.5で改行文字の扱いが変わった理由がよくわからなかったです。

課題 43882: [security] urllib.parse should sanitize urls containing ASCII newline and tabs. – Python tracker

改行文字を含むとどうなるかの検証は出来ましたが、改行文字を含んだURLをどう扱うとHTTPヘッダインジェクションになるかがわかりませんでした。

思いついたのはリダイレクトでしたが、リダイレクトはURLエンコードされてヘッダインジェクションっぽくはなりませんでした。

終わりに

django脆弱性の修正点確認でした。

これの環境構築をすることで簡単なdjangoアプリケーション作成を学ぶことが出来ました。

あまりdjangoで作られているアプリケーションを見かけませんが、それを見かけた場合は手元で検証できるようになったので助かりました。

よく見かけるjavaやASP.netでの検証も進めたいところです。

【PR】コミュニティの紹介

サイバーセキュリティ情報共有コミュニティをやっています。

インシデント例や脆弱性情報などを取り扱っています。

毎週金曜日はボイスチャットにて雑談会を行っています。

ご興味ありましたらご参加いただけると嬉しいです!

参加はこちら!

コメント

タイトルとURLをコピーしました