こんにちは。
キャスレーコンサルティングで受託開発をしている金巻です。

近年、セキュリティ意識の高まりを受けて、自分が担当するプロジェクトでも
クライアントからWebシステムの脆弱性に関して、問い合わせが増えています。

そこで、今回はWebエンジニアが見落としがちな脆弱性について、紹介いたします。

脆弱性の今

便利なWebサービスやWebアプリが、日々多く利用されています。
しかし、脆弱性により、情報漏洩などのインシデントも多く発生しています。

昨年も某スマートフォン決済サービスで、ログイン仕様の脆弱性による
アカウント乗っ取りがあったのは、記憶に新しいかと思います。

上記以外にも、脆弱性を起因とした不正アクセス、不正利用に関するインシデントが
日々多く報告されています。

皆さん、1ヵ月に発生している脆弱性によるWebサイトの改ざん件数をご存知でしょうか?

じつは、月に60〜90件も発生しているようです。
出典:JPCERT/CC インシデント報告対応レポート [2019年7月1日~2019年9月30日](2.52MB)

Webアプリケーションの主な脆弱性のカテゴリとその危険性を知る

まず、どのような脆弱性があるか、軽く触れておきたいと思います。
検出される脆弱性のカテゴリは、主に以下のものがあります。

・不適切な承認
・インジェクション系
・不適切なセッション
・エラーメッセージ
・機能の悪用
・情報漏洩

1つずつ、簡単に説明いたします。
(※見ただけで内容が想像つく方は、次のセクションまで読み飛ばしてください)

・不適切な承認

 こちらは不正なログインや、不正な登録・更新などに関連するものです。
 本来はその利用者が登録・更新できないはずのデータや、他人のデータを改ざん出来てしまうとなると
 特に大きな問題が発生します。
 これにより[情報漏洩]や[機能の悪用]などが発生する為、非常に気を付けなければならない脆弱性です。

・インジェクション系

 インジェクションとは、日本語で挿入という事です。
 悪意のある攻撃者が、不正なコードやデータを挿入できてしまう脆弱性の事です。

 代表的なものとして、HTTPヘッダインジェクション、SQLインジェクション
 OSコマンドインジェクション、メールヘッダインジェクションなどが挙げられます。

 各インジェクションについて解説するのは、本題からそれるため割愛いたします。

 
 近年、SQLインジェクションやクロスサイトスクリプティング(以下、XSS)は
 Webエンジニアにとって周知の脆弱性となり、対策が進んできました。

  しかし、2015年頃の200件からは半分以下になったものの、ここ数年は下げ止まり状態となっています。
 出典元:JPCERT/CC インシデント報告対応レポート (2015/2019年)

・不適切なセッション

 セキュアな状態を確保していないセッションは、漏洩により乗っ取られる可能性があります。
 CookieのSecure属性/HttpOnly属性の付与など、セッションの不正取得防止をしていないと、
 不正なスクリプトが実行された場合に、情報が窃取されてしまいます。
 SSLによる暗号化通信を行う事も重要です。

・エラーメッセージ

 エラーメッセージも、不正な操作に繋がる危険性があります。

 例えば、ログイン時のエラーメッセージにより、IDの存在が判断出来てしまったり、
 パスワードのパターンについて、絞り込めてしまったりするエラーメッセージは脆弱性となります。

 また、Exceptionの内容が意図せずエラーメッセージに表示されたり、
 SQLエラーが、そのまま表示されたりする事も脆弱性となります。

・機能の悪用

 XSSなどにより、他の利用者に対して攻撃が出来るようなものが該当します。
 XSSによって、任意のスクリプトを実行出来るように機能を悪用する事で、
 他の利用者に攻撃が出来てしまいます。

・情報漏洩

 例えば、メール内に個人情報が記載されたメールが暗号化されていない経路を通る場合
 平文となり、盗聴による漏洩の危険があります。
 企業としては、絶対に回避したい脆弱性です。

それぞれの脆弱性について、さらに詳しく知りたい方は
検索していただければ、多くの記事や事例を探すことができます。
そのため、本記事では省略させていただきます。

次のセクションでは、いよいよWebシステム開発における見落としがちな脆弱性についてお伝えします。

Webシステム開発における見落としがちな脆弱性

ポイント1:ログイン画面に潜む危険

攻撃者が、もっとも狙う所がログイン画面と言われております。
ログイン画面の機能において、脆弱性が紛れ込みやすい点は、以下の通りです。
・認証エラーメッセージ
・ロックアウト機能
・ID/パスワード再発行処理

ログインにおいては、エラーメッセージによる推測をさせない事が重要です。
「パスワードが違います」と表示されれば、IDは合っていると推測されてしまいます。

ログインを何度でも試せる場合、悪意ある攻撃者がメールアドレス名簿を元に総当たりでチェックし、
サービスを利用しているメールアドレスを、割り出す事が出来てしまいます。

