啓蒙しても無駄な場合があるという衝撃的な事実

先日の価格.comがクラックされた事件における価格.com側の対応への皮肉として書かれた「カカクメソッド」というキーワードの解説を受けて価格.comを擁護するエントリを書いたnmpf氏がコメント欄で非難を浴びています。

さらに下記の記事でも反論されています。

エントリのタイトルが挑発的に過ぎたのもありますが、特にコメント欄における一連のやりとりから見えてくるのは素人と専門家の対立です。

この事件での侵入手口は「SQLインジェクション」であるとされているわけですが、それを許してしまうということが「妥当なセキュリティ」であったかどうかについて、nmpf氏がきちんと理解していないように見えます。

詳細は解説記事に譲りますが、「その気になれば容易にデータベースから情報を取り出せる」という点で、少なくとも顧客情報(侵入者にとって価値がある情報)を扱うデータベースの実装としてはあってはならないことです。

一方、この問題は技術者の間では非常によく知られているので、対処法は少し調べれば容易に判ります。したがって、もし対策をしていなかったとしたら設計者の手抜き以外の何者でもありません。

そんなわけで、手口がSQLインジェクションだったという前提に立つ限り、(あんまり良くない例えですが)nmpf氏が言うところのドアにカギも掛けず、窓も全開にしている状態だったことについて議論の余地はないでしょう。

でもまあ、そんなこと言われても一般の人にはあまりピンとこないことでしょう。誰でも入れる状態であっても、入ってさらに悪さをするためにはそれなりの専門的知識が必要です。ドア開けっ放しで鍵つけっぱなしの車が目の前にあっても、運転ができなきゃ盗めないのと一緒です。

SQLは車の運転ほど一般的ではありませんから、素人と専門家との間で温度差が生まれるのも当たり前です。そこにある「技術的な壁」は、見えないけれど意外と高くそびえ立っています。

……と、これで話が終わりになるんだったらわざわざ記事にしないのです。実はこの話には続きがありまして。

というのはなんとnmpf氏、素人じゃないらしいんですね。

nmpf氏のブログには今回の話と密接に関わるSQL関係のエントリが割とたくさんあって、その中の一つにこう書かれているのです。

スクリプトから送信したメールの履歴がMySQLに保存される・・・ように作ったはずが、ある特定のメールだけMySQLに保存されてない。

原因は何かと試行錯誤してたら、その保存されないメールの本文に「半角のシングルクォーテーション」が含まれているのを発見。
原因はこれだった。INSERT文を発行する前にmysql_escape_string関数でエスケープする処理を忘れていたのだ。

──って、こういうミスを突くのがまさに「SQLインジェクション」なんですがっ……!

続けてnmpf氏は、

これからは必ずINSERT前にクエリー文をエスケープする処理を忘れないようにすべし。

と、自分でその対処法についてはっきり書いています。

この対応だけで十分とは言えませんが、nmpf氏はSQLインジェクション脆弱性がどの程度の問題なのか認識できるだけの知識はあったと見なして構わないと思います。

となると、例の記事におけるコメント欄での対立は実は技術的な問題じゃなくて単に価値観の問題だったということになります。そこに技術的な知識の壁はありません。

これはとてつもなく深刻な問題ではないでしょうか。必要な知識に限ればほとんど差がないにも関わらず、そこには断絶していると言っていいほどの価値観の差があるのです。

よく、「会社の上の方の人間はセキュリティの重要性について全く理解してない」と愚痴るシステム管理者がいます。原因は上司の不勉強にあると一般的には言われています。

しかし、価格.comの問題における価値観の差は「上司を啓蒙しさえすればこの状況は改善されるはずだ」という管理者の一縷の望みすら断ち切るものです。だって、同等の知識があるのに解釈に致命的な差が生じてるんですから。

『システムセキュリティの問題で「啓蒙」が全く意味を為さない場合がある』という事実は、一部の人にとっては意外かつ絶望的な事実ではないでしょうか。

2005-06-06 追記

nmpf氏が価格.comの事件およびネットワークセキュリティに関わるエントリを重ねていくにつれ、彼の思想的背景などが明らかになってきました。

先日は「啓蒙しても無駄な場合があるんだなあ」と私は悲観的になったわけですが、これらのエントリを読む限り、どうやら今回はかなり特殊なケースだったようです。一般にはここまで理解が得られないということはない……と思われます。