アカウント名:
パスワード:
認証無視で管理者権限アカウントとか脆弱性ってより裏仕様のバックドアばれちゃったみたいなはなしですね
本当にバグだったんだろうか
オンラインでソースが見られないのでよくわかりませんが、本家のアナウンスを見ると
The 'realname' parameter is not correctly filtered on user account creation, which could lead to user data override.
とあるので、「realname」というパラメータの入力値のチェック漏れでSQLインジェクションか何かを許してしていたのではないでしょうか。普通の脆弱性ではないかと。
高木センセーの仰ってる通り、サニタイズとかじゃなくてパラメータライズドクエリを使え、と。こんなメジャーなシステムでそんな初歩的なミスをしていたなんて、ちょっと驚きですね。
#ふと思ったんですが、プリペアドステートメントとパラメータライズドクエリ、どっちがメジャーな呼び方なんでしょうかね。
プリペアードステートメント … 埋め込む概念や方式のこと。プレースホルダ … 埋込む箇所のこと。パラメータライズクエリ … プリペアードステートメントで作られたと保障されるクエリそのもの(最終的な形)。
少なくとも「プレースホルダ」と「プリペアドステートメント」の概念は、PHPのドキュメントでは、そう区別されています。http://php.net/manual/ja/pdo.prepared-statements.php [php.net]>より成熟したデータベースの多くは、プリペアドステートメントという 概念をサポートしています。>(略)>この例は、name および value を名前つきプレースホルダで置き換えて INSERT クエリを実行します。
上記ドキュメントを使わせてもらうと"INSERT INTO REGISTRY (name, value) VALUES (:name, :value)" … プリペアードステートメント:name や :value …… プレースホルダ$stmt->prepare()を利用したexecute();によって発行される "INSERT INTO REGISTRY (name, value) VALUES ('one', 1)" … パラメータライズクエリ(かな?)
こういうものだと私は思ってました。
プリペアードステートメント - mysqlだと準備済みステートメントと訳されてますね。PREPARE構文で事前に準備されたステートメント(SQL文)を表すと思います。プレースホルダを含まなくてもPREPARE構文使えばプリペアードステートメントでしょう。
プレースホルダ - 場所といえば場所だけど、転じて「?」を表す語となってることも多いと思う。マニュアル的にはパラメータマーカという方が多いみたい。パラメータマーカ→DBで使ってる、プレースホルダー→より一般的な言い方、といったところ?
パラメタライズドクエリ - パラメータマーカを含むプリペアードステートメントを実際に用いて行うクエリ。具体的にはパラメータ付きのEXECUTE構文、またはその準備を含む一連の行為を意味する、ってところ?
Oracleから入った私としてはPreparedStatementなんですが, これを使う理由としてはセキュリティ上の理由よりも, 実行時コンパイルとその再利用による性能向上が主目的でした.
# なにしろ性能が1桁違ってきますから, オンライントランザクション系なんかでは最重要のチューニングポイントで
こうした実行時コンパイル形式の実装をとっているDBMSでは, これが同時にパラメータの型制限になるわけですが, そうでない場合, 例えば渡されたパラメータを保存されているSQL文に字句展開して評価するような実装だと, セキュリティ的な効果は無いと以前に指摘されたことがあります. 具体的にどのDBMSがそうなのかは知らないのですが, 一般的な対策としては, パラメータ方式に頼らずに, サニタイズも併用するのが吉みたいです.
一例としてはMySQL Connector/J(MySQL+JAVA)がコネクタ内で字句展開していて、実際にSQLインジェクションを許す不具合を出してました。 [jvn.jp]現行バージョンも同様なのかは不明ですが、こういうケースも有るので多層防御の観点から入力段階でI/Fや設計した値の範囲内かのチェックは必要でしょうね。
追記。プレースホルダ、って言い回しもありますねぇ。
なんかこうやって言い回しが色々ありすぎるのも、パラメータライズドクエリが普及しない原因なのかなぁ。
検索し辛いし、言い回しが複数あると知らない人は頭の中にはてなが浮かぶでしょうし。
#私は直感的に意味がわかる、パラメータライズドクエリ派です。
ODBCのAPIだと、SQLPrepare()を実行してから、SQLBindParameter()を実行するのですが、私が最初に知った言い方はプリペアドステートメントで、パラメタライズドクエリを知ったときは、へー、そういう言い方もあるのか、、と思ったものです。
プレースホルダというと、DB用語ではない何か別のものを指すような印象を受けます。fooとかhogeなどメタ構文変数の様な感じがします。
というわけなので、私はプリペアドステートメント派です。
広義には後から実際のものを入れるために取っておく場所のことでしょうから広告やプレゼンのレイアウトレイアウトとか、そういうものを指すと思いますが、データーベースに適用しても全然違和感はないですね
浩光センセーも言ってますしねhttp://www.atmarkit.co.jp/fsecurity/column/ueno/60.html [atmarkit.co.jp]
MS的にはパワーポイント用語ですか・・・
> プレースホルダというと、DB用語ではない何か別のものを指すような印象を受けます。> fooとかhogeなどメタ構文変数の様な感じがします。置換されるもの、でいいんじゃないですか?printf のフォーマット文字列中の %s とかもそうですよね。
「場所取り」って言ってください。
SQLとか関係なくて、Perl独特の罠にひっかかっちゃったかんじです。http://blog.gerv.net/2014/10/new-class-of-vulnerability-in-perl-web-ap... [gerv.net]
これだから型の弱い処理系は嫌いだ。
https://bugzilla.mozilla.org/show_bug.cgi?id=1075578 [mozilla.org]http://bzr.mozilla.org/bugzilla/4.0/revision/7791 [mozilla.org] (のexpand all)を読むと、scalarをつけるタイミングの話みたいですね。
GETのクエリに同じものがあると(?foo=1&foo=2&foo=3)……ってことのようです。
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
私はプログラマです。1040 formに私の職業としてそう書いています -- Ken Thompson
バックドア? (スコア:0)
認証無視で管理者権限アカウントとか
脆弱性ってより裏仕様の
バックドアばれちゃったみたいなはなしですね
本当にバグだったんだろうか
Re:バックドア? (スコア:4, 参考になる)
オンラインでソースが見られないのでよくわかりませんが、本家のアナウンスを見ると
The 'realname' parameter is not correctly filtered on user account creation, which could lead to user data override.
とあるので、「realname」というパラメータの入力値のチェック漏れでSQLインジェクションか何かを許してしていたのではないでしょうか。
普通の脆弱性ではないかと。
Re:バックドア? (スコア:2, 興味深い)
高木センセーの仰ってる通り、サニタイズとかじゃなくてパラメータライズドクエリを使え、と。
こんなメジャーなシステムでそんな初歩的なミスをしていたなんて、ちょっと驚きですね。
#ふと思ったんですが、プリペアドステートメントとパラメータライズドクエリ、どっちがメジャーな呼び方なんでしょうかね。
Re:バックドア? (スコア:4, 参考になる)
プリペアードステートメント … 埋め込む概念や方式のこと。
プレースホルダ … 埋込む箇所のこと。
パラメータライズクエリ … プリペアードステートメントで作られたと保障されるクエリそのもの(最終的な形)。
少なくとも「プレースホルダ」と「プリペアドステートメント」の概念は、
PHPのドキュメントでは、そう区別されています。
http://php.net/manual/ja/pdo.prepared-statements.php [php.net]
>より成熟したデータベースの多くは、プリペアドステートメントという 概念をサポートしています。
>(略)
>この例は、name および value を名前つきプレースホルダで置き換えて INSERT クエリを実行します。
上記ドキュメントを使わせてもらうと
"INSERT INTO REGISTRY (name, value) VALUES (:name, :value)" … プリペアードステートメント
:name や :value …… プレースホルダ
$stmt->prepare()を利用したexecute();によって発行される "INSERT INTO REGISTRY (name, value) VALUES ('one', 1)" … パラメータライズクエリ(かな?)
こういうものだと私は思ってました。
==========================================
投稿処理前プレビュー確認後書込処理検証処理前反映可否確認処理後……
Re: (スコア:0)
プリペアードステートメント
- mysqlだと準備済みステートメントと訳されてますね。PREPARE構文で事前に準備されたステートメント(SQL文)を表すと思います。プレースホルダを含まなくてもPREPARE構文使えばプリペアードステートメントでしょう。
プレースホルダ
- 場所といえば場所だけど、転じて「?」を表す語となってることも多いと思う。マニュアル的にはパラメータマーカという方が多いみたい。パラメータマーカ→DBで使ってる、プレースホルダー→より一般的な言い方、といったところ?
パラメタライズドクエリ
- パラメータマーカを含むプリペアードステートメントを実際に用いて行うクエリ。具体的にはパラメータ付きのEXECUTE構文、またはその準備を含む一連の行為を意味する、ってところ?
Re:バックドア? (スコア:1)
Oracleから入った私としてはPreparedStatementなんですが, これを使う理由としてはセキュリティ上の理由よりも, 実行時コンパイルとその再利用による性能向上が主目的でした.
# なにしろ性能が1桁違ってきますから, オンライントランザクション系なんかでは最重要のチューニングポイントで
こうした実行時コンパイル形式の実装をとっているDBMSでは, これが同時にパラメータの型制限になるわけですが, そうでない場合, 例えば渡されたパラメータを保存されているSQL文に字句展開して評価するような実装だと, セキュリティ的な効果は無いと以前に指摘されたことがあります. 具体的にどのDBMSがそうなのかは知らないのですが, 一般的な対策としては, パラメータ方式に頼らずに, サニタイズも併用するのが吉みたいです.
Re:バックドア? (スコア:1)
こうした実行時コンパイル形式の実装をとっているDBMSでは, これが同時にパラメータの型制限になるわけですが, そうでない場合, 例えば渡されたパラメータを保存されているSQL文に字句展開して評価するような実装だと, セキュリティ的な効果は無いと以前に指摘されたことがあります. 具体的にどのDBMSがそうなのかは知らないのですが, 一般的な対策としては, パラメータ方式に頼らずに, サニタイズも併用するのが吉みたいです.
一例としてはMySQL Connector/J(MySQL+JAVA)がコネクタ内で字句展開していて、実際にSQLインジェクションを許す不具合を出してました。 [jvn.jp]
現行バージョンも同様なのかは不明ですが、こういうケースも有るので多層防御の観点から入力段階でI/Fや設計した値の範囲内かのチェックは必要でしょうね。
Re: (スコア:0)
追記。
プレースホルダ、って言い回しもありますねぇ。
なんかこうやって言い回しが色々ありすぎるのも、パラメータライズドクエリが普及しない原因なのかなぁ。
検索し辛いし、言い回しが複数あると知らない人は頭の中にはてなが浮かぶでしょうし。
#私は直感的に意味がわかる、パラメータライズドクエリ派です。
Re:バックドア? (スコア:1)
ODBCのAPIだと、SQLPrepare()を実行してから、SQLBindParameter()を実行するのですが、
私が最初に知った言い方はプリペアドステートメントで、パラメタライズドクエリを知ったときは、
へー、そういう言い方もあるのか、、と思ったものです。
プレースホルダというと、DB用語ではない何か別のものを指すような印象を受けます。
fooとかhogeなどメタ構文変数の様な感じがします。
というわけなので、私はプリペアドステートメント派です。
Re: (スコア:0)
広義には後から実際のものを入れるために取っておく場所のことでしょうから
広告やプレゼンのレイアウトレイアウトとか、そういうものを指すと思いますが、
データーベースに適用しても全然違和感はないですね
浩光センセーも言ってますしね
http://www.atmarkit.co.jp/fsecurity/column/ueno/60.html [atmarkit.co.jp]
MS的にはパワーポイント用語ですか・・・
Re: (スコア:0)
> プレースホルダというと、DB用語ではない何か別のものを指すような印象を受けます。
> fooとかhogeなどメタ構文変数の様な感じがします。
置換されるもの、でいいんじゃないですか?
printf のフォーマット文字列中の %s とかもそうですよね。
Re: (スコア:0)
「場所取り」って言ってください。
Re:バックドア? (スコア:1)
SQLとか関係なくて、Perl独特の罠にひっかかっちゃったかんじです。
http://blog.gerv.net/2014/10/new-class-of-vulnerability-in-perl-web-ap... [gerv.net]
Re: (スコア:0)
これだから型の弱い処理系は嫌いだ。
Re: (スコア:0)
https://bugzilla.mozilla.org/show_bug.cgi?id=1075578 [mozilla.org]
http://bzr.mozilla.org/bugzilla/4.0/revision/7791 [mozilla.org] (のexpand all)
を読むと、scalarをつけるタイミングの話みたいですね。
GETのクエリに同じものがあると(?foo=1&foo=2&foo=3)……ってことのようです。