PHP Object Injection

ほぼこもセキュリティニュース By Terilogy Worx

PHP Object Injectionは、文字通りPHPのオブジェクトを挿入できてしまうという攻撃手法です。

現在いろいろなコンテンツ管理システムが利用されています。
そのなかのシェアが大きなもののひとつにWordPressがあります。
このWordPressが広く使われていることの理由の一つに、プラグインが豊富で期待する機能を実現しやすいという点があります。

広く利用されているWordPressのプラグインの一つであるGravity Formsに、脆弱性が見つかっています。
CVE-2023-28782として追跡されています。
この脆弱性はどのようなものなのでしょうか。

  • Gravity Formsの古いバージョンで入力フォームを作成する
    入力フォームはリストフィールドを含む状態になっているとします。
  • 攻撃者は入力フォームにデータを入力し、フォームを送信する
  • 攻撃が完了する

これだけで攻撃が成り立ちます。

CVE-2023-28782の脆弱性の解消されていないGravity Formsではmaybe_unserialize関数が利用されています。
このmaybe_unserialize関数に渡す値が十分に入力チェックされていない場合、攻撃が可能となってしまいます。
maybe_unserializeはWordPressに用意された機能で、データのシリアライズを可能にします。
もともとは複数のデータを1つのレコードとしてDBに保存できるようにすることでDBのアクセス負荷を抑えることに利用できることなどを目指して実装されている機能です。
認証されていないユーザーがアドホックにシリアル化された文字列を脆弱なシリアル化解除呼び出し(これがmaybe_unserializeです)に渡す可能性があり、その結果、アプリケーションスコープに任意のPHPオブジェクトが挿入される可能性があります。

この脆弱性が悪用されると最終的には任意のファイルアクセスや変更、ユーザー/メンバーデータの漏洩、任意のコードの実行などが行われる可能性があります。

Gravity Formsプラグインの2.74以降を使用することでこの脆弱性は解消されています。

この例ではPHP環境で実現されるWordPressのある特定のプラグインのお話でした。
しかしユーザの入力した値をチェックすることの重要性はこの範囲にとどまりません。
どんな環境のどんなアプリケーションでも入力値のチェックは重要です。

自分が作るアプリケーションやフォームでは入力チェックは十分に行うように再度意識しようと思います。
自分で作っていないアプリケーションやプラグインを利用する場合には日々更新しながら利用するように徹底していこうと思います。
こういった活動が自衛として機能すると信じて。

参考記事(外部リンク):Unauthenticated PHP Object Injection in Gravity Forms Plugin
<= 2.7.3

patchstack.com/articles/unauthenticated-php-object-injection-in-gravity-forms-plugin/