Snapmart(スナップマート)は2026年10月16日、本人確認書類を提出した一部のクリエイターについて、提出した画像を第三者が閲覧できる状態だった可能性があると公表しました。2019年3月頃から2026年10月8日まで、本人確認書類の画像が URL の直接指定により認証なしで表示される状態だったとしています。

原因として発表されたのは「画像の保存先の設定不備」です。スマートフォンアプリから提出された画像を保存するときに、認証なしで閲覧できる設定が付いていました。本記事は発表を時系列で整理し、ID を差し替えて他人のデータを見る IDOR とどこが同じでどこが違うかを示したうえで、対象者がやることと、開発者が自分の保存先で確かめることをまとめます。

TIMELINE時系列

URLの直接指定で認証なしに表示される状態だった

  1. 2019/3

    認証なしで表示される状態が始まる(頃)

    アプリから提出された画像の保存時に設定が付く

  2. 2020/5

    現在残るアクセスログの始まり

    それより前の約1年分はログが無い

  3. 10/7

    全社の点検で確認し、不備を解消

    国内外のインシデントを受けた再点検の過程

  4. 10/8

    発表が示す期間の終わり

    改修を完了。残っていた画像は削除か非公開に

  5. 10/16

    公表と個別メール

    取得の形跡は現時点で確認されていない

出典: Snapmart「本人確認書類画像の第三者閲覧の可能性について」2026-10-16。日付は日本時間

30秒でわかる(2026年10月16日の発表)

  • ・何が:本人確認書類の画像(運転免許証・パスポート・健康保険証・マイナンバーカード等)が、URL を直接指定すると認証なしで表示される状態だった
  • ・期間:2019年3月頃〜2026年10月8日。画像は提出から約1年で自動削除されるため、見られる状態だったのは各人の提出後およそ1年間
  • ・原因:画像の保存先の設定不備。アプリから提出された画像の保存時に、認証なしで閲覧できる設定が付いていた
  • ・取得の形跡:2020年5月以降のログでは、URL を推測した大量取得や第三者の取得を示す記録は現時点で確認されていない。それより前の約1年はログが無い
  • ・対象外:メールアドレス・パスワード・口座・作品データ・カード情報。パスワードの変更は不要としている

まずやること

  1. クリエイター:10月16日に届いた個別メールを確かめる。届いていなくても、本人確認書類を提出した心当たりがあれば専用の問い合わせフォームへ
  2. クリエイター:本人確認書類の再提出、口座やパスワード、カード情報を求める連絡には応じない(Snapmart はこれらを求めることは一切ないとしている)
  3. 開発者:本人確認書類やアップロード画像の保存先に、匿名で読める設定が残っていないかを確かめる(下のコマンドは AWS の S3 の場合)
BUCKET="example-kyc-uploads"   # 自分のバケット名に置き換える
aws s3api get-public-access-block --bucket "$BUCKET"
aws s3api get-bucket-policy-status --bucket "$BUCKET"
aws s3api get-bucket-ownership-controls --bucket "$BUCKET"

4項目がすべて true、IsPublic が false、BucketOwnerEnforced なら、バケット単位では公開を止める設定です。読み方と、ファイルごとの設定・コードの確かめ方は後半の節にあります。インシデントの読み方やほかの事案は サプライチェーン攻撃とは|手口・防御ツール比較・npm 12の新機構まで実践解説 にまとめています。

Snapmart 本人確認書類の件のタイムライン

日付(日本時間) 出来事
2019年3月頃 本人確認書類の画像が、URL の直接指定により認証なしで表示される状態が始まる
2020年5月 現在保存されているアクセスログの始まり。それより前の約1年分はログが無い
2026-10-07 国内外のインシデントを受けた全社のセキュリティ点検の過程で確認し、直ちに不備を解消
2026-10-08 発表が示す「認証なしで表示される状態」の期間の終わり
2026-10-16 公表。対象者に同じ内容のメールを個別に送付。個人情報保護委員会へは速やかに報告済み

