MOVEit Transfer 2023年 ファイル転送の製品のSQLインジェクション

外に開いたファイル転送の製品に、ログイン無しで通るSQLインジェクションがあった。攻撃者はDBを読むだけでなく、ウェブシェルを置き、管理者を作り、預かったファイルとクラウドの鍵を持ち出した。直すのは命令文の作りで、修正の当て布のあとには、置かれた物と作られた物の掃除が要る。

CVE-2023-34362。CVSS 3.1 の基本値は9.8、CWE-89[3]。製品は Progress Software の MOVEit Transfer と、そのクラウド版の MOVEit Cloud[1]。開発元は2023年5月31日に修正版を出し、6月9日と6月15日に、別に見つかったSQLインジェクションの修正を重ねた[2][5][6]。2026年11月時点の公開資料で書いています。

要点

  • 弱点は、ログインの要らない画面の処理で値が命令文に入るSQLインジェクションだった。DBの中身を読み、書き換え、消せた[3]。
  • 攻撃者は、正規の画面に似せた名前のウェブシェルを置き、DBの一覧、ファイルの取り出し、管理者の作成と削除、Azure の保存先の鍵の取得をした[4]。
  • CISA は、悪用の始まりを2023年5月27日とする。開発元が顧客の電話で異常を知ったのは5月28日の夜で、修正版は5月31日に出た[4][1]。
  • 修正版を入れても、DBに作られた管理者は残る。開発元と CISA は、通信を止める、置かれた物と作られた管理者を消す、資格情報を替える、を当て布と組で求めた[2][4]。
  • 根本は、値を命令文と分けて渡す作りにある。外への公開を絞る、DBに置く秘密を減らす、ウェブの置き場の変化を見張る、は届いた後の被害を減らす。

何が起きたか

5月27日の悪用の始まりから、5月28日の通報、5月31日の修正版、6月7日の CISA と FBI の注意喚起、6月15日の3つ目の修正までの段 1 悪用 2023年5月27日から 修正の無い弱点を 外から突く 2 気付く 5月28日の夜 顧客から異常の 問い合わせ 3 直す 5月30日に告知 5月31日に修正版 クラウド版も再開 4 重ねて直す 6月9日と6月15日 同じ種類の弱点を さらに2つ修正 悪用の始まりから修正版まで4日。その間、外に開いた画面は守りが無かった 6月2日に CISA の悪用済みの一覧へ。6月7日に CISA と FBI の注意喚起
図1 悪用から修正の重ねまでの段
日付出来事
2023年5月27日CL0P と呼ばれるランサムウェアの集団が、知られていなかったSQLインジェクションの悪用を始める。CISA は公開の情報によるとして、この日を挙げる[4]
2023年5月28日 米東部の夜Progress の MOVEit の窓口に、顧客から MOVEit Transfer で異常な動きがあるという最初の問い合わせが入る。調査の班が知られていない弱点を見つける[1]
2023年5月30日Progress が MOVEit Transfer と MOVEit Cloud の全顧客へ、弱点とすぐ取る手当てを知らせる。MOVEit Cloud を調査のため止める[1]
2023年5月31日対応する全部の版の修正版を出し、同じ日に MOVEit Cloud を戻す[1]。手当ての手順の記事を公開する[2]
2023年6月2日CVE-2023-34362 が NVD に載る。CISA が悪用の確認された弱点の一覧に足し、連邦の機関に6月23日までの対応を求める[3]
2023年6月5日Progress が米証券取引委員会へ臨時の報告書を出す。MOVEit Transfer と MOVEit Cloud は年間の総収入の4%未満と書く[1]
2023年6月7日CISA と FBI が共同の注意喚起 AA23-158A を出す[4]
2023年6月9日外部と進めたコードの点検で見つかった別のSQLインジェクション CVE-2023-35036 の修正版を出し、MOVEit Cloud に当てる[5][6]
2023年6月15日さらに別のSQLインジェクション CVE-2023-35708 の修正を、手当ての記事に足す[2][7]
被害の数は公表資料に無い

