前回の記事に訂正を行う。そしてこれによって、mixi内の非公開日記内画像を「その画像が確かにそのユーザーのアップした画像である」という証拠と共に外部に晒す方法が存在することが分かったので、警告しておく。
まず、おさらいすると、mixi日記内の画像本体アドレスは、閲覧にmixiログイン情報を要求しない。画像本体は外部参照可能なのだ。ただ、アドレスが時間と共に変わる仕組みなので、現実的なレベルでは外部参照できない(すぐに見れなくなる)。また、画像本体のアドレスにはユーザーIDが含まれていないため、外部掲示板に貼り付けた画像が誰の日記内の画像なのかは分からない。・・・と、ここまでが前回記事で書いた件。前回の記事を読んでない方は先にお願いします。
個人的に「mixi画像外部参照問題は部分的に解決された」と判断したのは、「画像を晒されても『それは俺の画像ではない』という言い逃れが可能」だと判断したからだった。もう一度書くが、そもそもにおいて、ウェブにアップした画像は誰かがダウンロードしてアップローダーなどに晒せば晒される。mixi非公開日記が「セキュア」である(べき)ポイントとは「顔&免許証入りハメ撮りを公開しても晒されることがあり得ない」ではない。それは個人対個人とかの問題であって、ウェブサービスに求めるべきセキュリティではない(電子メールで送った画像だって、裏切られれば、不特定多数相手に晒される、だろ?)。非公開日記内の写真を誰かがダウンロードして別の場所に晒したとしても
- その画像が真にmixi日記内で公開されていた保証が無い
- その画像が真に「その人」が(非公開日記内で)公開していた画像である保証が無い
この二つこそが、mixiが「守るべき」ポイントであった。即ち、顔や免許証が入っていないハメ撮り写真を外部に晒されても「え、それ俺じゃないですけど?どこのアダルトサイトから拾ったんすかw」と言い逃れられることが、「mixiというウェブサービス」が守るべきポイントだった。「アップローダーなどに晒された匿名の画像」と「その画像を(非公開)日記に載せた人のmixiID」は、繋がってはならない。
しかし、mixiの特定画像が特定個人IDの日記内に掲載されている/いたことを保証する方法は存在する。
画像本体URLと日記IDの結びつけ
画像本体のURLは
(画像ごとに固定された画像用サーバー).mixi.jp/p/(画像ごとに固定されていないランダムな文字列)/(時間と共に増えていく数字)/diary/(画像ごとに固定された数字)/(画像ごとに固定された数字)/(日記ID)_(画像を特定する数字).jpg
であり、内部に日記IDを含んでいる。故に画像本体のURL(をウェブ魚拓などでキャッシュ保存したURL)は「その画像がどの日記に含まれていたか」を示す。だが、ユーザーIDを含んでおらず、「その画像が誰の日記内に含まれていたか」を示さない。
日記IDとユーザーIDの結びつけ
個別日記ページのURL
mixi.jp/view_diary.pl?id=(日記ID)&owner_id=(ユーザーID)
にはユーザーIDが含まれている。「日記ID」は全ユーザーに関してユニークで、例えば
- id=1&&owner_id=1
- id=1&&owner_id=2
の両方が存在することはあり得ない。「id=1」は「全ユーザー内でID=1の日記」だ。この対応がおかしい場合、例えば日記ID=1はユーザーID=1の日記であるのに「id=1&owner_id=2」がリクエストされた場合は「この日記にアクセスできません」というエラーが表示される。問題は、これが、非公開日記相手であっても変わらない点。対応が正しく、自分がアクセスする権限がない非公開日記にアクセスしようとした場合は「友人までの公開のため見ることができません」であり、「view_diary.pl」にアクセスした場合の表示をまとめると
- 日記IDとユーザーIDの対応が正しく、自分が閲覧権限を持っている
エラーメッセージが表示されず日記が表示される(当たり前ですが)
- 日記IDとユーザーIDの対応が正しく、自分が閲覧権限を持っていない
「友人までの公開のため見ることができません」(※1)
- 日記IDとユーザーIDの対応が間違っていて、ユーザーIDに対する閲覧権限はある
「この日記にアクセスできません」(※2)
- 日記IDとユーザーIDの対応が間違っていて、ユーザーIDに対する閲覧権限もない
「この日記にアクセスできません」(※3)
しかも、(※1)(※2)(※3)は、既に削除された日記であっても変わらない。
まとめよう。非公開日記内の画像を、その画像がたしかに当該ユーザーの非公開日記内画像だという証拠ととも外部に晒す方法は以下。
- 晒したい相手の「/list_diary.pl」にアクセス(ここらへんで言及されてる通り足跡は残らない)
- サムネイル画像をクリックして「/show_diary_picture.pl」にアクセスし(その時点での)画像本体アドレスを右クリック「プロパティ」から取得
- 取得した画像本体アドレスをウェブ魚拓などによってキャッシュ化
- さらに、その画像が含まれる日記の個別日記ページアドレスを(「/list_diary.pl」上での右クリック「プロパティ」で)取得
- キャッシュ化した画像本体のアドレス・個別日記ページのアドレスを併せて匿名掲示板などに晒す
以後、「晒し」を見た掲示板内の匿名mixiユーザーが「その画像がたしかに当該ユーザーが非公開日記内で公開していた物だ」と確認する方法は以下。
- キャッシュ化された画像本体(ウェブ魚拓などmixi外サーバーにあるので当然ながらアクセスしても足跡は残らない)のURL内に含まれる日記IDで「その画像が含まれていた日記ID」を確認する
- かつ、mixiにログインした状態で、晒されている個別日記ページにアクセスし、「友人までの公開のため見ることができません」というエラーメッセージを見る(「この日記にアクセスできません」ではないことを確認する)ことで、その日記がたしかに当該ユーザーものであることを確認する(このエラーメッセージ参照は足跡を残さない)
これにより、非公開日記内の画像は外部に証拠を持って晒される。しかも、日記を削除しても無駄だ。
- 画像はウェブ魚拓など外部サーバー上にキャッシュ化されているので残る
- 日記を削除しても「view_diary.pl」へのアクセス時には「友人までの公開のため見ることができません」と表示されるので、その日記が当該ユーザーの物であることが分かる
と、いうことで、当該日記を削除しても、画像は、その画像がたしかに当該ユーザーの非公開日記にあった物だという証拠と共に晒され続ける。
まぁ、エラーメッセージに余分な情報を込めるとクラックの糸口にされるよ、という良い例なんじゃないでしょうか。非公開日記を使っているmixiユーザーの方は注意してください。さすがにこの仕様(特に日記を削除してもエラーメッセージが「友人までの公開のため見ることができません」である点)は酷すぎるので、早期に改善されるとは思うんだけど・・・。
なお、特にこれ系の話に不慣れな人には細かくややこしい&読みにくい記事になってる気がするんですが、んー、ひょっとしたら画像とか使った分かりやすい解説を作るかもしれませんが期待しないでください(誰か作ってくれないかなぁとも思いつつ)。