発覚後、Snapmart はシステムの改修を終え、その時点で保存されていた画像も削除または非公開にしたとしています。10月7日に「直ちに不備を解消」とし、期間の終わりを10月8日としている理由は、発表には書かれていません。

何が起きたか:認証なしの直接参照とIDORの違い

発表が述べているのは「保存先の設定不備で、URL を直接指定すると認証なしで表示された」ことです。どのクラウドサービスの、どの設定だったかは公表されていません。ここからは、一般にこの形の不備がどう起きるかの説明で、Snapmart の構成を推測するものではありません。

画像の置き場によく使われるオブジェクトストレージ(Amazon S3 や Google Cloud Storage など)は、ファイルやバケットごとに「誰が読めるか」を持ちます。アップロードのときに全員への読み取りを許す指定(S3 の ACL なら public-read)を付けると、そのファイルは URL を知っている人ならログインなしで取得できます。アプリの画面にログインが要っても、画像の URL がストレージを直接指していれば、アプリの認証は関係しません。

TWO SHAPESIDORとの違い

形は違っても、どちらもアクセス制御の不備(A01)

IDOR(BOLA)

ログイン済みの利用者がIDを差し替える

  • 他人のデータが見える
  • 所有者の確認が抜けている
  • 近いCWE: CWE-639

認証なしの直接参照

今回の発表の形

  • URLを知った人ならログインなしで見える
  • 既定の拒否が抜けている
  • 近いCWE: CWE-425・CWE-552
出典: OWASP Top 10:2025 A01 Broken Access Control。Snapmartの構成を示す図ではない

「IDOR 系」とまとめて呼ばれることもありますが、厳密には形が違います。IDOR は「ログインはしているが、他人のものを見られる」不具合で、今回の発表は「ログインしなくても見られる」状態です。OWASP Top 10:2025 はどちらも A01 Broken Access Control に入れ、公開するもの以外は既定で拒否することを最初の対策に挙げています。

  IDOR(BOLA) 認証なしの直接参照(今回の発表の形) 署名付き URL
誰が見られるか ログイン済みの利用者が、ID を差し替えて他人の分を URL を知った人なら、ログインなしで URL を持つ人なら、期限内だけ
欠けているもの オブジェクトごとの所有者の確認 認証そのもの(既定の拒否) 発行前の確認が抜けると IDOR と同じ
OWASP Top 10:2025 で近い CWE CWE-639 CWE-425・CWE-552 —
URL が推測されにくいと 推測は難しくなるが、漏れた ID で開く 推測は難しくなるが、漏れた URL で開く 期限が切れれば開かない

URL やファイル名が推測されにくいことは、認可の代わりになりません。URL はログ、共有、端末の履歴などから外に出ます。この論点は連載の UUIDv7か連番か|IDを推測されにくくしても認可漏れは防げない で、ID の差し替えを2つのアカウントで試す方法は IDOR(認可漏れ)の見つけ方 で扱いました。

発表で分かっていないこと

  • ・どのクラウドサービスの、どの設定だったか
  • ・画像の URL が推測できる形だったか。発表は「URL を推測して大量に取得された形跡は確認されていない」と書くが、URL の形には触れていない
  • ・対象の人数
  • ・ログの無い2019年3月〜2020年5月に取得があったか

Snapmart 本人確認書類を出したクリエイターがやること

・個別メールを確かめる:対象者には10月16日中にメールが送られました。配信を停止している、または登録アドレスが使えないと届かないことがあります。心当たりがあれば 専用の問い合わせフォーム へ
・なりすましの連絡に応じない:Snapmart は本人確認書類の再提出、口座やパスワードの問い合わせ、カード情報の入力を求めることは一切ないとしています。メールのリンクから入らず、アプリか公式サイトを自分で開いて確かめてください
・パスワード:別の環境で管理していて対象外のため、変更は不要としています
・マイナンバー:個人番号を隠さずにマイナンバーカードを提出した場合は、画像に個人番号が含まれた可能性があります。漏えいして不正に用いられるおそれがあると認められる場合、本人は市区町村に個人番号の変更を請求できます(番号法第7条第2項)
・心当たりのない契約や請求:現時点で不正利用などの被害は確認されていないとしていますが、不審な連絡や身に覚えのない契約・請求には注意してください

