LMDeployに認証不要のコマンド実行脆弱性、修正PRあり
InternLMのLMDeploy 0.9.0〜0.18.0で、認証なしのリクエストだけでサーバー上のOSコマンドを実行される脆弱性が公表されました。api_serverを動かしている組織は、公開範囲と版を確認し、修正の反映状況を調べてください。
急ぎ度: 早めに
CVSS v3は9.8、v4は9.3で、認証なしにネットワーク越しでコマンドを実行される脆弱性が公表されたばかりですが、修正を含む版はリリース情報で確認する必要があります。
関係があるか
LMDeployのapi_serverで大規模言語モデルを配信している組織が対象です。社内の検証用サーバーも、ほかの端末からネットワークで到達できれば当てはまります。
| 製品 | 影響を受ける版 | 修正版 |
|---|---|---|
| InternLM LMDeploy(lmdeploy) | 0.9.0以上0.18.0以下 | 修正のプルリクエストが公開されています。修正を含む版は、プロジェクトのリリース情報で確認してください。 |
確かめ方
- 1lmdeployを入れた環境で
pip show lmdeployを実行し、Versionが0.9.0〜0.18.0に入るか確認します。コンテナで動かしている場合は、イメージ内で同じコマンドを実行します。 - 2api_serverを起動しているホストを洗い出し、待ち受けているアドレスとポートを確認します。0.0.0.0で待ち受けていたり、ロードバランサーやリバースプロキシ経由で公開していたりしないか見てください。
- 3そのホストにどのネットワークから到達できるか、ファイアウォールやセキュリティグループの設定で確認します。認証を前段に置いていない場合は、到達できる範囲がそのまま影響範囲です。
何が起きたか
LMDeployのAPIサーバーに、ログインなしで外部から送り込んだデータによって、サーバー上のOSコマンドを実行できる脆弱性が見つかりました。コマンドはapi_serverプロセスと同じ権限で動きます。
問題があるのは、モデルの重みを更新する管理用エンドポイント/update_weightsです。受け取ったデータをPythonのpickle形式で復元する際に、中身を検証していません。pickleは復元の過程でコードを実行できる形式で、信頼できない入力に使うと任意のコード実行につながります(CWE-502)。
修正のプルリクエストはプロジェクトのリポジトリで公開されています。修正が入った版の番号は、リリース情報で確認してください。
攻撃の流れ
-
1
サーバーへ到達
api_serverにネットワークから接続できる位置を確保します。
-
2
管理APIへ送信
認証なしで`/update_weights`に細工したデータを送ります。
-
3
検証なしで復元
サーバーがデータを検証せずに復元し、中のコードが動きます。
-
4
OSコマンド実行
api_serverと同じ権限でコマンドが実行されます。
どう悪用されるか
悪用に必要なのは、api_serverにネットワーク経由で接続できることだけです。認証は要らず、操作が必要な利用者もいません。CVSSの評価でも、攻撃の複雑さは低く、権限も利用者の操作も不要とされています。
成功すると、api_serverを動かしているアカウントの権限でOSコマンドが実行されます。そのプロセスが読めるモデルファイルや環境変数、設定ファイルに入った鍵が盗まれたり、ファイルが書き換えられたり、サービスが止められたりするおそれがあります。GPUサーバーが社内の他のシステムとつながっていれば、そこを足がかりにされることも考えられます。
今すぐやること
-
1
版を確認する
lmdeployを使っているホストとコンテナをすべて洗い出し、版が0.9.0〜0.18.0に入るか確認します。開発者が個人で立てた検証機も忘れずに含めてください。
pip show lmdeploy -
2
公開範囲を絞る
更新の前に、api_serverへ到達できるネットワークを必要最小限にします。インターネットに直接出ている場合は、まずここから手を付けてください。
-
3
修正版に更新する
プロジェクトのリリース情報で、修正を含む版が出ているかを確認します。出ていれば更新して再起動し、更新後の版も確認してください。まだ出ていなければ、修正のプルリクエストの状況を見ながら、下の回避策でつなぎます。
-
4
侵害の跡を調べる
公開されていたサーバーでは、api_serverのアクセスログに
/update_weightsへの身に覚えのないリクエストがないか確認します。あわせて、api_serverから起動された見慣れない子プロセスや外部への通信がないかも見てください。 -
5
実行権限を絞る
api_serverは専用の一般ユーザーで動かし、読める鍵やファイルを必要なものだけにします。コンテナなら、ホストのファイルや認証情報をマウントしていないかも見直してください。
修正版がないあいだのつなぎ
修正版をすぐに入れられないときは、api_serverへの接続を、信頼できるアプリケーションサーバーなど必要なホストだけに限ります。リバースプロキシを置いているなら、/update_weightsへのリクエストを外部から遮断する設定も有効です。重みを外部から更新する運用をしていなければ、このパスは外部に出す必要がありません。ただし、これらは修正版までのつなぎです。
背景
LMDeployは、InternLMが公開している大規模言語モデルの推論・配信用ツールキットです。モデルを読み込んでAPIとして提供するapi_serverを持ち、社内のチャットボットや業務システムの裏側で動くことが多いソフトウェアです。GPUサーバー上で動き、高価な計算資源や学習済みモデル、外部サービスの鍵を扱うため、乗っ取られたときに失うものが大きくなります。
今回の/update_weightsは、動作中のサーバーのモデルの重みを入れ替える管理用の入口です。重みはテンソルという数値の塊で、受け渡しにPythonのpickleが使われています。Pythonの公式ドキュメントも、信頼できない出どころのデータをpickleで復元してはならないと警告しています。管理用の入口が認証なしで外から届く状態だったことが、今回の問題の核心です。
よくある質問
Q.社内ネットワークだけで使っているサーバーも対象ですか。
Q.0.9.0より前の版は安全ですか。
この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。
影響パッケージ
| 種類 | パッケージ | 影響を受ける版 | 修正版 |
|---|---|---|---|
| InternLM | lmdeploy |
0.9.0 〜 0.18.0 |
— |
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。
InternLM LMDeploy 0.9.0 through 0.18.0 contains an unauthenticated remote code execution vulnerability that allows remote attackers to run OS commands by sending pickled data to the /update_weights endpoint. Attackers can submit a base64-encoded crafted pickle in serialized_named_tensors, which ForkingPickler.loads deserializes without validation, executing commands as the api_server process.
出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory
参照URL
- advisory vulncheck.com
- advisory nvd.nist.gov
- advisory github.com
- package github.com
- patch github.com
- report github.com
- web github.com
- web github.com
- web github.com