情報処理安全確保支援士 2013年 秋期 午後1 問02
スマートフォンアプリケーションに関する次の記述を読んで、設問1~3に答えよ。
R社は、従業員数1,000名の飲食店情報提供サービス会社である。R社では、会員制Webサイトで飲食店情報や割引クーポンを提供してきた。今回、会員数を更に増やすために、新たにR社スマートフォンアプリケーション(以下、スマホアプリという)を利用したサービスを提供することを決め、プロジェクトを立ち上げた。プロジエクトリーダには、会員制Webサイトの運用チームのメンバであるBさんが任命された。
〔スマホアプリの概要〕
スマホアプリは、専用Webサーバに設置するWebアプリケーション(以下、WebAPという)と通する。WebAPは各食店の予約システムと通信して、予約を行う。スマホアプリを利用したサービスのシステム構成を図1に、スマホアプリとWebAPの動作概要(案)を表1に示す。


〔スマホアプリの利用者認証〕
Bさんは、スマホアプリを開発するに当たり、利用者認証について情報システム部のC課長に相談した。次は、そのときの会話である。
Bさん:スマホアプリを繰返し利用してもらうために、面倒なログイン操作は初回だけにして、2回目以降は自動的に利用者が認証されるようにしたいと考えています。
C課長:2回目以降はどんな情報を用いて利用者を認証するのかね。
Bさん:スマートフォンには、IMEI(International Mobile Equipment Identity)などの固有の端末識別番号が付与されていますので、これを用いて利用者を認証することを考えています。
C課長:確かに端末識別番号は端末の固有コードにはなるね。しかし、端末識別番号の特性を考えると、自分の端末識別番号を別の端末で利用されて、サービスを不正利用されるおそれがあるから、①端末識別番号の値をそのまま利用者認証に使うわけにはいかないな。
Bさん:そのまま使うのが問題であれば、端末識別番号を基にスマホアプリ内で②鍵付きハッシュ関数で算出したハッシュ値を使うという方法はどうでしょう。このスマホアプリ専用の鍵を一つ用意して、スマホアプリ内に格納しておけば、不正利用を防ぐことができるのではないかと思います。
C課長:しかし、③鍵を秘密にしておくことが難しいので、その方法を採用してはいけないと思うよ。スマートフォンサイトでの利用者認証は、一般的なPCサイトと同じように考えた方がいいのではないかな。
Bさん:分かりました。
〔予約案内サービスの問題〕
予約案内サービスは、利用者がパーティの参加予定者を利用者のスマートフォンのアドレス帳から選択すると、予約した日時、店舗の情報が参加予定者にメールで通知されるサービスである。具体的には次のような手順で行われる。
(1) 利用者が、スマホアプリの画面で“友達に案内する”ボタンを選択すると、図2のような予約案内の確認画面が表示される。
(2) 確認画面の“はい”ボタンを選択すると、WebAPにアドレス帳の全件データが送信され、友達の選択画面が表示される。
(3) 選択画面で参加予定者を選択すると、WebAPから参加予定者宛てにメールが送信される。

