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

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

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

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。
(編集:株式会社ラック・デジタルペンテストサービス部)

接触感染通知アプリCOCOAの仕組みを調べてみた

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

f:id:lac_devblog:20211019105239j:plain

こんにちは
デジタルペンテストサービス部のみゅーろっくまるです。
今回は話題の接触感染通知アプリ「COCOA」について、技術的かつセキュリティ⾯での解説をしたいと思います。
COCOAアプリのセキュリティ面で不安を抱いている⽅は結構多いと思います。
⾔い知れぬ不安を払拭するためにも、COCOAアプリが「何をもってセキュリティに配慮されている」と⾔われているのか、仕組みの⾯から理解してみませんか︖

 

2020/12/15 厚生労働省よりCOCOAバージョン1.2.1が公開され、一部の挙動に変更がありました。
詳細は下記にて記載しております。

https://devblog.lac.co.jp/entry/202101902

 まず、基本的なCOCOAアプリの仕組みです。
COCOAアプリと言いますが、実はGoogleAppleが用意した「Exposure Notification API」(接触感染通知のOS機能)を利用しています。
ですので、これから説明する仕組みの大半をスマホOSが担っています。

 

毎⽇割り振られるランダムなID(TEK)取得

まず、COCOAアプリが皆さんのスマホにインストールされると、最初に「COVID-19接触のログ記録」を許可すると思います。これによりOSの「Exposure Notification API」が使えるようになり、自動的にこれから説明する仕組みが動作し始めます。
最初にランダムなID(TEK)が毎⽇スマホ内で生成され割り振られます。
このIDがあなたのスマホに割り振られたことは、この時点では厚生労働省Google/Appleは記録しません。

f:id:lac_devblog:20210728100701p:plain

 

⼀時的なID(RPI)生成

 

毎⽇割り振られるランダムなID(TEK)から、更に10~20分おきの⼀時的なID(RPI)が、時間が来るたびにスマホ内で⽣成されます。ここはOSの機能により動作します。
なお⽣成された⼀時的なID(RPI)から、ランダムなID(TEK)を逆⽣成することは出来ません。(専⾨⽤語でいうところの、⼀⽅向性ハッシュで⽣成されます)

f:id:lac_devblog:20210728100738p:plain

自分の⼀時的なID(RPI)をBluetoothで配信

 

そしてBluetoothを⽤いて、10~20分おきの⼀時的なID(RPI)をスマホから周囲に送信します。
送信出力はAndroidでは中の下くらい、距離的には機種や向きによって大きく異なり、壁がない場合は数メートル程度送信されているようです。
ただ送信されたものが受信されたからと言って即座に濃厚接触と判断されているわけではありません。
これもOS機能で動作します。

f:id:lac_devblog:20210728100810p:plain

 

周囲の⼀時的なID(RPI)をBluetoothで収集

 

同時に、スマホから読み取れる範囲内にある、「Exposure Notification API」が有効なスマホからBluetooth送信されている⼀時的なID(RPI)を収集します。
この際の収集条件は厚生労働省が要求する仕様では「1m程度の距離に15分以上居たID」となりますが、「Exposure Notification API」の動作としては一旦周りのすべてを取得しスマホOSしかアクセス出来ない領域にしまっておき、後述する判定の際に1m程度15分という判断を行います。
こちらもOS機能により動作します。
(※電波の強さがスマホ毎に違うので、強さも収集するそうです。それも加味して後述する判断が行われます)

f:id:lac_devblog:20210728100848p:plain

陽性者TEK取得と陽性者RPIの生成

 

そして、厚⽣労働省のサーバから配信されてくる「陽性者達のランダムなID(陽性者TEKリスト)」をCOCOAアプリが取得し、あなたのスマホ内で改めてCOCOAアプリによって各種パラメータを与えられたOSの機能により過去14⽇分の⼀時的なIDを計算(陽性者RPIリスト⽣成)します。
(※実際には配信されてくる計算前の陽性者リストの値はDiagnosis Key(診断キー)といい、RPI計算の為にTEK+ENIN(RPI生成時刻)のリストとなっています)

f:id:lac_devblog:20210728100922p:plain

⼀時的なID(RPI)の⽐較と判定

 

上記で収集した⼀時的なID(RPI)の⽐較処理をスマホ内でOSが⾏い、スマホに記録されているIDが下記の条件を満たすと判断した場合に、感染疑いの通知※を出します。

