はじめに
「Merry Maker」 とは
「Merry Maker」は、Webサイトに仕込まれたWebスキマー(クレジットカード情報や認証情報を盗む悪意あるスクリプト)を検出するツールです。
米国の大手百貨店Target社のセキュリティエンジニアによって開発されており、GitHub上で公開されています。
(WikiによるとTarget社は2013年11月に7,000万人規模の顧客情報の流出を経験しているようです)
tech.target.com
ソースコードはこちらです。
target/mmk-ui-api: UI, API, and Scanner (Rules Engine) services for Merry Maker
ざっくりと説明
- 監視対象のWebサイトをクローリングすることでWebスキマーを検出
- クローリングは Puppeteer (Node.js) で記述 (クローリングが柔軟。でも少し知識が必要)
- ログイン処理を記述することでログイン後画面も監視可能
- 検出条件は yaraルールで記述
環境構築
Merry Maker を起動
Dockerファイルが提供されており、簡単に試すことができます。
執筆時点の最新版( 2022/04/22更新 コミットID ef57040e9cfabcb1ece2eaa118152ea57c632637
)を利用しています。
$ docker compose -f docker-compose.all.yml up
Merry Maker の起動後「http://127.0.0.1:8080/
」にアクセスするとダッシュボードが表示されます。
初期アクセス時には認証情報を設定する必要があります。
ログイン後に監視サイトの追加などの設定ができる画面が表示されます。
サイドバーから各種設定ができる画面に遷移できるようになっています。
監視対象(EC-CUBE)を構築
次に本記事で利用する監視対象サイトを構築します。
EC向けCMSである EC-CUBE を監視対象にします。
EC-CUBE は以下のリポジトリから取得できます。 バージョンは特に指定ありませんが 4.0.5 を使っています。
EC-CUBE/ec-cube at 4.0.5
こちらもDocker で起動します。
$ docker-compose up
起動後、DBの接続設定やサイトの情報を入力を終えると、EC-CUBEのトップページが表示されます。
管理画面から会員登録をします。後々ログイン後画面を監視するのに利用します。
Webスキマーの検知設定
ではサイトを監視するための設定作業を行なってきます。
本記事では初めに「トップページを監視」の設定を行い、その次にログイン処理などの設定が必要な「ログイン後ページ(購入確認) を監視」の設定を行なっていきます。
監視の設定入門
Merry Maker は監視対象サイトに対してクローリングを実施し、HTMLやJavaScriptファイルにWebスキマーが埋め込まれていないかを検査していきます。
クローリングは Puppeteer (Headless Chrome Node.js API) が動作するようになっており、 Node.js で画面の遷移方法やログイン処理などを記述していきます。
Webスキマーはyaraルールに従って検知されるようになっています。
ケース1:トップページを監視
手始めにトップページだけを監視する設定をしてみます。
"Sources" で遷移内容を設定
"Sources"画面ではWebサイトのクローリング内容を設定します。
Name項目には Source の識別子を適当に記述します。今回は shop 1
とします。
Source項目には Puppeteer の書き方でクローリング内容を記述します。
今回はトップ画面だけを監視するため、トップ画面にアクセスする一行だけの記述で動作します。
"Sites"で監視間隔を設定
"Sites"画面ではクローリング間隔を設定することができます。
今回は検証なので最短の5分間隔でクローリングを行うように設定します。
この画面で"Source"(クローリング内容)も設定する必要があるため、先ほど作成した shop 1
を設定します。
監視結果を確認 (検知なし)
"Alerts"に何も表示されていない。
Webスキマー(マルウェア)を埋め込む
検知の検証には本物のWebスキマーを利用せずに、yaraルールに引っかかる文字列(検知文字列)をWebサイトに埋め込んで検証をしていきます。
digital_skimmer_slowaes
ルールの検知文字列をWebサイトに埋め込みます。
EC-CUBEの管理画面からJavaScriptを編集して、検知文字列が出力されるようにします。
編集後、customize.js
に検知文字列が記述されていることが確認できます。
監視結果を確認 (検知あり)
検知文字列の設定後、クローリングが完了するとアラートが表示されます。
Merry Maker のダッシュボードから確認することができます。
"Alerts"画面からWebスキマーが検知されたJavaScriptファイル名を確認することができます。
ケース2:ログイン後ページ(購入確認) を監視
次は「ご注文内容のご確認」画面にWebスキマーを埋め込んで検知されることを確認していきます。
この画面は注文完了の直前の画面であり、遷移するにはログインする必要があります。
クローリングを簡潔にするため、カートに商品を入れた状態にしておきます。以下の画面が監視対象です。
Webスキマー(マルウェア)を埋め込む
digital_skimmer_gibberish
ルールの検知文字列をWebサイトに埋め込みます。
以下の条件に該当する文字列をサイトに埋め込みます。
「ご注文内容のご確認」のHTMLに検知文字列が表示されていることが確認できました。
"Sources" で遷移内容を設定
遷移内容を記述します。
ログインとリンク遷移の処理を記述する必要があります。
全スクリプトの内容は以下のようになります。
HTMLを監視するためにはhtmlSnapshot
関数を利用する必要があります。
監視結果を確認 (検知あり)
Alertsログに「digital_skimmer_gibberish hit
」があり、無事検知することができました。
文字化けしていますが、画面キャプチャを取得することも可能です。
まとめ
2022年2月に公開されたソフトウェアあり、まだ実績などの効果は不明ですが、ECサイトを運営しておりWebスキマーを検出する仕組みを取り入れていない方は使ってみてはいかがでしょうか。