このブログではウェブサイトやその上で動作しているウェブアプリケーションの脆弱性について紹介すると共に注意喚起をする目的でまとめられています。
今回は、最近著名CMSの脆弱性として情報漏えいを起こした原因としてニュースをにぎわしており、Webアプリケーションの脆弱性の中でも最も危険度の高いOSコマンドインジェクションについて解説をしています。
※なお、内容に関しましてはHASHコンサルティング株式会社の徳丸 浩様に監修いただいています。
+++++++++++++++++++++++++++++++++++++++++++++++
OSコマンドインジェクション脆弱性(CWE-78)
■概要
Webアプリケーションの中には、機能の実現のために外部コマンドを呼び出しているものがあります。多くのアプリケーションでは、メール送信の機能をsendmailコマンドの呼び出しで実現しています。外部からのファイルダウンロードをwgetやcurl等のコマンド呼び出しにより実現する場合もあります。
外部コマンドにパラメータを渡して呼び出している場合、パラメータを巧妙に細工することにより、開発者が意図しない別のプログラムを呼び出せる場合があります。これにより悪意のあるコマンド呼び出しを行う攻撃がSQLインジェクション攻撃です。また、OSマコンドインジェクション攻撃を許す状況をOSコマンドインジェクション脆弱性と言います。
OSコマンドインジェクションはソフトウェアの脆弱性として継続して報告されており、サイト改ざんなどの攻撃に悪用されています。
■攻撃のイメージと影響
Webアプリケーションで利用者登録の際にメールアドレスを登録してもらい、そのメールアドレスに対して通知メールを送信している場合を想定します。以下のPerlスクリプトで$mailは、利用者が入力したメールアドレスです。
system(“/usr/sbin/sendmail $mail < /var/data/message.txt”);
ここで、$mail = “test@example.jp; cat /etc/passwd” と外部から指定された場合、生成されるコマンドは以下の通りです。
/usr/sbin/sendmail test@example.jp; cat /etc/passwd < /var/data/message.txt
コマンド中のセミコロン「;」は、2つ以上のコマンドを続けて実行する際の区切り文字なので、上記コマンド呼び出しにより/etc/passwdの内容を表示する結果となります。この他、様々なコマンド呼び出しが可能です。
■脆弱性による影響
この脆弱性による影響の例として下記がありますが、これらに限りません。OSコマンドインジェクション攻撃を受けると、サーバーが乗っ取られたた状態になり、最悪の場合はサーバー内部からの脆弱性攻撃により、root権限を奪取される可能性があります。
- サーバー内のファイルの閲覧、書き換え、削除
- 不正なシステム操作(ユーザアカウントの追加、変更、その他)
- 不正なプログラムのダウンロード、実行
- 他のサーバーへの攻撃(踏み台)
■脆弱性の有無の確認方法
OSコマンドインジェクション脆弱性の有無の確認は、ソースコードを確認する方法が確実です。system、exec等外部コマンドを呼びだすことのできる関数名やメソッド名を検索して、該当箇所を目視で確認します。
あるいは、ネットワーク経由の手動診断で脆弱性の有無を検証することもできます。この場合、独立行政法人情報処理推進機構(IPA)が公開している「安全なウェブサイトの作り方」別冊の「ウェブ健康診断仕様」に診断の方法が説明されており、参考になります。
■対策
OSコマンドインジェクション脆弱性はアプリケーションのバグなので、アプリケーション改修による対策が基本です。外部コマンドを使わないで同じ機能を実現できる場合は、外部コマンドを呼ばない実装の方が安全で効率も良くなる場合が多いです。どうしても外部コマンドを使用する必要がある場合は、シェルを経由しないコマンド呼び出しの方法を採用します。詳しくは「安全なウェブサイトの作り方」等の参考資料を御覧ください。
なお、「シマンテック クラウド型WAF」では、OSコマンドインジェクション脆弱性からウェブサイトが攻撃を受けるのを防ぐことができます。
■参考文献
安全なウェブサイトの作り方