- 「陽性者の⼀時的なID(陽性者RPI)」が含まれている。
- それらのリスクスコアがCOCOAアプリが指示した値以上になっている(約1m15分以上の接触条件を満たしている)

(※「濃厚接触の可能性の確認」という通知があり表現がわかりにくいと最近話題になりましたが、この通知とは別です)

f:id:lac_devblog:20210728100954p:plain

検査後の陽性情報の登録

 

通知が出た人は保健所に連絡を取り、必要だと判断され検査を受けたとします。
そこで感染が発覚した⼈は、COCOAアプリから過去14日分のランダムなID(TEK)※を厚⽣労働省に伝えます。
実際のアプリ上では、いたずら防止のため保健所職員からもらった番号を打ち込むことで、送信処理が動きます。
この際、COCOAアプリはOSの「Exposure Notification API」機能に問い合わせを行い、過去14日分のTEKをひとまとめにし、厚生労働省の通知サーバと呼ばれるシステムに送ります。
そうすることで厚⽣労働省が配信する「陽性者達のランダムなID(陽性者TEKリスト)」に感染者のIDが登録されます。
伝えるかどうかは個⼈の⾃由で、拒否しても良いことになっています。
(※実際には、TEK+ENIN(RPI生成時刻)を一つにしたDiagnosis Key(診断キー)が送られます)
(※保健所職員からもらった番号=処理番号は、現状わずか8桁なので、陽性者なりすましが可能ではないかというエンジニアの議論があります。しかし少ない桁数を補えるようワンタイムパスワード方式になっており、またこのリスク自体あくまで無感染者が勝手に陽性者登録出来るのではないか?という問題であり、個人特定(身バレ)とは特に関係ありません)
(※通知サーバにはsecretというどのスマホかが判る識別子も付けて送信されます。これにより厚生労働省が感染者を追跡出来るようになる可能性があるため、利用者の疑念を生み出さないようセキュリティ上廃止しようという議論がエンジニアの間で起こりましたが、通知サーバ側も変更しないといけないので現状そのままになっています)

f:id:lac_devblog:20210728101028p:plain

 

15日前の収集したデータを消去

 

最後に、あなたのスマホが収集した過去14⽇分の⼀時的なIDは、上述のとおりOSしかアクセスできない領域に保管されていますが、COCOAアプリの動作に関係なく14⽇経ったもの(=15⽇以上のもの)からスマホ内で⾃動的に消されていきます。
(※陽性情報の登録用に診断キーの元となるTEK+ENINも14日間残すので、同様に消されます)

f:id:lac_devblog:20210728101057p:plain

 

セキュリティ的キーポイント

 

IDがたくさん出てきてわけが分からなくなりますね。私もそうなりました。
では、どの辺がセキュリティと関係あるのかというと、

・毎⽇割り振られるランダムID(TEK)は、それぞれどのスマホがどんなIDを使ったか誰も記録しないので、特定出来ない。(ただし上述の通り厚生労働省は陽性者登録を行った人については記録を持っている)
・配信されている陽性者のランダムID(陽性者TEK)も、ただのランダムな記号なのでどれが誰のものか全くわからない。(匿名化されている)
・収集した⼀時的なID(RPI)の保管も陽性者かどうかの判定も、すべてあなたのスマホ内部で⾏う。(サーバ側で⾏わない)

という部分です。
⼀応感染発覚した⼈は、ID提供を拒否できますが、提供したとしてもそのIDで厚生労働省以外はあなただとは全くわかりません。

このセキュリティは破れるのか?

 

え︖どうしてもIDが誰のものか知りたい︖
ちょっと検討しましょう。

あなたが知りたい人のスマホをちょっと拝借して、20分間1メートル以内にあなたのスマホ以外何も近づけなかったとしましょう。
あなたが凄腕のエンジニアで、あなた自身のスマホをroot化したりアプリを解析したりしてIDを取得できたとしましょう。
しかし、せっかく取り出したIDは10~20分おきに変更されるRPIです。
それにより、例えばどうにかして周りのお友達からスマホのID(RPI)を集めて回ったとしても、10~20分で変更されているのでその人の行動を追いかけることはできません。
その人の行動を知るには、何らかの方法でTEKを取得しその日の全RPIを生成したうえで周りのお友達からID(RPI)を集める必要があります。
(※更にRPIの変更時刻(ENIN)もあると楽ですが、1日分総当たりを想定しここでは必須としていません)
しかし、RPIからTEKを逆生成は出来ません。
つまり知りたい人のスマホを長期間入手して直接解析を行わないといけなくなり、ハードルが非常に上がります。
また仮にTEKがわかったとしても、それは1日おきに変更されるIDです。
翌日以降の行動を知る手掛かりにはなりません。


