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

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

LOCKメソッド

脅威:

  • ファイルに勝手にロックをかけられ、WebDAV経由での操作が不可能になる

 cadaverを使ってロックをかけている様子をリスト10に、ロックをかけられたことを知らずにSkunkDAV経由でロックをかけようとした様子を画面5に示します。

dav:/davnoauth/> lock DAVSec.txt
Locking `DAVSec.txt': (reconnecting...done) succeeded.
dav:/davnoauth/>
リスト10 cadaverによるLOCKメソッドの使用

画面5 他者の操作ができない例(画像をクリックすると拡大表示します)

対策:

  • LOCKメソッドの発行を制限する
     PROPFINDやMKCOLなどの制限と同様の設定を行うことで、リクエストを制限可能。

 また、すでにロックがかけられてしまった場合はロックデータベースファイルを削除する(リスト11)ことでロックを解除することが可能です。

# ls -al
total 16
drwxr-xr-x   2 share    share        4096 Nov 28 17:53 ./
drwxr-xr-x  13 root     root         4096 Nov 28 16:39 ../
-rw-r-----   1 share    share           0 Nov 28 17:53 DAVLock.dir
-rw-r-----   1 share    share        8192 Nov 28 23:17 DAVLock.pag
# rm DAVLock.*
rm: remove `DAVLock.dir'? y
rm: remove `DAVLock.pag'? y
# ls -al
total 8
drwxr-xr-x   2 share    share        4096 Nov 28 23:22 ./
drwxr-xr-x  13 root     root         4096 Nov 28 16:39 ../
#  ←ここで、画面6の操作を行う
# ls -l
total 8
-rw-r-----   1 share    share           0 Nov 28 23:23 DAVLock.dir ←再作成される
-rw-r-----   1 share    share        8192 Nov 28 23:23 DAVLock.pag ←再作成される
#
リスト11 ロックデータベースファイルの場所と削除

 この状態で、例えば新規にロックをかけた(画面6)場合、ロックデータベースファイルは新たに作成されます。

画面6 ロック操作の例(画像をクリックすると拡大表示します)

UNLOCKメソッド

脅威:

  • ロックをかけた以外の人がUNLOCKによって解除を実施してしまう

 LOCKメソッドでかけたロックをUNLOCKメソッドで開放するためには、Lockトークンが必要になります。対応するLockトークンは、LOCKリクエストに対応したレスポンス中で返却されますが、このトークンが不正に取得されてしまうとロックをかけた以外の人でもUNLOCKによるロック解除の実施が可能になります。画面6にてSkunkDAVでLOCKメソッドを発行しているときの通信内容をリスト12に示します。

LOCK /davnoauth/DAVSec.txt HTTP/1.1
(中略)
Content-type: text/xml..Content-length: 158

<?xml version="1.0" ?>
<lockinfo xmlns="DAV:">
  <lockscope>
    <exclusive/>
  </lockscope>
  <locktype>
    <write/>
  </locktype>
  <owner>
    <href>wakatono</href>
  </owner>
</lockinfo>


HTTP/1.1 200 OK
Date: Wed, 28 Nov 2001 14:33:49 GMT
Server: Apache/1.3.22 (Unix) DAV/1.0.3
Lock-Token: <opaquelocktoken:f04fe558-1dd1-11b2-8c12-8e456d58de06> ←Lockトークン
Connection: close
Transfer-Encoding: chunked
Content-Type: text/xml; charset="utf-8"

1b8
<?xml version="1.0" encoding="utf-8"?>
 <D:prop xmlns:D="DAV:">
 (中略)
<D:href>opaquelocktoken:f04fe558-1dd1-11b2-8c12-8e456d58de06</D:href> ←Lockトークン(HTTPヘッダに現れているものと同じ)
</D:locktoken>
</D:activelock>
</D:lockdiscovery>
</D:prop>
0
リスト12 LOCKメソッド実施中の通信内容

 上記の例では、Lockトークンは以下のような文字列になっています。

opaquelocktoken:f04fe558-1dd1-11b2-8c12-8e456d58de06

 この文字列をLockトークンに指定してUNLOCKリクエストを発行することで、ロックの解除が可能です。これを用いて不正にロックを解除している様子をリスト13に示します。

$ cadaver http://localhost/davnoauth/
Looking up hostname... Connecting to server... connected.
dav:/davnoauth/> ls
Listing collection `/davnoauth/': succeeded.
Coll:  sample                                  0  Nov 28 11:46
       DAVSec.txt                           7533  Nov 28 08:55
       DAVSec.txt~                          7659  Nov 28 08:55
       DAVSec_.lzh                         13880  Nov 28 08:55
       FIG.txt~                              284  Nov 28 08:55