本人確認書類の画像には、氏名・住所・生年月日・顔写真がそろって写ります。取得の形跡は確認されていないと発表されていますが、ログの無い期間があるため、しばらくは身に覚えのない請求に気を配っておくと安心です。

開発者の対策:本人確認書類を既定で非公開の保存先に置く

発表では、不備はアプリから提出された画像の保存時に付いていました。一般に、Web とアプリでアップロードの経路が分かれていると、ファイルに付ける設定も別々のコードに散らばります。経路ごとに直すより、バケットの側で公開を受け付けないようにするほうが漏れにくくなります。

PRIVATE BY DEFAULT実測した応答

非公開の保存先は、期限内の署名付きURLだけを通す

非公開のバケット

  • 直接署名なしのURL 403URLを知った第三者
  • 署名期限内のURL 200認証情報を持たないクライアントでも
  • 改変書き換えたURL 403署名・ファイル名・期限のどれか
  • 期限期限切れのURL 403期限2秒・4秒後
出典: 当サイトの実測(2026-10-18・SeaweedFS 4.48のS3互換API・SigV4・boto3 1.43.114)
対策 何を防ぐか 確かめ方
バケット単位で公開を止める(S3 Block Public Access の4項目/GCS の公開アクセス防止) ファイルに付いた公開 ACL や公開ポリシーが効かない get-public-access-block
ACL を無効にする(S3 Object Ownership の BucketOwnerEnforced) ファイルごとの ACL で公開できなくなる get-bucket-ownership-controls
閲覧は短い期限の署名付き URL で出す URL が漏れても期限後は開かない 下の実測
審査が終わった画像を消す 見られる期間と量を減らす 削除処理とライフサイクルの設定
ファイル単位のアクセスログを残す 取得されたかを後から確かめられる 次の節の「影響範囲」

AWS の文書では、BlockPublicAcls は公開 ACL を付ける PUT を失敗させ、IgnorePublicAcls は付いている公開 ACL を無視します。ACL を無効にしたバケットは、ACL を指定しない PUT か bucket-owner-full-control だけを受け付け、それ以外の ACL を付けた PUT は AccessControlListNotSupported で失敗します。今の文書では新しいバケットは ACL 無効が既定ですが、何年も前に作ったバケットは作成時の設定のままのことがあります。切り替えると、public-read を付けているコードはアップロード自体が失敗するので、先にコードを探してから変えます。

署名付き URL は期限を区切った合鍵です。S3 互換のストレージ(SeaweedFS 4.48、SigV4、boto3 1.43.114)で確かめた結果は次のとおりです。

試したこと 応答
非公開のファイルに署名なしで GET 403
期限60秒の署名付き URL を、認証情報を持たない HTTP クライアントで GET 200
署名の1文字を書き換え 403
URL の中のファイル名を別の既存ファイルに差し替え 403
期限の値(X-Amz-Expires)を 60 から 604800 に書き換え 403
期限2秒の URL を4秒後に GET 403

期限内は URL を持っていれば誰でも開けます。AWS の文書によれば、CLI と SDK で作る URL の期限は最長7日で、一時的な認証情報で作った URL はその認証情報の失効とともに使えなくなります。表示のたびに短い期限で発行し、発行する前に「この人にこの画像を見せてよいか」をアプリ側で確かめます。ここが抜けると、署名付き URL でも IDOR になります。

自分の保存先を確かめる:公開設定・ACL・コードの3か所

冒頭のコマンドはバケット単位の設定を見ます。S3 の動作を模した moto 5.2.4 と AWS CLI 1.46.1 で、公開ポリシーを付けたバケット(陽性)と、4項目を有効にしたバケット(陰性)を作って実行しました。

コマンド 陽性のバケット 陰性のバケット 未設定のとき
get-public-access-block (未設定) 4項目とも true NoSuchPublicAccessBlockConfiguration
get-bucket-policy-status "IsPublic": true "IsPublic": false NoSuchBucketPolicy
get-bucket-ownership-controls (未設定) BucketOwnerEnforced OwnershipControlsNotFoundError

