WebDAV時代のセキュリティ対策[前編]
各メソッドに内在する脅威

宮本 久仁男<kmiya@coe.nttdata.co.jp>
NTTデータ COEシステム本部
システム技術開発部第三技術開発担当
2001/12/15

各メソッドに内在する脅威と対策

 ここから、メソッドごとに脅威となり得る点とその対策方法を詳述していきます。本稿ではApacheのディレクティブで制限する方法を挙げておきますが、ほかのWebサーバでも同様のポリシーによって防御可能()です。

:バグなどで防御できない場合はこの限りではありませんが……。

PROPFINDメソッド

脅威:

  • リソース/コレクションのプロパティを知られてしまう
     コレクションのプロパティを見られるとリソース/コレクションの配置が丸分かりになる危険性がある。

 例えば、Webフォルダによるファイル一覧(画面1)はPROPFINDメソッドをコレクションに対して発行し、結果を取得しています。リスト1は、その際のパケットキャプチャの結果です。

画面1 Webフォルダによるファイル一覧(画像をクリックすると拡大表示します)

#######
T 10.1.87.156:1896 -> 10.1.87.157:80 [AP]    ←PROPFINDリクエスト
 PROPFIND /davnoauth HTTP/1.1..Accept-Language: ja, en-us;q=0.2..Conten
 t-Type: text/xml..Translate: f..Content-Length: 380..Depth: 1..User-Ag
 ent: Microsoft Data Access Internet Publishing Provider DAV 1.1..Host:
  tripmachine..Connection: Keep-Alive....<?xml version="1.0" ?>..<propf
 ind xmlns="DAV:">..<prop>..<name/>..<parentname/>..<href/>..<ishidden/
 >..<iscollection/>..<isreadonly/>..<getcontenttype/>..<contentclass/>.
 (中略)
##
T 10.1.87.157:80 -> 10.1.87.156:1896 [A]     ←PROPFIND結果
 HTTP/1.1 207 Multi-Status..Date: Wed, 28 Nov 2001 09:36:49 GMT..Server
 : Apache/1.3.22 (Unix) DAV/1.0.3..Keep-Alive: timeout=15, max=100..Con
 nection: Keep-Alive..Transfer-Encoding: chunked..Content-Type: text/xm
 l; charset="utf-8"....f13..<?xml version="1.0" encoding="utf-8"?>.<D:m
 ultistatus xmlns:D="DAV:">.<D:response xmlns:i0="DAV:" xmlns:lp0="DAV:
 " xmlns:lp1="http://apache.org/dav/props/">.<D:href>/davnoauth/DAVSec.
 txt</D:href>.<D:propstat>.<D:prop>.<D:getcontenttype>text/plain</D:get
 contenttype>.<lp0:creationdate xmlns:b="urn:uuid:c2f41010-65b3-11d1-a2
 9f-00aa00c14882/" b:dt="dateTime.tz">2001-11-28T08:55:14Z</lp0:creatio
 ndate>.<lp0:getlastmodified xmlns:b="urn:uuid:c2f41010-65b3-11d1-a29f-
 00aa00c14882/" b:dt="dateTime.rfc1123">Wed, 28 Nov 2001 08:55:14 GMT</
 lp0:getlastmodified>.<lp0:getcontentlength>7533</lp0:getcontentlength>
 .<D:resourcetype/>.</D:prop>.<D:status>HTTP/1.1 200 OK</D:status>.</D:
 propstat>.<D:propstat>.<D:prop>.<i0:name/>.<i0:parentname/>.<i0:href/>
 .<i0:ishidden/>.<i0:iscollection/>.<i0:isreadonly/>.<i0:contentclass/>
 .<i0:getcontentlanguage/>.<i0:lastaccessed/>.<i0:isstructureddocument/
 >.<i0:defaultdocument/>.<i0:displayname/>.<i0:isroot/>.</D:prop>.<D:st
 atus>HTTP/1.1 404 Not Found</D:status>.</D:propstat>.</D:response>.<D:
 response xmlns:i0="DAV:" xmlns:lp0="DAV:" xmlns:lp1="http://apache.org
 /dav/props/">.<D:href>/davnoauth/FIG.txt~</D:href>.<D:propstat>.<D:pro
 p>.<lp0:creationdate xmlns:b="urn:uuid:c2f41010-65b3-11d1-a2
(以下略)
リスト1 Webフォルダ表示時のパケットキャプチャの様子

 通常のWebブラウザでも、Apacheの設定によってはGETリクエストの結果としてディレクトリの内容が分かる場合があります(画面2)が、

  • Apache側でOptions Indexesを指定しない
  • ダミーのindex.htmlファイルを置いておく

