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メソッドはそもそも「コレクションのプロパティ」を取得することによってコレクションに含まれるリソースを確認するため、上記の対策では防げません。
●対策:
具体的には、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フォーラム WebDAV関連記事 |
Linux & OSS 記事ランキング
本日
月間