Moai+Easter 上級マニュアル
Moai
Manual
Advanced Manual
Annoucement
FAQ
ご案内
Moaiエンジン
CustomBoyエンジン
HowToコンパイル
Moai CGI Developers
Overview and Tutorial
Cookie Hints
PostVars Hints
Fingerprint Hints
Snippet Hints
Futaba Note
はじめに
この記事は高速ヤキソバ変換氏によるふたばちゃんねる入門講座です.
またMoaiが生まれたきっかけについてなど、歴史的なお話もあります.
目次
Chapter1 : Moai+Easter、そしてVirtualUSERS、歴史と展望
はじめに少し歴史を説明致しましょう.
Moaiシステムが生まれた経緯など….
あと、ふたばちゃんねるという匿名掲示板についてもお話します.
私は元々人工知能の研究のために匿名掲示板を始めたのですが、これは自動で会話するシステムを試す場としてなかなかに良い試験場であると思います.
またユーザー識別のためのアルゴリズムにも興味があり、掲示板における規制のメカニズムはその良い応用例かと思います.
特にふたばちゃんねるに関して、私は昔その仕様を詳細に分析していた時期があります.
なぜふたばちゃんねるかと言うと、このサイトでは規制のために割と凝った仕掛けをしており、また当時、その仕様は割と急ピッチで進化しつつありました.
一体どのように進化するのか見てみたいと感じたのがきっかけです.
しかしながら自然界で生物が進化するためには、厳しい環境要因に晒されることが不可欠であるように、掲示板規制の進化もまた、その掲示板にとっての厳しい環境要因が不可欠となります.
そこで私はこの進化を促す強力な環境要因を生み出すべく一つのツールを作成しました.
当時、私はそのツールをUSERS( User-agent Screen-size and Everything Randomize System ) と呼んでいました.
当時のふたばちゃんねるは、User-Agentとモニタの解像度、そしてフラッシュのバージョンやフラッシュクッキーなどの値でユーザを識別し規制を行っていたと記憶していますが、この名前はそれに由来し、それらをランダムに刷新するためのツールでした.
USERSは元々はC++で書かれており、Windowsのみで動作するネイティヴアプリケーションでした.
ふたばちゃんねるはどう進化するのでしょう?
USERSにより、予想通りこの掲示板の規制システムは複雑な進化を遂げました.
特にFingerprintの導入は興味あるものでしたが、まだまだ進化の余地はあると私は感じていました.
ところが残念なことに、その進化は途中停滞してしまったのです.
そしてこれ以上の更なる進化を促すには、私一人の力では限界があると感じていました.
そこで次のステップとして、私はこのツールを一般公開できないかという考えに思い至りました.
今度は私一人ではなく、複数のユーザがUSERSを使います.
匿名掲示板の規制システムにとって見れば、これまでよりもはるかに厳しい環境要因に晒されることになります.
ふたばちゃんねるはこの先どう進化するのか、その続きを見ることができるのでしょうか?
USERSは元々私が個人的に使っていたものです.
これを一般公開までするとなるとその開発プロジェクトの立ち上げはちょっと私一人では手に余るので、二人のプログラマ(うち一人は私と同じくふたばちゃんねるのユーザでもあります)に協力をお願いしました.
幸いにもお二人はこの話に興味をもってくれました.
一人は知る人ぞ知る凄腕の持ち主で、他にもプロジェクトを持ってお忙しい中、なんと片手間にローカルプロキシのエンジンまで作ってくれました.
なるほど、ローカルプロキシという発想はありませんでした.
確かにこれならばUSERSにあった環境依存の(特にGUI部分の)コードが排除でき、マルチプラットフォームでUSERSを動作させることができます.
これこそがこの記事をご覧の皆様ならもうご存知のMoaiエンジンです.
またもう一人はライブラリの作成管理やコードの自動生成に精通した方で、彼にはUSERS全体を移植性のあるコードで書き直していただきました.
彼はまた、掲示板を閲覧するために最近Moaiシステムに導入されたビューアEasterの作者でもあります.
これによりMoaiの利用が大幅に簡単になりました.
私はと言うと最近では、CustomBoyという仮想化のためのエンジンの開発を担当させていただいた程度です.
最後にこれをどこで公開するかですが色々検討した結果、ソースコードリポジトリはgithubに置き、旧2ch(現5ch)の某スレ、そしてここでは明かせませんが某コミュニティ、この3つで宣伝するのが最適ではないかという結論に至りました.
かくして USERS は VirtualUSERS と名前をリニューアルし、Moaiベースのシステムで世に公開されることとなります.
Moaiもまた進化を続け、システム全体として当初と比べ随分と使いやすくなったものだと感じています.
Moaiと匿名掲示板、一体どこまで進化するのでしょうか?
USERSの生みの親としては、これからもこれらの更なる進化が楽しみでなりません.
目次に戻る
Chapter2 : VirtualUSERSが仮想化する情報とは?
このチャプターではVirtualUSERSが仮想化する情報について詳しく述べましょう.
その情報とは具体的に一体どういうものなのか?
それらはどのようにして掲示板へと送信されるのか?
そして掲示板はその情報を使ってどうやってあなた個人を識別しようと試みているのか?
ここではふたばちゃんねるを例にとり、閲覧時およびレス投稿時に送信されるあなたのマシン情報の全てを余すことなくお話しましょう.
まず皆様もよくご存知の IP アドレスです.
これはある瞬間だけを見れば、すべてのユーザにユニークに割り当てられたネットワーク上の識別情報とみなすことができます.
しかしながらある程度長いスパンで見れば、この情報は容易に変動してしまうため識別情報としての価値を失います.
例えばPCならばルータリセット、スマホならば機内モードにするなどすれば、IP アドレスは瞬時に変更可能です.
その変更の可能な範囲は ISP(インターネットサービスプロバイダ)毎に一定のカテゴリを持つものの、これ単独ではユーザをピンポイントに特定することは難しいのです.
その他、外部プロキシ、VPNを用いるなどして真のIPを覆い隠すこともできます.
そこで掲示板サイドからすれば、IP アドレスに加えあなたのマシン固有の情報をもできるだけ集め、それらを総合的に加味してあなた個人を識別しようと試みる戦略をとることになるのでしょう.
ふたばちゃんねるは、そのような試みを他の同類の掲示板に先駆け先進的に行っていました.
(おそらく IP アドレス規制による巻き添え規制を懸念してのことでしょう).
これは簡単に言えば、あなたの使っているブラウザの識別名です.
FirefoxだとかChromeだとか色々あると思いますが、それらアプリケーションが自由に名乗っている「自称」のようなものです.
ではこれが実際にどのように送信されるかを説明致します.
以下の図をご覧下さい.
⇒
⇒
これは一般に送信先サイトへ実際に何が送信されるかを示した模式図です.
あなたのマシン固有の様々な情報は、上にある3つ(HTTPヘッダ、POST変数、クッキー)の入れ物のうちの一つにパックされて送信されます.
(厳密に言えばクッキーも最終的にHTTPヘッダの範疇になりますが、この記事では別枠としてあります)
User-AgentについてはHTTPヘッダにパックされて送信されます.
その送信処理は(特にJavascriptなどを介す必要もなく)ブラウザによってデフォルトで行われます.
この値は掲示板に初アクセスした時間(およびそれに類した値)と一般化することができましょう.
ふたばちゃんねるの場合、futaba.php に初めてアクセス(例えばカタログなどもfutaba.phpですね)するか、または初めてレス投稿した際に設定されるようです.
あるいはふたばちゃんねるのHTMLソースをご覧頂くとわかりますが /bin/cachemt7.php にアクセスしたときにそれに類した値が生成される形となっています.
この値は、CookieおよびブラウザキャッシュおよびlocalStorage などに保存されてしまいますから、逆に言えばこれら全てを消去しない限りその値が残り続け、その残り香を掲示板サイドから検出できてしまいます.
ではこれが実際にどのように送信されるかを説明致します.
以下の図をご覧下さい.
⇒
⇒
ふたばちゃんねるでは、POST変数 pthb, pthc, (pthd) とCookieのposttime値としてパックされ送信されます.
これらの値は localStorageへ保存されたり、逆にlocalStorageから取り出されたりもします.
この処理は /bin/base4ajax.js というJavascriptの実行によって行われます.
これは簡単に言えば、あなたの使っているモニタの解像度と色深度の情報です.
Javascriptにこれを取得するAPIがあり、これを利用して容易に取得できます.
ではこれが実際にどのように送信されるかを説明致します.
以下の図をご覧下さい.
⇒
⇒
ふたばちゃんねるでは、POST変数 scsz にパックして送信されます.
この処理は /bin/base4ajax.js というJavascriptの実行によって行われます.
この値はあなたのマシン環境の様々な情報を集めてつなぎ合わせ一つの巨大な文字列とし、それを元に32bit整数のハッシュ値を計算したものです.
ハッシュ値が何のことかわからない方は、次のように考えましょう.
例えばあなたのマシンの特徴を示す情報が3つあったとしてそれをそれぞれ仮に数字の 2, 4, 7 とします.
これらを足し算して合計すると 2 + 4 + 7 = 13 となりますが、この 13 がハッシュ値に相当します.
非常に大雑把ですが、とりあえずここではそのようなイメージで十分でしょう.
ここでのポイントは 13 から元の値 2, 4, 7 を一意には復元できないということです.
よってこの値は実のところデタラメに設定しても一般にその妥当性を検証する術はないといえます.
このハッシュ値の計算については /bin/fp.js というJavascriptの実行によって行われます.
ではこれが実際にどのように送信されるかを説明致します.
以下の図をご覧下さい.
⇒
⇒
ふたばちゃんねるでは、POST変数 flrv, flvv にパックして送信されていましたが、現在この変数は廃止された模様です.
この値はあなたのブラウザ上で、いくつかのJavascriptのテストコード(Snippetと呼びます)を実行させた結果です.
このSnippetによるテストの結果はブラウザの種類やバージョン毎に異なる値をとります.
この値がブラウザを特定するための情報であるというならば、こんな値よりも User-Agent で判断すればよいのではと思われるかもしれません.
しかしながら最近ではブラウザのアドオンを使うことによってUser-Agentを偽装することが簡単にできるようになりました.
それどころかブラウザ標準の機能としてUser-Agentを偽装できるものすらあります.
よって、単にUser-Agentの文字列では、ユーザが本当はどのブラウザのどのバージョンを使っているのかを特定する情報としては、いささか信憑性に欠けるというわけです.
そこでブラウザ識別のために掲示板がとる戦略としては、ユーザが投稿する際にまずこのSnippetを実行させ、次にそのテスト結果も掲示板へと一緒に送信されるようにしておきます.
掲示板側からは送信されたこの値を分析することで、ユーザが本当はどのブラウザのどのバージョンにおいて実行されたのかを(ある程度)特定するわけです.
Fingerprintとの違いは可逆性にあります.
つまりハッシュ値とは違い、この値は元の値を一意に復元できるような形式のものが使われます.
ではこれが実際にどのように送信されるかを説明致します.
以下の図をご覧下さい.
⇒
⇒
ふたばちゃんねるでは、POST変数 ptua にパックして送信されます.
この処理は /bin/base4ajax.js というJavascriptの実行によって行われます.
いかがでしょうか?
要するに上記の情報のいずれも(IPアドレスを除けば)最終的にはHTTPヘッダ、POST変数、そしてCookieの値のいずれかにパックされて送信されるということです.
また途中これら3つの要素で仲介されるということです.
そしてこの送信の流れを逆にして掲示板サイドの視点に立つと、重要なことが見えてきます.
それは、掲示板サイドからはHTTPヘッダ、POST変数、Cookieの値、この3つの手段をもってしかあなたを認識できないということです(IPを除いてですが).
これは仮想環境を実現する上では非常に重要な要件です.
もしあなたがこれら3つを直接修正する術を持つなら、仮想ブラウザ環境をソフトウェア的に自由に実現可能であることを意味します.
このとき、ブラウザやモニタの解像度などのマシン環境を実際に変更する必要は一切ありません.
では具体的にどうやってその3つを修正すればよいのでしょうか?
それをやってくれるツールがMoaiのVirtualUSERSなわけで、通常は「Moaiを使ってください」で話は終わるところですが、次のチャプターでは敢えてそれを使わず手動でこれを実現する方法を示しましょう.
このような処理を自分でプログラミングして実現したいという方にも、この知識は役に立つことでしょう.
目次に戻る
Chapter3 : 手動で仮想ブラウザ環境を実現する方法
例によってふたばちゃんねるを例に挙げますが、ここで紹介するテクニックは他の掲示板でも使えるかと思います.
- ブラウザで開いている掲示板関係のタブを一旦閉じる.
これによりうっかりPOST変数などがブラウザに残留してしまう可能性を排除します.
キャッシュを消してもこれが消えずに残る場合もあるため一旦閉じた方が確実でしょう.
- IP アドレスの変更
ルータリセット、機内モードなどによりIPアドレスを変更します.
- ブラウザのクッキー、キャッシュ、localStorageを消去.
localStorageの消去についてはブラウザ毎に異なりますが、Firefoxの場合「オフラインWebページとユーザデータ」とある部分で「今すぐ消去」ボタンを押すことで実現できます.
その他のブラウザについては大抵の場合キャッシュを消去すればlocalStorageの内容も消えると思います.
- User-Agentの値を変更する.
ツールの力を借りずに手動で変更するのは意外と難しいです.
勿論、使うブラウザを変更することでこの値も変わりますが、最近のブラウザでは設定画面によりこの値を変更できるものもあります.
あるいは使ってるブラウザにUser-Agent偽装アドオンなどが存在するならそれを入れて別の値に設定します.
- 新しいタブを開いた上で1で閉じた掲示板関係のページなどに再度アクセスする.
逆に言えばこの段階になるまでは、まだ掲示板関係のページを開かない方がよいでしょう.
- モニタの解像度や色深度の情報を変更する.
勿論、モニタのプロパティより解像度と色深度を変えればこの値も変わりますが限度がありますし、こんなことまで実際にはやってられません.
以下にある「POST変数を手動で修正する方法」によって、POST変数を直接変更しましょう.
ふたばちゃんねるの場合、POST変数scszを変更します.
- Fingerprintの値を変更する.
注:現在のふたばちゃんねるではこれは廃止されたようですが、一応ここでの説明は残しておきます.
以下にある「POST変数を手動で修正する方法」によって、POST変数を直接変更しましょう.
ふたばちゃんねるの場合、POST変数 flrv と flrv を変更します.
値は32bit整数なら何でもよいですが、ただしflrvとflvvとは異なる整数値にしておきます.
flrv や flvv の値がブラウザのどのような要素に依存しているかについては/bin/fp.jsを参照して頂くのが確実です.
またこれらの全要素のリファレンスを
こちらに作成しておきましたので参考にしてください.
flrv は以前まではUser-AgentやブラウザのPlugin構成を変更すればその値も変わっていましたが、今現在はそれらを変更してもその値は変わらなくなりました.
flvv はUser-Agentを変更してもその値は変わりませんが、ブラウザのPlugin構成を変更すればその値は変わります.
- Snippetのテスト値を変更する.
以下にある「POST変数を手動で修正する方法」によって、POST変数を直接変更しましょう.
ふたばちゃんねるの場合、POST変数 ptua を変更します.
この値は33bit整数というちょっと変な値となっています.
ふたばちゃんねるでは33個のSnippet(Javascriptのテストコード)が用意されており、それらは 0 か 1 を返します(ブラウザの種類によって結果は変わります).
これらすべてを実行させ、第1番目のSnippetの実行結果を 1bit目 に、第2番目のSnippetの実行結果を 2bit目 に、…第33番目のSnippetの実行結果を 33bit目 に置くことによって、この33bit整数を作ります.
これら33個のSnippetの意味については、それらのリファレンスをこちらに作成しておきましたので参考にしてください.
CustomBoyのアルゴリズムは、User-Agentの文字列とこの値が矛盾なきよう取り計らいつつ値を刷新します.
ちょっと難しいでしょうか?
よくわからなければ、このptuaの値はランダムにしてもとりあえずはよいと思います.
- jsの値をonに変更する.
このPOST変数はふたばちゃんねる独自のものです.
以下にある「POST変数を手動で修正する方法」によって、POST変数を直接変更しましょう(値は on にします).
このPOST変数値はJavaScriptを実行したかどうかを判断するためのものであり、通常は /bin/base4ajax.js を実行すると on に設定される仕組みとなっています.
これを on にしておかないと「環境変数がありません(JavaScriptがオフ?)」というエラーが表示され、投稿に失敗します.
- レス投稿またはスレ立て.
ふたばちゃんねるにおいて「Cookieを有効にしてください」と出る場合は、もう一度投稿しましょう.
本当にCookieを無効にしていない限りは、2回目はうまくいくはずです.
- まずスレのHTMLを保存します.
- 次に保存したスレのHTMLをテキストエディタ(メモ帳など)で開き、その中身を直接書き換えて修正します.
以下のように書かれた部分があるはずです.
<script type="text/javascript" src="/bin/base4ajax.js?w"></script>
このbase4ajax.jsが邪悪の元凶と言えます. これがあなたのマシンを識別するための数々の変数の値を設定してます.
そしてこのままでは base4ajax.js を実行してしまいますので、これが実行されないようこの部分を削除します.
- 後は <input type=hidden…> などと書かれている部分を好き放題変えればよいです.
例えばptuaならば、
<input type=hidden id="ptua" name="ptua" value="">
などと書かれてある部分を
<input type=hidden id="ptua" name="ptua" value="77777777">
とすれば晴れてptuaの値を77777777に偽装できます.
後は修正したHTMLをダブルクリックして、表示される投稿フォームから投稿すれば上において偽装された値が送信されることでしょう.
目次に戻る
This article was written by: