4 ポイント 投稿者 GN⁺ 2023-08-11 | 1件のコメント | WhatsAppで共有
  • arpchat は、コンピューターが同じネットワーク上の別のコンピューターの MAC アドレスを見つけるために使う ARP を利用して作られたチャットアプリのツール
  • クライアント分離ネットワークで友だちとチャットしたいという利用状況が動機として示されたプロジェクト
  • ARP 上に単純な汎用転送プロトコルを実装しており、数万文字の長さのメッセージを送ることができ、多少の 圧縮 も使用
  • 接続および退出通知とともに、オンラインユーザー一覧を更新するための presence discovery と heartbeat システムを備える
  • インストール用バイナリは releases page から入手可能
    • Windows では npcap が必要な場合があり、インストール時に Install Npcap in WinPcap API-compatible Mode の選択が必要
    • Linux では sudo setcap CAP_NET_RAW+ep /path/to/arpchat でネットワーク権限の付与が必要な場合あり
  • ターミナルでバイナリを実行し、送信したメッセージが自分の画面に表示されれば正常動作していると判断可能
  • ビルドは最新の unstable Rust でテストされており、Windows ビルドには WinPcap Developer's Pack と、LIB 環境変数を WpdPack/Lib/x64/ フォルダーに設定する手順が必要

