Drupalの脆弱性 (CVE-2019-6340) を検証してみた話
はじめに
TLでDrupalの脆弱性 (CVE-2019-6340) が話題になっていたので検証してみました.
本脆弱性の概要
www.drupal.orgによると一部のフィールドタイプがフォーム以外からのデータを正しくサニタイズしないため,RESTful Web Servicesなどの REST API を利用するモジュールを有効としている場合に任意のPHPコードを実行される可能性があるとのことです.
本脆弱性の影響を受ける環境
本脆弱性の影響を受ける可能性がある環境は以下の通りです.
本脆弱性を利用した攻撃の検証
検証環境の準備
Drupal 8.6.9 に対して検証を行うためにDocker
を利用しました.
Docker Hub
にDrupalのイメージがあるので検証環境の準備は簡単です.
以下のコマンドを実行すると
> docker run --name drupal_service -p 8080:80 -d drupal:8.6.9
http://localhost:8080/
に以下のような画面が表示されます.
English
-> [Save and continue]
-> Standard
-> [Save and continue]
-> SQLite
-> [Save and continue]
のように遷移するとインストールが始まります.
インストールが終わるとサイトの環境設定を求められるので適当に設定します.
設定が完了するとトップ画面が立ち上がります.
次にRESTful Web Servicesの設定を行います (デフォルトでは有効になっていないので).
Manage
-> Extend
-> WEB SERVICES
と遷移し,設定を全て有効にします.
次にコンテンツの追加を行います.
Manage
-> Content
-> Add Content
と遷移し,コンテンツの追加を行います.
コンテンツの追加に成功するとhttp://localhost:8080/node/1
にページが生成されます.
以上で検証環境の準備は終わりです.
攻撃手法
上記のサイトによると Drupal 8.6.9 と 8.6.10を比較した際にRESTモジュールでFieldItemNormalizer.php
が新しいトレイトとしてSerializedColumnNormalizerTrait.php
を使用していることが分かるとのことです.
この新しいトレイトではcheckForSerializedStrings()
メソッドを提供しています.
checkForSerializedStrings()
メソッドは名前の通り,チェック対象にシリアライズされた文字列が格納されている場合に例外を投げるメソッドです.
この修正内容からパッチ適用前のDrupalではシリアライズされた文字列に対してサニタイズが行われていないため,RCEが可能になっていると推測することができます.
そのため,checkForSerializedStrings()
メソッドが適用されているフィールドを特定し,PHPGGCを使用してペイロードを作成すれば攻撃が可能になります.
検証結果
以下がPHPのsystem()
を噛ませたペイロードを作成し,OSコマンドを実行している例です.
キャッシュチェック(X-Drupal-Cache
)で弾かれたノードはスキップしています.
本脆弱性に対する対策
脆弱性修正済みバージョンのDrupalが公開されているのでアップデートを適用することで対策が可能になります.
まとめ
- docker便利
- PHPGGC便利
- Drupalは早めにアップデートしましょう