などしておけば、これを防ぐことができます。詳しくはApacheによるWebサーバ構築 第7回の最後を参照してください。

画面2 Apacheの設定によってはディレクトリ構造が見えてしまう

 しかし、PROPFINDメソッドはそもそも「コレクションのプロパティ」を取得することによってコレクションに含まれるリソースを確認するため、上記の対策では防げません。

対策:

  • PROPFINDメソッドの実行を制限する

 具体的には、httpd.confでPROPFINDメソッドの実行を制限したい場所(例では/davauth)をリスト2のように設定して、Limitディレクティブで指定したメソッド(ここではPROPFIND)が使われた場合は認証を求めるようにします。

<Location /davauth>
        DAV     on
        AuthUserFile     /home/kmiya/htpwd/user.pwd
        AuthGroupFile    /dev/null
        AuthName         DAVhome
        AuthType         Basic
<Limit PROPFIND>
            Require user wakatono
        </Limit>
</Location>
リスト2 制限の実際の設定例

 上記の設定を施しておくことで、リスト3のようなレスポンスがWebブラウザに対して返却されます。正しい認証情報を与えない限り、不正にアクセスされることはありません。

##
T 10.1.87.157:80 -> 10.1.87.156:2114 [AP]
 HTTP/1.1 401 Authorization Required..Date: Wed, 28 Nov 2001 11:40:55 G
 MT..Server: Apache/1.3.22 (Unix) DAV/1.0.3..WWW-Authenticate: Basic re
 alm="DAVhome"..Keep-Alive: timeout=15, max=100..Connection: Keep-Alive
 ..Transfer-Encoding: chunked..Content-Type: text/html; charset=iso-885
 9-1....1e8..<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">.<HTML><
 HEAD>.<TITLE>401 Authorization Required</TITLE>.</HEAD><BODY>.<H1>Auth
 orization Required</H1>.This server could not verify that you.are auth
 orized to access the document.requested.  Either you supplied the wron
 g.credentials (e.g., bad password), or your.browser doesn't understand
  how to supply.the credentials required.<P>.<HR>.<ADDRESS>Apache/1.3.2
 2 Server at tripmachine.ts.u.coe.nttdata.co.jp Port 80</ADDRESS>.</BOD
 Y></HTML>...0....
リスト3 制限を施した場合のパケットキャプチャリングの様子 

MKCOLメソッド

脅威:

  • 勝手にコレクションを作成されてしまう
     少しではあるが、サーバ資源を勝手に利用されてしまう。

 実際に、ポート80に対してtelnetで接続した場合の実行例と、作成されたコレクションに対応してディレクトリができている様子をリスト4に示します。

Connected to localhost.localdomain.
Escape character is '^]'.
MKCOL /davnoauth/sample HTTP/1.0 ←コレクション作成リクエスト

HTTP/1.1 201 Created              ←作成された旨レスポンスが返る
Date: Wed, 28 Nov 2001 11:46:13 GMT
Server: Apache/1.3.22 (Unix) DAV/1.0.3
Connection: close
Content-Type: text/html

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>201 Created</TITLE>        ←作成された旨レスポンスが返る
</HEAD><BODY>                     ←作成された旨レスポンスが返る
<H1>Created</H1>                  ←作成された旨レスポンスが返る
Collection /davnoauth/sample has been created. ←作成された旨レスポンスが返る
<P><HR>
<ADDRESS>Apache/1.3.22 Server at tripmachine.ts.u.coe.nttdata.co.jp
 Port 80</ADDRESS>
</BODY></HTML>
Connection closed by foreign host.
$
$ ls -l /home/davnoauth/
total 56
-rw-r-----   1 share   share      7533 Nov 28 17:55 DAVSec.txt
-rw-r-----   1 share   share      7659 Nov 28 17:55 DAVSec.txt~
-rw-r-----   1 share   share     13880 Nov 28 17:55 DAVSec_.lzh
-rw-r-----   1 share   share      1155 Nov 28 17:55 FIG.txt
-rw-r-----   1 share   share       284 Nov 28 17:55 FIG.txt~
-rw-r-----   1 share   share     14821 Nov 28 17:55 davsec20011126.lzh
drwxr-x---   2 share   share        48 Nov 28 20:46 sample/ ←ディレクトリが作成されている
$
リスト4 MKCOLメソッドによるコレクション作成の様子 

対策:

  • MKCOLリクエストの実行を制限する
     リスト2で「PROPFIND」となっている部分を「MKCOL」に変更することで、MKCOLについてのリクエストを制限可能。

COPYメソッド

