とある大規模予約サイトが公開から1日も経ずたくさんの不備が指摘される事態となった。
新型コロナワクチンに関する自治体向け通知・事務連絡等 - 厚労省 に「新型コロナウイルス感染症に係る予防接種の実施に関する手引き」が公開されてます。 令和3年4月15日付けの第2.2版の仕様を確認しつつ、ニュースになっている問題とその影響を予測してみる。
前提条件が間違ってたり虚偽の情報が含まれている可能性があります。 個人が適当に考えたチラシ裏程度の信用度です。
Contents
問題点の4行まとめ
- 接種券番号をもたないユーザが架空の番号で予約できてしまう
- 接種券番号が届いた方の予約を事前に阻止できる
- 有効な接種券番号の推測が出来そう
- 脆弱性が指摘されてもシステムが止まる気配がない
大規模接種予約サイトの問題点
不備が多すぎて不具合なのかもわかりませんが、問題点をあげます。 東京と大阪で別のシステムが使われています。 この記事は東京の予約サイトについてです。 問題がある程度解消されれば、7月末までの高齢者の接種の期間は延命できると期待してます。
1. 接種券番号の採番が自治体任せ
手引きによると、接種券番号が10桁であること以外は自治体任せです。
▼ 手引きのp42, p43です。
自治体に任せたため数字10桁であること以外のチェックができない。 その接種券番号も予約システムで保持していないため番号の照合ができません。 不正な番号を検知するチェックデジットもない。
「生殺与奪の権を他人に握らせるな」ってやつだね。
2. 他者の接種券番号を推測しやすい
市町村コードの6桁は総務省のHPでわかる。市町村区で別れており人口と接種対象者の数は決まっている。 総務省|電子自治体|全国地方公共団体コード 10桁の番号ではたかが100億通りしかない。 例)
対象者が一番多そうな世田谷区の65歳以上の接種対象者はおよそ20万人であり、2回接種分を考えると接種券番号が40万通り必要です。一意に採番すると有効な接種券番号は0.004%です。一般接種が始まると0.02%とさらに高くなる。
これはランダムに10万回試行したときに有効な接種券番号に当たるかの2項分布です。
参考
- くらしと統計2020 区市町村統計表
- 二項分布 - 高精度計算サイト - Keisan - CASIO 初回登録に認証はありません。適当な生年月日で登録してはじかれた場合は予約済みとみなせるため、それは真の接種券番号である可能性が高い。 また、自治体が独自に採番しているとなると連番や偏った採番をした可能性もある。いくつかの番号がわかれば分布から推測しやすくなる。
以上より、結構高い確率で真の接種券番号がわかる。 次回の期限の公開時にも数十や数百万のアクセスが期待出来るので、そこで紛れ込ませて攻撃すると良さそう。 攻撃者からするといっちょやってみるかってくらいだと思うので、諦めてもらえる確率まで下げたい。 そのためには桁数を増やすしかないが、接種券番号の再発行が必要になる。 これから発行する分は市町村コードを細分化すると良いかも。
3. 任意の番号で予約できる
1により任意の番号で予約できてしまう。
まず、接種対象者が間違った番号で予約する事故が出ます。 チェックがある場合と比べその件数がはるかに多くなるはず。
悪意あるユーザからは直近の予約を埋めてしまうことが可能です。 現在の仕様では、スキルは必要なく人海戦術でも脅威です。 一般ユーザが不用意に登録してしまえる。
早めに不正な予約を取り消して正確な予約数を出さないと、予約件数分準備したワクチンが余る恐れがある。 不正な番号の予約を取り消すには市町村区の採番した番号との照会が必要です。 自治体のシステムと連携が取れていないため、追加で改修かデータ登録をしなくてはならない。
有効な番号で不正が起きた場合、残念ながら、その予約が不正かどうか判断する術は少ないです。 ログでbotからのアクセスだと判明したり、本人から申請により発覚します。
4. 正規のユーザのマイページを事前に抑えられる
この攻撃をされたらまずい。
2回目の予約には接種券番号と生年月日が必要ですが、初回は接種券番号のみで登録可能です。 攻撃者はとりあえず全件の番号で先に予約とキャンセルを繰り返してしまえば、接種券が届いてから予約しようとした本人の登録時に生年月日を求めさせ認証を阻止することが出来きます。
これが実行された場合はオペレーションに多大な負荷がかかり復旧がかなり大変になると思います。本人の申請からデータの変更や再発行が可能ですが、時間がかかります。反対にデータから不正な予約か本人の申請か判断することは難しく、接種券番号の発送時期でリセットする対応など限定的になるかと。
5. 他者の予約をキャンセルできる
別の日程に予約すると前の予約はキャンセルされる。 ここの仕様だけ玄人。 他者の予約でこれができるため逆に利用される。
予約とマイページの認証は接種券番号と初回登録した生年月日のみです。 生年月日はたかが数千の組合せですからブルートフォースに弱い。
接種券番号が漏洩していた場合、接種券番号をチェックする機能が追加されても予約を操作される恐れがある。
6. 他
twitterで「SQLインジェクション」がトレンドになっているが、確かめたくもない。
ドメインや予算には触れない。
良い点
個人情報を持たせない点と予約機能に絞ったシンプルな構成は良かった。 reCAPTCHAがあるし、初日の負荷を耐えきることができた。 10桁は心もとないがめちゃくちゃ悪いとも言えない桁数。
これからの修正案
直近では少しでも不正登録を防ぎ、不正な予約を削除したい。 一旦、1期の予約を締め切り入力のバリデーションと不正な予約の掃除をしてほしい。
そして以下のことを進めてほしい
- SQLインジェクションはすぐに塞いでデマだと言い張ろう。
- torとブルートフォースも防ぐ。
- 実在しない市町村コードと年齢はバリデーションする。
- WAFもいいぞ
- サーバの設定が心配だぞ
- 公開前にレビューとテストをしよう!!
- 発注者は納品時に検収しよう!!
- 不安なら有識者やデジタル庁に相談しよう!! 改修が進み市町村区が採番した番号でチェックできるようになれば、(現状に比べ)かなりの不正なアクセスを防げる。 ただし桁数が少ないため対応にも限度がある。
市区町村のシステムと連結させる大規模改修は「考えていない」と述べた。
おおう、連結は不要だとしても番号のチェックができるようにだけお願いします。 何とかしのいで次の一般接種までに、不正しずらい仕組みとシステムに新しくしたいね。
終わりに
まず、悪質なユーザや組織がいる前提で仕様を決めてほしい。 インターネットが安全ならフィッシングサイトもスパムメールもない。 サイバー攻撃なんて言葉も存在しない。 WAFやFWのログを見てるとサーバが公開されてれば毎日なにかの攻撃を受けてることがわかる。 現状のシステムままで攻撃されず接種が進んだら奇跡を誇っていい。
予約はさばけているので脆弱性を防げたら7月末まで延命できそう、できればいいな。 現在の国民の期待が懸かったフェーズには頼りないが、ワクチンの接種が進んだり供給量を増して予約システムが増えていけばそのうちの一つとして十分機能するシステムです。そのころにはシステムへの攻撃による影響度が減るはず。
発注内容もわからないので推測ですが、突貫にしては開発が健闘していると思う。 緊急時の迅速な対応には仕方がない面もある。 適宜修正を加えていこう。