FLATzブログ

[FLATzブログ]の記事一覧

Ruby On Rails Security Guideの訳 : 4 Redirection and Files – 4.1 Redirection

2010年03月19日(金)15:00|kimura|FLATzブログ, Ruby on Rails, 技術情報このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加

こんにちは。木村です。


今回は4 Redirection and Filesから
4.1 Redirectionです。


原文の単語と全く違う言葉に置きかえている場合が多々あります。原文ページと併せて、ご覧下さい。気になる箇所や間違っている箇所があれば、どうかご指摘下さい。


では、以下訳です。



4 Redirection and Files



4 リダイレクトとファイル


Another class of security vulnerabilities surrounds the use of redirection and files in web applications.


もう1つの種類のセキュリティ脆弱性はリダイレクトの使用とウェブアプリケーションのファイルの周辺に存在します。



4.1 Redirection



4.1 リダイレクト


- Redirection in a web application is an underestimated cracker tool: Not only can the attacker forward the user to a trap web site, he may also create a self-contained attack.


- webアプリケーションのリダイレクトはクラッカーツールとして甘く見られています。攻撃者は罠のあるwebサイトにユーザを転送できるだけでなく、内包型の攻撃を作り出すこともできます。


Whenever the user is allowed to pass (parts of) the URL for redirection, it is possibly vulnerable. The most obvious attack would be to redirect users to a fake web application which looks and feels exactly as the original one.
This so-called phishing attack works by sending an unsuspicious link in an email to the users, injecting the link by XSS in the web application or putting the link into an external site. It is unsuspicious, because the link starts with the URL to the web application and the URL to the malicious site is hidden in the redirection parameter: http://www.example.com/site/redirect?to= www.attacker.com. Here is an example of a legacy action:


ユーザが(部分的な)リダイレクトURLの通過を許可されるときはいつでも、攻撃を受けやすい可能性があります。最も分かりやすい攻撃は、オリジナルサイトと勘違いするような偽者のwebアプリケーションにユーザをリダイレクトすることでしょう。いわゆるフィッシング攻撃はユーザへのメールで疑わしくないリンクを送りつけるか、webアプリケーションのXSSをリンクに入れるか、外部サイトへのリンクを設置します。フィッシング攻撃は不審に思われません。なぜなら、リンクはwebアプリケーションへのURLで始まり、悪意のあるサイトへのURLはリダイレクトパラメータに隠されているからです。http://www.example.com/site/redirect?to= www.attacker.com. あるlegacyアクションの例が次の通りです。


def
legacy redirect_to(params.update(:action=>'main'))
end


This will redirect the user to the main action if he tried to access a legacy action. THowever, it can exploited by an attacker if he includes a host key in the URL:he intention was to preserve the URL parameters to the legacy action and pass them to the main action.


これはユーザがlegacyアクションにアクセスしようととするとmainアクションにリダイレクトします。legacyアクションへのURLパラメータをmainアクションに移動する時に保持することが目的です。しかしながら、URLにホストキーを含めることで攻撃者に悪用される可能性があります。



http://www.example.com/site/legacy?param1=xy&param2=23&host=www.attacker.com


If it is at the end of the URL it will hardly be noticed and redirects the user to the attacker.com host. A simple countermeasure would be to include only the expected parameters in a legacy action (again a whitelist approach, as opposed to removing unexpected parameters). And if you redirect to an URL, check it with a whitelist or a regular expression.


URLの終わりがこのようになっていれば、ほぼ気づかれずにユーザをattacker.comホストにリダイレクトします。簡単な対策方法はlegacyアクションに期待されるパラメータだけ含めることでしょう。(また一方で期待されないパラメータを削除するのとは対照的なホワイトリストという方法があります)もしリダイレクトするときは、ホワイトリストか正規表現でURLをチェックしてください。



4.1.1 Self-contained XSS



4.1.1 内包型のXSS


Another redirection and self-contained XSS attack works in Firefox and Opera by the use of the data protocol. This protocol displays its contents directly in the browser and can be anything from HTML or JavaScript to entire images:


