安全なWebサイトのつくりかた ざっくりまとめpart2


情報推進機構「安全なWebサイトのつくりかた」を読みましたが
情報量が多すぎて頭がフリーズしたので、現時点で最低限理解できる内容までを記録しておきます。
誰にでもわかるというより、僕が理解できる範囲で書いていますのでご了承ください。

Part1 
https://qiita.com/E-46/items/93199f38bdacd6b6076a

2. OS コマンド・インジェクション

どんな脆弱性なのか

インジェクションとは「注入、投入する」の意味。
Webサイト上に設置された入力フォームにコマンド(OSへの命令文)を入力することで
WebサーバのOSに対して不正な命令を実行できてしまう脆弱性が存在します。
これを利用した攻撃がOS コマンド・インジェクションです。

SQLインジェクションデータベースへの攻撃、
OS コマンド・インジェクションOSへの攻撃と言えます。

OSへの命令は、シェル(bashとかcmdとか)を通して行われます。
本記事では、OSコマンドではなくシェルコマンドという表現を使用していきます。


(前提知識)シェルのコマンド連結について

シェルには複数のコマンドを連結する機能があり、
;(セミコロン)で区切ることで、2行のコマンドを1行にまとめることが可能です。

# セミコロンで区切って連結したコマンド
$ cd Users/vagrant ; vagrant up


# この2行のコマンドを順に実行する
$ cd Users/vagrant
$ vagrant up

具体的にどんな攻撃が想定されるのか

危険なのはシェルにパラメータを渡すような機能が実装されている場合です。

Rubyを使用した以下のような処理を考えてみます。

safe.rb

system("curl #{params[:url]}")

systemメソッドは引数をシェルのコマンドとして実行するメソッドです。
入力されたURLにGETリクエストを送ることを想定した処理ですが、脆弱性が存在します。

URLが正しく入力された場合

# このようなパラメータが渡された場合
params[:url] ===> http://hogehoge.com

# シェルはこのコマンドを実行する
curl http://hogehoge.com

この場合、http://hogehoge.com にGETリクエストを送るという想定通りの処理が行われます。

シェルのコマンドを含む文字列を入力された場合

# このようなパラメータが渡された場合が問題
http://hogehoge.com; rm -rf /

URLの後ろにセミコロンが含まれています。このパラメータを受け取ったシェルは
セミコロンから先は別の命令だと解釈し、次の2つの処理を行います。

# 1行目の処理(これは問題ない)
curl http://hogehoge.com

# 2行目の処理(こっちが問題)
rm -rf /

rm -rf/についてですが、ルートディレクトリ下のデータがすべて消滅します。
OSに対しての命令が可能というのが、いかに重大な脆弱性であるかわかります。

どんな問題につながるのか

  • サーバ内ファイル(設定ファイル)を改ざんされる
  • サーバ内のパスワードが流出する
  • ウィルス・ワームのダウンロード、実行が行われる
  • サーバーが他システムへの攻撃への踏み台として使われる

注意すべきWebサイトの特徴

シェルを呼び出す関数を利用しているWebアプリケーション
別のプログラムを起動する関数を利用しているWebアプリケーション

対策

根本的な解決策として、そもそもシェルの呼び出し機能を使わない実装を行うこと。

シェルを起動する言語機能の利用を避ける

exec()とか system()とかopen()とかが出てきたら要注意。
シェルを起動しない関数で代替できないか?を考えること。

外部プログラムを起動させるような処理についても、
クラスライブラリなどで代替できないか?を考慮すること。

処理を外部に頼らない設計を心がける。

想定したシェルの操作しか許可しないように限定する

やむを得ずシェルを起動する場合は、
許可したパラメータだけを通すホワイトリスト形式が推奨。

引数として渡される値の組み合わせをあらかじめ洗い出すことで、
それ以外の値が渡されることを許可しないように設定する。

ブラックリスト(許可しないものを設定しておく)は非推奨。
だいたいチェック漏れは起きるので、そこを突かれる恐れがある。


むずかしいですね。

参考

OSコマンドインジェクション
https://senmon.cfc.ac.jp//studentreport/report2/OS.html
https://f5.com/jp/education/glossary/glossary067-21548

OSコマンドインジェクション攻撃 ‐ 通信用語の基礎知識
https://www.wdic.org/w/WDIC/OS%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%82%A4%E3%83%B3%E3%82%B8%E3%82%A7%E3%82%AF%E3%82%B7%E3%83%A7%E3%83%B3%E6%94%BB%E6%92%83

Re: 脆弱性を見つけるコードレビュー(OSコマンドインジェクション) - pockestrap
https://pocke.hatenablog.com/entry/2017/05/01/183053
※コードはこちらを参考にさせていただきました

cmd /c rd /s /q c:\とは (バルスとは) [単語記事] - ニコニコ大百科
https://dic.nicovideo.jp/a/cmd%20%2Fc%20rd%20%2Fs%20%2Fq%20c%3A%5C

IPA ISEC セキュア・プログラミング講座:Webアプリケーション編 第6章 入力・注入対策:コマンド注入攻撃対策
https://www.ipa.go.jp/security/awareness/vendor/programmingv2/contents/501.html