satto1237’s diary

satto1237’s diary

ラーメンとかCTFとかセキュリティとか

Drupalの脆弱性 (CVE-2019-6340) を検証してみた話

はじめに

TLでDrupal脆弱性 (CVE-2019-6340) が話題になっていたので検証してみました.

www.jpcert.or.jp

脆弱性の概要

www.drupal.orgによると一部のフィールドタイプがフォーム以外からのデータを正しくサニタイズしないため,RESTful Web Servicesなどの REST API を利用するモジュールを有効としている場合に任意のPHPコードを実行される可能性があるとのことです.

脆弱性の影響を受ける環境

脆弱性の影響を受ける可能性がある環境は以下の通りです.

脆弱性を利用した攻撃の検証

検証環境の準備

Drupal 8.6.9 に対して検証を行うためにDockerを利用しました.

Docker HubDrupalのイメージがあるので検証環境の準備は簡単です.

hub.docker.com

以下のコマンドを実行すると

> docker run --name drupal_service -p 8080:80 -d drupal:8.6.9

http://localhost:8080/に以下のような画面が表示されます.

f:id:satto1237:20190227012444p:plain

English -> [Save and continue] -> Standard -> [Save and continue] -> SQLite -> [Save and continue] のように遷移するとインストールが始まります.

インストールが終わるとサイトの環境設定を求められるので適当に設定します.

f:id:satto1237:20190227013329p:plain

設定が完了するとトップ画面が立ち上がります.

f:id:satto1237:20190227013558p:plain

次にRESTful Web Servicesの設定を行います (デフォルトでは有効になっていないので).

Manage -> Extend -> WEB SERVICES と遷移し,設定を全て有効にします.

f:id:satto1237:20190227014438p:plain

次にコンテンツの追加を行います.

Manage -> Content -> Add Content と遷移し,コンテンツの追加を行います.

コンテンツの追加に成功するとhttp://localhost:8080/node/1にページが生成されます.

f:id:satto1237:20190227015200p:plain

以上で検証環境の準備は終わりです.

攻撃手法

www.ambionics.io

上記のサイトによると Drupal 8.6.9 と 8.6.10を比較した際にRESTモジュールでFieldItemNormalizer.phpが新しいトレイトとしてSerializedColumnNormalizerTrait.phpを使用していることが分かるとのことです.

github.com

github.com

この新しいトレイトではcheckForSerializedStrings()メソッドを提供しています.
checkForSerializedStrings()メソッドは名前の通り,チェック対象にシリアライズされた文字列が格納されている場合に例外を投げるメソッドです.

この修正内容からパッチ適用前のDrupalではシリアライズされた文字列に対してサニタイズが行われていないため,RCEが可能になっていると推測することができます.
そのため,checkForSerializedStrings()メソッドが適用されているフィールドを特定し,PHPGGCを使用してペイロードを作成すれば攻撃が可能になります.

検証結果

以下がPHPsystem()を噛ませたペイロードを作成し,OSコマンドを実行している例です.

f:id:satto1237:20190227145220p:plain

f:id:satto1237:20190227145236p:plain

f:id:satto1237:20190227145254p:plain

キャッシュチェック(X-Drupal-Cache)で弾かれたノードはスキップしています.

脆弱性に対する対策

脆弱性修正済みバージョンのDrupalが公開されているのでアップデートを適用することで対策が可能になります.

まとめ

  • docker便利
  • PHPGGC便利
  • Drupalは早めにアップデートしましょう