攻撃者は、組織がSalesforce Experience CloudサイトやServiceNowのService Portal上で、デフォルトの**ゲストユーザー(匿名アクセス)**に対して公開設定にしてしまったデータを、そのまま利用しているのです。
Recoは、このキャンペーンを、攻撃者のインフラに使われていたドメイン city-forum.com にちなんで「City-Forum」と命名しました。少なくとも2025年3月以降、ドイツのホスティングプロバイダContaboでレンタルされた1台のサーバーが、世界中の通信事業者、銀行、金融サービス企業、エンタープライズソフトウェアベンダー、公共部門のポータルから、組織的にデータを収集しています。
SalesforceとServiceNowの両プラットフォームには、認証されていない訪問者用の永続的なゲストユーザーアカウントが標準で備わっています。このゲストユーザーは削除できません。各組織がその権限—どのレコードやオブジェクトを読み取り可能にするか—を設定する仕組みです。ゲストプロファイルが特定のレコードへの読み取りアクセスを持っている場合、インターネット上の誰もが、完全に正当なAPIエンドポイントを通じてそのデータを取得できてしまいます。
Salesforce(Auraフレームワーク)の場合:
/aura または /s/sfsites/aura エンドポイントにPOSTリクエストを送信します。HostConfigController.getConfigData を呼び出し、ゲストがアクセス可能なオブジェクト(Account, Contact, Case, Lead, User, ContentDocumentなど)を列挙します。SelectableListDataProviderController.getItems を使用し、アクセス可能な各オブジェクトの全レコードをページングしながら取得します。Salesforce(LWRフレームワーク:Lightning Web Runtime)の場合:
POST /webruntime/api/services/data/{version}/graphql?asGuest=true のGraphQLエンドポイントを標的にします。まず EntityDefinition でスキーマを列挙し、その後カーソルベースのページネーションでレコードを読み取ります。ServiceNowの場合:
/api/now/sp/search エンドポイントを標的にします。これはService Portalの標準検索APIですが、ほとんど文書化されておらず、オンライン上のドキュメントや関連するオープンソースツールもほとんど存在しません。セルフ登録のプローブ(Salesforce):
/SiteRegister と /CommunitiesSelfReg を付加し、セルフ登録が有効かどうかをテストします。有効な場合、ゲストは認証済みの外部ユーザーに昇格でき、はるかに多くのデータにアクセスできるようになります。158.220.87.79(ドイツのホスティングプロバイダContaboのVPS)。ドメイン city-forum.com(2002年に登録され、その後放棄され、再利用されたドメイン)に解決されます。Go-http-client User-Agent文字列を使用するため、ログでの識別が容易です。Recoの報告によると、主な標的は以下の通りです。
ServiceNowの場合: プラットフォームのトランザクションログ(syslog_transaction)は、/api/now/sp/search リクエストのPOSTボディを記録しません。防御側は、自動化された検索が発生したことと、返されたデータのおおよその量(出力長列で確認)を知ることはできますが、正確な検索語や、どの特定のレコードが取得されたかは特定できません。
Salesforceの場合: ゲストの列挙トラフィックは、通常のサイトトラフィックと見分けがつかない、正当でプロトコルに準拠したAPI呼び出しです。イベントモニタリングは、ゲストユーザーからの AuraRequest や Sites イベントの量を示すことはできますが、GraphQLやAuraのレスポンスで返された具体的な内容までは記録しません。
つまり、攻撃者がいたことと、どれだけのデータを取得したかはわかっても、どのレコードやフィールドが抽出されたのかを正確に再構築することはできないのです。
sp_portal、m2m_sp_portal_search_source、sp_search_source テーブルを確認し、公開ポータルに不要な検索ソースをデタッチします。is_scripted_source、data_fetch_script、そしてACLを適用する GlideRecordSecure と適用しない GlideRecord のどちらを使用しているかを確認します。kb_uc_can_read_mtom リンクをデタッチする。USER_TYPE = 'Guest' からの getItems や getConfigData の高頻度な発生、/webruntime/.../vNN.0/graphql のバージョンスイープ、/SiteRegister や /CommunitiesSelfReg へのアクセスを監視します。syslog_transaction: ゲストとして行われた /api/now/sp/search リクエストを監視します。出力長でソートし、小さな空の結果ベースラインよりも著しく大きな行は、データが返された検索を示しています。攻撃者は、組織がSalesforce Experience CloudサイトやServiceNowのService Portal上で、デフォルトの**ゲストユーザー(匿名アクセス)**に対して公開設定にしてしまったデータを、そのまま利用しているのです。
Recoは、このキャンペーンを、攻撃者のインフラに使われていたドメイン city-forum.com にちなんで「City-Forum」と命名しました。少なくとも2025年3月以降、ドイツのホスティングプロバイダContaboでレンタルされた1台のサーバーが、世界中の通信事業者、銀行、金融サービス企業、エンタープライズソフトウェアベンダー、公共部門のポータルから、組織的にデータを収集しています。
SalesforceとServiceNowの両プラットフォームには、認証されていない訪問者用の永続的なゲストユーザーアカウントが標準で備わっています。このゲストユーザーは削除できません。各組織がその権限—どのレコードやオブジェクトを読み取り可能にするか—を設定する仕組みです。ゲストプロファイルが特定のレコードへの読み取りアクセスを持っている場合、インターネット上の誰もが、完全に正当なAPIエンドポイントを通じてそのデータを取得できてしまいます。
Salesforce(Auraフレームワーク)の場合:
/aura または /s/sfsites/aura エンドポイントにPOSTリクエストを送信します。HostConfigController.getConfigData を呼び出し、ゲストがアクセス可能なオブジェクト(Account, Contact, Case, Lead, User, ContentDocumentなど)を列挙します。SelectableListDataProviderController.getItems を使用し、アクセス可能な各オブジェクトの全レコードをページングしながら取得します。Salesforce(LWRフレームワーク:Lightning Web Runtime)の場合:
POST /webruntime/api/services/data/{version}/graphql?asGuest=true のGraphQLエンドポイントを標的にします。まず EntityDefinition でスキーマを列挙し、その後カーソルベースのページネーションでレコードを読み取ります。ServiceNowの場合:
/api/now/sp/search エンドポイントを標的にします。これはService Portalの標準検索APIですが、ほとんど文書化されておらず、オンライン上のドキュメントや関連するオープンソースツールもほとんど存在しません。セルフ登録のプローブ(Salesforce):
/SiteRegister と /CommunitiesSelfReg を付加し、セルフ登録が有効かどうかをテストします。有効な場合、ゲストは認証済みの外部ユーザーに昇格でき、はるかに多くのデータにアクセスできるようになります。158.220.87.79(ドイツのホスティングプロバイダContaboのVPS)。ドメイン city-forum.com(2002年に登録され、その後放棄され、再利用されたドメイン)に解決されます。Go-http-client User-Agent文字列を使用するため、ログでの識別が容易です。Recoの報告によると、主な標的は以下の通りです。
ServiceNowの場合: プラットフォームのトランザクションログ(syslog_transaction)は、/api/now/sp/search リクエストのPOSTボディを記録しません。防御側は、自動化された検索が発生したことと、返されたデータのおおよその量(出力長列で確認)を知ることはできますが、正確な検索語や、どの特定のレコードが取得されたかは特定できません。
Salesforceの場合: ゲストの列挙トラフィックは、通常のサイトトラフィックと見分けがつかない、正当でプロトコルに準拠したAPI呼び出しです。イベントモニタリングは、ゲストユーザーからの AuraRequest や Sites イベントの量を示すことはできますが、GraphQLやAuraのレスポンスで返された具体的な内容までは記録しません。
つまり、攻撃者がいたことと、どれだけのデータを取得したかはわかっても、どのレコードやフィールドが抽出されたのかを正確に再構築することはできないのです。
sp_portal、m2m_sp_portal_search_source、sp_search_source テーブルを確認し、公開ポータルに不要な検索ソースをデタッチします。is_scripted_source、data_fetch_script、そしてACLを適用する GlideRecordSecure と適用しない GlideRecord のどちらを使用しているかを確認します。kb_uc_can_read_mtom リンクをデタッチする。USER_TYPE = 'Guest' からの getItems や getConfigData の高頻度な発生、/webruntime/.../vNN.0/graphql のバージョンスイープ、/SiteRegister や /CommunitiesSelfReg へのアクセスを監視します。syslog_transaction: ゲストとして行われた /api/now/sp/search リクエストを監視します。出力長でソートし、小さな空の結果ベースラインよりも著しく大きな行は、データが返された検索を示しています。