dav:/davnoauth/> unlock DAVSec.txt
Unlocking `DAVSec.txt':Enter locktoken: opaquelocktoken:f04fe558-1dd1-11b2-8c12-8e456d58de06 ←自分ではLOCKトークンが分からないので聞いている
 succeeded. ←正しいLOCKトークンが入力され、ロックが解除された
dav:/davnoauth/>
リスト13 Lockトークンさえ分かればUNLOCKが可能

 また、ロックが解除されたことを知らないSkunkDAVからロックを解除しようとすると、画面7のような画面が表示がされます()。

画面7 SkunkDAVでロックを解除しようとすると表示される画面(画像をクリックすると拡大表示します)

:タイムアウトによるロック解除もあり得るので、ロックを解除した覚えがなくても解除されていることはあります。

対策:

  • UNLOCKメソッドの発行を制限する
     PROPFINDやMKCOLなどの制限と同様の設定を行うことで、リクエストを制限可能。

 また、Lockトークンが奪取されること自体がよいことではないので、あまりにもLOCKが解除されるという状態が続いたら、ネットワークの不正盗聴などが行われている可能性も視野に入れてください。

PUTメソッド

脅威:

  • 勝手にファイルを作成されてしまうリスト14
  • 既存のリソースに対して上書きされると、リソースが破壊されるリスト15

# telnet localhost 80
(中略)
PUT /davnoauth/putsample.txt HTTP/1.1 ←リクエスト開始/putsample.txtというファイルを作成
Host: tripmachine
Connection:  close, TE
TE: trailers, deflate, gzip, compress
User-Agent: Skunkzilla/1.0 RPT-HTTPClient/0.3-2
Accept-Encoding: deflate, gzip, x-gzip, compress, x-compress
Content-type: application/octet-stream
Content-length: 24

PUT Method Sample File.    ←putsample.txtの内容
              
←リクエスト終了
HTTP/1.1 201 Created     ←レスポンス開始(ファイル作成成功)
Date: Wed, 28 Nov 2001 14:50:59 GMT
Server: Apache/1.3.22 (Unix) DAV/1.0.3
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html

11b
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<HTML><HEAD>
<TITLE>201 Created</TITLE>
</HEAD><BODY>
<H1>Created</H1>
Resource /davnoauth/putsample.txt 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
               ←レスポンス終了
Connection closed by foreign host.
# ls -l /home/davnoauth/
total 40
-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         284 Nov 28 17:55 FIG.txt~
-rw-r-----   1 share    share          23 Nov 28 23:51 putsample.txt ←新しくできているファイル
drwxr-x---   2 share    share          48 Nov 28 20:46 sample/
# cat /home/davnoauth/putsample.txt
PUT Method Sample File. ←PUTリクエストで入れた内容が入っている
#
リスト14 PUTメソッドによる新規ファイルの作成

# telnet localhost 80
(中略)
PUT /davnoauth/putsample.txt HTTP/1.1 ←リクエスト開始/リスト14で作成したファイルに上書き
Host: tripmachine
Overwrite: T                   ←上書き許可
Connection:  close, TE
TE: trailers, deflate, gzip, compress
User-Agent: Skunkzilla/1.0 RPT-HTTPClient/0.3-2
Accept-Encoding: deflate, gzip, x-gzip, compress, x-compress
Content-type: application/octet-stream
Content-length: 50

PUT Method Sample File alternative by WAKATONO. ←上書きする内容
                         ←リクエスト終了
HTTP/1.1 204 No Content          ←レスポンス開始(成功)
Date: Wed, 28 Nov 2001 14:57:14 GMT
Server: Apache/1.3.22 (Unix) DAV/1.0.3
Connection: close
Content-Type: text/plain
                         ←レスポンス終了
Connection closed by foreign host.
# cat /home/davnoauth/putsample.txt
PUT Method Sample File alternative by WAKATONO. ←上書きされている
#
リスト15 既存ファイルに対する上書き

対策:

  • PUTメソッドの発行を制限する
     PROPFINDやMKCOLなどの制限と同様の設定を行うことで、リクエストを制限可能。

後編の予告

 前編では、各メソッドの動作・危険性と、それに応じた対処方法を中心に解説しました。メソッドの動作を知ることで、防御方法が浮き彫りになったと思います。

 後編では、より包括的にセキュリティを確保する方法を紹介します。「ダイジェスト認証」を使ったより安全な認証方法やmod_dav固有の問題とその対策方法など、WebDAVの利点を生かしたままセキュリティを強化できることをお伝えします。

4/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 記事ランキング

本日 月間