Summary
Fedibird/kmyblueによるsearchableBy
タームの解釈とJSON-LDの意味論の間の不整合から、特定条件において署名済オブジェクトの検索範囲を悪意のある中間者が改竄できてしまう。
Details
現行のFedibird/kmyblueはActivity StreamsオブジェクトのsearchableBy
に空の配列が指定されている場合("searchableBy": []
)に当該オブジェクトの検索範囲を「リアクション限定」(Fedibirdにおける呼称)として解釈しますが、一方でJSON-LDにおいて"@container": "@list"
でないタームに対して空の配列[]
を指定した場合は何の値も指定していない場合と同じ意味であり、特にLD Signaturesの署名・検証処理においてこれらの値の存在は無視されてしまいます。つまり、LD Signaturesで署名されたオブジェクトから攻撃者が"searchableBy": []
を削除したり、逆にsearchableBy
が指定されていないオブジェクトに"searchableBy": []
を加えても署名の検証が通ってしまい、結果としてオブジェクトの改竄が成立します。
なお、類似の脆弱性であるCVE-2022-24307の対策として、Mastodonはリモートから配送されたオブジェクトのLD Signatureを検証する際に当該のオブジェクトに対してJSON-LD compactionを適用しています:
https://github.com/mastodon/mastodon/blob/664b0ca8cb10383c4c64964f830c41ddef4acb27/app/services/activitypub/process_collection_service.rb#L14
しかし、compactionは空の配列に対しては特に処理を加えない(実行例)ため、これは本事案のmitigationとしては機能していないと考えられます。
PoC
(N/A)
Summary
Fedibird/kmyblueによる
searchableBy
タームの解釈とJSON-LDの意味論の間の不整合から、特定条件において署名済オブジェクトの検索範囲を悪意のある中間者が改竄できてしまう。Details
現行のFedibird/kmyblueはActivity Streamsオブジェクトの
searchableBy
に空の配列が指定されている場合("searchableBy": []
)に当該オブジェクトの検索範囲を「リアクション限定」(Fedibirdにおける呼称)として解釈しますが、一方でJSON-LDにおいて"@container": "@list"
でないタームに対して空の配列[]
を指定した場合は何の値も指定していない場合と同じ意味であり、特にLD Signaturesの署名・検証処理においてこれらの値の存在は無視されてしまいます。つまり、LD Signaturesで署名されたオブジェクトから攻撃者が"searchableBy": []
を削除したり、逆にsearchableBy
が指定されていないオブジェクトに"searchableBy": []
を加えても署名の検証が通ってしまい、結果としてオブジェクトの改竄が成立します。なお、類似の脆弱性であるCVE-2022-24307の対策として、Mastodonはリモートから配送されたオブジェクトのLD Signatureを検証する際に当該のオブジェクトに対してJSON-LD compactionを適用しています:
https://github.com/mastodon/mastodon/blob/664b0ca8cb10383c4c64964f830c41ddef4acb27/app/services/activitypub/process_collection_service.rb#L14
しかし、compactionは空の配列に対しては特に処理を加えない(実行例)ため、これは本事案のmitigationとしては機能していないと考えられます。
PoC
(N/A)