予約案内サービスについてプロジェクトのメンバが検討している際に、“図2の確認画面は、メールで予約情報を案内することについて同意確認を行っているが、アドレス帳の全件データがR社に送信されることについては利用者に説明していないので問題である”という意見が多くのメンバから出た。
この意見に対して、“アドレス帳の全件データが送信されることについて確認画面で明確に説明し、同意確認を行う”という改善案が出た。しかし、説明しただけでは不十分であるとして、“アドレス帳の全件データの送信”が行われない別の案(以下、A案という)が提示され、A案を採用することになった。
BさんはA案に基づき、仕様を策定した。また、スマホアプリの機能や動作を利用者に理解してもらえるよう、スマホアプリの導入時に表示される利用規約に、サービスについて詳細に記述することにした。Bさんは仕様書を渡して開発業者にスマホアプリとWebAPの実装を依頼した。
〔WebAPの問題〕
開発後、スマホアプリとWebAPに関して第三者のセキュリティ評価を受けることが決定された。そこでBさんは、この分野で実績があるS社を選んでセキュリティ評価を受けることにした。S社によるセキュリティ評価の結果、WebAPの予約確認サービスには他人の予約情報を取得できてしまうという問題があるとの指摘を受けた。予約確認サービスのリクエストに含まれるパラメタの概要と、WebAPの予約確認サービスの動作概要を図3に示す。
この問題は、ある利用者(以下、利用者Vという)が、数日前に自分が発した予約確認のリクエスト中に含まれるパラメタのうちの二つのパラメタの値を変更して送信することによって、別の利用者(以下、利用者Wという)の予約情報を取得することができるというものであった。つまり、④利用者Vが予約情報を表示した際のリクエストである図4で使われるパラメタのうちの二つの値を変更して送すると、利用者Wが予約情報を表示した際のリクエストである図5に対する応答を得られるというものである。セキュリティ評価では、仕様書などを参考にして、図4のリクエストに操作を加えた上で、WebAPに送言し、その応答を確認した。予約確認サービスについて、図4のリクエストに対して行った操作内容、及びリクエストに対してWebAPから受した応答を表2に示す。




