徳丸氏は「伊織ネットショップの手口がこれかどうかは分からない」と前置きした上で、Webアプリケーションセキュリティの改善活動を行う非営利団体「The Open Web Application Security Project」(OWASP)が発行した「OWASP Top 10 2017」で、Webアプリケーションの重大リスクに挙げられた「安全でないデシリアライゼーション」(CWE-502)を用いる方法を説明する。
安全でないデシリアライゼーションとは、シリアライズ化(直列化)されたオブジェクトの復元処理(デシリアライズ)における脆弱性のことだ。外部から受け取ったクッキーやセッション変数など任意のオブジェクトを、デシリアライズ関数を用いて復元するようなコードがあった際に、攻撃者が任意のコードを実行できる恐れがある。
「PHPのようなオブジェクト指向言語では、メモリ内にさまざまなオブジェクトが生成される。複雑なデータ構造をデータベースなどに保存する場合、データ構造はシリアライズ関数(serialize)を用いて直列化し、保存されたデータを復元(unserialize)する。どういったオブジェクト(クラス)が生成されるかは、保存されたシリアライズデータに依存するため、最悪の場合、攻撃者が仕込んだプログラムが実行される恐れがある」
デモでは、クッキーを受け取る際にデシリアライズするようなECサイトを用意し、「Web経由でサーバコマンドを実行できる『Webshell』を外部からダウンロードする処理」をシリアライズ化してクッキーで送信。クラス実行終了時に呼び出されるデストラクタ関数を介して、その処理を実行させ、WebShellからECサイトサーバ内にあるトランザクションログを出力して、カード情報を盗めることを確認した。
「WebShellのようなバックドアを追加すれば、Web経由でコマンドを実行してサーバ内のファイルを探索し、カード情報を含む重要な情報を盗むことができる。また、カード情報が保存されていないサーバだとしても、今回説明した手口を利用すれば、攻撃者が所有するドメインにリダイレクトする決済画面を追加できる。また、カード情報を入力すると『エラーです』と表示され、次に本物の決済画面が表示される仕組みにすれば、改ざんしたことを検知されづらいようにもできる」
徳丸氏は、安全でないデシリアライゼーションの対策方法とまとめを述べて、説明を終えた。
「PHPを利用するアプリケーションにおける『安全でないデシリアライゼーション』の対策は、外部から受け取るデータをserialize/unserialize関数ではなく、json_encode/json_decode関数で処理することだ。カード情報保護対策の一つに、カード情報を保存させない非保持化があることは確かだが、アプリケーションに脆弱性があれば、カード情報を盗まれてしまう。カード情報の非保持化にも取り組むべきだが、まず、カード情報を盗まれないために、アプリケーションに脆弱性を残さないという基本的なセキュリティ施策が求められるだろう」
Copyright © ITmedia, Inc. All Rights Reserved.