影響を受けた組織と人の数として広く引かれる数字は、民間の集計によるもので、開発元と公的機関の発表には無い。CISA の注意喚起にある3,000を超える米国の組織、8,000の世界の組織という数字は、この集団が過去に侵害したと見積もられる数で、MOVEit の件の数ではない[4]。

通った道筋

外から認証の無い画面にSQLインジェクションを送り、DBに届き、ウェブの置き場にシェルを置き、それを通してDBの中身、ファイル、管理者、Azure の鍵に触れる 攻撃者 ログイン無し ファイル転送のサーバー。外に開いている ウェブの処理 値が命令文に入る 認証の前の処理 DB 利用者、ファイルの台帳 設定と保存先の鍵 置かれたシェル 正規に似た名前 管理者を作る DBに残る 持ち出し 預かったファイルと、DBの中身 Azure の保存先 鍵があれば届く
図2 外からの1つの要求から、預かったデータの持ち出しまで
段何があったか
入口MOVEit Transfer のウェブの処理にSQLインジェクションがあり、認証の無い攻撃者がDBに届いた。DBの種類によって、構造と中身を推し量り、要素を書き換えたり消したりする命令文を実行できた。HTTP と HTTPS のどちらからも突けた[3]。
足場LEMURLOOT と呼ばれる C# のウェブシェルが置かれた。最初は正規のファイルに似せた名前で見つかった。置かれると、自分の認証に使う36文字の合言葉を作った[4]。
中での操作シェルは、DBの一覧、名前を指定したファイルの取り出し、管理者の作成と削除、Azure の設定と保存先の口座、鍵、入れ物の取得ができた。作られた管理者には、点検の仕組みに見える表示名が付いていた[4]。
持ち出しMOVEit Transfer の下のDBからデータが盗まれた[4]。
直したあとも残る物

CISA は、ウェブのサーバーを作り直してもDBを残せば、作られた管理者が残るおそれがあると書き、DBで管理者の一覧を確かめるよう求めた[4]。弱点を塞ぐことと、入られた跡を消すことは別の作業になる。

どこで止められたか

命令文の作り、外への公開、置き場の書き込み、DBに置く秘密、見張り、修正のあとの掃除の6つの段に止める所を置く 命令文の作り 外への公開 置き場の書き込み DBに置く秘密 見張り 修正のあと 1 値を分けて渡す ここで止まれば、後の段は起きない 2 開く先を絞る 取引先の送信元か、VPN の先だけに見せる 3 ウェブの置き場に書かせない 動く処理の権限で、実行できる物を足せない 4 鍵をDBに置かない 保存先の鍵は短い期限の資格情報にする 5 増えた物と大きな取り出しを見る 新しいファイル、新しい管理者、量の多いダウンロード 6 当て布と掃除を組でする 遮る、消す、資格情報を替える、当てる、確かめる
図3 段ごとの止める所
止める所この件で限り
値を分けて渡す入口はSQLインジェクションで、6月にも同じ種類の弱点が2つ見つかった[3][6][7]。1か所でなく、命令文を組む箇所の全体の問題だった使う側は製品のコードを直せない。開発元を選ぶときに、こうした弱点の履歴と直す速さを見る
開く先を絞る開発元は、修正までの間、80番と443番への通信を防火壁で止めるよう求めた。止めても SFTP と FTP/S は使えた[2]取引先が多いと、送信元で絞り切れない。絞れない画面には、ログインの前に通る処理を減らす
ウェブの置き場に書かせないシェルはウェブの置き場に置かれた。開発元は、wwwroot と一時の置き場に新しいファイルが無いか見るよう求めた[2]製品が動く処理の権限は、製品の作りで決まる。使う側で変えられる範囲は限られる
鍵をDBに置かないシェルは Azure の保存先の鍵を取れた[4]。開発元は、Azure のログで鍵の読み出しを確かめ、触れられていれば鍵を替えるよう求めた[2]どこかに資格情報は要る。期限の短い資格情報と、使える範囲の狭い鍵にして、取られた時の幅を狭める
増えた物と大きな取り出しを見る開発元は、予想しない大きなダウンロードや、置かれたファイルへの要求をログで探すよう求めた[2]。最初に気付いたのは顧客だった[1]悪用の始まりから修正版まで4日あった。見張りは被害の幅を狭めるが、持ち出しそのものは止めにくい
当て布と掃除を組でする開発元の手順は、通信を遮る、置かれた物と作られた利用者を消す、資格情報を替える、当て布を当てる、確かめる、の順だった[2]DBを残して作り直すと、作られた管理者が残る[4]

