セキュリティ対策の「ある視点」  第1回 たった2行でできるWebサーバ防御の「心理戦」への反論

 
 http://www.atmarkit.co.jp/fsecurity/rensai/view01/view01.html
 
 ちょっとこれはまずそうなので反論をうpっておこう。
 
 サーバのバージョン情報を隠すことはプラスにはならない。むしろマイナスの効果を危惧すべきだ。
 大多数の攻撃者はバナーなど見ていない。「思慮深い」攻撃者相手ならバナーを隠しても意味が無い。
 むしろバナーを隠すことで「隠さなければならない事情」を想定させるだけ不利になる可能性すらある。
 なにより、意味の無い「対策」があたかも「セキュリティ対策」であるかのように語ってしまうと、その意味の無い「対策」で安心してしまいかねない。バナーを隠したところで防げる攻撃など、ほとんどないことを知らなければならない。
 
 
 
 攻撃者がサーバ等のデーモンのバージョン情報を見たとき問題になるのは、まず「脆弱なバージョンであることが示されている場合」になる。バージョン情報が表示されていても、そのバージョンが最新版であり脆弱性が知られていない場合、たいていの攻撃者は攻撃を断念するか、通用しない攻撃を試みるしかない。*1
 バージョン情報を隠す前に、まずは問題の無いデーモンでサービスを提供するようにメンテナンスを行うべきだ。同時に、そのように適切にメンテナンスされているデーモンであれば、バージョン情報を隠すことに意味は無い。ポリシーとしてバージョン情報を秘匿するようになっている場合は、ルールに従ってそうするべきだが、広く一般的に「セキュリティ対策の一環として」バージョンを隠せと言うべきではない。
 
 なぜバージョンを隠せと言うべきではないのか。それは,バージョンを隠すことでは問題を解決できず,それでありながら「何か対処した気分」になってしまうからだ。
 バージョンを隠せ、と言うその指導には背景がある。標題の記事の3ページ目にこのような文章が掲載されている。

この対策の狙い
 さて、これらの設定はなぜ必要なのだろうか。

 攻撃者のほとんどは、実際の攻撃を行う前に、何らかの偵察行動を行う傾向にある。今回、紹介したバナー情報を得ようとする行動も攻撃者が用いる偵察方法の1つである。そこで知りえたバージョン情報などを基に、攻撃者は既知の脆弱性情報を検索し、攻撃を行うのだ。

 このような幻想が未だにまかり通っている。攻撃者と厨房を分けて考えるならあながち間違いではないかもしれないが、サーバ管理者から見て厨房だろうがなんだろうが攻撃者の範疇に入る。
 そして厨房はいちいちバナーチェックなど行わない。いきなり Exploit コードを試し、通用したならそれは侵入成功なのだ。IP アドレスの並び順に、ポートが開いているかどうかすらおかまいなしにツールのボタンをクリックする。対象はどこでもよい。
 「このサーバをハクっちゃる」とばかりに狙われるようなサーバなら、そもそも既知の脆弱性を攻撃可能な状態で残していてはいけない。つまり、繰り返しになるが、バナーを隠すより先にやることがあり、それをやればバナーを隠す意味が無くなるのだ。そして、大半の「厨房」レベルの攻撃者にとって、バナーなど最初からどうでもよい情報でしかない。
 
 バナーを隠すことにさしたる意味は無い。決して「セキュリティ対策」として薦めるべきものではない。
 

 つまり、バナー情報を外部に露呈してしまっているという状態そのものは、直接、侵入やサービス停止にはつながらないが、それらを引き起こす大きなヒントを攻撃者に与えているということになるのである。
 という記述は、もはや時代遅れだ。
 

 また、攻撃者の中には、虎視眈々(たんたん)と攻撃の機会をうかがっているおり、バージョン情報を日々収集し、リスト化している者も存在する。これは、何らかの脆弱性が発見されたときに、攻撃可能なサーバリストを即座に用意し、攻撃を開始するためである。
 そのようなリストは必要ない。手元に保管したサーバのバージョンリストは時々刻々と陳腐化していく。いつサーバがメンテナンスされ、デーモンが更新されるかわからないからだ。むしろ、NetCraft あたりで起動しっぱなしのサーバを探すほうがよいだろう。
 さらに、新しい脆弱性が報告され、Exploit を作成または入手したなら、片っ端から試せばよい。どのサーバでも侵入できさえすればよいなら、片っ端から試していれば済む。狙ったサーバに入りたいなら、入手した Exploit が通じるかどうか試せば済む。バージョンを含むサーバリストなど不要だ。単純にアドレスリストさえあればよい。そしてアドレスリストを作成されることは防げない。「標的にされない」ことなど不可能だ。攻撃者は狙いを定めない。倒せた獲物を回収するだけだ。攻撃を開始するトリガは「新しい Exploit を入手」することだ。あとはそれを試せばよい。通じれば攻撃完了だ。
 
 
 標題記事筆者の理解の浅さは次のセンテンスの矛盾振りからもわかる。
 一見無関係に見えても、できることはすべて行うべき