〔指摘された問題への対応〕
BさんはS社から指摘された問題について対応を検討し、開発業者に依頼して必要な修正を行った後、再度S社のセキュリティ評価を受けた。その結果、問題が解消されていることが確認できたので、スマホアプリを利用したサービスの提供を開始した。
設問1:〔スマホアプリの利用者認証〕について、(1)〜(3)に答えよ。
(1)C課長が本文中の下線①のように判断したのは、端末識別番号のどのような特性からか。20字以内で述べよ。
模範解答
秘密情報ではないという特性
解説
解答の論理構成
- 本文で B さんは
「スマートフォンには、IMEI(International Mobile Equipment Identity) などの固有の端末識別番号が付与されていますので、これを用いて利用者を認証することを考えています。」
と発言し、端末識別番号を認証用識別子に流用しようとしました。 - これに対し C 課長は
「①端末識別番号の値をそのまま利用者認証に使うわけにはいかないな。」
と否定しています。 - 否定の理由は、端末識別番号が機器に刻印されるなどして既に多くの関係者に知られている可能性があり、外部から容易に取得・模倣できるからです。本人しか知り得ない情報(パスワードやトークン)とは違い、秘密に保たれていないため、番号を盗用されれば「なりすまし」が発生します。
- よって C 課長の判断は「端末識別番号は秘密情報ではない」という特性を問題視したものです。
誤りやすいポイント
- 「固有番号=安全」と短絡的に考え、番号が公開情報になり得る点を見落とす。
- 盗聴リスクや通信路の暗号化の有無と混同し、識別子そのものの公開性を評価対象から外してしまう。
- SIM カードの ICCID などと混同し、「通信事業者しか読めない」と誤認する。
FAQ
Q: 端末識別番号をハッシュ化すれば安全では?
A: 会話中で C 課長が指摘した通り、「③鍵を秘密にしておくことが難しい」ため、アプリ内に鍵を置いても解析されれば同じハッシュを生成できます。
A: 会話中で C 課長が指摘した通り、「③鍵を秘密にしておくことが難しい」ため、アプリ内に鍵を置いても解析されれば同じハッシュを生成できます。
Q: ソフトウェア方式で取得できないように OS 側で制限すれば?
A: 取得経路を制限しても端末外部に印字されている場合や通信ログから推測できる場合があり、完全な秘匿は困難です。
A: 取得経路を制限しても端末外部に印字されている場合や通信ログから推測できる場合があり、完全な秘匿は困難です。
Q: 固有番号を多要素認証の一部に使うのはどうか?
A: 他の秘密要素(パスワードなど)と組み合わせる副要素としてなら有効ですが、単独要素としては不十分です。
A: 他の秘密要素(パスワードなど)と組み合わせる副要素としてなら有効ですが、単独要素としては不十分です。
関連キーワード: IMEI, 端末識別番号、利用者認証、なりすまし、セキュリティ要件
設問1:〔スマホアプリの利用者認証〕について、(1)〜(3)に答えよ。
(2)本文中の下線②の鍵付きハッシュ関数を解答群の中から選び、記号で答えよ。
解答群
ア:AES
イ:HMAC
ウ:RIPEMD
エ:SHA-256
模範解答
イ
解説
解答の論理構成
- 本文では、Bさんが「端末識別番号を基にスマホアプリ内で②鍵付きハッシュ関数で算出したハッシュ値を使う」と発言しています。ここで求められているのは“鍵(キー)を用いてハッシュ値を生成する方式”です。
- 鍵付きハッシュ関数の代表例は HMAC(Keyed‐Hash Message Authentication Code)であり、メッセージと秘密鍵を入力にして MAC(Message Authentication Code)を生成します。
- 解答群の候補を機能で整理すると
- 「ア:AES」…共通鍵暗号方式(ハッシュではない)
- 「イ:HMAC」…鍵付きハッシュ関数
- 「ウ:RIPEMD」「エ:SHA-256」…いずれも鍵を用いない通常のハッシュ関数
- したがって、②に該当するのは「イ:HMAC」と導けます。
誤りやすいポイント
- 「SHA-256 もハッシュだから鍵を付ければ良いのでは」と誤解しやすいですが、SHA-256 単体は“鍵付き”ではありません。
- AES を“鍵を使う=鍵付き”と早合点するケース。AES は暗号アルゴリズムであってハッシュ関数ではありません。
- 「RIPEMD は HMAC-RIPEMD として使えるからウでもよい」と考えるのは早計です。問題文は“鍵付きハッシュ関数そのもの”を問うており、純粋なアルゴリズム名として HMAC が正答になります。
FAQ
Q: HMAC はハッシュ関数ではなく MAC では?
A: HMAC は「鍵付きハッシュ関数」の一種として定義されており、ハッシュ関数を内部で利用して MAC を生成します。本問の文脈では「鍵を用いるハッシュベースの方法」を示す名称として最適です。
A: HMAC は「鍵付きハッシュ関数」の一種として定義されており、ハッシュ関数を内部で利用して MAC を生成します。本問の文脈では「鍵を用いるハッシュベースの方法」を示す名称として最適です。
Q: SHA-256 を鍵付きに拡張したら同じでは?
A: 可能ですが、その拡張方式の名前が HMAC-SHA-256 などになります。問題は“方式の総称”を尋ねており、鍵付きハッシュを表す標準名称は HMAC です。
A: 可能ですが、その拡張方式の名前が HMAC-SHA-256 などになります。問題は“方式の総称”を尋ねており、鍵付きハッシュを表す標準名称は HMAC です。
Q: HMAC で端末識別番号を守れるのか?
A: 鍵が漏えいするとハッシュ値が偽造されるため、本文の「③鍵を秘密にしておくことが難しい」と C 課長が指摘しています。方式自体は正しくても、運用・実装の課題は別途解決が必要です。
A: 鍵が漏えいするとハッシュ値が偽造されるため、本文の「③鍵を秘密にしておくことが難しい」と C 課長が指摘しています。方式自体は正しくても、運用・実装の課題は別途解決が必要です。
関連キーワード: HMAC, MAC, ハッシュ関数、共通鍵暗号、メッセージ認証
設問1:〔スマホアプリの利用者認証〕について、(1)〜(3)に答えよ。
(3)本文中の下線③について、どのような手法で鍵を知られてしまうか。30字以内で述べよ。
模範解答
スマホアプリをリバースエンジニアリングする。
解説
解答の論理構成
- 【問題文】には、端末識別番号をハッシュ化する案に対し、C課長が「③鍵を秘密にしておくことが難しい」と指摘しています。
- 鍵をスマホアプリ内に格納する場合、攻撃者は配布されたアプリを自由に解析できます。
- スマートフォンアプリは Java bytecode や ARM ネイティブコードなどに変換されており、逆コンパイル・デバッガ・動的トレーサを使えばプログラム内部の文字列や定数を抽出できます。
- したがって、攻撃者はアプリの実行ファイルを解析して埋め込まれた鍵を取得できるため、「秘密にしておくことが難しい」という結論に至ります。
- この一連の行為は一般に「リバースエンジニアリング」と呼ばれるため、解答は「スマホアプリをリバースエンジニアリングする」となります。
誤りやすいポイント
- ネットワーク盗聴やパケットキャプチャを想定してしまう。鍵は通信に流れず、実行ファイル内部にある点が見落とされやすいです。
- スマートフォンの root 化や物理解析を答えてしまう。root 権限が無くても APK 解析ツールで十分に鍵を抽出できます。
- 「コード改ざん」と答えるケース。改ざんは結果であり、鍵を得るための主な手段はリバースエンジニアリングです。
FAQ
Q: リバースエンジニアリングは違法ではありませんか?
A: 目的や国によって法的評価は異なりますが、試験では技術的可能性を問うており、違法性の判断は論点ではありません。
A: 目的や国によって法的評価は異なりますが、試験では技術的可能性を問うており、違法性の判断は論点ではありません。
Q: 難読化を施せば鍵は守れますか?
A: 難読化で抽出コストは上がりますが、解析は可能です。「秘密にしておくことが難しい」という指摘自体は覆せません。
A: 難読化で抽出コストは上がりますが、解析は可能です。「秘密にしておくことが難しい」という指摘自体は覆せません。
Q: サーバ側で鍵の有効期限を短くしても効果がありますか?
A: 抽出自体は防げないため根本対策になりません。利用者認証はサーバ側管理のトークンなど別方式にすべきです。
A: 抽出自体は防げないため根本対策になりません。利用者認証はサーバ側管理のトークンなど別方式にすべきです。
関連キーワード: リバースエンジニアリング、静的解析、バイナリ解析、難読化、ハードコード
設問2:
〔予約案内サービスの問題〕について、A案の実現方法を、40字以内で述べよ。
模範解答
スマホアプリでメールアドレスを選択して、それをWebAPに送信する。
解説
解答の論理構成
- 現行案の問題点
表1の予約案内では「スマートフォン内のアドレス帳の全件データをWebAPに送信」していました。 - プロジェクトメンバの指摘
「アドレス帳の全件データがR社に送信されることについては利用者に説明していないので問題である」と多数が指摘しました。 - Bさんの対応方針
説明と同意確認だけでは不十分として「“アドレス帳の全件データの送信”が行われない別の案(以下、A案という)が提示」され、採用されました。 - 要求される機能
A案は“全件送信しない”ことが本質です。必要なのは予約案内に使うメールアドレスだけであり、スマートフォン上で利用者に選択させれば十分です。 - したがって、スマホアプリ側で選択したメールアドレスだけをWebAPへ渡す方式が最小限の情報提供となり、プライバシー問題を解決できます。
- 以上より模範解答「スマホアプリでメールアドレスを選択して、それをWebAPに送信する。」が導かれます。
誤りやすいポイント
- 「確認画面に説明を追加するだけで良い」と思い込み、実装変更を忘れる。
- 部分送信ではなく“予約に関係しそうな連絡先だけ”など曖昧な基準で抽出しようとする。全件送信と大差なく、要件を満たさない。
- WebAP側でアドレス帳を保持し続けてしまい、目的外利用のリスクを残す。
FAQ
Q: 選択画面は端末標準の連絡先APIを呼び出せば良いですか?
A: 端末標準APIを利用すると最新データを参照でき、追加の権限設定も最小限で済むため推奨されます。選択結果だけをアプリに返してください。
A: 端末標準APIを利用すると最新データを参照でき、追加の権限設定も最小限で済むため推奨されます。選択結果だけをアプリに返してください。
Q: WebAPへ渡す情報に名前や電話番号を含めても問題ありませんか?
A: 予約案内メールに必要なのは宛先メールアドレスだけです。余分な個人情報を送ると目的外利用になり得るため避けるべきです。
A: 予約案内メールに必要なのは宛先メールアドレスだけです。余分な個人情報を送ると目的外利用になり得るため避けるべきです。
Q: 利用規約には何を記載すれば良いですか?
A: 「選択されたメールアドレスのみを送信し、他の連絡先情報は送信・保存しない」旨と、その利用目的(予約案内送信)を明示してください。
A: 「選択されたメールアドレスのみを送信し、他の連絡先情報は送信・保存しない」旨と、その利用目的(予約案内送信)を明示してください。
関連キーワード: 個人情報、最小権限、プライバシー保護、入力値制限
設問3:〔WebAPの問題〕について、(1)、(2)に答えよ。
(1)本文中の下線④について、利用者Vはどのパラメタの値を変更することによって利用者Wの予約情報を取得できたか。値を変更したパラメタを、図4から選び、二つ答えよ。また、それぞれ、どのような値にすることで予約情報を取得できたか。予約情報を取得できたパラメタの内容を答えよ。(①と②は順不同)
模範解答
①パラメタ:YoyakuCode
内容:利用者WのYoyakuCode
②パラメタ:DateTime
内容:送信時とのずれが5分未満の時刻
解説
解答の論理構成
- 図3の動作概要では、
・「YoyakuCode の値が DBサーバに保持されている予約明細コードと一致しない場合はアプリケーションエラーを返す。」
・「DateTime の値とサーバ側の時刻とのずれが 5 分以上の場合はアプリケーションエラーを返す。」
と明記されています。 - 表2を見ると、
・「YoyakuCode パラメタの値を 201310000071 に変更」⇒「YoyakuCode が 201310000071 の予約情報の表示」
・「DateTime パラメタの値を現在から 4 分前の時刻に変更」⇒「YoyakuCode の値に該当する予約情報の表示」
・「DateTime パラメタの値を現在から 5 分前の時刻に変更」⇒「アプリケーションエラー」
となっており、YoyakuCode と DateTime を適切に改ざんすれば他人の予約情報を取得できる事実が示されています。 - したがって利用者Vは、図4のリクエスト中の
① YoyakuCode を利用者Wの値(例:201310000071 等)に変更
② DateTime を送信時刻との差が 5 分未満となる値(例:現在から 4 分前)に変更
することで図5相当の応答を得られました。
誤りやすいポイント
- AuthKey を別利用者のものに変えれば十分だと誤解しやすいですが、表2では AuthKey を改ざんしても YoyakuCode が変わらなければ V 自身の予約情報が返っており、必須なのは YoyakuCode と DateTime の組合せです。
- DateTime は「5 分未満」であれば何でも良い点を見落としやすく、具体的な値を固定的に答えてしまうと減点の恐れがあります。
- YoyakuCode と予約番号の関係(「月ごとに全利用者の予約を000001から順番に割り振る」)を読み飛ばし、他人のコードが類推可能である点に気付かないケースが多いです。
FAQ
Q: AuthKey を正しく保持しているのに他人の予約が見られるのはなぜですか?
A: WebAP が認可制御を YoyakuCode と DateTime のみで行い、AuthKey と予約のひも付け確認を実装していないためです。
A: WebAP が認可制御を YoyakuCode と DateTime のみで行い、AuthKey と予約のひも付け確認を実装していないためです。
Q: DateTime を操作する目的は何ですか?
A: 図3 (e) のとおり「サーバ側の時刻とのずれが5分以上の場合はアプリケーションエラー」を回避するためです。
A: 図3 (e) のとおり「サーバ側の時刻とのずれが5分以上の場合はアプリケーションエラー」を回避するためです。
Q: LANG や AppID を改ざんするとどうなりますか?
A: 表2のとおりアプリケーションエラーになり、予約情報は取得できません。
A: 表2のとおりアプリケーションエラーになり、予約情報は取得できません。
関連キーワード: パラメータ改ざん、認可、入力バリデーション、一意識別子、時刻検証
設問3:〔WebAPの問題〕について、(1)、(2)に答えよ。
(2)他人の予約情報を取得できてしまう問題の対策として、図3の2.にどのような仕様を追加すればよいか。追加する仕様を55字以内で述べよ。
模範解答
YoyakuCode の値が AuthKey に対応する予約明細コードでないときはアプリケーションエラーを返す。
解説
解答の論理構成
- 既存仕様では
“(c) AuthKeyの値がWebAPに保持されている利用者認証用の値と一致しない場合は認証エラー”
“(d) YoyakuCodeの値がDBサーバに保持されている予約明細コードと一致しない場合はアプリケーションエラー”
と個別チェックしか行っていません。 - 表2では
“AuthKey パラメタの値を別利用者の値に変更” → “YoyakuCode が 201310000034 の予約情報の表示”
“YoyakuCode パラメタの値を 201310000071 に変更” → “YoyakuCode が 201310000071 の予約情報の表示”
となっており、異なる利用者の AuthKey と YoyakuCode の組合せでも正常応答してしまうことが分かります。 - 問題点は、図3の2.(c)(d)だけでは「同一利用者の組合せであること」を確認していないことです。
- そこで “④利用者Vが…二つの値を変更して送信すると…利用者W…の応答を得られる” という不正取得を防ぐため、 AuthKey に紐づく予約明細コード以外が指定された場合はエラーにする仕様を追加する必要があります。
- 以上より模範解答の
“YoyakuCode の値が AuthKey に対応する予約明細コードでないときはアプリケーションエラーを返す。”
が論理的帰結となります。
誤りやすいポイント
- AuthKey と YoyakuCode を「どちらかが正しければよい」と誤解し、組合せチェックの必要性を見落としがちです。
- “LANG” や “DateTime” の制御ミスに気を取られ、本質的な認可不備(水平権限チェック漏れ)を指摘しない答案を作成しやすいです。
- “予約番号は月ごとに全利用者の予約を000001から順番に割り振る” という仕様から「推測容易性」を答えに混ぜてしまうと設問意図から外れて減点されます。
FAQ
Q: AuthKey が一致しているかを確認しているのに、なぜ追加仕様が必要なのですか?
A: 既存仕様は “AuthKey 単体” の真偽しか見ません。別利用者の AuthKey でも個別に正しい値ならパスするため、所有者照合を加える必要があります。
A: 既存仕様は “AuthKey 単体” の真偽しか見ません。別利用者の AuthKey でも個別に正しい値ならパスするため、所有者照合を加える必要があります。
Q: YoyakuCode をランダム化すれば十分では?
A: 推測困難にしても組合せ確認がなければリプレイや総当たりで突破される恐れがあります。根本的には「認証情報とリソースのひも付け」を行うポリシーが必須です。
A: 推測困難にしても組合せ確認がなければリプレイや総当たりで突破される恐れがあります。根本的には「認証情報とリソースのひも付け」を行うポリシーが必須です。
Q: 水平権限チェックとは何ですか?
A: システム内部で同一権限レベルの利用者間における「データアクセス制御」を行う仕組みです。本問では AuthKey─YoyakuCode の整合性確認が該当します。
A: システム内部で同一権限レベルの利用者間における「データアクセス制御」を行う仕組みです。本問では AuthKey─YoyakuCode の整合性確認が該当します。
関連キーワード: 認可、水平権限、パラメータ改ざん、入力値検証、ハッシュキー


