OpenEMRの患者ポータルに脆弱性、8.4.0で修正
OpenEMRの患者ポータルで、使用済みのワンタイムトークンが再利用でき、PINも総当たりで破られて患者情報が読まれるおそれがあります。7.0.1以上8.4.0未満を使う医療機関は、8.4.0へ更新し、ポータルの公開状況を確認してください。
急ぎ度: 早めに
CVSS v3は9.8、v4は9.3の重大な脆弱性で、修正版8.4.0が公開されているため、患者ポータルを外部に公開している環境から順に更新する段階です。
関係があるか
OpenEMR 7.0.1以上8.4.0未満を運用し、患者ポータルのワンタイムログインリンク(請求書の支払い案内など)を使っている医療機関やクリニックです。ポータルをインターネットに公開しているほど、リスクは高くなります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| OpenEMR | 7.0.1以上、8.4.0未満 | 8.4.0 |
確かめ方
- 1OpenEMRの画面に出るバージョン表示、またはインストール先のversion.phpで、版が7.0.1以上8.4.0未満かを確認します。
- 2患者ポータルが外部のネットワークから開けるかを確認します。FaxSMSなどで請求書の支払いリンクを患者に送っているかも、あわせて確認します。
- 3Webサーバーのアクセスログで、service_authというパラメーター付きのリクエストが、同じ値で何度も来ていないかを確認します。
何が起きたか
OpenEMRの患者ポータルには、メールやSMSで届くリンクから、パスワードなしで一度だけログインさせる仕組みがあります。この仕組みで、使い終わったはずのトークンが無効にならず、期限まで何度でも使えてしまいます。PINで保護されている場合も、試行回数が制限されていません。突破されると、患者の氏名、生年月日、SSN、住所、処方、検査結果、文書、安全なメッセージ、支払いページが読まれます。
原因はsrc/Common/Auth/OneTimeAuth.phpにあります。トークンにはenforce_onetime_useとmax_access_countという使用制限のフラグが付いていますが、トークンを使うときに読まれていません。使用後に削除も無効化もされず、増えるのはアクセス回数だけです。請求書の支払い案内では、1回限りと指定しているのに、最長14日間使えます。
PINは6桁で、失敗してもトークンには何も起きず、ロックも待ち時間もありません。PINは数字が重複しない形で作られるため、実際の組み合わせは151,200通りです。そのうえ比較が緩く、数値として等しい別の表記でも通ってしまいます。
分類はCWE-307(認証試行の回数制限の不備)で、トークンの再利用についてはCWE-613(セッション期限の不備)も挙げられています。
攻撃の流れ
-
1
トークン入手
患者に送られたリンクのURLから、service_authトークンを手に入れます。
-
2
トークン再利用
使用済みでも無効にならず、期限まで何度でもログインできます。
-
3
PINの突破
PINが必要な場合は、回数制限のない試行と緩い比較で破ります。
-
4
ポータル侵入
対象の患者として、完全なポータルのセッションが開きます。
-
5
患者情報の閲覧
診療や個人に関する情報が読み取られます。
どう悪用されるか
認証は不要で、ネットワーク経由で悪用でき、利用者の操作も要りません。ただし、有効なservice_authトークンを手に入れていることが前提です。トークンはURLのクエリに入っており、勧告は入手経路として次を挙げています。
- メールの傍受
- ポータルから外部リンクへ移るときのReferer経由の漏えい
- Webサーバーのアクセスログ
- 共用端末のブラウザー履歴
- HTTP通信の中間者攻撃
PINが必須のリンクでは、トークンに加えてPINを突破する必要があります。ただ、突破までの試行に制限はありません。
成功すると、対象の患者として患者ポータルに入られます。CVSSでは機密性・完全性・可用性とも高と評価されています。勧告が具体的に示している被害は、患者情報の閲覧です。
今すぐやること
-
1
OpenEMR 8.4.0へ更新する
対象の版を使っているなら、修正版の8.4.0へ更新します。患者ポータルを外部に公開している環境を先に進めてください。更新の前に、バックアップを取っておきます。
-
2
いまの版を確認する
インストール先のversion.phpに版が書かれています。<インストール先>は自社の環境に読み替えてください。
grep -n "v_" <インストール先>/version.php -
3
アクセスログに侵害の跡がないか調べる
service_authパラメーター付きのリクエストが、同じ値で繰り返されていないかを見ます。ポータルのログインフォームへのPOSTが、同じ送信元から大量に来ていないかも確認してください。疑わしい形跡があれば、社内の個人情報漏えい対応の手順で扱います。
-
4
送信済みのリンクの扱いを決める
更新後に、過去に発行済みのリンクがどう扱われるかは、GitHubのOpenEMR勧告で確認します。請求書の支払いリンクなどは最長14日有効なので、不安がある場合は再発行を検討してください。
すぐ更新できないとき
勧告の本文では、修正版以外の公式な回避策は確認できていません。更新までのつなぎとして、次の対策が考えられます。ただし、一般的なつなぎであり、根本的な解決は更新です。
- FaxSMSによる請求書リンクの送信を一時的に止める
- 患者ポータルへのアクセスを、VPNや送信元IPアドレスで制限する
- リバースプロキシやWAFで、portal/index.phpへの連続したリクエストを絞る
- ポータル全体を一時停止する
どの対策も、更新までの間だけにしてください。
背景
OpenEMRはオープンソースの電子カルテ・診療管理システムです。患者ポータルは、患者が検査結果や処方、医師とのメッセージを見たり、請求書を支払ったりする窓口で、診療情報がいちばん集まる場所の一つです。
今回の対象は、パスワードなしで入れるワンタイムリンクです。URLそのものが鍵になるため、ホテルの部屋に入れる1回きりのカードキーが、何度でもコピーして使えるような状態になります。しかもURLは、メール、Referer、アクセスログ、ブラウザー履歴など、あちこちに残りやすいものです。この仕組みのonetime_authテーブルとOneTimeAuthクラスは、7.0系で導入されました。そのため、影響範囲は7.0.1から始まります。
よくある質問
Q.CVSSのv3とv4で値が違いますが、どちらを基準にすればよいですか。
Q.患者ポータルを使っていなければ、影響はありませんか。
まだ分かっていないこと
- 7.0.1より前の7.0.0が影響を受けるかは、はっきりしません。勧告はonetime_authテーブルの導入時期を7.0.0または7.0.1と書いていますが、CVEの影響範囲は7.0.1以上です。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
影響パッケージ
| パッケージ | 影響を受ける版 → 修正版 | |
|---|---|---|
| openemropenemr |
7.0.1 以上 8.4.0 未満→ 8.4.0 |
8.4.0 |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
OpenEMR from 7.0.1 before 8.4.0 contains a flaw in src/Common/Auth/OneTimeAuth.php that ignores the enforce_onetime_use and max_access_count flags, never revokes consumed service_auth tokens, and checks login_pin without rate limiting or strict comparison. Attackers holding a captured token can replay it or brute-force the PIN to open patient-portal sessions exposing PHI.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory nvd.nist.gov
- advisory github.com
- web disclosure@vulncheck.com
- web disclosure@vulncheck.com
- web github.com