openCACAO / cocoa-issues

接触確認アプリ COCOA に関するIssues用レポジトリです
Creative Commons Zero v1.0 Universal
8 stars 0 forks source link

陽性者登録時の処理番号の取り扱いがリファレンスのRequirementsと異なっている #25

Open rocaz opened 4 years ago

rocaz commented 4 years ago

現状では陽性判明者が要求?すれば、COCOAでの登録のための8桁数字の処理番号が1時間有効なOTP(PIN)としてHER-SYSから払い出され、これをCOCOA(モバイルアプリ)から入力することで陽性者TEKの登録がVerification Serverを経由して行われます。 この際にアプリからPOSTされるJSONはCOCOAでも下記のGoogleによるリファレンス?の形式に従っているように見えましたが、

https://google.github.io/exposure-notifications-server/server_functional_requirements

COCOAでは上記の’verificationPayload’が8桁OTPそのままなのですが(@moonmile さんから頂いた情報による https://github.com/openCACAO/cocoa-issues/issues/22 )、同じく下記リファレンスにもあるように一旦OTPを保険当局側システムでVerifyさせた後に、JWTトークンを発行して、これを’verificationPayload’の値としてPOSTすることになっているようです。

https://google.github.io/exposure-notifications-server/design/verification_protocol

個人的にOTPを単純に送る方法に違和感があったのですが、OTPを一旦発行元での確認の後新たなClaim TokenでのVerificationを正とすることでリプライ攻撃など防ぎやすいということかな?

いずれにしても、この’Verification Protocol’については、”Use of the verification protocol is HIGHLY recommended”とされています。

moonmile commented 4 years ago

この部分は、実は 6月中旬に Covid19Rader のコードが公開されたときから気になっていたところで、晴れて cocoa-mhlw のほうが公開になったので再びチェックしたところなのです。

cocoa-mhlw のコードが、サーバーサイドで動作していると仮定して、

陽性者登録 diagnosis が呼び出され、 https://github.com/cocoa-mhlw/cocoa/blob/master/src/Covid19Radar.Api/DiagnosisApi.cs#L50

ここのところで、

// validatetion VerificationPayload
var verificationResult = await VerificationService.VerificationAsync(diagnosis.VerificationPayload);
if (verificationResult != 200)
{
    return new ObjectResult("Bad VerificationPayload") { StatusCode = verificationResult };
}

CustomVerificationService.VerificationAsync を呼び出している。

https://github.com/cocoa-mhlw/cocoa/blob/master/src/Covid19Radar.Api/Services/CustomVerificationService.cs#L54

public async Task<int> VerificationAsync(string verificationPayload)
{
    Logger.LogInformation($"start {nameof(VerificationAsync)}");
    var payload = $@"{{
""{VerificationPayloadParameterName}"": ""{verificationPayload}""
}}";
    var content = new StringContent(payload);
    var response = await Client.PostAsync(Url, content);
    if (!response.IsSuccessStatusCode) return 503;

    var responseBody = JsonConvert.DeserializeObject<ResponseCustomVerification>(await response.Content.ReadAsStringAsync());
    return await GetResultStatus(responseBody.Result);
}

この中で、多分 HER-SYS 相当を呼び出して処理番号が正しいかどうかをチェックする訳ですが、

という疑問の提起です。

これは根本的には

と対立するので、この部分を明確にしておきたいなと思った次第なのです。

Google のシーケンスで Verification server と Key server が別になっているのは、

を視野にいれているのかなと思っています。TEKs 自体は list.json と zip で誰でもダウンロードできるから公開情報扱いでよい。verificationPayload で送られる処理番号は個人情報なので、非公開扱いにする、という境界線を明確にするためです。

rocaz commented 4 years ago

なるほどです。信頼境界と連携の問題と捉えるとすっきりしますね。

  1. 「公衆保健当局=Verification Server」が自身が発行したPINであるかを確認後署名されたJWTトークンを発行
  2. 「公衆保健当局以外=EN Key Server」が署名検証できたものは公衆保健当局が認証したと確認出来るので、陽性者情報として加える

の信頼関係ですね。 このあたりの検討が初期に行われたかは不明ですが、いまとなってはuserUuidよりはよほど筋が良いように思います。 ポイントはこのVerification Protcolと名付けられたフローがGAF?においては”HIGHLY recommended”とされている点でしょうかね。

moonmile commented 4 years ago

Apple Developer のサイトからも Google のコードへのリンクになっていたので、サーバーサイドのシーケンスは Google の見解でしょうね。Google としては key server 側の仕組みはそのまま提供したいのかもしれません。

Temporary Exposure Key (TEK) Publishing Guide | Exposure Notification Reference Key Server

これを見ると、構築手順が丁寧に書かれているので、そのまま Google Cloud で提供とか。 そこは私の邪推ですけど...

少なくとも、Key server 内で囲っている(公開され得る)TEKs よりも、個人に割り振られる処理番号のほうが ”HIGHLY recommended” なのは確かです。

rocaz commented 4 years ago

少し話はずれますが、一応GCP以外でのHostingについても解説はしていますね。

https://google.github.io/exposure-notifications-server/server_deployment_options

でもknativeかーというのはありますが。

rocaz commented 4 years ago

思い出したので付記しますが、リファレンスでOTP(処理番号)とJWT(JWS)を交換して’verificationPayload’に用いてるのは、後からのオプトアウトにも用いれるという見込みもあるのでしょうね。 全員にuserUuidなんて発行する必要は無く、公衆保健当局が間違いなく発行したJWTであるのはいつでも検証可能なので、取消も可能。 よりいっそうすっきりしました。