SOCインフラエンジニアのブログ

ITインフラや情報セキュリティについて発信するブログです。

エスケープ!

エスケープ文字って何ですか?と問われ、何か聞き覚えはあるけど、よくわからずにいました。

 

エスケープ文字は、「それに続く文字に別の意味を持たせる」文字のようです。

 

・・・わかりずらい説明ですね。

 

以下、引用します。

 

通常、以下の3つの役割があります。

  • 意味を持つ文字列にエンコードする(文字列に意味を持たせる)
  • キーボードから入力できない文字を表現する
  • 望まない解釈となる文字の意味を打ち消す

一番目の「意味を持つ文字列にエンコードする」。これはターミナルなどで文字に色を付けたりする処理での利用方法です。コマンドラインアプリケーションでは、エスケープシークエンスを利用し、文字列に意味を持たせ文字や背景に色を付ける処理がよく行われています。

二番目の「キーボードから入力できない文字を表現する」はWebアプリでも見られます。例えば、文字列中のヌル文字は多くの言語で”\0″と標記します。

三番目の「望まない解釈となる文字の意味を打ち消す」がセキュリティ的に最も意味のある処理です。例えば、シングルクォートで囲まれた文字列にシングルクォートを書くには

エスケープ文字の\でエスケープし、特殊な意味(この例の場合、文字列の終端文字の ‘ )を打ち消しています。(注:このエスケープが使えない場合もあることに注意。OSコマンドエスケープXPathエスケープ、標準SQLの場合は’(シングルクオート)は’(シングルクオート)でエスケープします)

英語ではこの処理を”Character Quoting”と言う場合があります。英文マニュアルなどでエスケープの事をQuoteと書いてある場合がありますが、日本語ではエスケープとした方が解りやすいと思います。

Webアプリではエスケープ処理とセキュリティは切っても切れない関係にあります。Webアプリが処理するデータのほとんどがテキストインターフェースを持ち、特別な意味を持つ文字があるからです。

 

特別な意味を持つ文字が一文字でもある場合、ユーザー入力などをそのまま出力するとシステムが誤作動(インジェクション攻撃)する可能性があります。そもそもプログラムは正しい(妥当な)入力に対して正しく動作するように作られています。この為、不正なデータの受け入れは常にリスクが伴います。

攻撃者が悪意を持たせた入力を処理すると、システムに不正な処理を実行させる事(インジェクション攻撃)が可能になる事例は数えきれないくらい在ります。

セキュリティ対策的には、エスケープ処理は攻撃用入力データを送信(インジェクション)された場合でも「特別な意味を持つ文字の意味を打ち消し」、システムが誤作動しなくなるようにする為に行います。インジェクションができない様にエスケープ処理しても、出鱈目な攻撃用入力データがシステムに保存されることを防げない場合もあることに注意が必要です

 

Webアプリの脅威には様々な脅威がありますが、インジェクション攻撃がWebアプリにとって最大の脅威であることは、CVE等に登録される脆弱性情報からも明らかです。出鱈目な攻撃用入力データがシステムに保存されることを防げない場合があっても、エスケープ処理は様々なインジェクション攻撃の脅威に対するセキュリティ対策として重要な意味を持っています。

現在、Webシステムで問題となるインジェクション攻撃の大多数が”文字列”に対して”不正な処理を行う文字列”を”挿入”(インジェクション)することによって発生します。

■ そもそもエスケープとは何なのか?

 https://blog.ohgaki.net/what-is-escape