(前略)「バナー情報が露呈していても、アプリケーションを常に最新版を使用するよう心掛けて実行していれば問題ないのでは?」という考え方もあるが、答えはNoである。
 
 確かに、常に最新版であればゼロデイアタックを除き、脅威は発現しないといえるだろう。だが、これは攻撃者の心理を理解していない意見である。
 
 政治的、思想的目的から、特定組織に対して攻撃を行うようなものを除く、多くの攻撃者は、ローリスクハイリターンを好む傾向にある。「なんとしても侵入してやろう」ではなく、「侵入できるところにしてやろう」という思考なのである。
 
 つまり、技術的、意識的にセキュリティレベルが低いと推測されるところから攻撃されるということになるのである。
 
 
 侵入できるところにしてやろう。なら、最新版のバナーを見せ付ければ「侵入できるところ」ではないと見せつけることにならないのか。適切なメンテナンスをしていることを示せない「バナーを隠したサイト」は古い可能性があるのではないか。
 技術的にメンテナンスが適切であればバナーを隠していようがいまいが攻撃を退けることができると期待できる。「意識的」部分は関係ない。心理戦は相手を心理的に揺さぶれなければ意味が無い。バナーを見て問題の有無を判別できる相手にバナーを隠すことは「隠さなければならない理由」を想定させ、様々な試行を誘う可能性がある。バナーを見てもいない厨房なら、そもそもバナーを隠しても意味が無い。すくなくとも攻撃手法の知られた脆弱性が無いバージョンであることを示すほうがマシだ。そうすれば、「思慮深い」攻撃者の攻撃を避けられる可能性があるだろう。
 
 バナーを隠すメリットなど無いのだ。
 
 そもそもバナーを隠しても推測はできる。アドレスブロックをスキャンするツール、なんてもの*2を想定するわりには httprint も想定できていない。そもそもそこまでの「思慮深さ」を見せる攻撃者の絶対数はもはや極少数といえるが,偵察行動を行う攻撃者は複数の調査を行う。ペネトレーションテストをやるなら複数の手法で情報を収集し、突合せ、実証し、リスクレベルを判定する作業が必須のはずだ。むしろ手持ちの Exploit を片っ端から試すくらいのこともやるだろう。そのときバナー情報は重要だろうか?全く重要ではない。ペネトレの場合、必要なのは「攻撃が通じるか否か」についての調査結果だ。バージョン情報はひとつの目安にはなるが、目安にすぎない程度の情報でしかない。表示されているバナー情報が改ざんされたものではないと言い切れるか?
 たとえバナーが隠されていても「思慮深い」攻撃者なら複数の方法で調査を行う。NetCraftを使っても良い。Google が何かキャッシュしているかもしれない。httprint で推測できないか。レスポンスヘッダに特徴的なものは含まれていないか。
 
 対して、大多数の厨房はバージョン情報など考慮しない。手持ちの Exploit が通じるか否か。それだけでしかない。手持ちのツールが使えたなら、それは「手持ちのツールが使えるバージョンのデーモンだった」のだ。先に判別する必要など無い。攻撃に失敗したのであれば退散するだけだ。成功したなら、おもむろにバックドアを設置するなどすればよい。その程度の作業までは自動化されている。
 

 もちろん、攻撃されても大丈夫なシステム構築・運用は大切であり、大前提だろう。だが、攻撃対象に選定されないようなシステム構築・運用も大切なのではないだろうか。
 
 脆弱性があるかもしれないという匂いがする限り、攻撃対象に選定されないようなシステムなど不可能なのだ。それならば、むしろ「常に問題の無いバージョンを利用している」ことをアピールするほうが望ましいのではないか。「このページが見えていますか」なんて Apache のデフォルトページが剥き出しなんてのは論外としても、バナー隠しに効果は無い。
 
 まずはパッチをあてろ。そうすれば、バナーなんぞどうでもいい。効果の薄い対策を薦めるよりは、いつもピカピカの最新版だと自慢しているほうがずっとマシだ。どうせ厨房は見ない。バージョン情報をもとに判断できる奴なら最新版に無駄な攻撃はしない。バナー隠し程度で満足するような「技術的・意識的に劣るような」サーバよりは攻撃されにくいといえるだろう。
 
 
 それでもバナーを隠したければ隠せばよい。ただしそれはセキュリティ対策でもなんでもない。単なる不安解消にすぎないのだ。そのことを踏まえて、裏ではやはり常に「問題の無いバージョン*3デーモン」を使うことになる。なぜならバージョンを隠したところでセキュアにはならないからだ。
 我々セキュリティ屋は「不安解消」と「セキュリティ対策」は分けて考えなければならない。カウンセリングや占いではセキュアなサーバを作れない。
 
 
 

まとめ

 

  • バナーを隠しても攻撃は防げない。
    • 攻撃者の大半はバナーに関心が無い。
  • バナーを隠すことはセキュリティ対策ではない。
    • バナーを隠しても攻撃される可能性は減らない。
  • バナーチェックを行う攻撃者にとってバナー隠しは意味が無い。
    • むしろ余計な可能性を示唆するだけマイナス
  • バナーを隠すことで安心するのはまずい。
    • 適切なメンテナンスをしていればバナーを隠す必要はない。
    • バナーを隠さなければ不安なら、バナーを隠すのではなく、不安の原因となるバージョンの古さを対処するべき。

 

*1:ごく例外的に、ゼロデイが広まる可能性があるけど。

*2:nmap に -sV オプションつきでアドレスブロックスキャン??

*3:たいていの場合、それは最新版である