🙄

Bitwarden監査報告書解説 Webアプリとネットワークセキュリティ編

に公開

注意事項
本記事は、Fracture Labsが実施したBitwardenのWebアプリおよびネットワークセキュリティに関する監査報告書を基に執筆しております。
記載している情報は記事作成時点のものであり、報告書の正確性や完全性を保証するものではありません。
詳細は必ず監査元の公式文書をご確認ください。

  • Webアプリとネットワークセキュリティを監査した企業: Fracture Labs
  • モバイルアプリとSDKのセキュリティを評価した企業: Cure53

概要

2024年7月にBitwardenはサイバーセキュリティ企業のFracture Labsと提携し、自社のウェブアプリケーションおよび関連するネットワークコンポーネントに対する侵入テストと専用監査を実施しました。
Fracture Labsの専門テスターによって2週間にわたり入念な準備とテストが行われ、その結果、合計11件の問題が発見されました。これらのうち6件の問題は評価後に修正され、1件は現在も計画・調査中です。残る3件については対処不可能(または受容済み)と判断されました。
今回の監査報告書では、発見された問題点の範囲や影響、その対処方法についてBitwardenチームが詳細に記録しています。また透明性の確保を目的として、Fracture Labsが作成した元の報告書から「Findings(発見事項)」セクションを引用した文書も付録として公開されています。

テスト範囲

  • Bitwardenが管理する外部公開されたサブドメインやワイルドカードドメイン複数(合計74ターゲットをスキャン)。
  • Webアプリケーションは25サイトを対象に、認証前(未ログイン)・認証後(ログイン済み)の両面で脆弱性を探査。
  • 別途、アイコンを取得するサーバやAPIサーバなどを含む関連インフラを含めてテスト。

発見された問題の数と状況

  • 合計で11件の問題が発見されました。
    • 6件はテスト後に修正済み。
    • 3件は現状対策が難しい、もしくはリスクを受容(修正しない方針)と判断。
    • 1件は今後の計画中・検討中。

発見された問題の詳細

今回の監査では、合計11件の問題が発見されました。ここでは、リスクレベルがMediumと評価された3つの問題と、その他の問題について概要を解説します。

リスクレベルがMediumの3つの脆弱性について

  • 問題ID: WEB.M.01
    • 概要: 外部リソース経由のXSS
    • ステータス: 評価後に問題は修正されました。
    • Github Pull request #4747
    • 脆弱性の内容
      Web保管庫には、外部サイトからファビコンを自動取得・表示する機能があります。
      この仕組みにより、もし攻撃者が細工した悪意あるSVGファイルが外部サイトに置かれていた場合、それを取得してしまう可能性がありました。SVGファイルにスクリプトが埋め込まれていると、特定の操作(例: アイコンを新しいタブで開くなど)によってスクリプトが実行され、Bitwardenのドメイン上でXSS攻撃が発生する可能性がありました。
      この攻撃を利用すると、攻撃者はBitwardenの正規ドメイン内に偽のログイン画面を表示し、ユーザーが入力する認証情報を盗み取る可能性があります
    • 対応方法
      ファビコンを取得するアイコンサーバーのレスポンスにCSPヘッダーを追加しました。この変更により、ファビコンとして読み込まれるSVGファイル内のスクリプトは、ブラウザによって実行がブロックされるようになります。その結果、悪意のあるSVGを取得してしまってもスクリプトが動作せずXSS攻撃が防止されるようになりました。

  • 問題ID: WEB.M.02
    • 概要: 機密情報がメモリに平文保存される問題
    • ステータス: 評価後に問題は修正されました。
    • Github Pull request #11781
    • 脆弱性の内容
      BitwardenのWeb保管庫を手動でロックした後や、タイムアウトで自動ロックされた後でも、ユーザーが入力したマスターパスワードや、閲覧した保管庫内のパスワードなどの機密情報が、ブラウザのメモリ内に暗号化されていない状態で残存していることが確認されました。これは、Bitwardenのドキュメント(ロック中やログアウト中はメモリに保存されないと記載)とは異なる挙動でした。もし攻撃者が何らかの方法でブラウザのメモリにアクセスできた場合、これらの情報を盗み見られるリスクがありました。
    • 対応方法
      Bitwardenは、保管庫がロックまたはログアウトされる際に、ブラウザのウィンドウを再読み込みする処理を追加しました。これによりブラウザが使用していたメモリ領域が解放され、機密情報がクリアされることが期待されます。ただし、この挙動はブラウザの実装に依存するため、必ずしも保証されるものではありません。

  • 問題ID: WEB.M.03
    • 概要: 監査・イベントログの改ざん
    • ステータス: 評価後に問題は修正されました。
    • 脆弱性の内容
      Bitwardenには、ユーザーの操作履歴を記録する機能があります。しかし、保管庫アイテムの閲覧や変更といった一部の操作ログは、ユーザーのブラウザ(クライアント側)からサーバーへ送信される仕組みでした。そのため、悪意のあるユーザーが通信を傍受し、ログ送信のリクエストを改ざんしたり、意図的に送信しないようにしたりすることで、正確な監査ログが記録されない可能性がありました。例えば、「パスワードを閲覧したにもかかわらず、そのログを送信しない」といったことが可能でした。
    • 対応方法
      Bitwardenは、イベントログの仕組み自体は変更しませんでしたが、関連するヘルプドキュメントを更新し、イベントの記録プロセスについて詳細を明確化しました。クライアントからのログ送信はAPI経由で行われ、成功するまで再試行される事、何らかの理由でクライアントがAPIと通信できない、またはログを送信しないように改変された場合、ログは記録されない可能性があることが明記されました。
      該当のドキュメントはこちらから閲覧できます。

