$30 off During Our Annual Pro Sale. View Details »

ファイルアクセスに関する脆弱性

carotene4035
September 02, 2018
82

 ファイルアクセスに関する脆弱性

carotene4035

September 02, 2018
Tweet

Transcript

  1. 第3回 徳丸本輪読会  
    ファイルアクセスにまつわる問題
    かろてん

    View Slide

  2. 問題のあるwebアプリ
    •  サーバ上のファイル名を外部からパラメータ
    の形で指定できるアプリケーション  
    – テンプレートファイルをパラメータで指定している
    ようなケース

    View Slide

  3. それによって可能になる攻撃  
    •  ディレクトリ・トラバーサル  
    – webサーバ内のファイルに対する不正アクセス  
    •  OSコマンドの呼び出し  
    – OSコマンド・インジェクション

    View Slide

  4. ディレクトリ・トラバーサル

    View Slide

  5. ディレクトリ・トラバーサル
    •  ディレクトリ・トラバーサル  
    – webサーバ内のファイルに対する不正アクセス  
    •  OSコマンドの呼び出し  
    – OSコマンド・インジェクション

    View Slide

  6. ディレクトリ・トラバーサルの影響
    •  Webサーバ内のファイルの閲覧  
    –  重要情報の漏えい  
    •  Webサーバ内のファイルの改ざん、削除  
    –  Webコンテンツ改ざんによるデマ、誹謗中傷の書き込み  
    –  マルウェアのサイトに誘導する仕組みの書き込み  
    –  スクリプトファイルや設定ファル削除によるサーバ機能の停止  
    –  スクリプトファイル改ざんによる任意のサーバスクリプト実行

    View Slide

  7. ディレクトリ・トラバーサルの対策
    •  外部からファイル名を指定できる仕様を避ける  
    •  ファイル名にディレクトリ名が含まれないようにする  
    •  ファイル名を英数字に限定する

    View Slide

  8. 攻撃手法
    •  画面テンプレートのファイルを  
    template=の形で指定できるスクリプト

    View Slide

  9. 攻撃手法
    •  画面テンプレート  
    –  春のキャンペーン と書かれている  
    –  ディレクトリ構成は以下

    View Slide

  10. 攻撃手法
    •  h0ps://security-­‐directory-­‐carotene.c9users.io/4a-­‐001.php?
    template=spring  
     
    にアクセスすると  
    「春のキャンペーン」と表示される。

    View Slide

  11. 攻撃手法
    •  以下のディレクトリ構成  
    •  h0ps://security-­‐directory-­‐carotene.c9users.io/4a-­‐001.php?template=../
    etc/hosts%00  
    •  末尾にNULLバイト

    View Slide

  12. 攻撃手法
    •  Warning:  readfile()  expects  parameter  1  to  be  a  valid  path,  
    string  given  in  /home/ubuntu/workspace/4a-­‐001.php  on  line  
    7  Call  Stack:  0.0008  233960  1.  {main}()  /home/ubuntu/
    workspace/4a-­‐001.php:0  0.0009  234336  2.  readfile()  /home/
    ubuntu/workspace/4a-­‐001.php:7  
    •  あれ、、、情報漏えいしないぞ

    View Slide

  13. 攻撃手法
    •  Php5.3.4以降では、ファイル名などにnull  byteを含む場合、
    多くの関数でエラーになるように変更された  
    •  h0p://php.net/manual/en/security.filesystem.nullbytes.php  
    •  h0ps://bugs.php.net/bug.php?id=39863

    View Slide

  14. 攻撃事例

    View Slide

  15. 攻撃事例

    View Slide

  16. 攻撃事例
    •  公式サイド  
    –  (追記@4/10  17:00)問題の機器「Miele  Professional  PG  8528」は食器洗い機ではなく、
    「washer-­‐disinfector」(洗浄消毒器)とのこと。3月29日付けでMiele社がこれについての
    プレスリリースを出しており、「脆弱性があったことは事実だが、この機器は食器洗い機
    ではなく消毒器である」「問題の脆弱性によってハッカーがパスワードを取得し機器の
    ソフトウェアにアクセスできる可能性はあるが、これによって問題の機器が『踏み台』と
    して使われる可能性は低い」「ソフトウェアのアップデートにも取り組んでいる」としてい
    る。

    View Slide

  17. 攻撃事例
    •  脆弱性詳細 h0p://seclists.org/fulldisclosure/2017/Mar/63

    View Slide

  18. 芋づる式に情報が漏洩
    •  この攻撃はファイル名が分かっている必要がある  
    •  第三者にはファイル名が知られていない個人ファイルなどは
    安全、、、  
    •  というわけではない  
    •  ディレクトリトラバーサルにより  
    スクリプトのソースファイルを閲覧して、そこからファイル名を
    取得するという方法がある  

    View Slide

  19. 脆弱性が生まれる原因
    •  ファイル名を外部から指定できる  
    •  ファイル名として、絶対パスや相対パスの形で異なるディレク
    トリを指定できる  
    •  組み立てたファイル名に対するアクセスの可否をチェックして
    いない  
    •  (心理的なところで言えば)  
    異なるディレクトトリを指定できることに対する考慮漏れ  

    View Slide

  20. 対策
    •  外部からファイル名を指定できる仕様を避ける  
    •  ファイル名にディレクトリ名が含まれないようにする  
    •  ファイル名を英数字に限定する  

    View Slide

  21. 対策(その1)
    •  外部からファイル名を指定できる仕様を避ける  
    –  ファイル名を固定にする  
    –  ファイル名をセッション変数に保持する  
    –  ファイル名を直接指定するのではなく番号などで間接的に指定する  

    View Slide

  22. 対策(その2)
    •  ファイル名にディレクトリ名が含まれないようにする  
    –  ../を含まないようにする  
    –  /や\、:などいろんな形があるので、それらをまとめて扱える関数を使
    いたい  
    –  Phpの場合はbasename関数  
    –  basename(‘../../../etc/hosts’) →  hosts  

    View Slide

  23. 対策(その2)
    •  ファイル名にディレクトリ名が含まれないようにする  
    –  basenameはnullバイトが有っても削除しない  
    –  $file  =  basename($path)  .  ‘.txt’;  
    –  $path  =  a.php%00 とすると.txt以下が無視されa.phpになってしまう  
    –  ファイル名の妥当性チェックにより防ぐ  
    –  ただ、php5.3.4以降はヌルバイトを渡すとエラー  

    View Slide

  24. 対策(その3)
    •  ファイル名を英数字に限定する(記号文字を弾く)  
    –  preg_match(‘/\A[a-­‐z0-­‐9]+\z/ui’,  $tmpl)  
    –  ただし、eregはバイナリセーフじゃない  
    –  4.2入力処理とセキュリティ を参照  

    View Slide

  25. 意図しないファイル公開

    View Slide

  26. 概要
    •  外部から閲覧されるとこまるファイルをweb
    サーバの公開ディレクトリに配置している場
    合  
    – 重要情報の漏洩につながる  
    – 対策  
    •  公開ディレクトリには非公開ファイルを置かないこと  
    •  ディレクトリ・リスティングを無効にする

    View Slide

  27. ディレクトリ・リスティング

    View Slide

  28. ディレクトリ・リスティング  
    (ザッカーバーグもやってた)

    View Slide

  29. 脆弱性が生まれる原因
    •  外部から閲覧できる条件  
    – ファイルが公開ディレクトリに置かれている  
    – ファイルに対するURLを知る手段がある  
    – ファイルに対するアクセス制限がかかっていない

    View Slide

  30. 脆弱性が生まれる原因
    •  ファイルに対するURLを知る手段  
    – ディレクトリ・リスティング  
    – ファイル名が日付やユーザ名、連番  
    – User.dat,  data.txtなどありがちな名前

    View Slide

  31. 脆弱性が生まれる原因
    •  ありがちな名前とは  
    – 実際のアクセスログ

    View Slide

  32. 対策
    •  アプリケーションの設計時に、ファイルの安全
    な格納場所を決める  
    •  レンタルサーバを契約する場合は非公開ディ
    レクトリが利用できることを確認する

    View Slide

  33. 対策
    •  ディレクトリ・リスティングを無効にする  
    •  h0p.confもしくは.htaccess  
             
                 Opkons  -­‐Indexes  
           

    View Slide

  34. 対策
    •  Apache  HTTP  Serverで特定のファイルを隠す
    方法  
    – ファイルの移動ができない場合、  
    .htaccessで暫定的に対応できる

    View Slide

  35. 対策
     
       deny  from  all  

    View Slide