Note
このドキュメントは2026-02-27 02:43にPLaMo Translation Modelを使用して自動翻訳されました。
FEP-96ff: ActivityPubの意味論を明示的に示す方法
概要
ActivityPub実装において、同一ホスト名に存在する無関係なファイルがActivityPubの意味論を持つオブジェクトとして処理される「型混同」攻撃に起因する複数の脆弱性が確認されています。
このような攻撃は、Content-Typeヘッダーの厳密な検証(および、ユーザーがapplication/activity+jsonやapplication/ld+jsonといったコンテンツタイプのファイルを作成できないようにする実装側の対策)によって緩和されていますが、ActivityPubの意味論を適用すべきメッセージを明確に示すことで、これらの防御策をさらに強化できます。
さらに、ActivityPubはJSON-LD以外の転送構文も理論的にサポートしています(TurtleなどのRDF構文や、より帯域効率に優れたCBOR-LDのような構文など)。コンテンツタイプによる厳格なフィルタリングを実施すると、将来的にこうした代替構文を使用できなくなる可能性があります。
本文書中で使用する「MUST」「MUST NOT」「REQUIRED」「SHALL」「SHALL NOT」「SHOULD」「SHOULD NOT」「RECOMMENDED」「MAY」「OPTIONAL」という用語は、RFC2119で定義された意味に従って解釈されるものとします。
ActivityPubの意味論を示す方法
実装がリクエストまたはレスポンスボディに対してActivityPubの意味論を適用する意図を表明するには、Linkヘッダーを含み、関係タイプとしてtypeを指定し、内容にhttps://www.w3.org/TR/activitypub/を設定する必要があります。このヘッダー形式はLDPから借用したもので、同じ関係タイプを使用してLDPの意味論サポートを示しています。
Link: <https://www.w3.org/TR/activitypub/>;rel="type"
準拠実装は、ActivityPubの意味論を適用すべきHTTPメッセージには必ずこのリンク関係を含めなければなりません。
準拠実装は、Content-TypeヘッダーがActivityStreams 2形式かつActivityPubの意味論をサポートする実装対応の転送構文である場合に限り、当該リンク関係が存在するHTTPメッセージを処理する必要があります。
準拠実装は、「type」関係を持つLinkヘッダーを含まないHTTPメッセージであっても、以下の条件を満たせば処理可能です:
- Content-Typeヘッダーが正確にapplication/activity+jsonまたはapplication/ld+jsonであり、プロファイルパラメータとしてhttps://www.w3.org/ns/activitystreamsトークンを含んでいる場合(これにより既存実装との後方互換性を確保します)
準拠実装は、その他のHTTPメッセージをActivityPubの意味論で処理してはなりません。
準拠実装は複数のLinkヘッダーを含むメッセージも適切に処理できる必要があります。特に「type」関係を持つ複数のリンクヘッダーを含めることは有効です。以下に示す例はすべて有効な形式であり、いずれもActivityPubの意味論を適用すべきであることを示します:
Link: <https://www.w3.org/TR/activitypub/>;rel="type"
Link: <https://www.w3.org/TR/activitypub/>;rel="type", <https://example.com/>;rel="test"
link: <https://www.w3.org/TR/activitypub/>;rel="type", <https://example.com/>;rel="type"
LINK: <https://www.w3.org/TR/activitypub/>;rel="type"
Link: <https://example.com/>;rel="test"
Link: <https://www.w3.org/TR/activitypub/>;rel="type"
lInK: <https://example.com/>;rel="type"
実装側には、定期的にメッセージに追加のLink関係を付与することを推奨します。これにより、相互運用相手によるサポートを確実にすることができます(このプロセスは通常「グリース処理」(TLS拡張機能GREASEに由来)と呼ばれます)。
誤解を避けるため明記しますが、ActivityPubの意味論が適用されるのは、ActivityPub仕様で定義された意味論を持つActivityStreams 2ドキュメントを転送することが想定される場合に限られます。このリンク関係は、WebFingerクエリなど、ActivityPub実装が実施する可能性のある他の通信には含めてはなりません。
コンテンツタイプのみに依存しない理由
コンテンツタイプだけでは意味論を指定できません。ActivityStreams 2構文はActivityPubとは独立して使用可能であり、Cohostなどの非ActivityPubシステムでもActivityStreams 2ドキュメントを生成することがあります。
さらに、ActivityPub実装ではActivityStreams形式のコンテンツタイプを持つ予期せぬリソースの作成を防止できますが、同一ホスト名で動作する他のアプリケーションが未認証ユーザーによるそのようなリソースの作成を許可することを完全に防ぐことはできません。
今後、メッセージに明示的な意味論タグ付けが広く普及した段階では、この仕様の改訂版においてメディアタイプに基づく意味論判定機能を削除することが可能になると期待されます。
脆弱性(非規範的事項)
本メカニズムを実装していれば防止できたであろう既知の実装上の脆弱性は以下の通りです:
- CVE-2024-25623: Activity Streamsオブジェクトに対するメディアタイプ検証が不十分なため、遠隔アカウントのなりすましが可能(Mastodon)
- GHSA-qqrm-9grj-6v32: Activity Streamsオブジェクトに対するメディアタイプ検証が不十分なため、遠隔アカウントのなりすましと乗っ取りが可能(Misskey)
- コンテンツタイプの厳格な検証, Pixelfed(上記2件と同様)、脆弱性ID未付与
- リモートASオブジェクト参照処理の全段階でより厳密なチェックを追加, GoToSocial, 脆弱性ID未付与
- GHSA-xmw2-875x-rq88: 任意のユーザーコンテンツが存在するドメインにおける偽アカウント作成の可能性(Kitsune)
- Pleroma Issue 1948: メッセージのなりすましが可能
すべての実装がこのリンク関係チェックを厳格に実施していれば、以下の脆弱性も防止できたでしょう:
- CVE-2023-36460, メディア添付による任意ファイル作成が可能(Mastodon)
(現時点では、既存実装との互換性を損なうため提案されていません)
これらのリストは網羅的なものではない可能性があります。
参考文献
- ActivityPub Christine Lemmer Webber, Jessica Tallon他, 2018年
- Linked Data Platform 1.0, Steve Speicher, John Arwe, Ashok Malhotra, 2015年
著作権
CC0 1.0 Universal(CC0 1.0)パブリックドメイン献呈
法律で許容される範囲内において、本Fediverse Enhancement Proposalの著者らは、本著作物に関するすべての著作権および関連する権利を放棄しています。