もう1つのリダイレクトと内包型のXSSによる攻撃はデータプロトコルを使うことでFirefoxとOperaで動作します。このプロトコルはそのコンテンツをブラウザで直接表示し、HTMLやJavaScriptから完全な画像まで何にでもなれます。


data:text/html;base64,PHNjcmlwdD5hbGVydCgnWFNTJyk8L3NjcmlwdD4K


This example is a Base64 encoded JavaScript which displays a simple message box. In a redirection URL, an attacker could redirect to this URL with the malicious code in it. As a countermeasure, do not allow the user to supply (parts of) the URL to be redirected to.


この例は簡単なメッセージボックスを表示するJavaScriptをBase64エンコードしたものです。リダイレクトURLで使用する場合は、攻撃者は悪意のあるコードをデータプロトコルに含めることでリダイレクトすることができます。対策方法としては、(部分的な)リダイレクトURLをユーザに使わせないことです。


次回は4.2 File Uploadsです。

続きを読む


モテるアルゴリズム講座  第1回 グラフでモテたい

2010年03月05日(金)15:00|amakata|FLATzブログ, アルゴリズム, 技術情報このエントリをdel.icio.usに追加このエントリをはてなブックマークに追加

天方です。


今日からモテるアルゴリズム講座を始めたいと思います。


それでは、第1回グラフでモテたいの講義を始めようと思います。
なんといってもアルゴリズムができるとかいうと、いろいろモテます。
この講座を通じて、皆さんもアルゴリズムをマスターしてモテてください。


本日は、モテるアルゴリズムを考える上で重要な
グラフのデータ構造について話をしたいと思います。


グラフというと、普通思い浮かべるのは棒グラフとか円グラフとかかもしれませんが、今回は違います。そんな反応をしていると婚期を逃します。


グラフというのは、点と枝かつながってできるものをグラフと言います。


グラフの例

グラフの例



グラフはいろいろな分野で使われていると思いますが、
あのGoogleも検索エンジンのページの順位付けのためにグラフの概念を利用していたいりします。


さて、グラフをコンピュータ上で扱おうとすると、そのデータ構造の持たせ方に悩みます。
グラフ用のライブラリを使えばそれほど大変でもないのですが、やはり自分で書いた方がモテます。


グラフをデータとして表現するにはいくつか方法があります。
では、上記の図で示したグラフをさまざまなデータ構造で表現してみようと思います。


まず、上の図の点と枝を数学的な表現を使って次のように表現することにします。


点の集合 V=\{v_1,v_2,v_3,v_4,v_5,v_6\}


枝の集合 E=\{e_1,e_2,e_3,e_4,e_5,e_6,e_7,e_8,e_9,e_{10}\}


その場合、点と枝の接続関係は次のようになります。


枝, 始点, 終点
e_1,v_1,v_2\\e_2,v_2,v_4\\e_3,v_3,v_4\\e_4,v_4,v_5\\e_5,v_5,v_6\\e_6,v_6,v_1\\e_7,v_1,v_3\\e_8,v_5,v_2\\e_9,v_3,v_6\\e_{10},v_1,v_1


ちなみに、向きがある枝でできたグラフを有向グラフと呼びます。
向きがない枝でできたグラフを無向グラフと呼びます。


こういったグラフを表現するデータ構造としては、枝の始点と終点の番号の組を持たせることでグラフを表現する方法があります。


それではこのグラフのデータ構造をRubyをつかって表現してみましょう。


例えば、上記の視点と終点をRubyの配列で表現すると下記のようになります。


start_vertex = [1,2,3,4,5,6,1,5,3,1]
end_vertex = [2,4,4,5,6,1,3,2,6,1]


これは、さきほど示した数学的な表現だと下記のような表現になります。
start\_vertex=[v_1,v_2,v_3,v_4,v_5,v_6,v_1,v_5,v_3,v_1]\\end\_vertex=[v_2,v_4,v_4,v_5,v_6,v_1,v_3,v_2,v_6,v_1] … ①


配列の添え字が、枝の添え字 – 1になります。


頂点間に枝があるかどうかを調べるには
頂点数をnとするとO(n)の計算量(時間的)がかかります。
また、計算量(空間的)は枝数をmとすると2mです。