守り方

根本の直し方
  • 命令文は固定し、値はプレースホルダーで別に渡す。表名、列名、並び順のような値として渡せない部分は、許可した一覧から選ぶ。作り方は A05 インジェクション のSQLインジェクションの節にある。
  • ログインの前に通る処理を最小にする。認証の前に動く処理は、外の誰からも突ける。命令文を組む箇所があれば、真っ先に点検する。
  • 1つ見つかったら、同じ型を全体で探す。この件では、最初の修正のあと2週間余りのうちに、同じ種類の弱点がさらに2つ見つかった[6][7]。
  • 外部とファイルをやり取りする仕組みは、機微なデータが集まる所として扱う。外に開くなら、送信元を絞り、預かる期間を短くし、終わったファイルを消す。

悪い例と直した例。架空のファイル転送の受け取りの確かめ

// 悪い例 ログイン前の処理で、受け取りの番号を命令文に連結する
const sql = "SELECT path FROM transfers WHERE ticket = '" + req.query.ticket + "'";
const rows = await db.query(sql);

// 直した例 命令文は固定し、値は別に渡す。形も先に確かめる
if (!/^[A-Z0-9]{16}$/.test(req.query.ticket)) return res.sendStatus(400);
const rows = await db.query("SELECT path FROM transfers WHERE ticket = $1", [req.query.ticket]);

形の確かめは緩和で、守りの本体はプレースホルダーにある。形を確かめても、命令文を連結していれば、形の確かめを通る値で崩れる箇所が残る。

緩和の策
  • ウェブの置き場とDBの管理者の一覧を、正しい状態の控えと定期に比べる。比べる控えは、そのサーバーの外に置く。
  • 大きなダウンロード、普段と違う時間帯の取り出し、新しい送信元からの要求を、ログで警告にする。ログは別の場所へすぐ送る。作り方は A09 セキュリティログとアラートの不備 にある。
  • DBの接続の利用者に、要る表への要る操作だけを許す。被害を絞る策で、命令文の作りの代わりにはならない。
  • 悪用の確認された弱点の一覧を見張り、外に開いた製品が載ったら、当て布より先に通信を遮る段取りを持っておく。CISA は、この弱点に3週間の期限を付けた[3]。

直したあとに確かめる。架空の製品の管理者の一覧

-- 修正版を入れた後で、最後に正しいと確かめた日より後に作られた管理者を出す
SELECT login, display_name, created_at
  FROM users
 WHERE role = 'admin' AND created_at > '2023-05-20'
 ORDER BY created_at;

-- 出力
svc_health  | Health Check  | 2023-05-29 02:14:07

点検の仕組みに見える名前でも、誰が作ったか説明できない管理者は消し、その管理者で出来たことを全部調べる。この件で作られた管理者にも、点検の仕組みに見える表示名が付いていた[4]。

参照

  1. Form 8-K, Item 8.01 Other Events Progress Software、米証券取引委員会、2023年6月5日提出
  2. MOVEit Transfer Critical Vulnerability CVE-2023-34362 May 2023 Progress Software、2023年5月31日公開、6月21日更新
  3. CVE-2023-34362 NIST NVD
  4. #StopRansomware: CL0P Ransomware Gang Exploits CVE-2023-34362 MOVEit Vulnerability AA23-158A CISA、FBI、2023年6月7日公開、6月16日更新
  5. Working to Enhance the Security of MOVEit Transfer Products through Partnership and Transparency Progress Software、2023年6月13日
  6. CVE-2023-35036 NIST NVD
  7. CVE-2023-35708 NIST NVD