Skip to content

スタンプを利用することで、他のサーバーのカスタム絵文字の画像やライセンス情報などを上書きできる2つのリスク

Moderate
kmycode published GHSA-c7p6-c688-fhgp Oct 25, 2023

Package

No package listed

Affected versions

earlier than 1.0
5.4-lts, 7.0

Patched versions

5.7-lts, 8.0
5.7-lts, 8.0

Description

リスク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(

Severity

Moderate

CVSS overall score

This score calculates overall vulnerability severity from 0 to 10 and is based on the Common Vulnerability Scoring System (CVSS).
/ 10

CVSS v3 base metrics

Attack vector
Network
Attack complexity
Low
Privileges required
None
User interaction
None
Scope
Unchanged
Confidentiality
None
Integrity
Low
Availability
Low

CVSS v3 base metrics

Attack vector: More severe the more the remote (logically and physically) an attacker can be in order to exploit the vulnerability.
Attack complexity: More severe for the least complex attacks.
Privileges required: More severe if no privileges are required.
User interaction: More severe when no user interaction is required.
Scope: More severe when a scope change occurs, e.g. one vulnerable component impacts resources in components beyond its security scope.
Confidentiality: More severe when loss of data confidentiality is highest, measuring the level of data access available to an unauthorized user.
Integrity: More severe when loss of data integrity is the highest, measuring the consequence of data modification possible by an unauthorized user.
Availability: More severe when the loss of impacted component availability is highest.
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L

CVE ID

No known CVE

Weaknesses

No CWEs