前回、運転免許証記載情報の真正性を確認する方法を紹介しました。 パスポートにも免許証と同様にICチップが埋め込まれており、海外渡航時の入国審査では本物のパスポートかどうかチェックが行われています。
不動産取引や民間サービスの本人確認業務でも、同じ方法でICチップの確認を行えば身分証偽造による詐欺行為を防ぐことができます。
今回パスポートのICチップにアクセスして真正性を確認するAndroidアプリをつくったのでその仕組みを紹介します。
目次
電子パスポート仕様
パスポートは世界で通用する身分証明書です。 それぞれの国が独自仕様のパスポートを発行すると大変なので、 国際民間航空機関(以下ICAO)がICチップの技術仕様を標準化し、各国のシステムで相互運用できるようになっています。
ICAOはDoc 9303 Machine Readable Travel Documents(機械可読な旅券)という文書で仕様を公開していて、パスポートの形状やデータモデル、セキュリテイ機構について標準化しています。
この仕様書は全12部となかなかボリュームがあるので、今回はパスポートのセキュリティに絞って解説していきます。
電子パスポートのセキュリティ機構
2019年現在、日本で発行されているパスポートには3つセキュリティ機構が組み込まれています。1
各セキュリティ機構はそれぞれ以下のような脅威に対応する対策となります。
- Basic Access Controll - スキミング・盗聴対策
- Passive Authentication - データの改ざん対策
- Active Authentication - ICチップの複製対策
Basic Access Control
Basic Access Controlの目的はスキミング対策です。 券面の記載情報を知っている人にだけICチップにアクセスできるよう、アクセスコントロールを行います。
具体的には、パスポート番号 + 生年月日 + パスポートの有効期限
を共通鍵として通信データを暗号化します。
これによってパスポートを実際に手にしている人やOCR読み取りを行う空港の機械だけがICチップにアクセスでき、
満員電車でギュウギュウ詰めになったときに知らない人にICチップを読み取られるという危険を防いでいます。
暗証番号でアクセスコントロールを行う運転免許証と比べて使いやすい反面、間違えてもロックされないので総当り攻撃の心配はあります。
Passive Authentication
Passive AuthenticationはPKIに基づいた真正性検証処理です。 これによりICチップ内データの改ざんを検知できます。
Passive Authenticationの検証処理では2種類の公開鍵証明書を利用します。 ひとつ目はCSCA(Country Signing CA)証明書と もうひとつはパスポート内のSOD(Security Obeject Document)に署名を行うDS(Document Signer)証明書です。 SODにはICチップ内の各データのハッシュ値が記録されています。
Passive Authenticationの検証プロセスは以下のようになります。
- ICチップ内のDS証明書を読み出す
- DS証明書からトラストアンカーとなるCSCA証明書へのパス構築・検証を行う
- ICチップ内データのハッシュ値が記載されたSODをDS証明書の公開鍵で署名検証する
- ICチップ内のすべてのデータを読み出しハッシュ値を求める
- 署名検証を行なったSOD内のハッシュ値と実際に読み出したデータのハッシュ値を比較する
Active Authentication
Passive AuthenticationでICチップ内データの改ざんを防止できます。 しかしこれだけでは改変なくまるごと複製されたICチップを検知できません。これをクローニング攻撃といいます。 Active Authenticationはカードそのものに対する認証であり、目的はカードのクローニング対策です。
- まず監査システム側で乱数を生成してカードに送信します。
- カード側ではその乱数に対してICチップ内の秘密鍵で署名を行い監査システムに応答します。
- 監査システムはカードに格納されている公開鍵を使って署名検証を行います。
Active Authentication単独ではなんの意味もありませんが、 ICチップの耐タンパー性により秘密鍵のコピーが出来ないことと、 Passive Authenticationにより公開鍵の真正性が検証されていれば、 カードは複製されておらず正規のカードであることを保証できます。
公開鍵を公開しない病い
Passive Authenticationの仕組みを見れば、 各国の政府機関が発行するCSCA証明書がトラストアンカーとなっている事に気がつくと思います。 日本の場合CSCA証明書は外務省が発行します。 まずはこのCSCA証明書を手に入れなければ電子的なパスポートの真正性を確認できません。
ということで外務省に対してCSCA証明書を下さいという旨の情報開示請求を行いました。 通常、情報開示請求は行政が保有する文書に対して行うものですが、X.509証明書も行政文書の一種と言えるのではないか、と思ったので情報公開制度を利用しました。
しかし残念ながら外務省の回答は、CSCA証明書(公開鍵)は公開しない。でした。
不開示とした理由
旅券冊子の情報暗号化に関する情報であり,公にすることにより,旅券偽造のリスクが上がる等,犯罪の予防及び公共の安全と秩序の維持に支障を及ぼすおそれ並びに日本国旅券の安全性が損なわれ,邦人の円滑な海外渡航に支障を来すことにつながる可能性がある等,旅券事務の適正な遂行に支障を及ぼすおそれがある。 また、当該情報は,国際的に外交手段でのみ交換する慣行があり一般への公開をしない共通認識があるため,公にすることにより,他国,国際機関等との信頼関係が損なわれるおそれがあるため,不開示としました。
ほぼすべての文が間違っており、どこから突っ込んで良いのか分かりませんが、 公開鍵を公開しても安全と秩序が損なわれることはないし、国際的に外交手段でのみCSCA証明書を交換する慣行もありません。
先に説明したICAO(国際民間航空機関)はICAO Public Key Directory(以下ICAO PKD)というLDAPサーバーにCSCA証明書をアップロードすることを推奨しています。2
このICAO PKDにはドイツのマスターリスト(ドイツが信頼するCSCAのリスト)が公開されており、その中に日本のCSCA証明書が含まれていました。 これは信頼モデルとして日本のパスポートでドイツに入国できることを意味します。
私はこのドイツが公開しているマスターリストから日本国のCSCA証明書を抜き出しました。 ドイツが主張する日本のCSCA証明書をトラストアンカーとすることにやや不自然さがありますが、ひとまずドイツを信頼する事で日本が発行したパスポートの真正性を確認できるようになりました!3
Androidアプリで真正性検証
そんなこんなで無料のAndroidアプリでパスポートの真贋チェックが出来るようになりましたので、興味ある方はぜひ試してみてください。
ただ、複数の端末でパスポート読み取りの検証を行ったところテスト成績が芳しくありません。 問題なくパスポートの真正性まで確認できたのは185台中65台です。 多くの端末はNFCの通信レイヤで失敗してしまいます。 新しいパスポートよりも古いパスポートで失敗する傾向があります。
原因について、搬送波から生み出される起電力がBasic Access ControlやPassive Authenticationで行われる暗号処理に必要な電力に達していないのではないかと考えられます。
引き続き原因の調査を行いつつ、別の選択肢として外付けNFCリーダーへの対応を検討していく所存です。
近々新しいセキュリティ機構(PACE)が追加されます。 ↩︎
Annex 9という付属文書 に “Recommended Practice.— Contracting States issuing or intending to issue eMRTDs should join the ICAO Public Key Directory (PKD) and upload their information to the PKD.” とある ↩︎
ICAO PKDの運用はBSI(ドイツセキュリティ庁)に委任されているので、ドイツを信頼しないという選択肢はありません。 ↩︎