MOVEit Transfer 2023年 ファイル転送の製品のSQLインジェクション
外に開いたファイル転送の製品に、ログイン無しで通るSQLインジェクションがあった。攻撃者はDBを読むだけでなく、ウェブシェルを置き、管理者を作り、預かったファイルとクラウドの鍵を持ち出した。直すのは命令文の作りで、修正の当て布のあとには、置かれた物と作られた物の掃除が要る。
要点
- 弱点は、ログインの要らない画面の処理で値が命令文に入るSQLインジェクションだった。DBの中身を読み、書き換え、消せた[3]。
- 攻撃者は、正規の画面に似せた名前のウェブシェルを置き、DBの一覧、ファイルの取り出し、管理者の作成と削除、Azure の保存先の鍵の取得をした[4]。
- CISA は、悪用の始まりを2023年5月27日とする。開発元が顧客の電話で異常を知ったのは5月28日の夜で、修正版は5月31日に出た[4][1]。
- 修正版を入れても、DBに作られた管理者は残る。開発元と CISA は、通信を止める、置かれた物と作られた管理者を消す、資格情報を替える、を当て布と組で求めた[2][4]。
- 根本は、値を命令文と分けて渡す作りにある。外への公開を絞る、DBに置く秘密を減らす、ウェブの置き場の変化を見張る、は届いた後の被害を減らす。
何が起きたか
| 日付 | 出来事 |
|---|---|
| 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]。
通った道筋
| 段 | 何があったか |
|---|---|
| 入口 | MOVEit Transfer のウェブの処理にSQLインジェクションがあり、認証の無い攻撃者がDBに届いた。DBの種類によって、構造と中身を推し量り、要素を書き換えたり消したりする命令文を実行できた。HTTP と HTTPS のどちらからも突けた[3]。 |
| 足場 | LEMURLOOT と呼ばれる C# のウェブシェルが置かれた。最初は正規のファイルに似せた名前で見つかった。置かれると、自分の認証に使う36文字の合言葉を作った[4]。 |
| 中での操作 | シェルは、DBの一覧、名前を指定したファイルの取り出し、管理者の作成と削除、Azure の設定と保存先の口座、鍵、入れ物の取得ができた。作られた管理者には、点検の仕組みに見える表示名が付いていた[4]。 |
| 持ち出し | MOVEit Transfer の下のDBからデータが盗まれた[4]。 |
直したあとも残る物
CISA は、ウェブのサーバーを作り直してもDBを残せば、作られた管理者が残るおそれがあると書き、DBで管理者の一覧を確かめるよう求めた[4]。弱点を塞ぐことと、入られた跡を消すことは別の作業になる。
どこで止められたか
| 止める所 | この件で | 限り |
|---|---|---|
| 値を分けて渡す | 入口は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]。
参照
- Form 8-K, Item 8.01 Other Events Progress Software、米証券取引委員会、2023年6月5日提出
- MOVEit Transfer Critical Vulnerability CVE-2023-34362 May 2023 Progress Software、2023年5月31日公開、6月21日更新
- CVE-2023-34362 NIST NVD
- #StopRansomware: CL0P Ransomware Gang Exploits CVE-2023-34362 MOVEit Vulnerability AA23-158A CISA、FBI、2023年6月7日公開、6月16日更新
- Working to Enhance the Security of MOVEit Transfer Products through Partnership and Transparency Progress Software、2023年6月13日
- CVE-2023-35036 NIST NVD
- CVE-2023-35708 NIST NVD