OpenEMRに文書付け替えの脆弱性、8.4.0で修正
OpenEMR 8.4.0より前の版に、ログイン済みの低権限ユーザーが他の患者の文書を付け替えて閲覧できる脆弱性があります。診療記録を扱う組織は8.4.0へ更新し、文書が不審に移されていないかも確認してください。
急ぎ度: 早めに
CVSS v3は9.6のCriticalで、修正版8.4.0が公開済みであり、勧告に再現用のコードが付いているため、診療記録を扱う環境では早めの更新が望ましいです。
関係があるか
OpenEMRで患者の文書(Documents機能)を扱い、スタッフや委託先などに個別のアカウントを発行している診療所・病院・関連事業者が該当します。外部から接続できるかどうかにかかわらず、8.4.0より前の版はすべて対象です。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| OpenEMR(openemr/openemr) | 8.4.0より前のすべての版 | 8.4.0 |
確かめ方
- 1OpenEMRの画面から版を確認し、8.4.0未満であれば対象です。
- 2インストール先ディレクトリのversion.phpに、版を示す値が書かれています。
- 3Documents機能を使っているか、ログインできるアカウントが何人いるか、どの役割に文書へのアクセス権を与えているかを棚卸しします。対象版を使っていれば、文書機能を使っていなくても更新の対象です。
何が起きたか
OpenEMR 8.4.0より前の版では、ログインした低権限のユーザーが、本来は触れない患者の文書を自分がアクセスできる患者やカテゴリへ付け替え、そのまま閲覧できてしまいます。
原因は、文書の移動や更新といった書き込み系の処理に権限確認が抜けていたことです。移動元の文書、現在の患者とカテゴリ、移動先の患者とカテゴリのどれについても、操作する人に権限があるかを確かめていませんでした。閲覧側の処理には確認があるため、書き込み側で文書の所属を書き換えられると、閲覧側の確認が通ってしまいます。分類はCWE-639です。
見落としやすい点があります。移動の処理は、付け替えを先に実行してから、移動先の患者の一覧を表示します。権限の確認が働くのはこの一覧表示の段階です。そのため、操作の結果がHTTP 403になっていても、付け替えは完了している場合があります。
攻撃の流れ
-
1
ログイン
低い権限のアカウントでOpenEMRにログインします。
-
2
文書を付け替え
権限確認のない移動処理で、他の患者の文書を自分が扱える患者やカテゴリへ移します。
-
3
403でも実行済み
一覧表示の確認で403が返っても、付け替えはすでに終わっています。
-
4
通常経路で閲覧
文書が自分の担当範囲に入ったため、保護された閲覧画面から内容を取得できます。
どう悪用されるか
必要なのは、OpenEMRにログインできるアカウントです。ネットワーク越しに、特別な操作条件なしで、利用者に何かをさせることもなく実行できます。権限は低いもので足り、勧告では役割を問わずログイン済みのユーザーが対象とされています。
悪用されると、他の患者の文書が読まれ、文書の所属先が書き換えられます。付け替えられた文書は元の患者の記録から外れるため、診療記録の機密性と完全性の両方に影響します。可用性への影響は想定されていません。
今すぐやること
-
1
OpenEMRを8.4.0へ更新する
バックアップを取り、可能ならテスト環境で動作を確認してから、本番を8.4.0に更新します。修正では、文書の移動前にDocumentsの書き込み権限と移動元文書へのアクセス可否を確認するようになり、文書コントローラーにも権限確認が追加されました。
-
2
版を確認する
更新前後の版を記録します。インストール先ディレクトリで次を実行すると、版を示す値を確認できます。
grep -E "v_(major|minor|patch)" version.php -
3
付け替えの痕跡を調べる
ウェブサーバーのアクセスログで、controller.phpへの文書の移動操作を探します。応答が403のものも含めて調べます。あわせて、文書一覧に身に覚えのない文書がないか、あるはずの文書が消えていないかを、受付や診療の担当者に確認してもらいます。
-
4
アカウントを棚卸しする
退職者や使っていないアカウントを停止し、共有アカウントがあれば個人ごとに分けます。不審な操作が見つかったアカウントはパスワードを変更します。
-
5
疑いがあれば社内の手順に沿って対応する
他の患者の文書が不正に閲覧された疑いが出た場合は、診療情報を扱う組織として定めている漏えい対応の手順に沿って、責任者へ報告します。
すぐ更新できないとき
修正版のほかに公式の回避策は示されていません。更新までのつなぎとして、OpenEMRへの接続を院内ネットワークやVPNに限り、不要なアカウントを止めておく方法があります。ただし、すでにログインできるユーザーによる悪用は防げないため、更新までの期間を短くすることが前提です。
背景
OpenEMRは、診療所や病院で受付、診療記録、請求を扱うオープンソースのシステムです。Documents機能は、患者ごと、カテゴリごとに文書を保管します。ここから漏れるのは、診療に関わる要配慮個人情報です。
今回の脆弱性が起きた背景は、閲覧側だけが先に守られていたことです。閲覧の処理には、要求された文書がその患者のものかを確認する対策が明示的に入っていました。その確認は、文書がどの患者とカテゴリに属するかという記録を正しいものとして扱います。書き込み側にはその確認がなく、所属を書き換えれば閲覧側の確認をそのまま通過できました。修正の変更には、請求、DICOM、事前承認モジュールなど、同じく権限確認が足りなかった他のエンドポイントへのチェック追加も含まれています。
よくある質問
Q.8.4.0に更新すれば、すでに付け替えられた文書は元に戻りますか。
この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
OpenEMR is a free and open source electronic health records and medical practice management application. Prior to 8.4.0, controllers/C_Document.class.php write actions, including move_action_process(), do not verify the caller's access to the source document, current patient and category, or destination patient and category before Document::change_patient() performs the mutation. A low-privilege authenticated user can reassign an arbitrary document to a patient or category the user can access and then retrieve it through the normally protected read path. The reassignment occurs before a later list rendering check, so a final HTTP 403 response does not mean the unauthorized write was blocked. This issue is fixed in version 8.4.0.
出典: CVE.org (CVE Program・cvelistV5) NVD