大垣靖男氏はISO27000を理解していない
大垣靖男氏著『Webアプリセキュリティ対策入門 ~あなたのサイトは大丈夫?』には付録として「サンプルBBS」のソースコードが掲載されています。大垣さんによる「入力バリデーション」の実際を、見てみます。
そのために、Lib/bbs.class.phpで定義されているValidateInputs()関数の挙動をみることにします。
ログイン画面からユーザ名、パスワードを受けて、この関数は、正規表現で検査した結果の返り値を、V_RETURN に格納する *はず* です。ところがせっかく得られた返り値 V_RETURN を入力バリデーションの判定に利用せずに捨ててしまっていますので、結果的にはなんでもオーケーになっていて、入力バリデーションをしていないのと同じになってしまっています。
この後、入力バリデーションが機能しないまま、 Login($username,$password) のパラメータに引き渡しているようです。ここからは、さらに、Lib/auth.class.php の Login($username,$password) が呼ばれるようです。(認証ですね)
これでは、大垣さんの設計したアプリケーションの機能要件からみて、非常に不味い事態です。
さて、さきに見たように、入力バリデーション用の正規表現の返り値を捨ててしまっていたのでまずかった、であるならば、コードを修正して返り値を使ってあげたら大丈夫なのでしょうか。
実はこれでも駄目なのです。というのは、ユーザ名とパスワードとの入力バリデーション用の正規表現は、ソースコード上では、両方とも、 ^[a-z0-9]$ であって、量指定子が記述されていないのです。 これでは、例えば、 yohgaki と云う正当なはずのユーザ名に対し正規表現でエラー値が返ってきてしまいます。やはり、想定されるべきアプリケーションの機能要件を満たしません。これもまた不味い事態です。
ここまでをまとめますと、ソースコード上では、BBSのログインのための入力項目、ユーザ名とパスワードへの入力バリデーション用の正規表現に誤りがあり、本来は正当な入力であってもことごとくエラー判定するはずなのですが、さらに誤ってその返り値を捨ててしまっているので、逆になんでもオーケーとなり、正しい入力バリデーションに失敗しているのでした。
【注意を払わなければ、いっけん正しく動いているようにみえるかもしれませんが…】
ここで大垣さんがバグを作り込んでしまった状況について考えてみます。
まず、さすがに自らの書籍のサンプルですから、BBSを実機に設置してテストしたはずと考えます。その際には、ユーザ名とパスワードを適宜入力して、『動く動く♪』と評価なさったことでしょう。
しかし、アプリケーションの機能要件の検査として、入力バリデーションを通過しないはずのテストデータを用意してのチェックをすることを、サボっていたことが明白でしょう。
また、ソースレベルで、ごくごく簡単な(英数字の)正規表現に量指定子のないという、目視で気がつくレベルの単純な誤りに気がつかないはずも 【普通なら】 ありません。
大垣さんは、成果物のソースコードをじっくり見ていないのでしょう。
従って返り値を使っていないというミスも見逃しています。
これらのミスのうち、どれかひとつでも潰していれば、芋づる式に他のミスにも気がついたに相違ありません。
きちんとデバッグできていないようです。
書籍の付録に対して、うかつにもほどがあります。
人間は誤りをおかす存在です。そのことをこの拙記事で問題視してあげつらうつもりは毛頭ありません。
ミスは訂正すれば良いのですから。
しかしながら、問題にしたいことは別にあります。
サンプルBBSのソースの分析から判ることは、大垣さんがミスを発見しようと努めなかった形跡が見受けられることです。これは宜しくありません。
入力バリデーションの威力を強調する書籍の付録のサンプルにおいて入力バリデーションに失敗していますから書籍出版上でなんとも不味い、【手抜きの露呈】と云う重大なリスクを見逃していたことになります。
さて、ここからが本題です。
最近の大垣さんの雑誌への寄稿やblog、SNSでの苛烈な記事を拝見致しますと、ISO27000という標準に倣え、というメッセージが目立ちます。翻って改めてISO27000を調べますと、ISO27000ではベリフィケーションとバリデーションとを対にして武器となし、情報システムのマネジメントの各プロセスにおいてこの武器を使うことを要求しています。
大垣さんはBBS作成にあたり、この両者、ベリフィケーションとバリデーションとを怠ったと考えられます。
なお、ISO27000でのバリデーションは、大垣さんの云うところの入力バリデーションとは異なる概念です。似ているのは単語だけです。この拙記事をお読み頂いた皆さんには、ISO27000策定にあたって参考にされた、システム工学で云うところの、バリデーション(ベリフィケーションと対応します)について、是非とも、興味を持って頂ければと存じます。
大垣さんはISO27000で定義されているバリデーションを理解もせず実践面で軽視し、書籍やblog、SNSで誤ったアウトプットを量産しておいでのようです。大垣さんが入力バリデーションを偏重しながらも、入力バリデーションに失敗しているのも、システム工学で云うところのバリデーションを実践できていないからでしょう。
【つい先日も、文法エラーがあったり正規表現が間違ったりと多重に脱線した短いコードをblogで提示なさっておいででして、この人は、一生のあいだ、バグがあっても平気なままでいるのかと】
結論:大垣靖男さんはISO27000を実践できるほどには理解していないのです。
………以下追記
このBBSでは、どうやら以下の条件により、ログアウトが実際にはちゃんと呼ばれないことが分かりました。
(1)ログアウト処理が GET で呼ばれている
(2)キャッシュを無効化していない
このため、ログアウトのURLは二回目以降キャッシュが表示されるのみで、処理が呼ばれていないのでした。
上記の(1)(2)のもとでログアウトしますと、そのあとに、ブラウザのバックボタンで戻れば、ログアウト前のコンテンツ(例えばスレッド一覧など)が見れます。ブラウザの機能でリロードしてもです。 これではログアウトとしては適切ではなく、IPAへ報告ものの駄目なレベルでしょう。
脆弱性の有無を調べることをせずに仕上げたサンプル掲示板を、セキュリティ解説本にのせては不味いです。
きちんとISO27000が謳う、validation(妥当性確認)をしましょう。入力バリデーションにばかりに気をとられていてはいけません。
なお、最新版のISO27000では、大垣さんが愛してやまない input data validation は、外されました。大垣さんは知ってか知らずか旧版をもとにあちこちにISO27000に倣えとおっしゃいますが、ことinput data validation に関しては、もうISO27000を根拠に使わないで頂ければと存じます。
……追記の追記
BBSアプリケーションから以下が呼ばれています。
lib/session.lib.php
ini_set('session.cache_limiter', 'private'); // 戻るボタンを有効にする
これによりブラウザのキャッシュが有効になります。
以下はPHPのマニュアルからの引用で出力されるレスポンスヘッダです。
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: private, max-age=(session.cache_expire ぶんだけ未来), pre-check=(session.cache_expire ぶんだけ未来)
Last-Modified: (セッションが最後に保存されたときのタイムスタンプ)
http://php.net/manual/ja/function.session-cache-limiter.php より引用
この結果、ログアウトへのリンククリックにて……賢明な諸氏には自明と存じます。
本記事への大垣さんの反応をみつけましたので以下に引用します。
コードの問題点には気付いてますが、直せないんですよね。本ですから。確か短い正規表現で良さそうなのをコピペしたような気がします。しかし、バグがあるから考え方が根本的に間違っている、というのは暴論では?
⇒本文を読んで頂ければわかるはずなのですがバグがあるからではなくバグを取り除く気がない点を批判しています。ISO27000で云うところのリスクアセスメントが出来ておらずリスクトリートメントが出来ていません。ISO27000を実践できるほどには理解できていません。
コードの問題点には気付いてますが、直せないんですよね。本ですから。確か短い正規表現で良さそうなのをコピペしたような気がします。
⇒サポート用ないし訂正用のサイトを用意しておけば宜しかったと思います。こんな簡単な正規表現をコピペしたのならば技術者としてどうかと思いますし人様のコピペならば、なおさらテストしなければならないことでしょう。
タイトルからしてもバグがあるのでISOを理解していない、という風に読めますが?サンプルコードのチェックは甘かったと思います、内容の方に気を取られていたと思うので。それとISOの内容を理解していない、というのは論理に飛躍があります。
⇒誤読ですね。 ミスがあったからではなく、慢性的にみずからのアウトプットのミスを探しだしていないことから、ISO27000を実践できるほどには理解できていないと言っているのです。
コードがマズい、テスト不足、というのは理解していています。実際あまりテストしたり、コードを読み直した記憶がないので。別の本でも「おい」という間違いもあります。自分ですべき事をやってないだろ?と言いたいのでしょう。これは仕方ない批判ですね。しかし、それでタイトル、つまり論旨、が論理的に正しいとはならないと思いますが?論理的に正しく書くなら「実践してない」でしょう(苦笑
⇒実践できるほどの理解に到達していませんね。本文にも書きました通りです。自分ですべき事をやってないだろ?
とおわかりなのですから慢性的な検査さぼり、ISO27000が要求するところのバリデーションのさぼりをやめてください。私の日記に苦笑できる余裕はないはずですが。
input data validation 入力値検証が最新版のISO27000に書いてあると頑なに信じているのも幻想です。理解していらっしゃらないことの証左です。