WAF記事ブログ 10-07-2017

OSコマンドインジェクション脆弱性(CWE-78)の解説

デジサート
Blog | DigiCert
このブログではウェブサイトやその上で動作しているウェブアプリケーションの脆弱性について紹介すると共に注意喚起をする目的でまとめられています。 今回は、最近著名CMSの脆弱性として情報漏えいを起こした原因としてニュースをにぎわしており、Webアプリケーションの脆弱性の中でも最も危険度の高いOSコマンドインジェクションについて解説をしています。

概要

Webアプリケーションの中には、機能の実現のために外部コマンドを呼び出すものがあります。また、多くのアプリケーションでは、メール送信の機能をsendmailコマンドの呼び出しで実現し、外部からのファイルダウンロードをwgetやcurl等のコマンド呼び出しにより実現する場合もあります。

外部コマンドにパラメータを渡して呼び出している場合、パラメータを巧妙に細工することにより、開発者が意図しない別のプログラムを呼び出せる場合があります。これにより悪意のあるコマンド呼び出しを行う攻撃がOSインジェクション攻撃です。また、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コマンドインジェクション脆弱性からウェブサイトが攻撃を受けるのを防ぐことができます。

参考文献

安全なウェブサイトの作り方 https://www.ipa.go.jp/security/vuln/websecurity.html

修正の上再掲しました。

UP NEXT
5 Min

特集記事

クラウド上で量子コンピュータをいかに保護するか

NIST PQC アルゴリズムに関する詳細な説明

従来の PKI がもたらす割高な機会損失