学習忘備録

学習のアウトプットや感じた事を発信していきます

OSコマンド呼び出しの際に発生する脆弱性

書籍を読んで

www.amazon.co.jp

こちらの書籍を読んでWebアプリケーションを作る際に重要な要点を自分用としてアウトプットします。

OSコマンド呼び出しの際に発生する脆弱性

Webアプリケーションの開発に用いる言語の多くはシェル経由でOSコマンドの実行が可能。シェル経由でOSコマンドを実行する場合や、開発に用いた機能が内部的にシェルを用いて実装されている場合、意図しないOSコマンドまで実行可能になる場合がある

この現象をOSコマンド・インジェクションと呼ぶ

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

脆弱性が生まれる原因
  • シェル経由でOSコマンドを呼び出す際に、シェルのメタ文字がエスケープされていない場合
  • シェル機能を呼び出せる関数を使用している場合

OSコマンド・インジェクション脆弱性が生まれる条件は、以下の3つをすべて満たしている場合

  • シェルを呼び出す機能のある関数(system, openなど)を利用している
  • シェル呼び出しの機能のある関数にパラメータを渡している
  • パラメータ内に含まれるシェルのメタ文字をエスケープしていない
対策
  • OSコマンド呼び出しを使わない実装方法を選択する
    • 設計フェーズで対策方針を決定する
  • シェル呼び出し機能のある関数の利用を避ける
    • シェルを経由しない関数の使用
  • 外部から入力された文字列をコマンドラインのパラメータに渡さない
  • OSコマンドに渡すパラメータを安全な関数によりエスケープする
    • シェルのエスケープルールは複雑なので、自作ではなく安全なエスケープを行えるライブラリ関数を用いる
保険的対策
  • パラメータの検証
    • パラメータ文字列の文字種を制限することが推奨
    • 例えば、OSコマンドのパラメータにファイル名を渡している場合、ファイル名の要件を英数字に限定すれば攻撃できなくなる
  • アプリケーションの稼働する権限を最小限にする
    • これにより攻撃の被害を最小限にとどめられる
    • 外部からの攻撃の多くはWebshellと呼ばれる遠隔操作用のバックドアコマンドをドキュメントルートにダウンロードして設置する
    • ドキュメントルートにWebアプリケーションから書き込み権限がない状態にすれば、Webshell設置による攻撃は成功しない
  • WebサーバのOSやミドルウェアのパッチ適用
    • サーバ内部からOSの脆弱性をついた攻撃を受けた場合は最も被害大きくなる
    • 外部から攻撃を受けない脆弱性であっても、パッチ適用などの対処が推奨