脅威:

  • 勝手にリソースやコレクションを複製/破壊されてしまう
  • 既存のリソースに対する上書きを実施されることでコンテンツが破壊されるリスト5
  • COPYメソッドの発行を繰り返すことで、ディスクフルなどの事象を誘発されるリスト6

$ ls -l /home/davnoauth/
total 56
-rw-r-----   1 share   share     7533 Nov 28 17:55 DAVSec.txt
-rw-r-----   1 share   share     7659 Nov 28 17:55 DAVSec.txt~
-rw-r-----   1 share   share    13880 Nov 28 17:55 DAVSec_.lzh
-rw-r-----   1 share   share     1155 Nov 28 17:55 FIG.txt
-rw-r-----   1 share   share      284 Nov 28 17:55 FIG.txt~
-rw-r-----   1 share   share    14821 Nov 28 17:55 davsec20011126.lzh
drwxr-x---   2 share   share       48 Nov 28 20:46 sample/
$ telnet localhost 80
(中略)
COPY /davnoauth/FIG.txt HTTP/1.1     ←コピー元指定
Accept-Language: ja, en-us;q=0.2
Destination: http://tripmachine/davnoauth/davsec20011126.lzh ←コピー先指定
Overwrite: T              ←上書き許可
Depth: infinity
Translate: f
User-Agent: Mage Hoge DAV 1.1
Host: tripmachine
Content-Length: 0
Connection: Keep-Alive

HTTP/1.1 204 No Content          ←レスポンス開始(成功)
Date: Wed, 28 Nov 2001 12:16:32 GMT
Server: Apache/1.3.22 (Unix) DAV/1.0.3
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Content-Type: text/plain
                      ←レスポンス終了
Connection closed by foreign host.
$ ls -l /home/davnoauth/         ←その後どうなったか
total 44
-rw-r-----   1 share  share     7533 Nov 28 17:55 DAVSec.txt
-rw-r-----   1 share  share     7659 Nov 28 17:55 DAVSec.txt~
-rw-r-----   1 share  share    13880 Nov 28 17:55 DAVSec_.lzh
-rw-r-----   1 share  share     1155 Nov 28 17:55 FIG.txt ←コピー元
-rw-r-----   1 share  share      284 Nov 28 17:55 FIG.txt~
-rw-r-----   1 share  share     1155 Nov 28 21:16 davsec20011126.lzh ←コピー先(コピー元の内容で上書きされた)
drwxr-x---   2 share  share       48 Nov 28 20:46 sample/
$
リスト5 リソースの上書きによる破壊

$ telnet localhost 80
(中略)
COPY /davnoauth/DAVSec_.lzh HTTP/1.1 ←コピー元指定
Accept-Language: ja, en-us;q=0.2
Destination: http://tripmachine/davnoauth/DAVSecure1.lzh ←コピー先指定
Overwrite: F
Depth: infinity
Translate: f
User-Agent: Mage Hoge DAV 1.1
Host: tripmachine
Content-Length: 0
Connection: Keep-Alive        ←リクエスト終了
                  
←空行(リターン)挿入
HTTP/1.1 201 Created         ←レスポンス開始
Date: Wed, 28 Nov 2001 12:02:57 GMT
Server: Apache/1.3.22 (Unix) DAV/1.0.3
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html


11f
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>201 Created</TITLE>
</HEAD><BODY>
<H1>Created</H1>
Destination /davnoauth/DAVSecure1.lzh has been created.
<P><HR>
<ADDRESS>Apache/1.3.22 Server at tripmachine.ts.u.coe.nttdata.co.jp
 Port 80</ADDRESS>
</BODY></HTML>

0
                   ←レスポンス終了
COPY /davnoauth/DAVSec_.lzh HTTP/1.1 ←コピー元指定
Accept-Language: ja, en-us;q=0.2
Destination: http://tripmachine/davnoauth/DAVSecure2.lzh ←コピー先指定
Overwrite: F
Depth: infinity
Translate: f
User-Agent: Mage Hoge DAV 1.1
Host: tripmachine
Content-Length: 0
Connection: Keep-Alive        ←リクエスト終了
                 
←空行(リターン)挿入
HTTP/1.1 201 Created         ←レスポンス開始
(中略)
Content-Type: text/html

11f
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
(中略)
</BODY></HTML>

0
                   ←レスポンス終了
COPY /davnoauth/DAVSec_.lzh HTTP/1.1 ←コピー元指定
Accept-Language: ja, en-us;q=0.2
Destination: http://tripmachine/davnoauth/DAVSecure3.lzh ←コピー先指定
Overwrite: F
Depth: infinity
Translate: f
User-Agent: Mage Hoge DAV 1.1
Host: tripmachine
Content-Length: 0
Connection: Keep-Alive        ←リクエスト終了
                  