そこで、各頂点毎に、出入りする枝を持つという手があります。


たとえば、下記の様な図のように一つの頂点に出入りする枝に注目します。


頂点v1に入る枝と出る枝の例

頂点v1に入る枝と出る枝の例



これはRubyで表現すると下記のようになります。


start_edge = [[1, 7, 10], [2], [3, 9], [4], [5, 8], [6]]
end_edge = [[6, 10], [1, 8], [7], [2, 3], [4], [5, 9]]


数学的な表現では下記のようになります。
start\_edge=[[e_1,e_7,e_{10}],[e_2],[e_3,e_9],[e_4],[e_5,e_8],[e_6]]\\end\_edge=[[e_6,e_{10}],[e_1,e_8],[e_7],[e_2,e_3],[e_4],[e_5,e_9]] … ②


これで、頂点と枝の両方から検索ができるデータ構造ができました。ここモテます。
でも、もうすこしハイクラスのモテを期待したい場合は、クラスを利用したほうがいいと思います。


さて、配列でグラフを表現できるとからモテモテだと思っていい気になってはいけません。
やはりグラフを表現する場合にもTPOがあります。
例えば、他のラフの表現方法としては、接続行列を使う方法もあります。


接続行列 M=\left\(<br />
  \begin{array}{ccc}<br />
   1  & 0  &  0 &  0 & 0 & -1 &  1 &  0 &  0 & 0\<br />
   -1 & 1  &  0 &  0 & 0 &  0 &  0 & -1 &  0 & 0\<br />
   0  & 0  &  1 &  0 & 0 &  0 & -1 &  0 &  1 & 0\<br />
   0  & -1 & -1 &  1 & 0 &  0 &  0 &  0 &  0 & 0\<br />
   0  & 0  &  0 & -1 & 1 &  0 &  0 &  1 &  0 & 0\<br />
   0  & 0  &  0 &  0 &-1 &  1 &  0 &  0 & -1 & 0\<br />
  \end{array}<br />
\right) … ③


縦の座標が頂点の添え字、横の座標が枝の添え字に対応し、
要素が1であれば、その頂点を始点、要素が-1であれば、その頂点を終点とすることを表現しています。
この場合、計算量(空間的)はnmです。頂点間に枝があるかを調べる計算量(時間的)はO(m)です。
ちなみに、接続行列だと、自己ループしている枝を表すことができません。
そういえば、さきほどの配列を用いた、枝の始点と終点の番号の組のデータ構造だと、枝がない頂点を表現できません。
そこらへんについて、「ちょっときみ、そのデータ構造だと、自己ループが表現できないので、今回の案件には使わない方がいいと思うよ」と
それとなく耳打ちできるとそれとなくモテます。


他に隣接行列で表現する方法もあります。


隣接行列 A=\left\(<br />
  \begin{array}{ccc}<br />
  1 & 1 & 1 & 0 & 0 & 0 \<br />
  0 & 1 & 0 & 0 & 0 & 0 \<br />
  0 & 0 & 0 & 1 & 0 & 1 \<br />
  0 & 0 & 0 & 0 & 1 & 0 \<br />
  0 & 1 & 0 & 0 & 0 & 1 \<br />
  1 & 0 & 0 & 0 & 0 & 0 \<br />
  \end{array}<br />
\right) … ④


これは、縦の座標を始点の頂点の添え字に対応させ、横の座標を終点の頂点の添え字に対応させて表現したもので、1なら接続している、0なら接続していないという表現です。この場合、計算量(空間的)はn^2です。頂点間に枝があるかを調べる計算量(時間的)はO(1)です。
みなさん、もうお気づきとは思いますが、隣接行列では、同じ始点、終点をもつ複数の枝を表すことができなくなります。


さて、4種類ほど表現方法を扱いましたが、それぞれの表現では、表現できるパターンの制約や、グラフを参照、更新する場合の計算量(時間的、空間的)などが違います。
シチュエーションや、相手の好みによって、表現方法を変えるとモテまくります。


みなさんもグラフでモテてみませんか?

続きを読む


Page 1 of 8812345»...Last »

このページの先頭へ