@IT messenger v1.4
クウ ……ふむふむ。なるほど
ジュン 特に最近話題になってるのは、バイナリセーフな関数とかバイナリセーフじゃない関数とかを交ぜこぜで使うと困ったことになる、ってとこかなぁ。
クウ バイナリセーフ……ですか? 言葉は聞いたことあるけど……。
ジュン んっと。バイナリをちゃんとバイナリとして扱えるってのが、バイナリセーフかな?
クウ ふむ……。
ジュン 制御文字とかが交ざってるときに、文字列として扱わないと困るときがあるからねー。
クウ むむむ……
ジュン 具体的な例の方がいいよね。特に問題になることが多いのは、%00のNULL文字かな。
クウ NULL文字っすか。それならギリギリ分かりそうっすね。
制御文字の中でも特に「%00」などで表すことができるNULL文字を、Webアプリケーションに渡される文字列の中に混入することで、意図しない動作を引き起こす可能性がある。バイナリセーフの場合、NULL文字も文字として扱われるが、非バイナリセーフの場合、NULL文字を「文字列の終了」と見なしてしまうため、以降の文字を扱えず、この挙動の差から問題が発生する。
例えば、Webアプリケーション内で利用されている関数に、バイナリセーフの関数と非バイナリセーフの関数が混在している際に「abcd%00efg」という文字列が渡されたとすると、以下のような挙動となってしまうことが想定される。ここでは、例として、「入力チェック」と「処理の実行」を対にして説明を行うが、この限りではない。
a.入力チェックがバイナリセーフの関数、処理の実行が非バイナリセーフの関数
入力チェックで、NULL文字以降の文字列「efg」が入力チェックを通過する条件になっている場合(例えば後方一致など)に、処理の実行で本来あるべきNULL文字以降の文字列が存在しないため想定外の動作となる可能性が存在する。
b.入力チェックが非バイナリセーフの関数、処理の実行がバイナリセーフの関数
非バイナリセーフの関数を用いた入力チェックでは、NULL文字以降がないものとされ、不正な文字が混入していても検知することができなくなる。しかし、入力チェックの後に同じ文字列に対しバイナリセーフの関数を使用すると、NULL文字以降に不正な文字が挿入されている場合、想定外の動作を行う可能性がある。
バイナリセーフ、非バイナリセーフの関数が混在していない場合でも、入力された文字列の後方に特定の文字列を追加することで処理の制御を行っている場合(例えばファイルの拡張子など)、非バイナリセーフの関数に与えられた際にその制限を回避されてしまうこととなる。
また、NULL文字だけではなく改行(%0d%0a)のような制御文字で問題が発生する場合も多く存在する。
このような問題が起きないようにするために、制御文字が混入することを想定し、バイナリセーフか否かを意識する必要がある。しかし、すべての関数について把握するのは非常に困難となるため、実際に制御文字がどのように扱われるかを試してみるのもよいだろう。
@IT messenger v1.4
ジュン %96%be%93%fa%81%41%92%a9%91%81%82%a2%82%b5%82%bb%82%eb%82%bb%82%eb%90%51%82%e6%82%a4%82%a9%82%c8
→明日、朝早いしそろそろ寝ようかな
クウ %8d%a1%93%fa%82%cd%82%a0%82%e8%82%aa%82%c6%82%c5%82%b5%82%bd%81%42%82%a8%82%e2%82%b7%82%dd%82%c8%82%b3%82%a2%81%49
→今日はありがとでした。おやすみなさい!
(Illustrated by はるぷ)
株式会社ユービーセキュア 技術本部 テクニカルサービス部 セキュアオーディットコンサルタント
杉山 俊春(すぎやま としはる)
セキュリティコンサルタントとして、主にWebアプリケーションのセキュリティ検査やWebアプリケーション検査ツールの開発などに従事している。大手ショッピングサイトなどの検査実績を持つ。
Copyright © ITmedia, Inc. All Rights Reserved.