次は本人確認書類を置くプレフィックスの下で、全員(AllUsers)か AWS の全認証ユーザー(AuthenticatedUsers)に権限を与えているファイルを1件ずつ探します。

BUCKET="example-kyc-uploads"   # 自分のバケット名に置き換える
PREFIX="uploads/"              # 本人確認書類を置くプレフィックスに置き換える
aws s3api list-objects-v2 --bucket "$BUCKET" --prefix "$PREFIX" --query 'Contents[].Key' --output text \
  | tr '\t' '\n' | grep -v '^None$' | while read -r KEY; do
  aws s3api get-object-acl --bucket "$BUCKET" --key "$KEY" \
    --query 'Grants[].[Grantee.URI, Permission]' --output text \
    | grep -E 'global/(AllUsers|AuthenticatedUsers)' | sed "s|^|PUBLIC $KEY |"
done

public-read で置いたファイルと非公開のファイルを混ぜたバケットでは PUBLIC uploads/app/a.jpg http://acs.amazonaws.com/groups/global/AllUsers READ の1行が出て、非公開だけのバケットと、ファイルの無いプレフィックスでは何も出ませんでした。ファイルの数だけ API を呼ぶので、まずはプレフィックスを絞ってください。

最後に、アップロード時に公開の指定を付けるコードを、リモートの既定ブランチから探します。

git fetch --all --prune
BRANCH="origin/main"   # 既定ブランチに置き換える
git grep -nIiE 'public[-_]?read|makePublic|allUsers|allAuthenticatedUsers' "$BRANCH" --

TypeScript(ACL: "public-read")・Python・Java(CannedAccessControlList.PublicRead)・GCS の predefinedAcl: 'publicRead' と makePublic()・Terraform の allUsers を置いた検体のリポジトリでは5ファイル6行を拾い、署名付き URL だけを使うリポジトリでは0件(終了コード1)でした。

この確認で言えること・言えないこと

  • ・3つとも見ているのは構成で、漏えいの有無の判定ではない。陰性でも安全とは言えない。CDN などの配信経路、画像を返すアプリの API の認可、アカウント単位の設定、手で変えた設定はここでは見ていない
  • ・陽性でも公開されているとは限らない。AWS の文書では、IgnorePublicAcls が有効なら ACL の取得は実際に効いている権限を返す(moto はこの動きを再現しなかったため未検証)
  • ・git grep は文字列の一致だけを見る。変数で組み立てた ACL や、別のリポジトリにあるアプリのコードは拾わない

影響範囲と、ログが無い期間の意味

対象は本人確認書類を提出した一部のクリエイターです。人数は発表にありません。画像は提出から約1年で自動削除されていたので、見られる状態だったのは各人の提出後およそ1年間で、今回の改修の時点で残っていた画像は削除または非公開になりました。

Snapmart は2020年5月以降のログを精査し、取得の形跡は現時点で確認されていないとしています。一方、2019年3月〜2020年5月の約1年はログが無く、確かめられていません。

開発する側にとっての教訓は、公開されたファイルへの取得が既定では記録に残らないことがある点です。S3 では、CloudTrail は既定でバケット単位の操作だけを記録し、ファイルへのリクエストはデータイベントを有効にしないと残りません(料金がかかります)。サーバーアクセスログはベストエフォートの配信です。Google Cloud の文書は、公開されたオブジェクトへのアクセスは Cloud Audit Logs で追えないとしています。個人情報を置く保存先は、ファイル単位のログを取るかどうかと、何年残すかを先に決めておきます。クラウドの鍵の側から守る手順は アクセスキー漏洩を防ぐ にまとめています。

続報では、対象の人数、ログ精査の結果、再発防止策(画像の保存・管理方式の改修、審査完了後の速やかな削除、クラウド環境の設定の定期点検)の進み具合を見ておくと、対応を見直しやすくなります。続報が出たら本記事も更新します。

参照ソース