検索
連載

9500万人に影響を与えた凶悪なサイバー攻撃、原因はアプリの作りにあった

ファイル転送ソフト「MOVEit」に対する攻撃は2700社以上に被害を与え、約9500万人以上が影響を受けたといわれる。この攻撃を防ぐ古典的な対策が見つかった。

PC用表示 関連情報
Share
Tweet
LINE
Hatena
Cybersecurity Dive

 2023年5月ごろから始まり、2024年4月18日時点で2770社に被害を与え、9500万人以上が影響を受け、150億ドル以上の損害を与えた大規模なサイバー攻撃がある(被害状況はEmsisoftの集計による)。ファイル転送ソフト「MOVEit」の脆弱(ぜいじゃく)性を利用した攻撃だ。

どうすればMOVEit事件の再発を防げるのか

 このような被害を防ぐためにできることはいろいろある。ユーザー企業であれば次のような対策が有効だ。

 まずは利用しているソフトウェアの脆弱(ぜいじゃく)性情報を監視し、計画的に修正パッチを適用することだ。

 MOVEitに限らず、ファイル転送ソフトを使う際、社内に限った利用であれば、LAN内にソフトを設置すればよい。クラウド環境であればIPアドレス制限を用いて、不正なアクセスを閉め出すことが可能だ。IPアドレス制限が難しい利用環境であればWAF(Web Applicaiton Firewall)で対策できることもある。

 だが、もっと良い対策がある。MOVEitのようなソフトウェアに脆弱性がないかどうかを確認し、出荷前にソフトウェア開発企業側で対策することだ。全ての脆弱性を取り除くことは難しいかもしれないが、取り除く方法が明らかになっている脆弱性もある。

 サイバーセキュリティ・インフラストラクチャセキュリティ庁(CISA)と連邦捜査局(FBI)は2024年3月25日に発表した警告の中で(注1)、SQLインジェクションの脆弱(ぜいじゃく)性を排除する対策を講じるよう開発企業に促した。

「MOVEit」への攻撃ではSQLインジェクションが使われた

 CISAとFBIは開発企業の経営層に対し、SQLインジェクションの危険性があるかどうかを調べるため、コードの正式なレビューを開始するよう求めた。脆弱性が発見された場合、CISAとFBIは各社に対し、既存のソフトウェアはもちろん、将来開発するソフトウェアからもSQLインジェクションの欠陥を排除する早急な措置を講じるよう要請する。

 なぜ両機関はSQLインジェクション対策に注力するのだろうか。それはMOVEitの脆弱性を利用した大規模攻撃において(注2)、SQLインジェクションが大きな欠陥が果たした役割を挙げた。

 CISAとFBIによると、ソフトウェア業界ではSQLインジェクションの欠陥に関するリスクが何十年も前から知られていたにもかかわらず、メーカーはソフトウェアからこれらの欠陥を取り除くための十分な措置を講じてこなかった。

 SQLは「Structured Query Language」の略称で、データベース管理システム内のデータを管理するために使用されるプログラミング言語だ。データベースの操作には欠かせないと言ってよいほど多用されている。

 今回の警告によると(注3)、開発者はソフトウェアの設計段階と開発段階で必ず脆弱性を取り除くように作業することで、悪用されるリスクを排除できる。作業内容はパラメーター化されたクエリによる「準備済みステートメント」を採用することだ。こうすることで開発者はSQLコードとユーザーに提供されるデータを分離することができ、この種の脆弱性を防ぐことができる。

 Rapid7のスペンサー・マッキンタイア氏(セキュリティリサーチマネジャー兼Metasploit開発の責任者)は次のように述べた。

 「準備済みステートメントへの移行は合理的な要求のように思われる。だが、セキュリティリーダーにとっての『合理的』が全てのソフトウェアプロデューサーにとっても合理的だとは限らない。それでもCISAが提案するパターンをサポートするためのライブラリへのアクセスは容易だと考えている」

 CISA関係者はバイデン政権の国家サイバーセキュリティ戦略の一環として、ソフトウェアやハードウェアのメーカーに対して、設計の段階で製品の安全性を確保し、デフォルトで安全なものにするよう働きかけている(注4)。これは製品が出荷され、コンピュータネットワークにインストールされた後、顧客が隠れた欠陥を探したり、設定を変更したりする必要がないことを意味する。

SQLインジェクションとは

 SQLインジェクション(SQL Injection)はWebアプリケーションを標的としたサイバー攻撃の一種だ。1990年代にWebアプリケーションが普及するにつれて登場した。攻撃者がWebフォームの入力フィールドに悪意のあるSQLコードを挿入することで、外部に直接露出していないデータベースを操作して機密データにアクセスしたり、データを変更したり、削除したりする攻撃だ。

 SQLインジェクション攻撃が成立する条件はWebアプリケーションがユーザー入力を適切に検証せず、入力された文字列をSQLクエリの一部として使ってしまう場合だ。検証されなければ、攻撃者がアプリケーションの入力フィールドに任意のSQLコードを注入することで、データベースを操作する独自のクエリを作成できる。

 単純なログインフォームがあったとしよう。ユーザー名とパスワードのフィールドがあり、データベースに対してクエリを実行して、入力された資格情報が正しいかどうかを確認するという機能があるはずだ。SQLインジェクション攻撃ではユーザー名フィールドに有効なユーザー名と悪意のあるSQLコードを続けて入力する。例えば、本来のユーザー名「admin」の代わりにユーザー名として「'admin'--」を入力し、続けてパスワードフィールドに何らかの値を入力したとしよう。

 もしこのログインフォームで入力が適切に検証されていなかった場合、アプリケーションは次のSQLクエリを実行する可能性がある。

SELECT * FROM users WHERE username = 'admin'--' AND password = 'entered_password';

 ダッシュ記号「--」はSQLでコメントの開始を表すため、それ以降のクエリは無視される。その結果、データベースはユーザー名として「admin」を持つ全てのユーザー名を返し、パスワードを検証しない。攻撃者が本物のパスワードを知らなかったとしても管理者アカウントにアクセスできてしまう。

 SQLインジェクション攻撃はデータベース内の機密データの漏えいはもちろん、データの不正変更やデータの削除、データベース自体の完全な制御につながる可能性がある。

 SQLインジェクション攻撃を防ぐためにできることは幾つかある。入力検証はもちろん、パラメーター化クエリや準備済みステートメントを使うこと、最小権限の原則に従ったデータベースアクセス権の制限など、安全なコーディング手法を実装できる。(キーマンズネット編集部)


© Industry Dive. All rights reserved.

ページトップに戻る