ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

スマートフォンアプリケーションにおけるサーバ証明書検証不備の検証方法

※こちらの記事は2021年1月12日公開note版「ラック・セキュリティごった煮ブログ」と同じ内容です

はじめに

こんにちは、デジタルペンテストサービス部のlac01です。主に、スマートフォンアプリケーション診断を担当しています。今回は、スマートフォンアプリケーション診断を実施している中で、問い合わせが多い「サーバ証明書検証不備の検証方法」についてご説明いたします。

サーバ証明書の検証不備とは

ここでは、サーバ証明書の検証不備について簡単にご説明いたします。非技術者の方に、大まかなイメージを掴んでいただくことを目的としているため、既にご存知の方は「サーバ証明書検証不備の検証方法」からお読みください。

サーバ証明書は、「サーバの正当性証明」、「通信の暗号化」の2つの役割を持つ電子証明書のことを指します。「通信の暗号化」の役割を除くと、現実世界ではパスポートやマイナンバーカードなどの身分証明書が近いです。サーバ証明書の検証不備は、「サーバの正当性証明」に関する問題であるため、身分証明書であるパスポートを例にご説明いたします。

空港での出国審査を思い出してください。パスポートを確認される際に、パスポートの顔写真との照合、パスポートのICチップの記録確認などが行われると思います。もし、あなたが誰かに「パスポートにICチップが搭載されているなら、パスポートのICチップを読み込んで確認するだけ良いのではないか?」と聞かれた場合、肯定または否定どちらの回答をしますか。恐らく、多くの人は否定するのではないでしょうか。なぜなら、例えば他人のパスポートを盗み、パスポートの顔写真部分を張り替えられていた場合、ICチップを読み込んで確認するだけでは確認できないからです。

サーバ証明書の検証不備も上記のパスポートの例と同様に、サーバ証明書の検証すべき箇所が抜けていた場合などにより発生します。サーバ証明書の検証不備が発生してしまうと、攻撃者が用意したサーバ証明書を正規のサーバ証明書と同様に信頼してしまいます。このことにより、攻撃者のサーバに通信を行った場合でもエラーなく通信が行われしまい、重要情報の漏えいに繋がる可能性があります。

サーバ証明書検証不備の検証方法

本稿では、下記の検証方法をご説明いたします。
①サーバの証明書変更
②プロキシツールによる検証

簡単に確認できる検証方法は、①です。

①サーバの証明書変更
簡単に確認できる検証方法は、サーバの証明書を変更することです。攻撃者が用意したサーバにクライアント(≒アプリケーション)が接続することを想定して、自己署名証明書や正規のサーバとは異なったホスト名の証明書などに差し替えることで、サーバ証明書検証不備の検証が行えます。

②プロキシツールによる検証
プロキシツールとは、クライアント(≒アプリケーション)とサーバとの通信の間に入り、通信内容の確認、変更するためのツールです。代表的なツールとしては、Burp Suite、OWASP ZAP、Fiddlerなどがあります。今回は、Burp Suiteを用いて検証します。
(※本稿では、Androidでの検証例を載せています。)

〇必要なもの
・PC
スマートフォン
・無線ルーター
・Burp Suite

1.PCが接続しているSSIDIPアドレスの確認
スマートフォンをPCと同じネットワークに接続させるために、SSIDを確認してください。また、スマートフォンの通信先をPCに向けさせるためにIPアドレスを確認してください。IPアドレスの確認方法は、下記の通りです

Windowsキー+Rを押下し、「cmd」と入力
・「ipconfig」と入力し、IPアドレスを確認

2.スマートフォンをPCと同じネットワークに接続
「設定」→「ネットワークとインターネット」→「Wi-Fi」の順にタップします。その後、1で確認したSSIDと同じSSIDをタップして接続します。

3.スマートフォンの通信をPCに向ける
ネットワークに接続後、接続したネットワークのSSIDの横にある歯車マークをタップします。
その後、「右上のペンマーク」→「詳細設定」をタップして「プロキシ」を「手動」に変更します。

「プロキシのホスト名」に1で確認したPCのIPアドレスを入力、「プロキシポート」に「8888」を入力し「保存」をタップします。(PCで8888ポートを使用している場合は、他のポート番号に変更してください。)

4.PCでBurp Suiteをインストールし、起動
Burp Suiteの公式サイトであるPortSwigger社のHPからBurp Suiteをインストールし、起動してください。起動後は、デフォルト設定のまま「Next」を押下します。
※ Community Editionでも問題ございません。

5.Proxy Listenersの設定
「Proxy」タブを選択し、「Options」→「Add」を選択します。その後、スマートフォンで設定したプロキシ設定と同様の設定を行います。

最後に、「Certificate」タブを選択し、「Use a self-signed certificate」を選択してOKを押下します。
※ホスト名の検証不備を確認したい場合は、「Generate a CA-signed certificate with a specific hostname」を選択し、任意のホスト名を入力してください。

6.プロキシの通信受信設定
「Intercept」タブを選択し「Intercept is on」を押下します。「Intercept is off」になったことを確認後、「HTTP history」タブを選択します。既に通信が表示されている場合は、全選択し、右クリックから「Delete selected items」により通信を消しておくと、アプリケーション起動時の通信確認が楽になります。

7.スマートフォンでアプリケーションを起動し、サーバ証明書の検証を確認
下図は、Chromeで「google.com」へアクセスした際の画像となります。エラー画面から、サーバ証明書の検証が不備なくされていることを確認できます。

下図は、Burp Suiteの画像となります。Requestのみが表示されており、Responseが表示されていないことからサーバとの通信が正常に行えていないことを確認できます。

さいごに

今回は、サーバ証明書検証不備の検証方法についてご説明させていただきました。サーバ証明書検証不備の問題がある場合、攻撃者に重要情報が漏えいしてしまう可能性があります。そのため、上記方法をご活用いただき、安全なスマートフォンアプリケーション作成の一助となれば幸いです。

おまけ

Apache Cordovaを利用している場合、正常にサーバ証明書の検証がされていたとしてもAndroidManifestでandroid:debuggable=”true”に設定しているとSSLエラーが無視されてしまいます。Apache Cordovaを利用している場合は設定をご確認ください。

■参考リンク
HTTPSSSL を使用したセキュリティ (Android デベロッパー)
https://developer.android.com/training/articles/security-ssl?hl=ja

Security Guide (Apache Cordova)
https://cordova.apache.org/docs/en/latest/guide/appdev/security/#self-signed-certificates