
2026/07/28 0:48
Bad Apple but Traceroute です
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
このプロジェクトは、Bad Appleのカバーにインスピレーションを得た「traceroute」アニメーションを演示しており、nftablesの
postroutingチェーンにおけるnumgenを利用して各ホップごとに偽のIPv6アドレスを注入し、sysctlによるデフォルトのICMPv6レート制限を無効化しています。表示の clutter を防ぐため、標準の mtr ツールは ui/net.c で i = 0 を設定するパッチが適用され、軽量版である mtr2 に置き換えられています。視覚出力は ffmpeg を用いて8フレーム/秒でリサンプリングされ、30×11ピクセルにスケーリングされた後、シャドウアートスタイルの表示に変換されます。Python スクリプトにより生成されたPNGシーケンスが、マルチメガバイト規模の nftables ルールセットに変換されます。シャドウアートは1ビット/ピクセルディスプレイ(文字LCDを含む)上で描画可能であり、このビデオは最小限のハードウェアでも表示できます。本作品は、偽のネットワークホップに関する以前の実験を基盤とし、実行中のDoomをコード実行のベンチマークとして用いながら、Bad Appleシーケンスをハックされたディスプレイデバイスのベンチマークとして提示しています。専用のサブreddit では此类のハックのショーケースが公開されており、著者はHD47780互換のLCDへのハッキングに対して特に興味があると強調しています。全体として、このプロジェクトは複雑なネットワークデータが制約されたハードウェア上で永続的な視覚アーティファクトへと変換可能であることを証明し、これらの特定のパライアール構成に遭遇した際に誤検知を回避するようセキュリティツールに課題を投げかけています。本文
Tra 工具と Bad Apple!! で「ハッキングされたディスプレイ」体験を作ろう
前回の投稿(Tra 工具を使って任意のコンテンツを表示する方法)に続くシリーズです。先日公開された別の「Bad Apple!!」のカバー作品に触発され、どうしても試さねばなりませんでした。もちろんこの手法を実行したのは私だけではありませんが、私のやる気を削ぐことはありませんでした。
仕組みと準備
Tra ツールの出力に偽のホップ(Hop)情報を挿入し、
nftables の numgen フィーチャを活用することで、ICMPv6 パケット生成時にホップ情報を変化させます。
はランダム数値か、単調増加カウンターを提供します。numgen- カウンターを使用すれば、応答パケットごとに異なる IPv6 アドレスをホップとして返すように容易に設定できます。
nftables ルール設定
前回のプレイグラウンドを以下のように利用し、ルールを設定します。
ip netns exec tracemess nft -f - <<EOF destroy table inet tracemess table inet tracemess { chain prerouting { type filter hook prerouting priority raw; ip6 daddr fd00::1 ip6 hoplimit 1 reject with icmpv6 admin-prohibited; } chain postrouting { type filter hook postrouting priority raw; icmpv6 type destination-unreachable icmpv6 code admin-prohibited \ ip6 saddr fd00::1 @th,120,8 1 \ ip6 saddr set numgen inc mod 3 map { 0: fd00::2, 1: fd00::3, 2: fd00::4 } \ icmpv6 type set 3 icmpv6 code set 0 accept; } } EOF
必須の環境調整
この仕組みを動作させるには、以下の 2 つの点で調整が必要です。
-
ICMPv6 のレート制限無効化
- カーネル内のデフォルト設定では送信レートが「1 パケット/秒」に制限されています。
- イベントが非常に短時間で終了するため、以下のコマンドで制限を解除する必要があります。
sysctl net.ipv6.icmp.ratelimit=0 -
mtr の複数アドレス表示問題の解決
- mtr は通常、各ホップに対して複数のアドレスを表示してしまいます(これは複数のパケット経路が使用されていることを示しますが、今回のケースでは煩雑です)。
- この問題を解決するには、
に以下の 1 行の.patch を適用する必要があります。mtr2
diff --git a/ui/net.c b/ui/net.c index c0cbf28..7c52710 10064 --- a/ui/net.c +++ b/ui/net.c @@ -266,6 +266,7 @@ static void net_process_ping( break; /* Found first vacant position */ } } + i = 0; if (found == 0 && i < MAX_PATH) { memcpy(&nh->addrs[i], &addrcopy, sockaddr_addr_size(sourcesockaddr));
プロセスフロー
準備が整った後の手順は以下の通りです。
を使用して動画を 8 フレーム/秒(間隔 125 ミリ秒)で再サンプリングします。ffmpeg- 画像を縮小し(30×11 ピクセル)、PNG ファイルとして個別に出力します。
- これらの PNG ファイルを読み込み、対応する ICMPv6 応答を生成する
ルールセットに変換する Python スクリプト を作成します。nftables - 生成されるルールセットは約 1 メガバイト以上になりますが、その価値は十分にあります。
なぜ?(動機)
シャドウアート風の「Bad Apple!!」ミュージックビデオは、「ハッキングされたディスプレイ(hacked display)」の基準事例として広く認知されています。
- 定義: 「display」という言葉の定義はやや緩やかですが、1993 年の『Doom』が新たなハードウェアでコード実行を獲得したことに指標となるようにです。
- 特徴: シャドウアートのスタイルゆえに、ピクセル当たりビット数だけ(オン/オフのみ)のディスプレイでも動画を描画可能です。
個人的な動機
Bad Apple!! をどのようなデバイスに表示させるかを紹介するサブレディットにも投稿が寄せられています。
- お気に入り事例: HD47780 互換のキャラクター型 LCDに Bad Apple!! を表示させるハックです。
- 理由: 私もこうした小型デバイスのハッキングを特に楽しむためです。
さらに、複数のバージョンを並べたまとめ動画も多数存在します。こうした背景を考慮すると……私は仕方なかったのでしょうか?