1件のコメント

 
GN⁺ 2023-08-11
Hacker News のコメント
  • これを作った本人です。今日 HN に載った別のものも作ったのですが(https://news.ycombinator.com/item?id=37062422)、ArpChat も一緒に上がっているのを見てかなり不思議な気分です。たぶん誰かが私のプロフィールを見たのでしょう。
    本当に楽しいプロジェクトで、ネットワーキングをたくさん学びました。
    少し前に完全オフライン環境で実際に使ってみる機会もあり、面白かったです。ただ、その後大きなバグを見つけ、そのバグがものすごい遅延を引き起こしていました。修正はしましたが、まだ新しいビルド成果物を上げられていないので、実環境でテストするつもりならソースから自分でビルドしたほうがよいです。遊びでユーザー名の色とメッセージ時刻も追加しました。近いうちに新しいリリースを上げると約束します。
    興味があれば、約1年前に ArpChat の仕組みについて書いた記事もあります: https://kognise.dev/writing/arp

    • これをずっと見ながら笑いっぱなしです。ArpChat はネットワーク管理者に心臓発作を起こさせる可能性が高いですが、発想そのものは本当に素晴らしいです。自分も面白半分で OSI レイヤーの本を読んでいたタイプなので共感します。
      これからもコードで遊び続けてほしいです。justine tunney が https://justine.lol/ape.html のような仕事で見せたものにも少し似ています。ごく少数の人だけがきちんと理解している領域、たとえばコンパイラのバイナリ形式の細部を深掘りしたうえで、「すべてのバイナリ形式を1つのメタ形式につなぎ合わせて、実際に全部で実行できるようにできないか?」みたいな狂った問いを投げかけ、実際に動くものを作り上げる感じです。
    • README 下部のバナーが本当に笑えて美しいです。素晴らしい仕事です。
    • Linux でも動く想定ですか?
      # sudo getcap ./arpchat
      ./arpchat cap_net_raw=ep
      “error getting channel, might be missing permissions” と出ます。
      追記: このエラーは setcap の設定ではなく arpchat から出ているものです。
  • まさにこういうものを求めていました。データリンク層で遊ぶなんて。
    Address Resolution Protocol(ARP)が何かを知らない人向けにかなり大ざっぱに言うと、MAC アドレス(Ethernet が使うもの)と IP アドレス(インターネットが使うもの)をつなぐミッシングリンクです。route で見られる IP ルーティングテーブルが、次にパケットを送る IP アドレスを決めると、arp で見られる ARP キャッシュが、その IP に対応する MAC アドレスを決定します。通常はルーターのローカル IP アドレスです。
    最近では ARP の存在を知っているだけでも、少し非専門的な秘教知識のように扱われがちで、IPv6 側の兄弟である Neighbor Discovery Protocol はさらにそうです。現代のクラウドベースのデプロイでは頻繁に直接触らないとしても、その存在を知っていると、ネットワークスタック全体を俯瞰する視野がずっと完全になります。

    • ARP が難解な知識だという点には同意しにくいです。ネットワーキングに携わる人にとって、ARP を理解する、少なくとも知っていることは今でもほぼ必須です。arping は、同じネットワークセグメント上の機器が起動しているものの ICMP ping に応答しないかを確認するときに非常に便利です。
      tcpdump や Wireshark のダンプを見れば、いずれ必ず遭遇します。ただ、ソフトウェアエンジニアはクラウドと従来型ネットワークがかなり違うため、アプリケーションより先に自宅ネットワークをデバッグするときに触れることになるかもしれません。
    • 最近ではより一般的には 802.11 でしょう。それでもホストが IP を取得する必要があるときには、どんなデータリンク層プロトコルでも ARP が使われ得るはずです: https://en.wikipedia.org/wiki/Data_link_layer
    • 本当に ARP がなじみのないものになりつつあるのなら残念です。IP ネットワークがどう動くかを理解していると言いながら、ARP に最低限の親しみすらないというのは想像しにくいです。
    • 固定 IP アドレスを持つネットワーク内の別のコンピュータの ARP エントリをハードコードすることもできます。
  • ARP が任意のペイロードを載せられる点を悪用するのは面白いですが、ネットワーキング入門の観点から言い直すと、作者が頼っている核心は、スイッチが ff:ff:ff:ff:ff:ff 宛てのパケットをブロードキャストドメイン全体にフラッディングするという単純な事実です。
    スーパーユーザー権限や raw パケット権限がなくても、L3 ブロードキャストアドレスにパケットを送れば通常 L2 でフラッディングされるため、似たようなメッセージ伝播を作れます。つまりブロードキャストアドレスに ping を打つのは面白いということです。
    ARP を使うことに特別な利点はありません。また、最近のスイッチの多くは ARP パケットを監視する機能を持っているため、偽の ARP トラフィックを大量に流すと実際に悪影響が出る可能性があります。それでも面白い取り組みで、自分が学んでいた頃に作っていたいたずらを思い出します。個人的にはこの目的には ICMP を悪用しただろうと思いますし、今後の開発方向になるかもしれません。楽しいプロジェクトに拍手を送ります。

    • もう1つ重要なネットワーキング入門の原則も使っています。結局、全部数字だということです。
      ARP、DNS、HTTP、TLS は、一方では私たちが思い浮かべるまさにそのプロトコルですが、同時にすべて数字にすぎません。ARP も HTTP と同じ数字の空間にアクセスしています。UDP だけが 11 ビットバイトを使うわけでもなく、DNS だけが使える特別な CPU 命令があるわけでもありません。結局は全部数字です。最後には、望む数字を線に押し込むことができ、世界の残りはその数字を受け取ってそれぞれの仕事をするだけです。
    • 私が最初に見た増幅型 DDoS 攻撃の1つは1990年代のもので、被害者ホストのアドレスを送信元として偽装したうえで、無防備なキャンパスネットワークのブロードキャストアドレスに ping を送る方式でした。
      今日では動作すべきではありませんが、当時は無邪気な TCP/IP 実装、つまりそのかなり多くが喜んで参加していました。
    • https://hpbn.co/ のことを言っているのですか?
  • ほとんどのOSに標準搭載されているプロトコルを悪用するのが好き。別途クライアントソフトウェアをインストールせずに済むクロスプラットフォームのGUI/CLIメッセージングシステムが見つからなかったので、Finder.app/Explorer.exe/Gnome/KDEでメッセージを見られる、ばかげた偽の Samba共有 を作ったことがある
    ローカルネットワークでnetcatを呼ぶのもうまくいかず、ブロードキャストするにはOSごとのフラグの違いもあった。ファイルブラウザでSamba共有のメッセージを見てクリックし、ファイル名を修正して3行の「掲示板」を更新する方式だった
    https://github.com/jedahan/samba-haiku/blob/master/index.js
    これも元々はWi-Fi SSIDを使ってcaptive portal俳句を作っていたものを再実装したもの
    https://github.com/jedahan/haiku-wifi

  • 思った以上に面白いかもしれない。主要ベンダーのハードウェアで VLAN を使ってネットワークを分離していたのだが、ほとんどの場合VLANは機能している一方で、ARPトラフィックが漏れていることに気づいた
    マシンはすべてのトラフィックをルーター経由で送る必要があったのに、時々、本来見えてはいけないARP応答を見て、別のマシンへ直接到達できると判断していた。その結果、ARPキャッシュエントリが期限切れになるまでトラフィックを送れず、厄介だった。ベンダーは大きすぎて気にせず、バグ修正にも関心を示さなかった
    特定の状況では、このチャットアプリがVLANを突破できる可能性がある

    • 同じ理由で興味深い。任意のペイロードを含むARPメッセージを送受信できるなら、VLANのトラブルシューティング や他のL2接続性の確認が間違いなく楽になるはず
    • 自分がテストした限りでは、かなり多くのものを突破できる
  • 妻と子どもたち、そして自分はほとんど家で仕事や勉強をしていて、それぞれ別の部屋にいることが多い。必要なときに互いにメッセージをやり取りするために BeeBEEP を使っている。サーバー不要で、LinuxクライアントとWindowsクライアントの両方があるのが決め手だった
    かなりうまく動くが、ノートPCがスリープから復帰したあと、LAN上の他の人を再び見えるようにするには、たまに再起動が必要になる。それと、トレイアイコンから特定の人へ直接メッセージウィンドウを開けない点が、ほぼ唯一の不満。面白い猫画像をコピーして貼り付けることもできるし、ファイル転送など自分が使っていない機能もある。有料広告ではなく、ただ長々と語っただけ
    https://www.beebeep.net/

    • このプロジェクトの美しさはメッセージング自体ではなく、低レベルのネットワークプロトコルを悪用して クライアント分離 のようなものの外へ飛び出すところにあると思う
  • 高校のとき net send でこれをやって叱られた

    • そのトリックを見つけて友人何人かに見せたのだが、秘密は長続きしなかった。いつの間にか、友人でもないもっと大きな集団がコンピューター室の授業でカンニングに使っていた。露骨なカンニングも気に障ったし、特に好きでもない人たちが自分の見つけたもので得をしているのも少し面白くなかった
      そこでシステム管理者のユーザー名をスプーフィングし(Win9xでは難しくなかった)、厳しい警告メッセージを送った。突然メッセージがすべて止まったところを見ると、かなり驚いたらしい
    • write がよろしくと言っている
      https://en.wikipedia.org/wiki/Write_(Unix)
    • net send はドメインに接続されている必要があったと記憶しているので、ARPは使っていなかったと思う
    • ネットワークアナライザーが間違っているか、変なARPパケットに関心を払わないなら、ARPメッセージングはおそらく検出しにくかったはず
    • そういう時代があった。大学でうっかり、いや意図的にドメイン全体へメッセージを送り、ITの先生たちはすぐに問題児のこちらを見た
  • とてもクール。ただしTCP/IPはOSIモデルに従っていないので、OSIの微妙な区分をそのまま適用するのは難しい
    ARPは実務上、Stevens基準のTCP/IPモデルにおける 2.5層 と定義できると見なせるので、2.5と呼ぶのが最も妥当に思える。そしてARPフレームはルーティングされないので、明らかにL3ではない

  • IPv4 NATが事実上の標準だった時代、今もそうではあるがIPv6とCGNATもある最近とは違って、NATChat というものを作ったことがある
    基本的にグローバルIPv4アドレスを基準にチャットルームを作り、同じネットワークの誰とでもチャットできるようにした。オフィスで他の人たちと使うにはなかなか良かった。オフィスというものも当時は存在していたし

  • C++で書かれた似たものもある: https://github.com/gbonacini/arpchatcpp