Home JavaScript Greasemonkey PHP

Twitter ダイレクトメッセージ誤配送の原因を推測してみた2009-04-25


Twitterの最新のバグ: "ダイレクトメッセージの誤配達"」という記事があって、Twitter のダイレクトメッセージ (DM) に超重要な情報を流すような人は、セキュリティ意識が足りてないよね~、なんて事を思っていた矢先、自分のアカウントにどうも「誤フォロー」では無いかと思われるお知らせメールが届きました。

フォローしてきたのは外人さんなんですが、TL みても普通の人だし、フレンズ数も普通。その後何度か見てもフレンズがばんばん増えているわけでもなく、ボットやスパムのたぐいではなさそう。
じゃあ、本当に興味を持ってフォローしてくれたのかというと、そんな要素は欠片も感じません。

唯一特徴的な点があるとすれば、たかだか 1 時間前の発言がその人の最初の発言で、「twitter twitter twitter! I finally joined :d」となっている事でした。どうも、すごい最近 Twitter を始めた人のようです。
そこで、このフォローが誤フォローだったとすると、DM の誤配信と同じ原因ではないかと気づきました。その原因を推測してみます。

Twitter のアカウントを特定する ID として公開されているものに数字の ID と文字列の ID があります。
文字列の ID も全体で唯一のものなので、API の呼び出し時に指定したりもできるのですが、元々本来のプライマリーキーは数字の方であると思われます。
そしてその数字が 32bit で管理されていた場合に、その数値を使い切ってしまったのでは無いでしょうか?*1

Twitter の利用者数はまだまだ 1 億にも届かないですし、32bit あれば約 43 億まで扱えるので不思議に思うかも知れませんが、実際に利用されているアカウントだけではなく、ボットやスパマによって日々作られ、消されているアカウントがそれこそ膨大な数存在するはずです。

プライマリキーを使い切ってしまうと何が起こるかというと、またゼロに戻ってカウントし直しとかになり、プライマリーキーの重複が発生してしまいます。
根本的にはこれが DM 誤配送や、誤フォローの原因になったのではないかと思われます。

もちろん、Twtiter 側もただ手をこまねいていたわけではないでしょうから、DB やカラムを追加するなり、文字列 ID を活用するなりして、対処したのだと思いますが、修正に漏れがあってプライマリーキーだけで判断する古い処理が残ってしまい、それが原因になったというわけです。

さらに言うのであれば、プログラミング的なミスではないと思います。
さすがにそれは相当頑張ってテストをしてからリリースしているはずなので、むしろ本番サーバへのリリース時にミスがあったのではないでしょうか?

Twitter を運用しているサーバが全部で何台あるのかは知りませんが、相当な台数のサーバで平行してプログラムが稼働していると思われます。
前述の修正プログラムを適用する時に、適用が漏れてしまったサーバ、適用に失敗した事に気づいていなかったサーバが存在したとすると、"一部に" 誤配送があった事にも説明がつくのです。

最初の誤フォローの話に戻ってみると、そのアカウントはかなり新しいものでした。
すなわち上記の推測が正しいとすると、最近友達何人かで Twitter を始める事になってお互いをフォローしあったんだけれども、最近の新しいアカウントはプライマリーキーが一周した後のアカウントだったため、同一のプライマリーキーを持った別アカウントをフォローしてしまった、というストーリーが考えられるわけです。

本当の原因は全然違うかも知れませんが、Twitter 側が「問題の原因は“弊社のサービスにおける基本的データの不整合性”にある」と言っている事からも、上記の推測もあながち外れていないように思うのです。

もし上記の推測が当たっていて、誤フォローが本当に発生したとすると、Twitter の発表とは裏腹に、まだ不具合が残っているかも知れません。
そもそも、公開を前提とした Twitter と、例えば Gmail のような非公開を前提としたサービスでは、設計思想からして異なっていて当然です。
今回の件に限らず、Twitter の DM が漏れる可能性は常にあると考えるべきです。
Twitter の DM 機能はあくまでオマケ機能として捉え、本当に重要な情報を Twitter でやり取りするのは控えた方が良いですね。

*1

実際の数値を見るとまだせいぜい 3000 万台がいいところなので、全然関係ないように見えるかも知れません。ですが、真のプライマリーキーは表に見せないのが普通なので、表に見ている数字の ID 自体、真のプライマリーキーから、アカウント作成時にエラーで弾かれたレコードを除いた総数なのだろうと考えています。
その場合であっても、真のプライマリキー自体はエラーで弾かれるたびに 1 つずつインクリメントされると思われるので、同様の論法が成り立ちます。

カテゴリ: Technology タグ: twitter