Mercari Engineering Blog

We're the software engineers behind Mercari. Check out our blog to see the tech that powers our marketplace.

CDN切り替え作業における、Web版メルカリの個人情報流出の原因につきまして

本日コーポレートサイトでお知らせした通り、Web版のメルカリにおいて一部のお客さまの個人情報が他者から閲覧できる状態になっていたことが判明しました。原因はすでに判明して修正が完了しております。また、個人情報を閲覧された可能性のあるお客さまには、メルカリ事務局より、メルカリ内の個別メッセージにてご連絡させていただきました。 お客さまの大切な個人情報をお預かりしているにも関わらず、このような事態に至り、深くお詫びを申し上げます。

本エントリでは技術的観点から詳細をお伝えさせていただきます。

2017年6月27日 CDNのキャッシュの動作について、CDNプロバイダと仕様について確認し検証を行いました。その結果一部記述に実際と異なる箇所があり、加筆修正いたしました。

概要

メルカリWeb版のコンテンツキャッシュをしているCDNのプロバイダ切り替えを行いました。

その際本来キャッシュされるべきでない情報がCDN側にキャッシュされてしまい、該当時間帯にアクセスしたお客さまに、他のお客さまの情報が表示されておりました。

お客さまからのお問い合わせを受け、問題認識後、即時に設定の切り戻しとプロバイダ側のキャッシュの削除を行いました。 これにより状況は収束し、現在は通常にサービスを提供しております。対象はメルカリWeb版の JP 及び US のみであり、iOS・Androidアプリ版には影響ありません。

原因

メルカリWeb版へのお客さまからのリクエストはCDNプロバイダから、メルカリが管理するnginx Webサーバを介してアプリケーションサーバに到達します。

メルカリではお客さまのメルカリでの体験をよりよくするため、このnginxサーバにて、

location / {
  # disable cache
  expires -1;
  proxy_pass http://127.0.0.1:80;
}

とキャッシュを防ぐ設定を追加しております。本設定を反映することで、お客さまのブラウザはサーバへ毎回問い合わせを行い、画面が更新されないなどの意図しない動作を防ぐようになっております。

具体的には上記の設定をおこなうと、サーバからのレスポンスヘッダに

Cache-Control: no-cache
Expires: Thu, 22 Jun 2017 08:58:21 GMT (アクセスの1秒前の時間)

と送信されます。まず、Expiresヘッダがアクセスの時間より過去の時間となるため、ブラウザのキャッシュはすぐに無効になります。またno-cacheオプションによりキャッシュ使用時にサーバに対して問い合わせを行うようになり*1、新しいコンテンツが常に表示されるようになります。この手法はメルカリに限らず広く用いられております。

切り替え前のCDNプロバイダはCache-Controlヘッダではなく、CDNの設定でキャッシュを制御することで、メルカリWeb版においては全くキャッシュが行われないようにしていました。

切り替え後のCDNプロバイダでは、Cache-Controlヘッダでキャッシュの制御が可能であるため(この制御はnginxの設定により行います)、CDNの設定によるキャッシュ無効化は行わず切り替えを行いました。切替前の検証では手元のマシンのhostsファイルを編集し、数回アクセスを行い問題なく動作していることを確認しました。

問題発覚後に切り替え後CDNのキャッシュの仕様を再度確認したところ、キャッシュをしないのは

Cache-Control: private

が含まれている場合のみとわかりました。Expiresヘッダが過去の日付であっても、Cache-Controlヘッダが存在している場合は利用されないという仕様になっておりました。このためCDNのサーバ上にお客さまの情報が含まれたキャッシュが作成され、別のお客さまへ配信される事態に至りました。

Expiresヘッダは、Cache-Controlヘッダにmax-ageまたはs-maxageがない場合採用されます。ただし、過去の日付である場合、0秒として扱われます。キャッシュの有効期限が0秒となる場合、CDNからオリジンへのリクエストの処理中に、同じURLに対してリクエストが発生すると、最初のレスポンスを待って、2つ目以降のリクエストにも同じレスポンスが返される仕様になっていました。

このため、お客さまがWeb版メルカリに対してアクセスを行い、メルカリのサーバがレスポンスを構築している途中で、別のお客さまから同じURLに対してリクエストがあった場合、レスポンスがまとめられ、最初のお客さまの情報がふくまれたコンテンツが別のお客さまへ配信される事態に至りました。

影響

本来お客さまごとに異なる内容が表示されるはずが、CDNにてキャッシュされたことにより同一の内容が表示されました。 これによりお客さまの個人情報(配送先住所、メールアドレス)などが、本人以外に表示されました。

意図せずお客さま本人以外に表示された可能性がある情報と影響をうけたお客さまは以下の通りです。*2

影響範囲 アクセス数
名前・住所・メールアドレス・電話番号
(※登録しているお客さまのみ)
459名
銀行口座情報、クレジットカードの下4桁と有効期限
(※登録しているお客さまのみ)
1855名
購入・出品履歴 22458名
ポイント・売上金、お知らせ、やることリスト 53816名

※ ポイント・売上金は全ページに表示されているため、影響あったお客様と同数になっています。

追記 (6/23 16:00)

調査の結果、新たに判明した事項につきまして、詳細はコーポレートサイトのお知らせをご覧ください。

対応

問題の認識後、以下の対応を行いました。

  • DNSの設定の切り戻しにより、切り替え前のCDNを利用する状態に戻しました。
  • 切り替え後CDNのコントロールパネルより、キャッシュされた情報の削除を行いました。

再発防止について

外形監視を利用した、CDNによる意図しないキャッシュを早期に検知できる仕組みを導入します。

今回はこのような事態に至り、深くお詫び申し上げます。

*1:no-cacheの動作について一部誤りがありましたので修正しました。2017/06/23

*2:日本版メルカリのみの人数