LoginSignup
597
322

More than 3 years have passed since last update.

laravelのヤバい脆弱性をついたkinsing(kdevtmpfsi)というマルウェアに感染した話 CVE-2021-3129

Last updated at Posted at 2021-04-06

webサーバー上でlaravelを動かしていれば、ちょっとした設定のミスで誰でもマルウェアに感染する可能性がある激ヤバセキュリティホール(CVE-2021-3129)が2021年1月20日に報告されています!

  • composerでインストールしたパッケージをバージョンアップせずに使っていませんか?
  • インターネット上に公開されているサーバー、特にステージングや開発環境でDEBUG=ONにしていませんか?
  • エラー画面がこんな風に見えますか? 68747470733a2f2f6661636164652e6769746875622e696f2f69676e6974696f6e2f73637265656e73686f742e706e67.png

この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が突然、爆上がりしているではないか。

b0cd4d5f02acf7bebb93887e08acc7aeca59577a.png

これはなにかおかしいぞと思い、サーバーへログインして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)リソース(ネットワーク帯域、プロセッサ処理、ディスクスペースなど)を完全に枯渇させたり、完全に停止させることが可能である。

597
322
15

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
597
322