パスワードを忘れた? アカウント作成
14423086 story
バグ

矛盾表示が指摘されていた接触確認アプリCOCOA、当初のバグ誤認説を改め修正版を配布 43

ストーリー by nagazou
たぶん修正 部門より
厚生労働省は25日、iOS用において接触確認アプリ「COCOA」で修正版配布を開始したそうだ。以前から問題となっていたプッシュ通知とアプリ内表示が異なるという問題に対処したものになるという(過去記事)。Android版に関しては近日中に予定しているとだけ告知されている(厚生労働省NHK)。

このアプリでは陽性者と1メートル以内の距離で15分以上の接触する場合、通知が行われる仕組み。しかし、「接触の判定が想定しているよりも広範なもの」に設定されていたことで誤検出が起きた模様。陽性者の検出に使用しているスマートフォンのBluetooth機能が機種ごとに差があり、計測する距離や時間に差が生じることとなる。このため、厳密に設定して検出されない事態を避けるため、検出範囲を広げすぎていたのが理由であったようだ。リリースはボカして書かれているが、このためにプッシュ通知だけ警告の出る状況になったのではないかとみられる。
  • by Anonymous Coward on 2020年09月25日 22時47分 (#3895293)

    問題の箇所は ExposureNotificationHandler.cs で定義されている暴露リスクの評価テーブルです。
    https://github.com/cocoa-mhlw/cocoa/commit/868e291cd05cf50e7e61e6eb499... [github.com]
    https://github.com/cocoa-mhlw/cocoa/commit/20f3e8c570175f1ad693ccbf90e... [github.com]

    修正前

    - TransmissionRiskScores = new int[] { 1, 2, 3, 4, 5, 6, 7, 8 },
    - AttenuationScores = new[] { 1, 2, 3, 4, 5, 6, 7, 8 },
    - DurationScores = new[] { 1, 2, 3, 4, 5, 6, 7, 8 },
    - DaysSinceLastExposureScores = new[] { 1, 2, 3, 4, 5, 6, 7, 8 },

    修正後

    + TransmissionRiskScores = new int[] { 7, 7, 7, 7, 7, 7, 7, 7 },
    + AttenuationScores = new[] { 0, 0, 0, 0, 1, 1, 1, 1 },
    + DurationScores = new[] { 0, 0, 0, 0, 1, 1, 1, 1 },
    + DaysSinceLastExposureScores = new[] { 1, 1, 1, 1, 1, 1, 1, 1 },

    このテーブルを利用して「X[days]前に電波強度Y[dBm]以上でZ[min]以上の接触を濃厚接触とみなす」といった判定をしています。修正前のコードは見るからにサンプル値です。通常は厚労省のサーバから送られてくる最新の値が優先されるので問題にならないのですが、何らかの事情でサーバ値を取得できなかった場合にはデフォルトでアプリ内のサンプル値が使われてしまい、どれだけ軽微な接触でも濃厚接触扱いになるということのようです。「オンラインで陽性登録者のIDは取得できるがテーブルの値が取得できない」という微妙なケースを想定し切れていなかったんでしょうね。

    8月4日の時点でおかしいと気付いたYoshiyuki Nakamura氏が詳細な解説を行っています。
    https://twitter.com/nakayoshix/status/1290608592949620736 [twitter.com]
    https://twitter.com/nakayoshix/status/1303296656121589760 [twitter.com]
    https://twitter.com/nakayoshix/status/1305784863320993793 [twitter.com]

    > このため、厳密に設定して検出されない事態を避けるため、検出範囲を広げすぎていたのが理由であったようだ。

    というのはnagazou君の妄想、真っ赤なデマです。

    ここに返信
    • サンプル値そのまま……
      実際に動いてしまうサンプル値を入れたコードを公開した結果起きた失敗事例がまた一つ。

      こんなのどうすれば。
      リリースビルドでサンプル値のままだとエラーになるようにするしかない?

      # BTデバイスとか [security.srad.jp]

      --
      私を信じないで、貴方を裏切ってしまうから。
      • by Anonymous Coward

        Risk levelって国ごとに社会情勢ごとに設定すべきもので 作り始めで決められるものではないですね

        • by Anonymous Coward

          それを.csファイルにハードコーディングしている段階でおかしいんですよね。
          settings.jsonに切り出しておけば誰かが早期に気付いた可能性も。
          その上で設定値が空のsettings.jsonとサンプルのsettings.json.exampleを用意するのが正道。

          • by Anonymous Coward

            何らかのエラーがあったときのためのデフォルト値なんだから読めない可能性がある外部ファイルに依存するのはむしろ問題では?

            • by Anonymous Coward

              cocoa/Covid19Radar/Covid19Radar/settings.json [github.com] って読めない可能性がある外部ファイルなんですか?
              いや、まあ、デフォルト値を設定してもいいですけど、何万人もの行動に影響する値をハードコーディングする勇気はちょっと私にはないですね……。

              • by Anonymous Coward

                ファイルなんて読めない可能性があるもの。
                もっともそいつだと読めないならアプリ動かすなって代物でもあるが。

                それと#3895293をよく読めよ。
                サーバから値取得して使うんだけど、それが取得できない場合の値だよ。
                ファイルにしたところでハードコードする部分は残る。
                なので取得できなくとも動作させるのか、させないかでしかない。

              • by Anonymous Coward

                配列自体を空にしといてサーバから読んだ値を格納すること無く参照したらエラーでコケるようにしとけばハードコードは要らない。
                まぁこれは取得できない場合に動作させない選択をした場合限定の方法だが。
                前回最後に取得成功したときの値を覚えておくって手もある。

    • by Anonymous Coward

      「オンラインで陽性登録者のIDは取得できるがテーブルの値が取得できない」という微妙なケースを想定し切れていなかったんでしょうね。

      某MNポイント申込APIが想像以上にエラー返しているのを見ると国のサービスなんてあてにしちゃだめだよね、という感想もある

    • by Anonymous Coward

      ちゃんと公開レポジトリー更新されてるんだね

    • by Anonymous Coward

      サンプル値っていう表現に違和感がある。普通、サンプリングした値のことをサンプル値って呼ぶ気がする。
      初期値、デフォルト値ならわかるんだけど。
      元にしたサンプルコードの値そのままっていうような意味で使ってるのかしら。

      • by Anonymous Coward

        はい、書いた当人もそう思います。ここでは例示値という意味で使いました。
        初期値・デフォルト値と言い換えることも考えましたが、修正後のコードもある意味では初期値・デフォルト値であり、区別が難しくなるのでやめました。

  • 誤検出 (スコア:0, オフトピック)

    by Anonymous Coward on 2020年09月25日 20時30分 (#3895209)

    職員に接触通知50人超、敦賀市困惑
    https://www.fukuishimbun.co.jp/articles/-/1151688 [fukuishimbun.co.jp]

    > 新型コロナウイルス感染者との接触可能性の通知を受けた福井県敦賀市職員は、計59人となった。

    なお、厚生労働省は「現状としては(アプリの)誤作動ではない」と強弁している模様。

    ここに返信
    • by Anonymous Coward

      仕様通りに動いているなら「誤作動」ではないな、たしかに

    • by Anonymous Coward

      状況がわからんのだけど、市内などに感染者が誰もいないのに検知されておかしいということ?

      「多いからおかしい」って意味が分からない
      仮に市職員に感染者がいて、でもその人が黙ってたら次々と検知されて当たり前なんだけど。市職員に限定して発生しているのなら尚更

      端末やバージョンに依存しているなら市職員に限らず発生してもいいようなものだけど、その辺どうなんだろう

      • by Anonymous Coward

        黙ってたらといってもアプリに陽性者(疑い)として登録してなきゃいけないから行動としてなんなんだろう、ってことにもなりますな…。
        というか「多いから」云々ってのは判定範囲が異様に広く設定されてるならあり得るかもしれませんね。
        職員にはゼロ人なのに、外を歩いてた人と「濃厚接触していた」と判定されてしまったらこうなる。
        むろんあくまで可能性の話であって、そう信じられるかは別の話ですが。

  • by Anonymous Coward on 2020年09月25日 20時56分 (#3895229)

    プッシュの場合の動作がよくわからんのだけど、
    信号の強弱(=距離)を無視して照合していて、遠いのも接触扱いでプッシュ通知が発行されているってこと?
    で、アプリの画面は強弱も判定して遠いのは接触してないことになるの?

    プッシュ通知を出している主体はどこ?
    アプリの定期処理?厚労省のサーバー?

    ここに返信
  • by Anonymous Coward on 2020年09月25日 21時01分 (#3895234)

    > ただし、ブルートゥースの性質上、機種の性能や周辺環境等により、計測する距離や時間に差が生じるため、

    そんなことは前提条件として設計し、リリース前に実機でも評価すべき話だろうに、なにを今更。

    ここに返信
    • by Anonymous Coward

      マイナンバーカード関連でも、申請画面を開いてから書式を記入して送信するまでに
      カードとの接続が切れると記入中の書式を捨てて書き直しになる仕様がなかったっけ
      実機での評価をすっ飛ばして検収しても誰も責任を問われないのかもね

    • by Anonymous Coward

      趣味で作ったんだから面倒なテストなんてしないよ。
      「文句はapiの提供元(google&apple)へ」です。

  • COCOAの前提:サーバー側には接触判定するデータ(個人情報)を持っていないのでクライアント(スマホ)側が判定している。クライアント間のブルートゥース通信で互いのIDを交換して時刻とともに一定期間保存。

    厚労省の説明で知ったこと:プッシュ通知用の接触判定と確認画面の接触判定が別のロジック

    判定は
     (1)プッシュ通知を表示する際の接触の判定 →想定しているよりも広範となっていた
     (2)陽性者との接触があった旨の表示をする際の接触の判定 →(1)と違うロジック

    (Debug)これらの「内部処理」を整合的に行うようにプログラムの修正

    サーバーからは陽性者のIDだけがクライアントに飛んでくるのでしょう。
    ビーコンを受け取った不連続な時刻だけがクライアントに保管されているのでしょうから
    そこから「(連続)15分以上」と決定するロジックに2種類あったというでしょうか。

    「(連続)15分以上」は接触時に判定して、リアルタイムに保管しているものと思っていた。

    Code for Japanが作って公開した方のソースでも読んだらわかるのか?

    ここに返信
    • by Anonymous Coward

      8月後半までiOS版は「通知はくるけどアプリでの接触表示はない」人しかTwitter上で見かけないので、
      Risk levelの判定だけで説明される話ではないのだろうなと思っています
      (1)でiOSがどのロジック使ってるかわからない、(2)のCOCOAが使うロジックは8月後半にdeprecated
      ドイツのアプリはGetExposureInfo使ってなさそう そしてAppleもgoogleもENEに移行したい
      というあたりでそもそもiOSもあやしいと思ってます
      なによりデバッグのしようがない。実際に接触したかどうかを判定できるのは
      通知を受けた端末側だけでデバッグ環境を手軽に用意できない。

      • by Anonymous Coward

        そもそもENSが「バグがあっても誤通知でも受けた側は真偽が分からないように高度に匿名化されたシステム」なんだからしょうがない

        • by Anonymous Coward

          連投ごめんなさいね
          今回のバグと解るのも「通知され過ぎた」あるいは「通知されるけどアプリで表示されない」という現象だから把握できるもので、
          もし「通知される/接触表示が出る」べきなのに全く反応しないバグがあったとしても知り得ないのです。仕様のバグとしか言いようがない。

  • by Anonymous Coward on 2020年09月26日 0時23分 (#3895336)

    警告が来たら無条件で確信するように

    、と教祖様がおっしゃってた。

    ここに返信
  • by Anonymous Coward on 2020年09月26日 11時16分 (#3895478)

    ところどころに配置したノートに名前とそこにいた時間帯を書いてもらうようにした。仕組みが簡単で、費用対効果も理解しやすく、みな協力している。電子機器の持ち込みが禁止されているからでもあるが。

    ここに返信
    • by Anonymous Coward

      プライバシー皆無だなw

    • by Anonymous Coward

      うちらの県でもやってるけど、人が集まる場所に機械を置いて来場者にQRコードスキャンしてもらうシステムの方がよほど確実だよな。

      (失敗したけど)個人の罹患状況を抜きたいIT大手に騙されてこんなもんつくって、しょうがねえよ。

  • by Anonymous Coward on 2020年09月26日 13時46分 (#3895544)

    自身が陽性だと分かったとき陽性であると自ら進んで登録するだろうか
    いや、しないだろう

    ここに返信
    • by Anonymous Coward

      独裁国家が好きなら早く移住シナよ

    • by Anonymous Coward

      陽性登録者に厚労省からお見舞金を出せ。
      陰性になるまで50,000円/日、後遺症には10,000円/日とか。
      (金額については例示であり、何の算定根拠もありません)

      非陽性者が陽性登録するのはシステム上できないようになっていると聞くが……

  • by Anonymous Coward on 2020年09月26日 18時00分 (#3895656)

    プログラム内に円周率を3とハードコーディングして、
    実際の円周率はオンラインでサーバからとってきた値(3.1415・・・)を使用してたが、
    たまにサーバに接続できないときに、ハードコーディングされた3がつかわれた感じ

    ハードコーディングされる円周率を、3.14に設定したのでサーバからとってこれなくても大丈夫になった感じ

    ここに返信
typodupeerror

アレゲは一日にしてならず -- アレゲ研究家

読み込み中...