Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

攻撃手法 •  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   •  あれ、、、情報漏えいしないぞ

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

攻撃事例

Slide 15

Slide 15 text

攻撃事例

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

意図しないファイル公開

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

対策      deny  from  all