Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ShareTrace 内部処理の調査

Avatar for meow meow
April 25, 2026

ShareTrace 内部処理の調査

2026/04/25(土) 秋葉原電脳倶楽部 技術発表会 #30 で発表した資料です
https://akiba.connpass.com/event/390273/

Avatar for meow

meow

April 25, 2026

More Decks by meow

Other Decks in Technology

Transcript

  1. 発表概要 u 2026年4⽉に話題になった調査ツール『ShareTrace』の 内部ロジックを追った u 各プラットフォームの共有リンクから 『何が』『どうやっ て』取れるのかを1つずつ⾒ていく u 最後に抽出ロジックを抽象化して、こういう⼿法をそもそ

    もどう⾒つけているのかを推測 ⚠免責事項 本発表は機微情報保護の勉強を⽬的として作成されました。 本発表の内容を不正に利⽤した場合、刑事罰、⺠事訴訟の対象となることがあります。 本発表の内容を⽤いたことにより起こした、いかなる損害、損失に対し著者は⼀切責任を負いません。
  2. アジェンダ u 1. はじめに u 2. ShareTraceの使い⽅ u インストール、 共有リンクの仕様上の注意

    u 3. 各プラットフォームの実⾏結果と追跡の理屈 u TikTok、Discord、Instagram...など u 4. APIをどうやって発⾒しているかの推測 u 5. まとめ
  3. 内部処理を調査する意味 u 便利ツールの出⼒は、過程を理解していないと正当性を 主張できない u 例: 裁判でShareTraceで得た証拠を出したとしても「そんな出⾃ のわからないツールから出た情報なんか信じられるか」と⾔われた ら終わり u

    さらに「どうやって⾒つけたのか」を知りたい u コードから⼿法そのものを学べるのでは、という期待 u 「猫に⿂をやるのではなく、⿂の捕り⽅を教える」的な(?) (興味本位以外の)
  4. 「リンクを共有したんだから、 共有主がわかるのは当たり前では?」 ...という質問が想定される u 実際には「当たり前」ではない u 共有した本⼈は ⾃分のアカウント情報が埋め込まれている⾃覚が ない可能性がある u

    「共有 → リンクをコピー」を押しただけで、UIに警告は出ない u URL上の識別⼦は短縮 / ハッシュ / Base64 / SSR埋め込み JSON などで ⽬視では読めない u 受け⼿が⼀段掘らないと出てこない情報 u つまり匿名に⾒えるが、実は紐付いている状態 u この⾮対称性をShareTraceは可視化する
  5. 主なユースケース u ジャーナリズム / ファクトチェック u 情報源(特に偽情報と疑われるもの)の発信元アカウントを辿る u 機微情報、プライバシー保護、OpSec u

    企業 u 組織の共有運⽤が本当に匿名化されているかの検査 u 個⼈ u ⾃分が発信しているリンクから、どこまで素性が漏れているか確認 (主にSNSアカウント調査の)ピボットを増やすことに役に⽴つという意味では めちゃくちゃでかい
  6. [備考]有志によるWeb アプリ版 u Flask 実装のセルフホスト版 u https://github.com/voelspriet/sharetrace-web u @henkvaness⽒によるWebApp版 u

    https://share.whopostedwhat.com/ u 説明や、デモの対象とするターゲットも⽤意されており、 CLIを叩く前に所感を掴むのにオススメ 界隈の著名⼈がこぞってシェアしたり保守しているのを ⾒ると、本当にこのツールがインパクトあるんだろうなと 思う
  7. Platform 抽出できる情報 有効な共有リンクフォー マット 無効なリンク TikTok User ID, Username, Display

    Name, Country, Device, Timestamp vm.tiktok.com/ZMxxxxxx / vt.tiktok.com/... ブラウザのアドレスバーから 取った tiktok.com/@user/video/1 23... Instagram Username, Display Name, User ID, Profile Pic ?igsh=... を含む共有リン ク 素の /p/Cxxx/ URL、数⽇以 上経過したリンク Discord User ID, Username, Display Name, Avatar, Creation Time discord.gg/xxxxx discord.com/invite/xxxxx vanity招待、プロフィール・ メッセージURL ChatGPT Display Name chatgpt.com/share/<uui d> ̶ 抽出できる情報は公式リポジトリ、 有効な共有リンク、無効なリンクは デモWebサイトから引⽤ 現在は抽出できなくなってる 対応プラットフォームと抽出される情報 26/4/19時点
  8. 対応プラットフォームと抽出される情報 Platform 抽出できる情報 有効な共有リンクフォー マット 無効なリンク Claude Display Name, UUID

    claude.ai/share/<uuid> ̶ Perplexity Username, Avatar, User ID perplexity.ai/search/<slu g> ̶ Microsoft Email (SharePoint / OneDrive リンク) *- my.sharepoint.com/:x:/p /username/... “Anyone with the link” の 1drv.ms 匿名URL Pinterest Username, User ID, Display Name, Avatar 短縮リンク pin.it/XXXXX webサイトからコピーした pinterest.com/pin/123.../ 26/4/19時点 抽出できる情報は公式リポジトリ、 有効な共有リンク、無効なリンクは デモWebサイトから引⽤
  9. Platform 抽出できる情報 有効な共有リンクフォー マット 無効なリンク Substack User ID, Name, Handle,

    Bio ?r=XXXXX を含む紹介リン ク ?r= の無い通常の投稿URL Suno Username, Display Name, Avatar suno.com/song/<uuid> suno.com/playlist/... ̶ Telegram User ID (joinchat リンク) t.me/+AbCdEf... t.me/joinchat/AAAA... メッセージリンク t.me/c/123/456、公開チャ ネル t.me/channelname 対応プラットフォームと抽出される情報 26/4/19時点 抽出できる情報は公式リポジトリ、 有効な共有リンク、無効なリンクは デモWebサイトから引⽤
  10. アジェンダ u 1. はじめに u 2. ShareTraceの使い⽅ u インストール、 共有リンクの仕様上の注意

    u 3. 各プラットフォームの実⾏結果と追跡の理屈 u TikTok、Discord、Instagram...など u 4. APIをどうやって発⾒しているかの推測 u 5. まとめ
  11. インストールと実⾏(README.mdより) ターミナルでpythonのモジュール実⾏をするだけ。 インストール u git clone https://github.com/soxoj/sharetrace.git u cd sharetrace

    u pip install -r requirements.txt 実⾏ u python -m sharetrace <url> u urlはクオートで囲むんだほうがいい(? や & がシェルに⾷われる)
  12. アジェンダ u 1. はじめに u 2. ShareTraceの使い⽅ u インストール、 共有リンクの仕様上の注意

    u 3. 各プラットフォームの実⾏結果と追跡の理屈 u TikTok、Discord、Instagram...など u 4. APIをどうやって発⾒しているかの推測 u 5. まとめ
  13. TikTokで追跡できる理屈 1. 短縮URL vm.tiktok.com/XXXXX をリダイレクト追跡 2. Android ブラウザを偽装してページHTMLを取得 3. HTML内の

    webapp.reflow.global.shareUser JSON を正規表現でパース 取れるもの u User ID / Username / 表⽰名 / アバター u 共有者の国・デバイス・タイムスタンプ (投稿者ではなく 共有者)
  14. Discord で追跡できる理屈 u エンドポイント: GET discord.com/api/v9/invites/{code} u レスポンスの inviter.id /

    inviter.username / inviter.avatar を参照 u さらに Snowflake ID から アカウント作成⽇時 も算出可 能 u 計算式: ((snowflake_id >> 22) + 1420070400000) / 1000
  15. Pinterestで追跡できる理屈 u ① 短縮URL pin.it/XXXXX のリダイレクト先( Locationヘッダー)から invite_code を抽出 u

    ② InviteCodeMetadataResource API に invite_code を渡してリクエスト u ③ レスポンスの sender フィールドを参照 u 取得情報: Username / User ID / 表⽰名 / アバター / プロフィールURL u 通常ピンのURLは対象外、招待コード付き共有リンクのみ 有効
  16. Telegramで追跡できる理屈 t.me/joinchat/JdJoSRcUuUma-UHZN3NTmg を例に説明 u ① ハッシュ部分を Base64url デコード → 16バイトのバイ

    ナリ: 25 D2 68 49 17 14 B9 49 ... u ② 先頭4バイトをリトルエンディアンで読む → 0x4968D225 = 1231606309(これがUser ID) 通常の利⽤だとまず気づかない。
  17. 現状動いていないモジュール プラット フォーム 原因 ChatGP T OGPが "Shared by NAME

    via ChatGPT" → "Shared via ChatGPT" に変化 プラットフォーム側の仕様変更への追従が必要
  18. アジェンダ u 1. はじめに u 2. ShareTraceの使い⽅ u インストール、 共有リンクの仕様上の注意

    u 3. 各プラットフォームの実⾏結果と追跡の理屈 u TikTok、Discord、Instagram...など u 4. APIをどうやって発⾒しているかの推測 u 5. まとめ
  19. ① DevToolsで観察する u 共有リンクを開いた状態で DevTools の Network タブ を⾒る u

    どのAPIが叩かれているかが⼀覧で⾒える u Sources タブで HTML ソースの埋め込みJSONが⾒える u 例: u TikTok: webapp.reflow.global.shareUser u Substack: window._preloads
  20. ② URLを⽬で読む u コードを書くまでもなく構造が⾒える u Microsoft: SharePoint URLはメールが _ 区切りでその

    まま⼊っている u Telegram: Base64をデコードすると、先頭4バイトが User ID と判明 u 同じアカウントで複数の招待リンクを⽣成 → 先頭4バイトが⼀致 u ⾃分のUser IDと⽐較してビンゴ u パターン認識 + 統計的推測
  21. アジェンダ u 1. はじめに u 2. ShareTraceの使い⽅ u インストール、 共有リンクの仕様上の注意

    u 3. 各プラットフォームの実⾏結果と追跡の理屈 u TikTok、Discord、Instagram...など u 4. APIをどうやって発⾒しているかの推測 u 5. まとめ
  22. まとめ u ShareTraceの実⾏、コードリーディングを通して、どう情報を抽出 しているのかの仕組みを理解した u 全体的にブラウザがやっていることの再現 u 脆さもある u プラットフォームの仕様変更でいつ壊れてもおかしくない

    u 実際に ChatGPT は現時点で取得不能 u 技法がオープンになる前に、⾃分で⾒つける姿勢が⼤事だと思っている u ⾃分で⾒つけるとなった場合、アプローチは2つありそう u DevTools の Network / Sources タブで観察 u URL・バイナリを⽬で読んで構造を当てる