VeilSwap
← All posts
プライバシー2026-11-068 min read

ウォレットは本当に Tor 経由か:SOCKS5 実測監査

4つのウォレット、同じ SOCKS5 ハンドシェイク。Electrum、Sparrow、Feather、Monero GUI がホスト名をどこへ渡すか、DNS がどこで漏れるか、自分でできる5つの確認。

ウォレットの Tor スイッチは、送信する全パケットについての約束です。そしてその約束を検証できるのは、実際に判断が下される一行、SOCKS5 リクエストです。本稿は4つのウォレット——Electrum、Sparrow、Feather、Monero GUI——のその一行を読み、接続先を記録する SOCKS5 プロキシ上で差を測りました。結論は「Tor は動く/動かない」ではありません。地図です。4つのうち3つは既定の経路でサーバー名をプロキシに渡し、それぞれに1箇所、迂回する場所があります。どれも画面には出ません。だからこそ最後の確認手順が、トグルの状態より重要なのです。 (Torでのスワップは安全?)

どちらが名前解決するかを決めるのは1バイトです。 SOCKS5 はリクエストの ATYP フィールドで宛先を表します。0x01 は IPv4 アドレス、0x03 はドメイン名です。0x03 を送れば、名前解決はプロキシ、つまり Tor 側で行われます。0x01 を送るということは、手元ですでに解決済みということで、その問い合わせはトンネルができる前に外へ出ています。127.0.0.1:1081 に記録する SOCKS5 リスナーを立て、curl で同じ宛先へ2回接続しました。`curl --socks5` は `ATYP=1 HOST=172.66.147.243:80`、`curl --socks5-hostname` は `ATYP=3 HOST=example.com:80` を記録しました。同じプロキシ、同じ宛先、違いは1点だけ。前者は Tor が関与する前に DNS の答えが存在していました。以下のどのウォレットも、コードの中でこの選択をしており、それを画面に書きません。 (Torでのスワップは安全?)

Electrum:自ら探り、しかも厳格です。 プロキシ未設定(出荷時の既定)でも、Electrum は 127.0.0.1 の 9050、9051、9150 を並行に探ってローカル Tor を自動検出できます。この探査は単なる TCP 接続ではありません。18 バイトの SOCKS5 ハンドシェイクの末尾にコマンド 0xF0、Tor の RESOLVE 拡張を置き、0.0.0.0 を解決させ、返答が 12 バイト `05 00 05 00 00 01 00 00 00 00 00 00` と完全一致する場合だけ受け入れます。ソースのバイト列を自作エミュレータへ送ると、ログは `CMD=0xf0 ATYP=3 HOST=0.0.0.0:0`。Tor が返す形そのものです。実務上の帰結は2つ。RESOLVE を実装しない汎用 SOCKS5(ssh -D、dante)は検出に失敗し、Electrum はそのまま直接接続へ戻ります——エラーも警告も出ません。そして 9051 は Tor の制御ポートなので、3つの探査のうち1つは設計上ふつう死んでいます。 (Torでのスワップは安全?)

実際にプロキシを通る場合、Electrum の主経路はきれいです。SOCKS 層はホスト名を ATYP 0x03 で符号化するので、サーバー名は未解決のままプロキシに届きます。例外は同じリポジトリの中にあります。`dnssec.py` はハードコードされた 8.8.8.8 に対して解決し、ソースには「FIXME this method is not using the network proxy」と書かれています。`contacts.py` は支払い識別子の検索にこれを呼びます。name@domain 形式の識別子を使うと、その DNS 問い合わせは Tor が動きプロキシが有効なまま、手元のマシンから平文で出ていきます。ブロックチェーン接続ではない狭い経路ですが、ウォレットのセッションを特定するのは、まさにこういう狭い経路です。 (Torでのスワップは安全?)

Sparrow:2つのトランスポート、正反対の答え。 同じアプリでも、選ぶサーバープロトコルで挙動が変わります。SSL(ポート 50002)とプロキシの組み合わせでは `ProxyTcpOverTlsTransport` を使い、ソケット呼び出しは `InetSocketAddress.createUnresolved(server.getHost(), port)`。ホスト名は SOCKS プロキシへ渡り、ローカルのリゾルバは呼ばれません。一方、平文 TCP(ポート 50001)とプロキシでは `TcpTransport` と `ProxySocketFactory` に落ち、`createAddress` が未解決のまま残すのは .onion ホストだけです。クリアネットのホストは `new InetSocketAddress(address, port)` を通り、生成時に解決されます。Tor に届くのは名前ではなく IP です。Sparrow の既定の公開サーバーは SSL なので、一般的な構成は安全な側。例外はサーバー一覧で1クリックの距離にあります。 (Torでのスワップは安全?)

Feather:既定は Tor、ただし初回同期を除く。 Feather は出荷時から proxy = Tor で、同梱の tor バイナリを `--SocksPort 127.0.0.1:19450` で起動します。穴はプライバシーレベルにあります。既定は「初回同期以外すべて Tor」で、プロキシを付けるか決める関数は Tor モードのとき「onion ノードのみ」を返します。この条件は、ウォレットが一度リフレッシュを終えるまで、あるいはチェーン高が初期同期しきい値に届くまで false のままです。つまり、ウォレットが生涯で出す最も大きく特徴的な通信である初回同期が、クリアネットのノードへ直接送られます。同期後はプロキシが効き、onion 限定を有効にすると .onion ノードへ TLS を意図的に切って接続します(その区間は Tor がすでに暗号化しているため)。 (Torでのスワップは安全?)

