
Dynaconf は、__@Jinja__ リゾルバーにおける安全でないテンプレート評価により、サーバーサイドテンプレートインジェクション (SSTI) に対して脆弱です。jinja2 パッケージがインストールされている場合、Dynaconf は設定値に埋め込まれたテンプレート式をサンドボックス化されていない環境で評価します。
攻撃者が以下のような設定ソースに影響を与えることができる場合:
.env ファイル...ホストシステム上で任意の OS コマンドを実行される可能性があります。さらに、__@Format__ リゾルバーはオブジェクトグラフの走査を許可するため、機密性の高いランタイムオブジェクトや環境変数が露出する可能性があります。
この脆弱性は、Dynaconf の文字列リゾルバーに適切なセキュリティ境界が存在しないために発生します。
__@Jinja__ リゾルバー__@Jinja__ リゾルバーは、完全な Jinja2 評価を使用してテンプレートをレンダリングします。ただし、レンダリングコンテキストは、攻撃者が Python の内部属性にアクセスできるようになります。 などのオブジェクトを使用することで、攻撃者は Python のグローバルに到達し、 モジュールをインポートできます。
cycleros攻撃経路の例:
cycler → __init__ → __globals__ → os → popen()
これにより、任意のコマンド実行が可能になります。
__@Format__ リゾルバー__@Format__ リゾルバーは、内部オブジェクトを使用して Python の文字列フォーマットを実行します。これにより、攻撃者は Python のオブジェクトグラフを走査し、機密性の高いランタイムオブジェクトにアクセスできます。
走査の例:
{this.__class__.__init__.__globals__[os].environ}
これにより、以下が露出する可能性があります:
import os
from dynaconf import Dynaconf
# 悪意のある設定インジェクション
os.environ["DYNACONF_RCE"] = "@jinja {{ cycler.__init__.__globals__.os.popen('id').read() }}"
settings = Dynaconf()
print("[!] コマンド実行結果:")
print(settings.RCE)
悪用に成功すると、攻撃者は以下を実行できます:
設定値は CI/CD パイプライン、コンテナオーケストレーションシステム、または環境インジェクションに由来する可能性があるため、この脆弱性は実際のデプロイメントにおいてリモートから悪用可能になる可能性があります。
from jinja2.sandbox import SandboxedEnvironment
env = SandboxedEnvironment()
template = env.from_string("{{ config_value }}")
safe_value = template.render(config_value=user_input)
__@Format__ の使用を信頼できる値に制限するsafe_value = "{name}".format(name=trusted_name)