ちゃっぴの監禁部屋

ガチガチに締めすぎて動きがとれなくなる。。。

ホーム 連絡をする 同期する ( RSS 2.0 ) Login
投稿数  405  : 記事  5  : コメント  12048  : トラックバック  134

ニュース

記事カテゴリ

書庫

日記カテゴリ

Communities

Personal Information

ちょっと前からですけど、SQL injection の祭りになってますね。第何次だろう。。。

ということで、injection 系の攻撃について改めて考察してみる。

Injection 系の脆弱性で有名なのはこんなのがあると思います。

  • SQL injection
  • XSS (cross Site Scripting), script injection
  • OS command injection

これらのものの共通点ってなんでしょう?

命令と data を混在させて扱えることですね。

ここに根本的な解決策があるわけです。混在させることが問題の本質なんですから、命令と data を完全に分離できるようにすればよいわけです。

SQL injection の対策としては、stored procedure, parameterized query の利用がありますね。これ行っていることがまさに命令と data の分離ですね。Data を parameter として切り出すことによって、絶対に命令として実行できないようにしています。

もちろん software として実装されているものなので、自分で同等のものを作成することもできます。ただ、それが本当に現実的でしょうか?脆弱性を作らないようにそういったものを用意するのは非常に大変です。というのは、扱う言語仕様を完璧に理解したうえで、間違いなく実装することが求められますから。

SQL の言語仕様完璧に抑えている人どれだけいますか?
HTML の言語仕様完璧に抑えている人どれだけいますか?
Shell の言語仕様完璧に抑えている人どれだけいますか?

それを完璧に理解していなければ独自の実装などやるべきではないです。多少面倒でも、標準で用意されている安全な方法を利用したほうがよいでしょう。

なお、XSS に関しては、要件によりますね。多くの場合、HTML tag を入力として扱う必要がないと思いますので、data と tag を分離するようにすれば問題ありません。難しい場合 (たとえば blog とか) には、HTML の仕様完璧に理解した上で扱いましょう。

OS command injection に関しては OS command を扱わないのが近道です。OS command 使わないと処理できないなんてことないでしょうから。

投稿日時 : 2008年3月20日 21:52

コメント

# re: Injection 系の脆弱性ってなんで起こるんだろ? 2008/03/20 22:41 凪瀬
アスペクト指向の横断的関心事のような事例はヒューマンエラーが起こりやすく、バグのないことの証明が悪魔の証明になる、というわけですね。

要するに、SQLインジェクションもXSSも「すべての」該当箇所で適切に処理されていなければならない、という代物なんですよ。(横断的関心事)
んで、人間が「気をつけることで」解決しようというのは、精神論にしかならず、あまり有効な対策とはならない。そもそも周知されているかも疑問だ。
だから、注意喚起は幾度もされるけども、後を絶たないわけですな。
間違えることができないような仕掛けのフレームワークにするなど、根治療法を考えないといけない

# re: Injection 系の脆弱性ってなんで起こるんだろ? 2008/03/20 23:33 ちゃっぴ
> アスペクト指向の横断的関心事のような事例はヒューマンエラーが起こりやすく、バグのないことの証明が悪魔の証明になる、というわけですね。

すいません。勉強不足でそちらに関しては全然追いついていません。
暇見つけて勉強してみます。

とわいえ、

> 間違えることができないような仕掛けのフレームワークにするなど、根治療法を考えないといけない

が主旨であることに間違いはありません。

あと、自分でそういった library を作ったとして、maintenance まで考慮するとという問題ももちろんあります。抜けてましたね。。。

# オブジェクト指向を利用してエスケープを行う 2008/03/21 0:19 凪瀬 Blog
オブジェクト指向を利用してエスケープを行う

# re: Injection 系の脆弱性ってなんで起こるんだろ? 2008/03/21 0:24 凪瀬
「横断的関心毎」は単なるキーワードで、要するに「すべてのXXに」何かをしないといけない、って類のはオブジェクト指向とかの既存のパラダイムじゃ解決できないねってこと。
全部が網羅的に大丈夫ってことを証明するには、全検査して確認するしかないわけで、非常に労力がかかるわけです。
利用箇所が有限だからかろうじてテストが実現可能だけど、漏れがないことの証明の大変さは正に悪魔の照明。

このタイプのものは基本的にシステム開発の中でヒューマンエラーに起因するバグを盛り込みやすい。
こういうところは機械でコード生成するとか、人間で処理しないことで全網羅する方向性が確実。
データのマッピングとかも手でコード書くとミスを盛り込むんですよね。

# re: Injection 系の脆弱性ってなんで起こるんだろ? 2008/03/21 22:26 ちゃっぴ
おっしゃっていることは非常によくわかります。

そうなんですよね。どんなに注意深い人でも間違いは犯すので、そんなものは機械的に check してやるのが正しいわけですし、より上の level としては基本的に扱えなくするというのが有効ですね。

ただし、全く扱えないとなるとそれはそれで問題なので、手順を踏めば扱える。これがやっぱり本来あるべき姿でしょうね。

とりあえず、default を反転した framework が出てきて欲しいもんですねぇ。。。


# アスペクト指向の概念 2008/05/12 15:15 凪瀬 Blog
アスペクト指向の概念

Post Feedback

タイトル
名前
Url:
コメント