AWS InspectorがJinja2のXSS脆弱性を検出していたので、autoescapeを使って対応
はじめに
先日、AWS Inspectorによる脆弱性スキャンで、Lambda関数のJinja2テンプレートエンジンにXSS(クロスサイトスクリプティング)の脆弱性が検出されました。
今回はその対応方法と、簡単な例を使ってどのように解決したかを残しておきます!
結論
Jinja2のEnvironment()の引数にautoescape=Trueを追加する。
env = Environment(
autoescape=True, # この設定を追加
loader=DictLoader({
'greeting.html': '<h1>Hello {{ name }}!</h1>'
})
)
なぜ脆弱性があるのか?
Jinja2はデフォルトでautoescapeが無効になっているため、ユーザー入力がそのままHTMLに出力されてしまい、XSS攻撃の原因となる可能性があります。
脆弱性が検知されるであろうコードと、脆弱性に対応したコードを比較しつつ見ていきます。
Badな例
from jinja2 import Environment, DictLoader
# 脆弱なEnvironment設定(autoescapeが無効)
env = Environment(loader=DictLoader({
'greeting.html': '<h1>Hello {{ name }}!</h1>'
}))
# ユーザー入力を想定
user_input = '<script>alert("XSS攻撃!")</script>'
# テンプレートレンダリング
template = env.get_template('greeting.html')
result = template.render(name=user_input)
print(result)
# 出力結果: <h1>Hello <script>alert("XSS攻撃!")</script>!</h1>
上記のコードのように、何らかの形でユーザーから入力された値に悪意のあるスクリプトが含まれていた場合、そのままHTMLを出力するのは非常にマズイです。
要するに悪意のある攻撃をプログラムで保護できていないことが問題です。
Goodな例
from jinja2 import Environment, DictLoader
# 安全なEnvironment設定(autoescapeを有効化)
env = Environment(
autoescape=True, # この設定を追加
loader=DictLoader({
'greeting.html': '<h1>Hello {{ name }}!</h1>'
})
)
# 同じユーザー入力
user_input = '<script>alert("XSS攻撃!")</script>'
# テンプレートレンダリング
template = env.get_template('greeting.html')
result = template.render(name=user_input)
print(result)
# 出力: <h1>Hello <script>alert("XSS攻撃!")</script>!</h1>
Goodな例では、Environment()の引数にautoescape=Trueを追加しています。
これにより、Bad例であったような問題は解決でき、悪意のあるスクリプトが仕込まれたとしても対処することができます。
拡張子によって制限を変えることも可能
env = jinja2.Environment(
autoescape=select_autoescape(['html', 'xml']), # HTMLとXMLのみエスケープ
loader=jinja2.FileSystemLoader(path.join(path.dirname(__file__), 'templates'))
)
select_autoescape()を使うことにより、拡張子によってエスケープするかどうかを変えることも可能です。
単純にautoescape=Trueだけだと、全ての拡張子がエスケープされるので、一部のみ例外がある場合はこのような対処もOKです。
おわりに
AWS InspectorによるJinja2の脆弱性検出は、
たった一つのパラメータ autoescape=True の追加で解決できました。
セキュリティ対策は小さな設定変更から始まることが多いので、定期的なスキャンと迅速な対応が重要ですね。
AI時代に、スピード感を持ちつつプロダクト開発を進めていますが、
その分、防御の部分もしっかりと意識して開発していきたいですね!
では!
Discussion