odz buffer

2006-09-18

[]クライアントに任意のSQLを実行させる危険性

クロスブラウザ関数群をブラウザ限定して小さくし、欲を言えば、日付入力用カレンダー やダイナミックロードとか、jslb_ajaxやドラッガブルフロートやインジケータオブジェクト、AjaSQLなども整理したいなぁと。

JavaScript++かも日記: 【jKamo】クロスブラウザ関数群をリメイク

うぉ。AjaSQLは1年近く放置されてたのでもう放棄かと思ったらやる気なんですね。なんか、はてなブックマークのほうを見ても最近でも地味にブックマークしている人がいるけど、自分の感覚からいえば有る程度制限を掛けているとしても不特定多数のクライアントから任意のSQLを実行させるなんてライブラリは作るほうも使おうとするほうも正気の沙汰とは思えないんだけどなぁ。ブックマークコメントを見てもほとんどの人は危険性を認知していないように思える。というより、多分、危険だと思った人はブックマークしてないだけなんだと思うけど。

ということで、とりあえずそのコンセプト自体の問題点を考えてみる。

レコードごとの認証を掛けることができない

多分、世の中のほとんどのRDBMSはテーブル毎のアクセス権限は細かく設定できてもレコード(行)毎のアクセス権限は設定できない。少なくともMySQLとSQLiteは無理。

すると有るテーブルのレコードを見せようとすれば、そのテーブルのレコードは全部見えてしまうことになるし、更新させようとすれば全レコードを更新できてしまう。JavaScriptのレベルで認証しても最終的には単なるHTTPリクエストなので、スクリプトやBookmarkletで簡単にHTTPリクエストが発行されるので問題外。JavaScriptのソースを難読化するとか暗号化するとかすれば有る程度防げるかも知れないが、所詮JavaScriptなので、多分Firefox+FireBugs+LiveHTTPHeadersとかで一発で解析される。

DoSに弱い

たとえ100レコードのテーブル1つしかなくても

SELECT f.id FROM foo as f, foo, foo, foo, foo;

ってやれば、結果は100億レコードになる。ついでに ORDER BY とか GROUP BY とか DISTINCT とかつければさらに効果的かもしれない。要するに、たかだが50文字程度のクエリパラメータを含むHTTPリクエスト1つで簡単にDoS攻撃ができるようになる可能性があると。

と、今思いつくのはこんなところかなぁ。DoSの方というかセキュリティ全般的にも、SQLの実行は

SendSQL("SELECT name FROM users WHERE id = ?", user_id);

みたいなプレースホルダを使った形にしておいて、登録してあるSQLしか実行できないようにしておくとかすれば多少はマシかなぁ。パラメータを検査なしで使うだけでも十分危ないけど。

高橋高橋 2006/09/19 17:06 こんにちは。今考えている、AjaSQLの使い道は、まず第一にSELECTオンリーの、型にはまった問い合わせ用。
たとえば、http://ajasql.org/sample/3/sample.htmでの12万件のデータへの問い合わせでは、サーバー側ロジックに触らずに簡単にいろいろ加工できて、速度も結構出てくれているかなと思っています。
あとは、イントラネットなどの信頼できるネットワーク用で、不特定多数が自由にすべてのSQL文を使えるという状況は今は考えてないです。

