サーバーサイド・テンプレート・インジェクション(SSTI)とは?

サーバーサイド・テンプレート・インジェクション(SSTI)とは?

近年のWebアプリケーションでは、効率的に開発を行うためにサーバーサイドでテンプレートエンジンを採用することがあります。テンプレートエンジンとは、雛形となるテンプレートに動的な入出力を記述することで一定の処理を行う仕組みです。

テンプレートエンジンは、プログラム言語ほどの複雑な処理は行えませんが、Webページの生成やドキュメントの出力など定型処理を行う場合に重宝するため、適切に利用すれば開発現場にさまざまなメリットをもたらしてくれます。

しかし、セキュリティを考慮せずにこのテンプレートエンジンを使っている場合、意図しない動作を引き起こしてしまうことがあります。このような問題をサーバーサイド・テンプレート・インジェクション脆弱性と呼び、この脆弱性を突く攻撃のことをサーバーサイド・テンプレート・インジェクション攻撃といいます。

なお、サーバーサイド・テンプレート・インジェクションは、コードインジェクションの一種ですが、近年のテンプレートエンジンの利用頻度の高まりにつれて標的となるケースが増えてきています。

サーバーサイド・テンプレート・インジェクション(SSTI)の仕組み

サーバーサイド・テンプレート・インジェクションは、コードインジェクションに似ていますが、以下のように、外部入力の値を元に雛形となるテンプレートを作成して用いる、あるいはテンプレートに組み込んで評価するといったことが原因で発生します。

【サーバーサイド・テンプレート・インジェクションが発生する条件】

  • 外部入力に基づいてテンプレートを作成している
  • 外部入力をもとにサーバーサイドのテンプレートエンジンなどで値を評価している

サーバーサイド・テンプレートインジェクション攻撃の概要

  1. 攻撃者はテンプレートとして成立する文字列を含んだHTTPリクエストを送信する
  2. 問題のあるWebアプリケーションでは、攻撃者が指定した文字列をテンプレートに組み込んで評価してしまう
  3. 2.の処理の結果、攻撃者が指定したテンプレートの実行結果が応答がされる

被害事例

サーバーサイド・テンプレート・インジェクション(SSTI)が原因で実例に至ったという報告はありませんが、バグバウンティーサービスなどで下記のように世界的に著名なWebサービスに問題が存在したことが報告されています。

Uber Eatsでの事例

2016年にUber Eatsの配送を確認する処理において、テンプレートエンジンを介してOSコマンドを実行できる脆弱性が発見されました。この問題はインシデントが発生する前に発見されたため、被害は出ませんでしたが、問題を検出してUber Eatsに報告した人物は、同社から報奨金を受けとっています。

脆弱性の解説動画

サーバーサイド・テンプレート・インジェクション(SSTI)が起こる原因

前述した通り外部入力をもとにテンプレートを作成もしくは実行することが原因で問題が発生ます。

また、近年ではMVCモデルを採用したフレームワークに含まれるテンプレートエンジンにおいては、複雑な処理を可能とするテンプレートエンジンが用いられています。そのため、複雑なロジックを処理できるリッチなテンプレートエンジンが標的になっています。

サーバーサイド・テンプレート・インジェクション(SSTI)の発生原因の概要

サーバーサイド・テンプレートインジェクション(SSTI)攻撃への対策手法

必須対策1(外部入力に依存したテンプレートを評価をしない)

外部入力をもとにテンプレートを組み立てる実装は本脆弱性を招く恐れがあります。そのため、外部パラメータの値からテンプレートを実行する処理が本当に必要か検討の上、他の処理方法で代価できる場合は、そちらの実装方法を採用することが望ましいと言えます。

必須対策2(バリデーション処理)

必須対策1が実施できない場合に行います。Webサイトの仕様上、どうしても外部パラメータからテンプレートを評価する必要がある場合には、規定のコード以外の入力の場合に処理を停止するようにチェック処理を行います。また、チェック処理に合わせてプログラムコード実行時にはchrootなどのコマンドを用いてルートディレクトリを変更して影響度を下げた上で実行することが望ましいと言えます。

推奨対策1(テンプレートエンジン)

置換機能のみのシンプルなテンプレートエンジンを使用します。複雑なロジックを記述できるテンプレートエンジンを用いた場合と比べてインシデント発生時に被害を抑止することが望めます。

オプショナルな対策1(WAFの導入)

Webアプリケーションファイアーウォール(WAF)を導入して、Webサイトを保護する方法です。この方法は一定の防御効果が見込めますが、製品を導入・運用していくのに費用が掛かることに加えて、他の脆弱性と同様にすべてのコード・インジェクション攻撃を防御することができません。そのため、あくまで前述した対策が実施できない場合などに代価案として実施することが望ましい対策と言えます。

まずは手軽にツールで脆弱性診断

上述の対策手法が重要となる一方で、脆弱性が混入されていないかを検知する事も重要となります。そのためには脆弱性診断を受診する必要があり、コードインジェクションの脆弱性についても脆弱性診断を通じて発見する事が出来ます。

脆弱性診断とは何かについて詳しく知りたい⽅は脆弱性診断とは(エンジニア向け)脆弱性診断とは(⾮エンジニア向け)もぜひご参照ください。

脆弱性診断ツール「Securify Scan」では、コードインジェクションの脆弱性検知も対応しております。脆弱性検知やセキュリティレベルを強化したい企業様はぜひ弊社の脆弱性診断ツール「Securify Scan」を活用ください。

無償でのトライアル実施も⾏っておりますので、お気軽にお問い合わせください。

Webアプリケーションの
継続的セキュリティを簡単に実現
Securify

ブログ一覧へ戻る

サービスに関するご質問・ご相談など
お気軽にお問い合わせください