Monero GUI:フラグ1つ、想定より広い範囲。 GUI は `--socks5-proxy address:port` を受け付け、自身のソースには「リモートノード接続、アップデートのダウンロード、価格ソースの取得」を対象と書かれています。ウォレット側の `--proxy` はもっと狭く、デーモン接続用の socks プロキシです。その下の SOCKS クライアントは `v5_domain_connect` リクエスト、ATYP 0x03 を組み立てるので、デーモンのホスト名はリゾルバではなくプロキシへ渡ります。帰結は2つ。この設定は汎用 SOCKS5 であって Tor スイッチではなく、Tor でないプロキシに向ければホップが1つ増えるだけで匿名性はゼロです。そして範囲にアップデート確認と価格取得が含まれるため、ブロードキャストと同じ瞬間、同じ回路から第三者の価格 API へもリクエストが飛びます。 (Torでのスワップは安全?)

ATYP が正しくても不可視にはなりません。 すべて 0x03 にすればローカルのリゾルバは排除できますが、出口ノードには宛先ホスト名が見え、クリアネットの TLS では SNI も見えます。両方を消せるのは .onion ノードだけです。DNS 問い合わせもなく、出口が読むホスト名もありません。どちらでも残るのはタイミングです。ウォレットがノードへ接続して間もなく取引が現れる——両側を見られる観測者にとって、それは試せる相関です。Tor は観測点を動かすのであって、観測を消しはしません。Tor スイッチを入れればオンチェーン送金がプライベートになると言う人は、存在しないものを売っています。 (Torでのスワップは安全?)

10分でできる確認を5つ。(1)ウォレットを idle にして `ss -tnp`。tor 以外が持つ 50001、50002、18081、18089 の外向き接続があってはいけません。(2)`sudo tcpdump -ni any udp port 53` を走らせてウォレットを再起動。表示されるクエリはすべて、トンネルに届かなかった解決です。(3)システムのリゾルバを 127.0.0.1 のようなシンクホールに向けて再起動。それでも接続できるならローカル解決はしていません。失敗するなら、ずっとローカルで解決していました。(4)Electrum で `--proxy socks5:127.0.0.1:9050` と Tor でない SOCKS サーバーを比べ、自動検出が後者を拒むのを見ます。(5)Sparrow でプロキシを有効にしたまま、同じサーバーを 50001 と 50002 で切り替え、どちらが DNS クエリを起こすか観察します。 (Torでのスワップは安全?)

スワップにとって何が重要で、何を直せないか。 入金アドレスへの送金に DNS 照会は一切ありません。文字列を貼って署名するだけです。漏れるとすれば、ウォレットとノードの間の接続で、それは注文の前にも後にも存在します。2つを別問題として扱ってください。注文ページの責務はあなたを記録しないこと——当サイトは 4jyoxqdyx7dh3xfjctihpld7fgliowhimajfszcgypxash5rjqhas3yd.onion に Tor ミラーを置き、アカウントを求めません。ウォレットの責務はあなたを名乗らないことです。2026年11月6日 10:05 UTC の実測では、100 USDT-TRON が 0.1420618 XMR(1 XMR あたり 703.9 ドル相当、現物 617.43)、1 XMR は 2 ルートで 612.157 USDT。少額側の差はロックレート経路によるもので、プライバシー課金ではありません。ライブ見積りが優先します。SOCKS5 監査がもたらすのは、もっと小さくて役に立つ知識です。ウォレット設定の「Tor」は1つのリクエストの1バイトを指している、そして自分で確認できる、ということです。 (Torでのスワップは安全?)

Frequently asked questions

SOCKS5 プロキシを設定すれば DNS 漏洩は防げますか?

保証されません。リクエストの ATYP バイト次第です。0x03 ならプロキシが解決し、0x01 なら手元が先に解決していて問い合わせは既に出ています。2026年11月6日の私のテストでは、同じプロキシに対して `--socks5` は ATYP=1 と 172.66.147.243、`--socks5-hostname` は ATYP=3 と example.com を送りました。設定は意図の証明であって挙動の証明ではありません。udp/53 を tcpdump で見てください。

Tor Browser はウォレットの通信を守りますか?

守りません。Tor Browser は自分のプロセスのみをプロキシし、ウォレットは独自のソケットを持つ別アプリで、プロキシを継承しません。Electrum、Sparrow、Feather、Monero GUI はそれぞれプロキシ設定(または自前の Tor)が必要で、上述の例外もそれぞれにあります。クリアネットでノードと通信するウォレットは、どのブラウザを開いていても、そのノード運営者に IP を見せます。

このうち実際にホスト名を Tor へ渡すのはどれですか?

Electrum のノード接続(aiorpcx が名前を ATYP 0x03 で符号化)、Sparrow の SSL 50002(createUnresolved)、Monero の SOCKS クライアント(v5_domain_connect)です。例外は、Sparrow の平文 TCP 50001 がホストを先に解決して IP を送ること、Electrum の支払い識別子 DNS がプロキシを迂回して 8.8.8.8 へ行くこと、Feather の既定プライバシーレベルが初回同期を飛ばすことです。

Keep reading

All articles →

Ready to swap?

No account · No KYC · No email

Exchange now
ウォレットは本当に Tor 経由か:SOCKS5 実測監査 — VeilSwap