odzodz 2006/09/19 18:00 コメントどうもです。実は昨年掲示板で散々問題点を指摘したのは私なんですが(w
えと、イントラネット用ということですが、公式サイトにある掲示板や郵便番号検索のサンプルは不特定多数が使えますよね。掲示板に至ってははINSERTを使ってますし。言っていることとやっていることが全然一致してないように思われます。
そもそもイントラネット専用なら公式サイトの目立つところにでもそう書いておくべきじゃないですか?(今ちらっと公式サイトを見直しただけですが、イントラネット用というような記述は見受けられませんでした。)
あと、公式サイトにはゲートウェイで自動的にSQLインジェクション対策を行うとありますが、ゲートウェイ側ではどこからどこまでがエスケープ対象なのかわからないため、現状の仕組みでは不可能です。というか良く考えると、任意のSQLを実行させるのにSQLインジェクションもへったくれもないと思いますが。

高橋高橋 2006/09/19 19:08 AjaSQLはまだまだ試作品ですので、私が言っていることとテスト版の実装は、異なって当たり前です。掲示板なども自分の実験用です。一般の方には禁止しています。結構目立つように書いておいたつもりでしたが、もっと目立たせた方が良いかな。「インターネット上のサーバーへ放置することは危険ですのでご遠慮下さい。」http://ajasql.org/sample/ajasql/doc/ajasql-man-download.htm
うーん。公開も止めようかな。

odzodz 2006/09/19 21:47 実装がどうなっているとかソフトウェアの公開がどうとかいう話ではなくて、イントラネット専用だといっているのにインターネットに公開してますよね、って話です。
ダウンロードページの赤字の記述も、私には「現在はテスト版」だから危険だよ、何があっても知らないよ程度にしか書いてないように見えますし、安定版なら大丈夫でインターネット上での公開を前提にしているように見えます。作者自身が公開スペースでAjaSQLを使っているわけですし、これなら、ユーザはベータ版のソフトをインストールする調子でやってしまうとか考えられませんか?

odzodz 2006/09/19 21:57 余計かもしれませんが、サーバ側を触らずにやりたいってのなら Sajax(http://www.modernmethod.com/sajax/) なんかでいいんじゃないかなぁと思います。厳密にはサーバ側をいじっているわけですが、クライアントとサーバ、1ファイルで完結していて、適当にラッパー関数も用意してくれるので、サーバ側を編集している感じはしないと思います。似たような仕組みを Java Servlet + Rhino とかで作れば全部 JavaScript にすることもできそうですが。

高橋高橋 2006/09/20 09:28 odzさんのAjaSQLと私の考え方についての誤解だけ解いておきたいと思います。1.「JavaScriptのレベルで認証」はありません。サーバー側で権限設定します。2.「信頼できる」かどうかと権限さえクリアすればよいので「イントラネット専用」ではありません。メンバー以外見れなくすることもできます。3.仮に、イントラネット用だとしてもWebで公開してはいけない理由にはならないと、私は思っています。まして、警告までしているので。4.警告を無視して利用するユーザーへの配慮までは必要ないと、私は思っています。5.いずれにしても、AjaSQLは開発中のテスト版です。どんな制限を付け加えるかまで含めて、いろいろな可能性をのんびりテストしたいと思っています。

とはいえ、公開していたのは古いバージョンなので、確かに誤解もあるでしょうから、ダウンロードは止めました。フィードバックはしてもらえなくなりますが、とりあえずこれでやってみます。ご指摘には心から感謝しています。

odzodz 2006/09/20 11:51 えと、わかりにくいかもしれませんが、ここで上げている問題点はAjaSQL自体の問題ではなく、クライアント側で直接SQLクエリを組み立てて実行してしまうことの問題です。「JavaScriptレベルの認証」というのは1つの例ですが、サーバ側で認証したところでレコード単位のアクセス権限設定は無理ですし、SELECTを許可した時点でDoSもあっさり成功するでしょう。
あと3、4に関してですが、ソフトウェアの配布にはそれほど問題だとは思いません。
問題は「(イントラネット専用だろうが、なかろうが)不特定多数に公開しない」というのが、ソフトウェアを動かす上での前提だというのがわからないということです。しかも前提に反して、高橋さんは自分のサーバで不特定多数向けにAjaSQLを動かしているじゃないですか、と。
最後に、繰り返し言っておきますが、クライアントサイドでSQLを組み立てる現状のAjaSQLのコンセプトではSQLインジェクションを防ぐのは原理的に無理です。信頼できるクライアントが「値をきちんとエスケープする」のは可能ですが。

高橋高橋 2006/09/21 09:02 AjaSQLで試行錯誤しているのは、odzさんもプレースホルダはどうかなと言われているような、どういう型をどんなふうにはめるか、という部分です。使えるSQL文をサーバーへ登録してしまうのは、多少窮屈ですし、JavaScriptやHTTPクエリで送ったのでは意味がない。今は、そのページへ使うSQL文のリストを、対象ページファイル内に、データとしてMicroformatsのようなスタイルで記述するみたいなこととか試したりしています。
私のサーバーは研究用で、まぁ、善意者の便宜を優先ということで。。。

odzodz 2006/09/21 15:34 そこまでするなら、サーバサイドとクライアントサイドのラッパー関数を自動生成する仕組みを作ってしまうとかしたほうがいいような気がしますが。とりあえず Sajax 使えばどうなるかってのを最新のエントリに上げてあるので、そっちも見て考えてもらえれば幸いです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/odz/20060918/1158645784
Connection: close