矛盾表示が指摘されていた接触確認アプリCOCOA、当初のバグ誤認説を改め修正版を配布 43
ストーリー by nagazou
たぶん修正 部門より
たぶん修正 部門より
厚生労働省は25日、iOS用において接触確認アプリ「COCOA」で修正版配布を開始したそうだ。以前から問題となっていたプッシュ通知とアプリ内表示が異なるという問題に対処したものになるという(過去記事)。Android版に関しては近日中に予定しているとだけ告知されている(厚生労働省、NHK)。
このアプリでは陽性者と1メートル以内の距離で15分以上の接触する場合、通知が行われる仕組み。しかし、「接触の判定が想定しているよりも広範なもの」に設定されていたことで誤検出が起きた模様。陽性者の検出に使用しているスマートフォンのBluetooth機能が機種ごとに差があり、計測する距離や時間に差が生じることとなる。このため、厳密に設定して検出されない事態を避けるため、検出範囲を広げすぎていたのが理由であったようだ。リリースはボカして書かれているが、このためにプッシュ通知だけ警告の出る状況になったのではないかとみられる。
このアプリでは陽性者と1メートル以内の距離で15分以上の接触する場合、通知が行われる仕組み。しかし、「接触の判定が想定しているよりも広範なもの」に設定されていたことで誤検出が起きた模様。陽性者の検出に使用しているスマートフォンのBluetooth機能が機種ごとに差があり、計測する距離や時間に差が生じることとなる。このため、厳密に設定して検出されない事態を避けるため、検出範囲を広げすぎていたのが理由であったようだ。リリースはボカして書かれているが、このためにプッシュ通知だけ警告の出る状況になったのではないかとみられる。
nagazou君のデマを払拭するための解説 (スコア:5, 参考になる)
問題の箇所は ExposureNotificationHandler.cs で定義されている暴露リスクの評価テーブルです。
https://github.com/cocoa-mhlw/cocoa/commit/868e291cd05cf50e7e61e6eb499... [github.com]
https://github.com/cocoa-mhlw/cocoa/commit/20f3e8c570175f1ad693ccbf90e... [github.com]
修正前
修正後
このテーブルを利用して「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君の妄想、真っ赤なデマです。
Re:nagazou君のデマを払拭するための解説 (スコア:1)
サンプル値そのまま……
実際に動いてしまうサンプル値を入れたコードを公開した結果起きた失敗事例がまた一つ。
こんなのどうすれば。
リリースビルドでサンプル値のままだとエラーになるようにするしかない?
# BTデバイスとか [security.srad.jp]
Re: (スコア:0)
Risk levelって国ごとに社会情勢ごとに設定すべきもので 作り始めで決められるものではないですね
Re: (スコア:0)
それを.csファイルにハードコーディングしている段階でおかしいんですよね。
settings.jsonに切り出しておけば誰かが早期に気付いた可能性も。
その上で設定値が空のsettings.jsonとサンプルのsettings.json.exampleを用意するのが正道。
Re: (スコア:0)
何らかのエラーがあったときのためのデフォルト値なんだから読めない可能性がある外部ファイルに依存するのはむしろ問題では?
Re: (スコア:0)
cocoa/Covid19Radar/Covid19Radar/settings.json [github.com] って読めない可能性がある外部ファイルなんですか?
いや、まあ、デフォルト値を設定してもいいですけど、何万人もの行動に影響する値をハードコーディングする勇気はちょっと私にはないですね……。
Re: (スコア:0)
ファイルなんて読めない可能性があるもの。
もっともそいつだと読めないならアプリ動かすなって代物でもあるが。
それと#3895293をよく読めよ。
サーバから値取得して使うんだけど、それが取得できない場合の値だよ。
ファイルにしたところでハードコードする部分は残る。
なので取得できなくとも動作させるのか、させないかでしかない。
Re: (スコア:0)
配列自体を空にしといてサーバから読んだ値を格納すること無く参照したらエラーでコケるようにしとけばハードコードは要らない。
まぁこれは取得できない場合に動作させない選択をした場合限定の方法だが。
前回最後に取得成功したときの値を覚えておくって手もある。
Re: (スコア:0)
某MNポイント申込APIが想像以上にエラー返しているのを見ると国のサービスなんてあてにしちゃだめだよね、という感想もある
Re: (スコア:0)
ちゃんと公開レポジトリー更新されてるんだね
Re:nagazou君のデマを払拭するための解説 (スコア:1)
公開されても誰も気づかないモノか
Re: (スコア:0)
サンプル値っていう表現に違和感がある。普通、サンプリングした値のことをサンプル値って呼ぶ気がする。
初期値、デフォルト値ならわかるんだけど。
元にしたサンプルコードの値そのままっていうような意味で使ってるのかしら。
Re: (スコア:0)
はい、書いた当人もそう思います。ここでは例示値という意味で使いました。
初期値・デフォルト値と言い換えることも考えましたが、修正後のコードもある意味では初期値・デフォルト値であり、区別が難しくなるのでやめました。
誤検出 (スコア:0, オフトピック)
職員に接触通知50人超、敦賀市困惑
https://www.fukuishimbun.co.jp/articles/-/1151688 [fukuishimbun.co.jp]
> 新型コロナウイルス感染者との接触可能性の通知を受けた福井県敦賀市職員は、計59人となった。
なお、厚生労働省は「現状としては(アプリの)誤作動ではない」と強弁している模様。
Re: (スコア:0)
仕様通りに動いているなら「誤作動」ではないな、たしかに
Re:誤検出 (スコア:1)
以下山下達郎禁止
バグは夜更け過ぎに仕様へと変わるだろう
Re:誤検出 (スコア:1)
きっとヘルプは来ない。一人きりのデバッグ。
Re:誤検出 (スコア:2)
コード深く、諦めた重い、また出そうで怖い
Re: (スコア:0)
サイレンナイト(警鐘を鳴らした内藤君は:意訳)
ホリインナイト(堀の中に沈められた:意訳)
Re: (スコア:0)
状況がわからんのだけど、市内などに感染者が誰もいないのに検知されておかしいということ?
「多いからおかしい」って意味が分からない
仮に市職員に感染者がいて、でもその人が黙ってたら次々と検知されて当たり前なんだけど。市職員に限定して発生しているのなら尚更
端末やバージョンに依存しているなら市職員に限らず発生してもいいようなものだけど、その辺どうなんだろう
Re: (スコア:0)
黙ってたらといってもアプリに陽性者(疑い)として登録してなきゃいけないから行動としてなんなんだろう、ってことにもなりますな…。
というか「多いから」云々ってのは判定範囲が異様に広く設定されてるならあり得るかもしれませんね。
職員にはゼロ人なのに、外を歩いてた人と「濃厚接触していた」と判定されてしまったらこうなる。
むろんあくまで可能性の話であって、そう信じられるかは別の話ですが。
信号の強弱に関係なく記録してるの? (スコア:0)
プッシュの場合の動作がよくわからんのだけど、
信号の強弱(=距離)を無視して照合していて、遠いのも接触扱いでプッシュ通知が発行されているってこと?
で、アプリの画面は強弱も判定して遠いのは接触してないことになるの?
プッシュ通知を出している主体はどこ?
アプリの定期処理?厚労省のサーバー?
Re:信号の強弱に関係なく記録してるの? (スコア:2)
>割って入らんでもよろしい
誰かの意見に対する第三者の強引なリプライなら「割って入った」感はあるけど、
今回はそうではないからね。
とても「割って入った」ようには見えん。
Re: (スコア:0)
陰険自慢か
Bluetooth機能が機種ごとに差があり (スコア:0)
> ただし、ブルートゥースの性質上、機種の性能や周辺環境等により、計測する距離や時間に差が生じるため、
そんなことは前提条件として設計し、リリース前に実機でも評価すべき話だろうに、なにを今更。
Re: (スコア:0)
マイナンバーカード関連でも、申請画面を開いてから書式を記入して送信するまでに
カードとの接続が切れると記入中の書式を捨てて書き直しになる仕様がなかったっけ
実機での評価をすっ飛ばして検収しても誰も責任を問われないのかもね
Re: (スコア:0)
趣味で作ったんだから面倒なテストなんてしないよ。
「文句はapiの提供元(google&apple)へ」です。
クライアント側は接触者の情報をどう持っているのか (スコア:0)
COCOAの前提:サーバー側には接触判定するデータ(個人情報)を持っていないのでクライアント(スマホ)側が判定している。クライアント間のブルートゥース通信で互いのIDを交換して時刻とともに一定期間保存。
厚労省の説明で知ったこと:プッシュ通知用の接触判定と確認画面の接触判定が別のロジック
判定は
(1)プッシュ通知を表示する際の接触の判定 →想定しているよりも広範となっていた
(2)陽性者との接触があった旨の表示をする際の接触の判定 →(1)と違うロジック
(Debug)これらの「内部処理」を整合的に行うようにプログラムの修正
サーバーからは陽性者のIDだけがクライアントに飛んでくるのでしょう。
ビーコンを受け取った不連続な時刻だけがクライアントに保管されているのでしょうから
そこから「(連続)15分以上」と決定するロジックに2種類あったというでしょうか。
「(連続)15分以上」は接触時に判定して、リアルタイムに保管しているものと思っていた。
Code for Japanが作って公開した方のソースでも読んだらわかるのか?
Re: (スコア:0)
8月後半までiOS版は「通知はくるけどアプリでの接触表示はない」人しかTwitter上で見かけないので、
Risk levelの判定だけで説明される話ではないのだろうなと思っています
(1)でiOSがどのロジック使ってるかわからない、(2)のCOCOAが使うロジックは8月後半にdeprecated
ドイツのアプリはGetExposureInfo使ってなさそう そしてAppleもgoogleもENEに移行したい
というあたりでそもそもiOSもあやしいと思ってます
なによりデバッグのしようがない。実際に接触したかどうかを判定できるのは
通知を受けた端末側だけでデバッグ環境を手軽に用意できない。
Re: (スコア:0)
そもそもENSが「バグがあっても誤通知でも受けた側は真偽が分からないように高度に匿名化されたシステム」なんだからしょうがない
Re: (スコア:0)
連投ごめんなさいね
今回のバグと解るのも「通知され過ぎた」あるいは「通知されるけどアプリで表示されない」という現象だから把握できるもので、
もし「通知される/接触表示が出る」べきなのに全く反応しないバグがあったとしても知り得ないのです。仕様のバグとしか言いようがない。
COCOAはバグのないソフト (スコア:0)
警告が来たら無条件で確信するように
、と教祖様がおっしゃってた。
Re: (スコア:0)
あっ、預言者様だ!
一方、某社の場合 (スコア:0)
ところどころに配置したノートに名前とそこにいた時間帯を書いてもらうようにした。仕組みが簡単で、費用対効果も理解しやすく、みな協力している。電子機器の持ち込みが禁止されているからでもあるが。
Re: (スコア:0)
プライバシー皆無だなw
Re: (スコア:0)
うちらの県でもやってるけど、人が集まる場所に機械を置いて来場者にQRコードスキャンしてもらうシステムの方がよほど確実だよな。
(失敗したけど)個人の罹患状況を抜きたいIT大手に騙されてこんなもんつくって、しょうがねえよ。
日本のIT(笑) (スコア:0)
自身が陽性だと分かったとき陽性であると自ら進んで登録するだろうか
いや、しないだろう
Re: (スコア:0)
独裁国家が好きなら早く移住シナよ
Re: (スコア:0)
陽性登録者に厚労省からお見舞金を出せ。
陰性になるまで50,000円/日、後遺症には10,000円/日とか。
(金額については例示であり、何の算定根拠もありません)
非陽性者が陽性登録するのはシステム上できないようになっていると聞くが……
たとえるなら (スコア:0)
プログラム内に円周率を3とハードコーディングして、
実際の円周率はオンラインでサーバからとってきた値(3.1415・・・)を使用してたが、
たまにサーバに接続できないときに、ハードコーディングされた3がつかわれた感じ
ハードコーディングされる円周率を、3.14に設定したのでサーバからとってこれなくても大丈夫になった感じ