←空行(リターン)挿入
HTTP/1.1 201 Created         ←レスポンス開始
(中略)
Content-Type: text/html

11f
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
(中略)
</BODY></HTML>

0
                   ←レスポンス終了
Connection closed by foreign host.  ←タイムアウト
$
$ ls -l /home/davnoauth/       ←実際のディレクトリを見る
total 104
-rw-r-----   1 share   share     7533 Nov 28 17:55 DAVSec.txt
-rw-r-----   1 share   share     7659 Nov 28 17:55 DAVSec.txt~
-rw-r-----   1 share   share    13880 Nov 28 17:55 DAVSec_.lzh ←コピー元
-rw-r-----   1 share   share    13880 Nov 28 21:03 DAVSecure1.lzh ←コピー先1
-rw-r-----   1 share   share    13880 Nov 28 21:03 DAVSecure2.lzh ←コピー先2
-rw-r-----   1 share   share    13880 Nov 28 21:03 DAVSecure3.lzh ←コピー先3
-rw-r-----   1 share   share     1155 Nov 28 17:55 FIG.txt
-rw-r-----   1 share   share      284 Nov 28 17:55 FIG.txt~
-rw-r-----   1 share   share    14821 Nov 28 17:55 davsec20011126.lzh
drwxr-x---   2 share   share       48 Nov 28 20:46 sample/
$
リスト6 COPYメソッドの繰り返しによるディスクフルの再現

 ほかにも、リソース名やコレクション名を変更されてしまうことで、コンテンツの依存関係が崩されるといった事態も考えられます。

対策:

  • COPYリクエストの発行を制限する
     PROPFINDやMKCOLの制限と同様の設定を行うことで、リクエストを制限することが可能。
  • ディスクフルになっても被害が局所的に収まるようにクオータなどを設定する
     クオータの設定については、Linux Tipsに設定方法があるので参考にしてください。
     ディスクの使用量を制限するには

補足:mod_dav-1.0.3-1.3.6で、クォータ制限にひっかかってコピーできない場合でもステータスコード507 Insufficient Storageを返すようになりました。

2/4

Index
WebDAV時代のセキュリティ対策[前編]
 各メソッドに内在する脅威
  Page 1
WebDAVの特徴と機能
メソッドとステータスコードから見るセキュリティホール
  Page 2
各メソッドに内在する脅威と対策
 PROPFINDメソッド
 MKCOLメソッド
 COPYメソッド
  Page 3
 MOVEメソッド
 DELETEメソッド
 PROPPATCHメソッド
  Page 4
 LOCKメソッド
 UNLOCKメソッド
 PUTメソッド
後編の予告

Linux Square全記事インデックス


 Linux Squareフォーラム WebDAV関連記事
特集:次世代プロトコルWebDAVの可能性[前編]
技術仕様徹底解説

将来、SambaやCVSを不要にする可能性を秘めた「WebDAV」。このプロトコルの仕様から実用化までを徹底解説。今回は、技術仕様を明らかにする
特集:次世代プロトコルWebDAVの可能性[中編]
WebDAVクライアント/サーバ環境の構築
WebDAVの実装はすでに存在する。LinuxによるWebDAVサーバの構築とクライアントの整備を行い、実際に使ってみよう
特集:次世代プロトコルWebDAVの可能性[後編]
日本語ファイル名の利用とバージョン管理
日本語ファイル名を扱えるようにするほか、WebDAVの「V」を司るバージョン管理機能を実現。WebDAV解説完結編!
特集:WebDAV時代のセキュリティ対策[前編]
WebDAVのメソッドは便利な反面、セキュリティホールとなり得る。しかし、適切な対策を講じることでメソッドの危険性は取り除くことができる
特集:WebDAV時代のセキュリティ対策[後編]
WebDAVの使用に際し、包括的な対策を行っておくのも重要である。何をどのように設定すればよいのかをここで明らかにする
特集:Apache 2.0でWebDAV
Apache 2.0の正式リリースでWebDAVも新たな段階に入った。一方で、1.3時代のmod_encodingがうまく機能しないという問題も浮上した
特集:Subversionによるバージョン管理
DeltaVがRFCとしてリリースされ、WebDAVのバージョン管理機能も足元か固まった。DeltaVの実装である「Subversion」を導入しよう
Linux Squareフォーラム全記事インデックス

MONOist組み込み開発フォーラムの中から、Linux関連記事を紹介します


Linux & OSS フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Linux & OSS 記事ランキング

本日 月間