トラフィック解析

最近、本当にファイル共有アプリケーションを利用した情報漏洩型ウイルスが酷いので、改めて分かりやすく書いておきますね。
Winnyは大規模なトラフィック解析には勝てません。
ネットエージェントさんなどがやっているように、あるファイルを誰が最初にWinnyで公開したかを追うことは、今では十分に実現可能です。キャッシュによる匿名効果は、あくまで「過去は分からない」というだけであり、多数の地点で継続的に記録を続けている強力な監視者がいるような場合には著しく効果が薄れます。所詮は、「目をつけられなければ勝ち」という程度だと思ってください。

また、おそらく内閣官房情報セキュリティセンター(NISC)も同様の調査を行っていることでしょう。おそらくはより大規模に。

ばれないだろうと思って軽い気持ちでウイルスを改変・配布するのは絶対に辞めてください。

補足

多数の地点からWinnyの検索ネットワークを定常的に観測し、統計的に処理することで、このような解析ができます。

  • ある時点で「あるファイル(ハッシュ値)」のキャッシュを持っているノードの数は、確率的に推測できる
  • それを保存し、時系列で並べることで、一次公開者を絞りこむことができる

地点を増やしていくことで絞り込みの確度を高めることができます。

電子投票等にも使われる匿名通信路の研究において、このようなトラフィック解析に関する議論は多くなされているわけですが、Winnyの提供する匿名性(情報公開者の特定性)はこのような位置づけというわけです。

追記 (2006-03-13)

そうそう、これを張るべきでしたね。

トラフィック解析を回避するための「運用策」が存在することも確かですが、ノードの細かい挙動に基づくトラフィック解析は相当に強力です、と念を押しておくに止めておきます。

Winnyの技術 isbn:4756145485

|  |
|  | ∧∧  とりあえず、Fingerprint 置いておきますね。
|_|(´・ω・`)
|桃|o   ヾ
| ̄|―u'   16B6 7953 A7C1 2DCA 9DEF C7D1 2546 1CCE C03F 2BA3
""""""""""""""""

Public Key Server -- Index ``0xC03F2BA3 ''

予想通り、PGP公開鍵のFingerprintでしたね。

第02回 テキストメッセージに注目する

さて、今回からソースコードの中身を見ていくことにします。

今回使っているのは、配布されているWinny2のバイナリから逆に生成したソースコードですので、作者47氏の意図が見えづらくなってしまっています。そこで、逆生成によっても変化する余地のないメッセージ部分から探してみようと思います。

眺めるファイル

前回ファイル一覧から分かる範囲で切り分けてみました。とにかく、Winny の動作を知ることが先決と言うことで、最もファイルサイズの大きかった CMainControl.cpp を眺めることにします。

ざっとソースコードを広く眺めてみると、普通に日本語で書かれている部分が目立っているので探すのはそう大変ではなさそうです。問題は、11248行という大きさだけです。

メッセージ部分

さて、日本語で書かれたメッセージをいくつか見てみると、こういう事が分かります。

  • メッセージが書かれた行やその直後に ny_addlog が呼ばれている。

そこから、メッセージ内容と合わせて考えれば、Winny2 の動作ログ出力のために呼ばれる関数が ny_addlog であると言うことが分かります。このメッセージには当然 Winny の動作内容が書かれているわけです。「ny_addlog」を検索することで、Winnyの動作を追うことがとても楽になりそうです。

広く眺めてみる

さて、この ny_addlog とそこに書かれたメッセージを探すと、いくつかの関数の用途が推測できます。

関数(CMainControlクラス) メッセージ 推測される処理内容
mf_CMainControl_0040 アップフォルダファイル読み込み失敗 アップフォルダの設定ファイルの読み込み
mf_CMainControl_0050 アップフォルダファイル書き込み失敗 アップフォルダの設定ファイルの書き込み
mf_CMainControl_0290 ネットワークサブシステム異常のため待ちうけポートを再初期化しました ネットワーク関係の何か
mf_CMainControl_0290 WSAsyncSelect(accepted) 失敗 WinSock の非同期select
mf_CMainControl_0290 BBSポート待ち受け開始 BBSポートの待ち受け開始
mf_CMainControl_0290 accept() 失敗 ネットワークのコネクション受付(accept)
mf_CMainControl_0450 BBSファイルが多すぎます BBSファイルの読み込み
mf_CMainControl_0460 名前の長すぎるファイルがあります 何かのファイル読み込み
mf_CMainControl_0090 ダウンロードリスト読み込み失敗 ダウンロードリストの読み込み
mf_CMainControl_0100 無視リスト読み込み失敗 無視リストの読み込み
mf_CMainControl_0110 ダウンロードリスト書き込み失敗 ダウンロードリストの書き込み
mf_CMainControl_0100 無視リスト書き込み失敗 無視リストの書き込み
mf_CMainControl_1210 初期ノードファイル読み込み失敗 初期ノードファイルの読み込み
mf_CMainControl_1220 初期ノードファイル出力失敗 初期ノードファイルの書き込み
mf_CMainControl_1570 指定されたキャッシュフォルダが見当たりません。生成しますか? 起動時のフォルダ存在確認

動作ログ以外に気づくこと (キー種別)

CMainControl::mf_CMainControl_0490関数に書かれているメッセージは動作ログではないんですが、とても重要な手がかりです。

ここでは、キー種別を元にした switch 分岐が行われています。この部分を読むと、この関連づけが分かります。

キー種別 メッセージ 推測
KEYTYPE00 仮想フォルダ キャッシュを持たないキー
KEYTYPE01 部分キャッシュまたは受可キャッシュ 部分キャッシュを持つキー
KEYTYPE02 UPフォルダ内 UPフォルダに実体のあるキー
KEYTYPE03 完全キャッシュ 完全なキャッシュを持つキー

このキー種別が定義されている部分を検索してみると、CKey.h で列挙型 enumKeyType として定義されていました。キーの種別は様々な処理に関わってくるので、この4種類は覚えておいた方が良さそうですね。

動作ログ以外に気づくこと (BBSの表示)

CMainControl::mf_CMainControl_1340 あたりも眺めていると BBS の HTML 出力だと言うことが推測できます。当面、BBS 関係にはあまり目を向けませんが、そのうちひつようになることもあるでしょう。同様に、CMainControl::mf_CMainControl_1350,1360 あたりも BBS の投稿結果のようです。

動作ログ以外に気づくこと (システム情報)

最後に見つけておくべきは、CMainControl::mf_CMainControl_0550 に含まれる沢山のメッセージです。おそらくこれらは、Winny のシステム情報タブに表示する処理のようです。ここには、様々な変数をメッセージと結びつけていますから、それぞれの変数の役割を知ることができます。

これらの変数は、一つのWinnyノード全体に関する情報ですから、それらの変数に対する処理を追うことで、パズルを紐解くことができそうです。

今日はここまで

というわけで、今回はテキストメッセージに注目して、CMainControl.cpp を軽く眺めてみました。次は、ネットワークへの送受信あたりからさらに切り分けていこうかなと思います。