2016年12月21日よりQuick Homepage Maker(以下QHM)を使って作成されたウェブサイトが相次いで改竄される事件が発生しました。弊社ではQHMを入手できない状況の中、様々な推定をしてきましたが、この度、検証環境を作成することが出来たことと、修正版がリリースされていることが確認できたことにより情報公開を行うことにしました。
改竄に利用された脆弱性は以下の二件になります。
- アクセス制御不備の脆弱性
- 任意のファイルをアップロードできる脆弱性
まずは、画面を見ていただきましょう。
QHMのトップページです。便宜上、ログインした状態になっています。
アップロードされたファイルの状況です。
アップロードされたWebShellを実行した画面です。
悪意のコードが含まれたファイルを実行した画面です。本来であれば、この位置にはファイルを配置できないのですが、WebShellのおかげで配置できています。実際に改竄されたサイトでも、このようなファイルの配置をされていました。
今回修正されたポイントは3ヶ所になります。差分を掲載しますと、
swfu/upload.php
13,14c13,27 < if (!isset($_FILES["Filedata"]) < || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) --- > if ( ! isset($_SESSION['usr'])) { > header('HTTP/1.1 403 Forbidden'); > exit(0); > } > > $upload_name = $_FILES['Filedata']['name']; > > // ファイルをチェックする。スクリプトを実行可能なファイルは許可しない > if ( ! is_valid_file_for_upload($upload_name)) { > header('HTTP/1.1 400 Bad Request'); > exit(0); > } > > if (!isset($_FILES["Filedata"]) > || !is_uploaded_file($_FILES["Filedata"]["tmp_name"]) 22,23d34 < < $upload_name = $_FILES['Filedata']['name'];
swfu/upload2.php
49a50,56 > // ファイルをチェックする。スクリプトを実行可能なファイルは許可しない > if ( ! is_valid_file_for_upload($upload_name)) { > header('HTTP/1.1 400 Bad Request'); > echo 'Cannot upload script file'; > exit(0); > } >
swfu/config.php
549a550,571 > if ( ! function_exists('get_extension_blacklist')) { > /* > * PHP, CGI, Pearl スクリプトはアップロード許可しない > */ > function get_extension_blacklist() > { > return array( > 'php', 'cgi', 'pl' > ); > } > } > > if ( ! function_exists('is_valid_file_for_upload')) { > /* > * アップロードしても良いファイルかどうか判別する > */ > function is_valid_file_for_upload($filename) > { > return ! in_array(pathinfo($filename, PATHINFO_EXTENSION), get_extension_blacklist()); > } > } >
になります。upload.phpはアクセス制御不備の脆弱性と任意のファイルをアップロードできる脆弱性の修正。upload2.phpとconfig.phpは任意のファイルをアップロードできる脆弱性の修正となります。
これらの修正点からも判る通り、今回の改竄は悪意の第三者がupload.phpを使ってWebShellや改竄ファイルをアップロードし、任意の位置にファイルを配置したと推測できます。
脆弱性は現在の最新版(6.0.8)以前のすべてのバージョンに存在しているため、最新版へのアップデートが推奨されます。
ちなみにQHMではファイルのアップロードにSWFUploaderを使っているのですが、このプログラムには任意のファイルをアップロードできる脆弱性が2011年2月7日に報告されています。しかしながらQHM側では何故か対策をされていませんでした。メンテナンスにマメではない会社・個人が作成したプログラムは、こういったことが発生しがちですので注意が必要です。
なお、今回の検証作業につきましては夜猫(@night1ynx)様からも情報を頂きまして実施しております。