では逆に、どうやったらセキュリティが崩れるか︖
答えは、あなたが「今⽇はこのID(TEK)を貰いました〜♪」とTwitterなんかに投稿したら、間違いなくあなただと分かってしまいます。
(※でも絶対やめてほんとこれだけは絶対ぜったいやめて)
(※とは言えこれを実際にやるにはAndroid/iPhoneの高度な解析技術が必要です)

f:id:lac_devblog:20210728101753p:plain

ランダムIDがあるだけなら、それぞれ「陽性者のXさん」「未感染のYさん」というような誰かわからない匿名化された状態ですが、「陽性者のXさん」+「Twitterアカウント」といったように個⼈を⼀意に指し⽰すものと紐づいた時点で、個⼈情報となってしまいます。
他にも、電話番号やGMail/(Appleの)Mailで使っているメールアドレス、住所、⽒名、職場や役職なんかが紐づいたら同様に個⼈情報です。

個⼈情報を、個⼈情報保護法に則りアプリやWebサービスで完璧にしっかり護るのは、⾮常に⼤変です。
少なくとも数か⽉以上の期間を掛けてじっくり検討し公開する万全なシステムが必要です。(COCOAに対して処理番号を発行する厚生労働省のHER-SYSは整備が遅かったですが、個人情報を扱うシステムなのでむしろ超特急といっていいと思います)

COCOAアプリは、4⽉初頭に「造ります」と⾔って、5⽉末に「出来ました」と出したとても急いで⽤意されたアプリです。
使い勝⼿の⾯で様々な指摘がされていますが、少なくともセキュリティが護られているのは、個⼈情報を「そもそも持たない」という上⼿な仕組みが編み出されたためです。

 

アプリ・IoT機器エンジニアの方々へ
駅や喫茶店など"定点"で"RPIを収集"し"公開"するシステムやサービスは開発しないで下さい。
確かに各スマホが配信するRPIは、直接誰かを特定できません。
しかし当記事で取り上げたように万一TEKを自ら公開するユーザが現れた場合、定点+RPIの公開されたリストは、その人の行動を特定できる情報となってしまいます。

 

「Exposure Notification Express」について

「Exposure Notification Express」とは、Google/Appleが用意した、COCOAのようなアプリをインストールしなくても接触感染通知を行ってくれる仕組みです。
これをスマホで有効にしているだけで、RPIの発信と収集を行ってくれます。
上述の通りCOCOAアプリは橋渡しの機能が大半で、重要な動作はOSの機能である「Exposure Notifications API」が行っています。
そういったアプリの橋渡し無しにOSで全てやるように拡張されたものが「Exposure Notification Express」です。
しかし、これは日本のようなアプリ開発が出来ない国のために用意されたもので、既にCOCOAアプリを運用している日本ではあまり関係ありません。

具体的には、厚生労働省の通知サーバから陽性者リストを持ってきて定期的に判定する処理(の実行指示)や、感染が検査で発覚した時の陽性者登録は現状COCOAアプリがないと出来ません。

今後どうなるかはわかりませんが、筆者としては操作やわかりやすさの面で日本語の案内は必要だと思うので、COCOAもずっと使われると思います。

あとがき

 

以上により、COCOAアプリは少なくともセキュリティについては仕組みから考え抜かれているため、根本的にリスクが低く、安全性が高いと言えます。
つまり、身バレはまず心配しなくてもいいです。

どうしても⼈との接触が避けられない職業の⽅、設備等の事情で未だにリモート授業が出来ない学⽣の⽅、井⼾端会議が⽣き甲斐で駄⽬だとわかっててもついお隣さんとおしゃべりしてしまう主婦の⽅、ぜひCOCOAアプリを活⽤してください。

当記事で参考にした資料
接触確認アプリ及び関連システム仕様書
Covid19Raderの実装内容
GoogleCOVID-19(新型コロナウイルス感染症)に関する情報とリソース」各種ドキュメント
GoogleExposure Notifications API」ドキュメント
・「RSSI Measurements」ドキュメント