割り出されたメールアドレスに対して、本物を装った偽サイトへのリンク付きメールが送りつけられ、
利用者がうっかりパスワードを入れようものなら、アカウントが乗っ取られてしまいます。

ロックアウト機能も重要です。
何度もパスワードの入力を試す事が出来ては、総当たりにて割り出されてしまうリスクを伴います。
また、何度もログイン処理を繰り返す様な動作は、悪意のある攻撃者である可能性が高いので
排除する必要があるでしょう。

パスワード再発行処理については、メールを通じワンタイムURLが使われたりします。
しかし、SSLサーバ証明書などによる暗号化がされていない場合は危険を伴います。

なぜなら、サーバで暗号化していても、中継サーバにて平文で送られている事があるからです。
その場合、盗聴する事は容易となります。

近年、SSL化されていないサイトは、ブラウザ上で警告が出るようになったため
SSL対応をするサイトが当然のようになっております。
しかし、メールについてはまだまだ対応がされていない事も多いのが現状です。

どうしてもSSLサーバ証明による対応が出来ない場合は、メール文中のURLにアクセスした際は
本人しか知りえない情報を用いて、認証を行うなど対応する必要があります。
メールには記載されていない、利用者が画面から登録した内容等を利用すると良いでしょう。

このようにワンタイムURLを使う時には、そのメールがしっかり暗号化されている事を確認し、
暗号化されていない場合は、盗聴される事を前提に安全かを確認されると良いでしょう。
Web画面側の脆弱性にばかり注意が行き、見落としがちなポイントとなります。

ポイント2:権限があるか確認を

ユーザ情報画面など個人情報を更新する画面で、他の利用者の情報を更新できるとしたらどうでしょうか?

それがログインパスワード等を設定する画面であったなら、即座にアカウントが乗っ取られてしまいます。

画面内のhidden項目に例えばユーザコードがあり、
そのパラメタを元にDBを登録・更新している場合があるとします。

その場合、hiddenの値は簡単に変更する事ができ、任意の利用者情報を不正に更新する事が出来てしまいます。

キーとなる項目は、hiddenに持たない事や利用者に紐づかない情報を変えられない様に、
チェックをするなど対応する必要があります。

XSS対策として、入力ボックスへの対処は意識出来ている事が多いと思います。
ですが、見えている以外のパラメータにも、不正な情報が入り込む危険がある事は忘れてはなりません。

悪意のある攻撃者は、こういう見落としがちな脆弱性を狙っています。
見落とさないよう防ぎましょう。

見落としがちな脆弱性を残さないために

次に見落としがちな脆弱性を残さない為に、どうしていけば良いか考えてみましょう。
私は、以下の2点が重要でないかと考えます。

その1:脆弱性のテストは繰り返し実施する

プロジェクトの遅延により、開発工数及びテスト工数が十分に確保出来ない…
そういったケースでは、十分なテストが出来ずに脆弱性が見過ごされる危険があります。

そこで、重要なのは“繰り返しによる脆弱性チェック”です。
Webサービスは、リリース後にバグ改修や機能追加などで
リリース時には想定されていない脆弱性が入り込む可能性を認識し、
リリース後も、繰り返し脆弱性を潰して行く事が必要です。

その2:ツールと手動による脆弱性チェックの重要性を理解する

脆弱性を見つける為の自動検出ツールは、有料・無料どちらも存在します。

脆弱性診断を行うセキュリティ診断会社に依頼した場合、それなりのコストになる為
前述のようなツールのみで、脆弱性を検出する場合もあるかもしれません。

その際、ツールでは検出し切れない脆弱性は当然あり、
完璧ではないという事は、認識しておいた方が良いかと思います。

セキュリティ診断会社のチェックにおいても、ツールを使用している所が殆どですが、
それ以外にも、独自のノウハウによる手動チェックも行っております。

自動では検知出来ない重要な脆弱性が発見される事がある点を認識した上で、判断する必要があります。
※Webシステムによっては自社IPのみに制限したクローズドなサービスから、
 誰でも登録すれば利用できるオープンなサービスまであります。
 各サービスで漏洩のリスクが異なる為、一概に診断会社の利用が推奨されるわけではありません。

最後に

脆弱性のリスクはOS、インフラ、アプリ、etc…とそれぞれにおいて様々なものが存在します。
今回触れた脆弱性はその一部ではありますが、Webエンジニアが意識しておくと良いと思われるポイント、
そして、その対処法について解説いたしました。
この記事が、皆さまに少しでも役立つ情報であれば幸いです。

弊社では国家資格である情報処理安全確保支援士が数名在籍しております。
もし脆弱性について支援をご希望の方は弊社CSVIT事業部までご用命ください。

金巻
CSVIT事業部 金巻
入社から4年あまり金融系プロジェクトを経て、現在は社内受託業務に従事しております。