webサーバー上でlaravelを動かしていれば、ちょっとした設定のミスで誰でもマルウェアに感染する可能性がある激ヤバセキュリティホール(CVE-2021-3129)が2021年1月20日に報告されています!
- composerでインストールしたパッケージをバージョンアップせずに使っていませんか?
- インターネット上に公開されているサーバー、特にステージングや開発環境でDEBUG=ONにしていませんか?
- エラー画面がこんな風に見えますか?
この3つの条件を満たしていると、あなたのlaravelは、今すぐにでもマルウェアに感染する可能性があります。
laravelの脆弱性をついたkinsing(kdevtmpfsi)というマルウェアに感染した話
「何もしてないのにLaravelが乗っ取られてました」
自分が運用しているサービスでは、laravelが500エラーを出すと、Slackに通知が来るようになっていますが・・
ある日の夕方、不思議なエラーが発生していました。
Message
file_get_contents(aa): failed to open stream: No such file or...
おかしい、今のサービスではfile_get_contentsなんて使っていないし、(aa)という引数が入っている。
詳細メッセージには
file_get_contents(=50=00=44=00=39=00=77=00=61=00=48=00=41=00=67=00=58=00=31=00=39=00=49=00=51=00=55=00=78=00=55=00=58=00=30=00=4E=00=50=00=54=00=56=00=42=00=4A=00=54=00=45=00=56=00=53=00=4B=00=43=00=6B=00=37=00=49=00=44=00=38以下略
という、長い文字列が渡されている・・・。
バッファーオーバーフロー攻撃か何かかな・・?と思っていた。
追加でこんなエラーも出現。
file_put_contents(phar://../storage/logs/laravel.log/test.txt): failed to open stream: phar error: write operations disabled by the php.ini setting phar.readonly
file_put_contents(): iconv stream filter ("utf-8"=>"utf-16le"): invalid multibyte sequence
webサーバーのログ
IPアドレスはロシアのものなので、完全になにかの攻撃であることは確定。
82.114.253.13 - - [06/Apr/2021:07:59:30 +0000] "POST /_ignition/execute-solution HTTP/1.1" 500 579068 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" "-"
/_ignition/execute-solutionってなんだろう?もちろんそんなrouteは設定していない。
などと思っていると。。。
突然CPUが100%(High Load Avarage)になっているというエラーメールが来た。
上記のエラー通知の3分後、CPU使いすぎエラーメールが到着。LoadAvarageが突然、爆上がりしているではないか。
これはなにかおかしいぞと思い、サーバーへログインしてtopを叩いてみると不審なプロセス(kdevtmpfsi)がCPUを専有
top - 17:13:20 up 284 days, 6:28, 1 user, load average: 2.04, 1.82, 1.14
Tasks: 124 total, 1 running, 82 sleeping, 0 stopped, 0 zombie
%Cpu(s): 96.8 us, 3.2 sy, 0.0 ni, 0.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 8086200 total, 241676 free, 3053112 used, 4791412 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 4825448 avail Mem
Change delay from 3.0 to u
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1318 33 20 0 2721420 2.3g 2776 S 193.8 29.7 7:05.83 kdevtmpfsi
23652 root 20 0 2001680 117400 63728 S 6.2 1.5 44:04.25 agent
1 root 20 0 125680 5712 4036 S 0.0 0.1 44:40.70 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:07.21 kthreadd
なんかいるうううううう!!!
てめぇなんだぁ?と思ってプロセス名[kdevtmpfsi]を検索すると・・・
仮想通貨マイニングマルウェアじゃねーか!!!
なんで!?ワイのセキュリティは完璧なはずなのに!?どっから感染したんや???
と思って最初はサーバーのログイン履歴やログを見てもそれらしき形跡はなし・・・
そういえば・・・さっきのlaravelのログ・・・あれはもしや・・・
と思って[laravel kdevtmpfsi]で検索すると・・・
LARAVEL <= V8.4.2 DEBUG MODE: REMOTE CODE EXECUTION
https://www.ambionics.io/blog/laravel-debug-rce
https://github.com/laravel/framework/issues/35880
対策を急いでたので細かく読んでいる暇はなかったのですが、laravel導入時についてくることがあるパッケージのIgnitionの脆弱性が原因のようです。
REMOTE CODE EXECUTIONって!!!
- Ignition <= 2.5.1
- Laravel <= 8.4.2 ※これほとんどだよね
- DEBUG_MODE = ON
の条件を満たすと(開発環境ってほぼこの構成では・・・)リモートから**(どこの御サーバーでも空いておりますHTTP/HTTPSポート経由でPOSTを叩くだけで!!!)**任意のコードが実行されてしまうという超ウルトラやべぇセキュリティホールです!!
http/httpsポートは80/443でなくても、laravelにつながっているのであれば3000や8000などでも同じことです。
対処方法はDEBUGオフ、composerパッケージのバージョンアップとマルウェアの削除
このkdevtmpfsiというプロセスは殺しても殺しても何度でも復活するので、まずは原因となったlaravelの入っているdockerごとprocessを止めます。
# sudo service docker stop
マルウェアの削除方法
簡単で対象ファイルを検索して削除するだけでOK
# find / -name kdevtmpfsi
/var/lib/docker/overlay2/afab93b1a...74902e08061140e/diff/tmp/kdevtmpfsi
/var/lib/docker/overlay2/afab93b1...a1eb129902e08061140e/merged/tmp/kdevtmpfsi
# find / -name kinsing
/var/lib/docker/overlay2/afab93b1a2...742e08061140e/diff/tmp/kinsing
/var/lib/docker/overlay2/afab93...750902e08061140e/merged/tmp/kinsing
おるわおるわ。こいつらをサクッと削除。
しかし、脆弱性を埋めない限りまたこいつらは復活します。
脆弱性対策
試験的に運用していたため、本番サーバーでもDEBUGがオンのままになっておりました。これはお恥ずかしいポイントです。ここはコソッと直しておいて、composer updateでパッケージのバージョンアップを行いましょう。
一応、ignitionのバージョン確認。。。2.3.7 はいアウトー!
# composer show -i | grep ignition
You are using the deprecated option "installed". Only installed packages are shown by default now. The --all option can be used to show all packages.
facade/ignition 2.3.7 A beautiful error page for Laravel applications.
facade/ignition-contracts 1.0.1 Solution contracts for Ignition
これ半年ぐらい前に立ち上げた環境だから、ignitionが入っているlaravelの開発環境はほとんど該当するんじゃないんですかね。。。
composer updateを実行。
# COMPOSER_MEMORY_LIMIT=-1 $(which composer) update
念の為再度バージョン確認。
# composer show -i | grep ignition
facade/ignition 2.7.0 A beautiful error page for Laravel applications.
facade/ignition-contracts 1.0.2 Solution contracts for Ignition
※ 環境によっては2.5.2になることもあるようです。
ignitionパッケージを最新版になりましたら、念の為dockerプロセスとコンテナを再起動。
感染経路によってはcrontabも汚染されていることも
うちの環境では大丈夫だったのですが、感染経路によってはcrontabが汚染されておりマルウェアを再ダウンロードするように設定されていることもあるそうです。
以下のコードで全ユーザーのcrontabを確認
# for user in $(cut -f1 -d: /etc/passwd); do echo $user; crontab -u $user -l; done
しばらく様子を見て、再感染・マルウェアの起動がされてないことを確認。
docker api経由で感染することもある
docker apiポートを開けていると感染することもあるようです。。
laravelの設定を念のため今一度確認することをおすすめします
laravelを使っているwebサービスは数多くあり、composerパッケージのバージョンアップを行わないままの古い状態のまま使われているサービスは多数あります。
ここに、何らかの都合でDEBUG=ONにするだけで、このマルウェアに感染する条件が成立してしまいます。
また、このセキュリティホールは「ホストで任意のコードを実行できる」なので、仮想通貨をマイニングされるだけでなく、個人情報の流出など大変な情報漏えいに繋がる恐れもあります。
このセキュリティリスクを見つけるのは簡単です、以下のコマンドでignitionがインストールされているか、バージョンを調べてください。Ignition <= 2.5.1 (そんな古くないですよ)なら脆弱性があります。
composer show -i | grep ignition
合わせてDEBUG設定も、念の為、確認してみてください。
本番環境には通常入れないパッケージでDEBUGもオンにすることはありませんが、本番環境のつもりがうっかりデバッグ構成のまま動いていた(正常動作は変わらないので気が付かなかった…)とか。。。
デバッグ環境として使われる開発サーバーやステージングサーバーのIPアドレス制限を外している場合(制限しているつもりだった、もよくある事です)は要注意です。
今一度、設定の確認を。
この脆弱性はlaravelがインターネット上に公開されていればステージングサーバーや開発サーバーでも攻撃対象になりえます。極端な話、オフィスのローカル環境でも通信が通れば攻撃が成功します。
セキュリティ脆弱性は「そんなまさか」「自分はキチンとしている」「出来てるつもりだった」が狙われやすいポイントです。
本記事が皆様のセキュリティ対策になればと思います!
参考文献
https://jslim.net/blog/2021/02/25/AWS-EC2-instance-used-up-CPU-100-Malware-kdevtmpfsi/
https://qiita.com/yhishi/items/63543ebaf0fe09c2fa4b
https://qiita.com/funtip-inc/items/e416ba401d3cc7ac55cc
公開サーバーでDEBUG=ONにすることなんか無いだろ、というご意見
そのとおりです・・・
通常は…デバックモードは…開発環境でのみ…使います
だから…自分の公開サーバーの設定は…
絶対に…絶対に…デバックモードではないと
絶対に…そんなことはないと…言い切れますか・・
セキュリティ脆弱性とは・・・
そういうところを…狙ってくるのです・・・
(追記)CVE-2021-3129の脆弱性評価について
このセキュリティ脆弱性についての評価は、以下のようになっております。
Laravelで運用しているサービスがあるのであれば、潜在的なリスクを抱えていないか
すぐにセキュリティチェックを行うべき内容ではないでしょうか?
評価報告書の読み方
https://www.ipa.go.jp/security/vuln/CVSSv3.html
脆弱性スコア : 9.8 CRITICAL
攻撃元区分(AV:Attack Vector):
ネットワーク経由でリモートから攻撃可能
攻撃条件の複雑さ(AC:Attack Complexity):
特別な攻撃条件を必要としない
必要な特権レベル(PR:Privileges Required):
不要(N) 特別な権限を有する必要はない。
ユーザ関与レベル(UI:User Interaction):
不要(N) ユーザが何もしなくても脆弱性が攻撃される可能性がある。
スコープ(S:Scope):
変更なし(U) 影響範囲が脆弱性のあるコンポーネントの帰属するオーソリゼーションスコープに留まる。
機密性への影響(情報漏えいの可能性、C:Confidentiality Impact):
高(H) 情報や重要なシステムファイルが参照可能であり、その問題による影響が全体に及ぶ。
完全性への影響(情報改ざんの可能性、I:Integrity Impact):
高(H)機密情報や重要なシステムファイルの改ざんが可能で、その問題による影響が全体に及ぶ。
可用性への影響(業務停止の可能性、A:Availability Impact):
高(H)リソース(ネットワーク帯域、プロセッサ処理、ディスクスペースなど)を完全に枯渇させたり、完全に停止させることが可能である。