リスク1
5.4 LTS・7.0よりカスタム絵文字のActivityPub仕様にdomain
プロパティが追加されたが、これを悪用することで、他のサーバーのカスタム絵文字を自分の思い通りの画像で上書きできる
サーバーA、B、Cがあり、AがCに自分のカスタム絵文字を送信した。
サーバーBは、自分のサーバーのカスタム絵文字にAのdomain
を指定して送信する。するとCは、Bのカスタム絵文字の画像をAのものと認識して扱ってしまう。
その結果、Cはスタンプの画像が置き換わるなどの影響を受ける
例として、攻撃者はカスタム絵文字の画像を不快なもの、スパムなどに差し替えることが可能であるだけでなく、その責任を自分以外のドメインに押し付けることが可能である。
画像の差し替えだけなら今回の脆弱性がなくても可能だが、今回は『他の正常なサーバーの特に問題なく広く使われているカスタム絵文字を上書きすることが可能である』『攻撃者はこの画像の差し替えをほぼ匿名的に行うことができる』点を重視した。これらは連合に混乱をきたしかねず、本来不要なドメインブロックを生み出すリスクがある点で影響はある。
当面の間の対策として、domain
プロパティを削除する。WEB_DOMAIN
対応が削除されるが、セキュリティのためなら仕方ない。後日別案を検討する。
リスク2
今年2月のスタンプ仕様実装当初からあったと思われる問題で、他のサーバーのスタンプに相乗りしたものを受け入れるため、カスタム絵文字のドメイン抽出にuri
を利用しているが、このドメインは認証されない。そのため、攻撃者はリスク1と同様、他のサーバーのカスタム絵文字を自分の思い通りの画像で上書きできる
対策として、新規のカスタム絵文字を認証した場合/既存のカスタム絵文字を上書きする必要があると判断した場合、かつスタンプを付けたアカウントのドメインとカスタム絵文字から抽出したドメインが異なる場合、uri
をフェッチしてそこのJSON情報と矛盾がないかを確認する。
Patches
なし
Workarounds
なし
References
リスク1
|
domain = tag['domain'] || URI.split(custom_emoji_parser.uri)[2] || @account.domain |
リスク2
|
domain = tag['domain'] || URI.split(custom_emoji_parser.uri)[2] || @account.domain |
|
|
|
if domain == Rails.configuration.x.local_domain || domain == Rails.configuration.x.web_domain |
|
# Block overwriting remote-but-local data |
|
return CustomEmoji.find_by(shortcode: custom_emoji_parser.shortcode, domain: nil) |
|
end |
|
|
|
return if domain.present? && skip_download?(domain) |
|
|
|
emoji = CustomEmoji.find_by(shortcode: custom_emoji_parser.shortcode, domain: domain) |
|
|
|
return emoji unless emoji.nil? || |
|
custom_emoji_parser.image_remote_url != emoji.image_remote_url || |
|
(custom_emoji_parser.updated_at && custom_emoji_parser.updated_at >= emoji.updated_at) || |
|
custom_emoji_parser.license != emoji.license |
|
|
|
begin |
|
emoji ||= CustomEmoji.new( |
リスク1
5.4 LTS・7.0よりカスタム絵文字のActivityPub仕様に
domain
プロパティが追加されたが、これを悪用することで、他のサーバーのカスタム絵文字を自分の思い通りの画像で上書きできるサーバーA、B、Cがあり、AがCに自分のカスタム絵文字を送信した。
サーバーBは、自分のサーバーのカスタム絵文字にAの
domain
を指定して送信する。するとCは、Bのカスタム絵文字の画像をAのものと認識して扱ってしまう。その結果、Cはスタンプの画像が置き換わるなどの影響を受ける
例として、攻撃者はカスタム絵文字の画像を不快なもの、スパムなどに差し替えることが可能であるだけでなく、その責任を自分以外のドメインに押し付けることが可能である。
画像の差し替えだけなら今回の脆弱性がなくても可能だが、今回は『他の正常なサーバーの特に問題なく広く使われているカスタム絵文字を上書きすることが可能である』『攻撃者はこの画像の差し替えをほぼ匿名的に行うことができる』点を重視した。これらは連合に混乱をきたしかねず、本来不要なドメインブロックを生み出すリスクがある点で影響はある。
当面の間の対策として、
domain
プロパティを削除する。WEB_DOMAIN
対応が削除されるが、セキュリティのためなら仕方ない。後日別案を検討する。リスク2
今年2月のスタンプ仕様実装当初からあったと思われる問題で、他のサーバーのスタンプに相乗りしたものを受け入れるため、カスタム絵文字のドメイン抽出に
uri
を利用しているが、このドメインは認証されない。そのため、攻撃者はリスク1と同様、他のサーバーのカスタム絵文字を自分の思い通りの画像で上書きできる対策として、新規のカスタム絵文字を認証した場合/既存のカスタム絵文字を上書きする必要があると判断した場合、かつスタンプを付けたアカウントのドメインとカスタム絵文字から抽出したドメインが異なる場合、
uri
をフェッチしてそこのJSON情報と矛盾がないかを確認する。Patches
なし
Workarounds
なし
References
リスク1
mastodon/app/lib/activitypub/activity/like.rb
Line 105 in 243f1db
リスク2
mastodon/app/lib/activitypub/activity/like.rb
Lines 105 to 122 in 243f1db