Japan
サイト内の現在位置
本当は怖いワイルドカード(「*」)
NECセキュリティブログ2021年9月3日
NECサイバーセキュリティ戦略本部セキュリティ技術センターの山﨑です。
以前、「本当は怖いsudoコマンド」[1]というタイトルでLinuxコマンドsudoを悪用した権限昇格方法について紹介しました。今回のブログでは本当は怖いシリーズの第二弾として、ワイルドカードの悪用をテーマとします。
※本ブログに記載の内容を悪用したクラッキング行為等は絶対におやめください。
ワイルドカードとは
Linuxにおけるワイルドカードは、他の文字の代わりとなり様々なパターンに置換される特殊文字のことを意味します。例えば以下のようなものがありますが、本ブログ内では【ワイルドカード=「*」】として読み進めてください。
ワイルドカード | 意味 |
---|---|
* | 任意の0文字以上の文字列 |
? | 任意の1文字 |
[...] | []内のいずれかの文字 |
ワイルドカードを悪用した権限昇格
ワイルドカードは複数のファイルやディレクトリを操作する際に使用しますが、使い方によっては攻撃者が侵入したLinuxマシン上で、権限昇格に悪用される可能性があります。ここでは、アーカイブファイルを作成/展開するLinuxコマンドであるtarを例に、以下のシナリオで一般ユーザからrootユーザへ権限昇格が成功する様子を見ていきます。
■シナリオ
攻撃者はWebアプリケーションを実行しているLinuxマシンへの侵入に成功し、www-dataユーザの権限でシェルを操作可能です。攻撃者は権限昇格を目指しLinuxマシンの内部を探索した結果、root権限で定期的にWebのコンテンツをバックアップしている設定を発見しました。具体的な設定は以下の通りです。
- cronにより/opt/backup.shがroot権限で定期実行されている。
- /opt/backup.shは、/var/www/html配下のデータをアーカイブファイルとして/var/backups/webcontents_backup.tarに保存するスクリプト。また、www-dataユーザは、/opt/backup.shへの書き込み権限はない。
このようなシナリオにおいて、攻撃者は侵入したLinuxマシンの/var/www/html配下に攻撃者の持つマシンへリバースシェルを接続するコマンドを記載したshell.shを配置します。また、同ディレクトリ配下に以下の名前を持つファイルを作成します。
- --checkpoint=1
- --checkpoint-action=exec=sh shell.sh
この状態で、/opt/backup.shがcronで定期実行されるまで一定時間待機すると、侵入したLinuxマシンから攻撃者の持つマシンへリバースシェルが確立されます。idコマンドの実行結果の通り、このシェルはroot権限のシェルであり、www-dataユーザからrootユーザへの権限昇格に成功していることが確認できます。
なぜ、/var/www/htmlディレクトリ配下にshell.sh、”--checkpoint=1”および”--checkpoint-action=exec=sh shell.sh”という名前のファイルを作成したことで権限昇格に成功できたのでしょうか。今回の攻撃のポイントは、本ブログのテーマにもなっているワイルドカードです(/opt/backup.shの4行目、tarの引数部分)。
詳細は後述しますが、Linuxシェルがワイルドカードを解釈する際の特性を悪用して、管理者の意図しない操作(上記のシナリオだと任意コマンドの実行)を引き起こす攻撃手法は「ワイルドカードインジェクション」と呼ばれています。
ワイルドカードインジェクションの発生原理
Linuxシェルでワイルドカードを使用した場合、シェルはハイフン(-)で始まるファイルやディレクトリをコマンドラインの引数として解釈します。これがワイルドカードインジェクションの発生原理であり、これはシェルの「展開」という処理によるものです。
ワイルドカードインジェクションの発生原理について、ファイルやディレクトリを削除する際に使用するrmコマンドを例に説明します。
■Case1
wildディレクトリ配下に1つのディレクトリ(dir)と3つのファイル(file1.txt、file2.txt、file3.txt)があり、これを初期状態とします(①)。これらをまとめて削除するためにrmコマンドの引数に「*」を指定して実行します。しかし、ディレクトリも削除対象とするrオプションが付与されていないため、「cannot remove ‘dir’」というエラーメッセージが表示されます(②)。結果、3つのファイルは削除できましたが、dirディレクトリは削除できず残ったままです(③)。
■Case2
Case1の初期状態からさらに、「-r」という名前のファイルを作成し(①)、同様にrmコマンドの引数に「*」を指定して実行します。すると、Case1で発生したエラーメッセージは表示されず、dirディレクトリが削除できました。また、このとき「-r」という名前のファイルは残ったままであることが確認できます(②)。
Case1とCase2の差異は、「-r」という名前のファイルの有無のみですが、Case2で上記の結果になった理由を考えます。事前にsetコマンドを実行し、トレース情報としてシェルが実行したコマンドとその引数を出力する設定をしておきます(①)。「-r」ファイルが存在している状態でrmコマンドを実行すると、トレース情報より、シェルでは以下が実行されていることが確認できます(②)。
$ rm dir file1.txt file2.txt file3.txt –r
ワイルドカードはコマンドに渡される前にシェルが「展開」という処理を行い、展開後の結果をコマンドに渡します。上記の例だと「-r」はrmコマンドのオプションとして解釈されたためdirディレクトリが削除されました。一方でファイルとして扱われなかった「-r」は削除されなかったということになります。このように、ワイルドカードを使用した際に、シェルによってハイフンから始まるファイル、またはディレクトリがコマンドのオプションとして解釈されることがワイルドカードインジェクションの発生原理です。
冒頭のtarコマンドの例だと、”--checkpoint=1”および”--checkpoint-action=exec=sh shell.sh”はファイルではなく、tarコマンドのオプションとして解釈されるため、/opt/backup.shの4行目部分では、以下が実行されたことになります。
$ tar cvf /var/backups/webcontents_backup.tar index.html shell.sh –checkpoint=1 ‘–chekpoint-action=exec=sh shell.sh’
それぞれのオプションの意味は以下の通りです。
- --checkpoint[=NUMBER]
- NUMBER番目のレコード毎に進捗メッセージを表示(デフォルトは10)
- --checkpoint-action=ACTION
- チェックポイント毎でACTIONを実行
つまり、チェックポイント(=1)に到達する毎に、shell.sh(攻撃者のマシンへリバースシェルを接続するスクリプト)が実行されます。tarコマンドが記載されている/opt/backup.shはroot権限で定期実行される設定となっていたため、攻撃者のマシンにrootユーザの権限でリバースシェルが確立されたということになります。
ワイルドカードインジェクションで悪用可能なコマンド
コマンド実行時の引数にワイルドカードを指定することで管理者の意図しない操作を引き起こすコマンドは他にも存在します[2]。悪用方法はtarコマンドと同様に、コマンド実行前にコマンドオプションに記載した名前のファイル名を作成しておく必要があります。
コマンド | コマンドオプション | 悪用された際に想定される影響 |
---|---|---|
chown | --reference=FILE | ファイルやディレクトリの所有者を任意のユーザ、グループに変更 |
chmod | --reference=FILE | ファイルやディレクトリのパーミッションを任意の設定に変更 |
rsync | --rsh=COMMAND --rsync-path=PROGRAM |
任意コマンドの実行 |
対策
ワイルドカードインジェクションの対策は単純で、引数に指定したワイルドカードの前にディレクトリを含めたフルパスを指定することです。ワイルドカードインジェクションの発生原理でも例としたrmコマンドを使って説明します。
rmコマンド実行時にワイルドカードの前にフルパスを指定することで(①)、「-r」はrmコマンドのオプションではなく、ファイルとして認識されます(②)。結果、dirディレクトリは残りますが、「-r」ファイルは削除されます。
前述のシナリオだと、/opt/backup.shの4行目を以下のように書き変えることで、ワイルドカードインジェクションを防ぐことが可能です。
tar cvf /var/backups/webcontents_backup.tar /var/www/html/*
まとめ
ワイルドカードインジェクションの概要、発生原理、および対策について紹介しました。ワイルドカードは使い方によっては潜在的な危険性があることを認識してもらえたかと思います。ワイルドカードインジェクションについて興味を持たれた方は、chown、chmod、rsyncでの悪用方法[2]についてもぜひご自身で動作確認してみてください。
参考
執筆者プロフィール
山﨑 泉樹(やまざき せんじゅ)
セキュリティ技術センター リスクハンティングチーム
ペネトレーションテスト、脆弱性診断を通じたセキュア開発支援、NECの社内CTF運営に従事。業後はフィジカルセキュリティの強化に励む。CISSP、RISS、GPEN、GCPNを保持。
執筆者の他の記事を読む
アクセスランキング