【入門編】SSTIを防ぐためのサンドボックス化とロジック分離 – アプリケーションセキュリティ & 安全な開発防御ガイド

こんにちは。日々、システムの守りを固める現場の最前線に立っている者です。

今日は「SSTI(サーバーサイドテンプレートインジェクション)」という、少し聞き慣れないけれど、一度食らうと致命傷になりかねない攻撃について、一緒に学んでいきましょう。

エンジニアになりたての頃、「入力されたデータをそのまま画面に出しちゃいけない」と教わったことはありませんか? その延長線上にある、もっと巧妙で恐ろしい罠がこれなんです。

—

1. SSTIって、結局なに?(泥棒の例えで理解する)

皆さんの家を想像してください。あなたは「手紙(ユーザーからの入力データ)」をポストから受け取り、それを「家の中の掲示板(テンプレートエンジン)」に貼って家族に見せていますよね。

通常、その手紙には「今日は天気がいいですね」といった挨拶しか書かれていません。でも、もし泥棒が「この手紙を読んだら、家の金庫の鍵を開けて、裏口から脱出せよ」という命令文を隠して送り込んできたらどうなるでしょうか?

掲示板を管理している家族(テンプレートエンジン)が、その命令文を「あ、これ実行しなきゃいけない指示なんだ!」と勘違いして、金庫を開けてしまったら……これがSSTIの正体です。

テンプレートエンジンは、本来「計算したり、条件分岐したり」と賢い機能を持っています。その賢さを悪用して、「プログラムを自由自在に動かしてやるぜ」と命令を送るのが攻撃者の狙いです。

—

2. なぜ「サニタイズ」だけでは足りないのか?

「じゃあ、悪い文字を消せばいいんでしょ?」と思うかもしれません。もちろん、怪しい文字を弾くのは基本ですが、相手はプロの泥棒です。あの手この手で「悪い命令」を隠してきます。

だからこそ、私たちは「そもそも、掲示板(テンプレート)には複雑な命令をさせない」という、より強い防犯対策が必要です。

悪い例(やってはいけないこと)

ユーザーが入力した名前を、深く考えずにテンプレートへ流し込んでいませんか?

Flaskでの危険な例
@app.route(“/hello”)
def hello():
user_input = request.args.get(‘name’)
# テンプレートにそのまま渡すと、入力内容でコードが実行される危険が!
return render_template_string(f”

こんにちは {user_input} さん

“)

この user_input に {{ 77 }} なんて文字列が入ったら、画面には「こんにちは 49 さん」と表示されてしまいます。計算ができている……つまり、プログラムが動かされているという証拠なんです。

—

3. 「サンドボックス」と「ロジック分離」で鉄壁を作る

では、どう守ればいいのでしょうか。大きく2つのポイントを押さえましょう。

① テンプレート内でのロジック実行を禁止する

テンプレートエンジン(Jinja2やThymeleafなど)には、設定で「この中で関数を実行させない」という機能があります。テンプレートは「表示するための場所」であって、「計算するための場所」ではないと割り切りましょう。

② 入力データは「ただの文字」として扱う(分離の原則)

一番確実なのは、テンプレートエンジンに渡す前に、データを完全に「ただの文字列」として切り離しておくことです。

安全な例:ロジックとデータを分離する
from flask import render_template

@app.route(“/hello”)
def hello():
user_input = request.args.get(‘name’)
# テンプレートエンジンに直接コードを渡さず、変数として安全に渡す
return render_template(“hello.html”, name=user_input)

hello.html 側もこうします:


こんにちは {{ name }} さん

これなら、たとえ {{ 77 }} と入力されても、そのまま「こんにちは {{ 77 }} さん」と画面に表示されるだけで、計算は行われません。泥棒の命令書が「ただのメモ書き」として処理されるわけです。

—

4. セキュリティは「疑うこと」から始まる

最後に、新人の皆さんに覚えておいてほしいことがあります。

「プログラムに渡されるデータは、すべて泥棒からの手紙だと思え」

これが、現場で生き残るセキュリティの心得です。
1. 複雑なことをテンプレートにさせない(ロジックの分離)
2. テンプレートの機能は制限する(サンドボックス化)
3. データとプログラムの通り道を分ける(構造化)

これらを意識するだけで、システムはぐっと強固になります。最初は面倒に感じるかもしれませんが、一度身につけてしまえば、それは一生使える「最強の防犯知識」になりますよ。

一歩ずつ、着実に。一緒に安全なコードを書いていきましょう!

コメント

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