Lowリスクの問題

  • 問題ID: WEB.L.01

    • 概要: プレミアム機能への不正アクセス
    • ステータス: リスク受容済み
    • 脆弱性の内容
      悪意ある利用者がローカルで設定を変更し、プレミアム機能の一部を利用できてしまう問題です。技術的に複雑であり悪用のリスクは限定的として、リスク受容済み。
  • 問題ID: WEB.L.02

    • 概要: URL内のセッショントークン
    • ステータス: アップストリームの制限として承認
    • 脆弱性の内容
      WebSocketで通知を正常にやり取りするために、SignalRの認証トークンをクエリ文字列に含める必要があります。これは、Microsoftのドキュメントでも必須要件として示されています。認証トークンをURLに含めると、第三者が取得できるリスクがゼロではありませんが、Push通知で送られる情報はごく基本的な内容に限定されており、被害の可能性は最小限に抑えられています。
      該当のドキュメントはこちらから確認できます。
  • 問題ID: WEB.L.03

    • 概要: 外部リソースの整合性チェックの欠落
    • ステータス: 計画・調査中の問題
    • 脆弱性の内容
      マーケティングウェブサイトでGDPR対応のために使用されているサードパーティライブラリを、SRIに対応しているプロバイダに置き換える。
  • 問題ID: WEB.L.04

    • 概要: 保管庫エクスポートの脆弱なパスワードポリシー
    • ステータス: 評価後に問題は修正されました。
    • GithubPull Request #10539
    • 脆弱性の内容
      暗号化されたJSON形式でエクスポート時に、非常に弱いパスワードでも設定できてしまう問題。
    • 対応方法
      パスワード強度を評価するインジケーターがエクスポートプロセスに追加し、エンドユーザーに警告する仕組みを追加することで対応されました。この機能はあくまでユーザーに注意を促すものであり、弱いパスワードの使用を禁止するわけではありません。

infoリスク問題

  • 問題ID: WEB.BPI.01

    • 概要: ソフトウェア名とバージョンの報告を無効化する
    • ステータス: 評価後に問題は修正されました。
    • 脆弱性の内容
      CDNやエッジネットワークの設定変更によって、一部のレスポンスヘッダーにシステムの軽微な内部情報が含まれていました。このヘッダを削除することで、ソフトウェア名やバージョンなどの余分な情報が外部に漏れるリスクを抑えました。
  • 問題ID: WEB.BPI.02

    • 概要: ファイルアップロードの制限不備
    • ステータス: リスク受容済み
    • 脆弱性の内容
      Bitwardenはファイルアップロードの内容を検査しません。
  • 問題ID: WEB.BPI.03

    • 概要: APIレスポンスからプライベートIPアドレス削除
    • ステータス: 評価後に問題は修正されました。
    • GithubPull requests #4771
    • 脆弱性の内容
      特定のAPIエンドポイントが、レスポンスに内部ネットワークのプライベートIPアドレスを含んでいました。この情報漏洩は、攻撃者が内部ネットワーク構成を推測する手掛かりを与える可能性がありました。
    • 対応方法
      問題にAPIエンドポイントは、Bitwardenによると何年も前に内部ネットワークのテストだけに使われたものなので、削除されました。

外部ネットワークテストで見つかったLowリスクの問題

  • 問題ID: EXT.L.01
    • 概要: 設定ミスによりTLS 1.0とTLS 1.1が使用されていた
    • ステータス: 評価後に問題は修正されました。
    • 脆弱性の内容
      本来利用しないはずのバックエンドホスト向けに誤ったDNSエントリが登録されていたことが原因で、Azureのデフォルト動作によってTLS 1.0およびTLS 1.1で通信応答が返される状態になっていました。該当のバックエンドホストは実在せず、名前解決もされないため実害はありませんでした。しかし、不要なDNSエントリが残っていたことで、レガシーなTLSバージョンが利用されるリスクが存在していました。
    • 対応方法
      不要なDNSエントリを削除することで、TLS 1.0およびTLS 1.1の応答が返される状態を解消しました。また、Azureの設定やサーバ証明書を見直し、TLS 1.2以降のプロトコルのみを使用するように制限することで、同様の誤設定が起きても影響が生じないように対策が行われました。

参考文献

Discussion