👏

Cloudflare WAF のコンテンツアップロード検査機能を試す

2024/03/22に公開

Security Week 2024では多くのセキュリティ強化機能が発表されましたが、そのなかでもWAFに新しく機能として加わったコンテントアップロードにおけるコンテンツの検査を試しました。

https://blog.cloudflare.com/waf-content-scanning-for-malware-detection/

この機能はEnterprise版をお使いのお客様に有償で提供されます。
ウェブサイトに対して、主に以下のようなコンテンツがアップロードされた際に悪意のあるバイナリーデータかどうかを判別します。判別には単純にファイル種別(拡張子ではなくコンテンツタイプは自動判別します)やファイルサイズのルールだけではなく、ウイルス対策スキャナーと連携しファイルの安全性そのものを判別します。
また、悪意のあるバイナリーをアップロードする攻撃者は、Content-Typeを偽装することも考えられるため、ファイル種別の判別は独自で行われます。

コンテンツオブジェクトとは、以下のどのタイプにもマッチしないリクエストのペイロードのことを指します。text/htmltext/x-shellscriptapplication/jsontext/csvtext/xml。他のすべてのコンテンツタイプは、検査対象となり以下のようなコンテンツオブジェクトとみなされます:

実行可能ファイル(.exe、.bat、.dll、.wasmなど)
ドキュメント(.doc、.docx、.pdf、.ppt、.xlsなど)
圧縮ファイル(.7z、.gz、.zip、.rarなど)
画像ファイル(.jpg、.png、.gif、.webp、.tifなど)
ビデオおよびオーディオファイル

また、リクエストボディのJSON(BASE64エンコードされたバイナリーを含む)もWAFのルール書式に設定することで検査対象とすることができます。

さっそくやってみる

オリジンの設定

では早速やってみます。まず最初にAmazon EC2を用いてOriginを立てます。
https://zenn.dev/kameoncloud/articles/6d2dec59232917
この記事を参考にnginxを起動します。

その後以下のHTMLファイルを配置します。
/usr/share/nginx/html/upload.html

<!DOCTYPE html>
<html>
<head>
    <title>File Uploader</title>
</head>
<body>
    <h1>Please upload file</h1>
    <form action="#" method="post" enctype="multipart/form-data">
        <input type="file" name="fileToUpload" id="fileToUpload">
        <input type="submit" value="Upload">
    </form>
</body>
</html>

nginxがファイルアップロード用POSTリクエストを正しく処理できるように/etc/nginx/nginx.confを編集します。
error_page 405 =200 $uri;の1行を以下の場所に追記します。

        error_page 404 /404.html;
        location = /404.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
        }

        error_page  405     =200 $uri;
    }

これは、POST処理(ファイルアップロード処理が終わった後の画面遷移を指定するパラメーターです。またclient_max_body_size 50m;を以下の場所に追記することで50MバイトまでのPOSTを受付可能となります。

        listen       80;
        listen       [::]:80;
        client_max_body_size 50m;
        server_name  _;
        root         /usr/share/nginx/html;

sudo service nginx restartで再起動します。
/upload.htmlで簡単なPDFとTXTファイルを準備しアップロードできることを確認しておきます。

Cloudflareの設定

動作確認が出来たらいつも通りCloudflareのCDNをセットします。CloudflareではCDNとWAF、DNSのセットアップは一体化しておりDNSエントリをセットした時点で、CDNが自動でActivateされWAFも設定が完了しています。通常はWAFのルールをActivateしないため、WAFは動作していませんが、WAFそのものの導入は完了している、という形です。

では次にWAFの設定を行うのですが、コンテンツアップロードスキャン機能はPaid-Opt-inとなるため、明示的に機能を有効化させる必要があります。アカウントに権利が付与されていれば以下のトグルがオンになっています。(テストを行いたい方は個別に連絡くださいませ)


SecuritySettings

トグルがオンになっていることを確認出来たら、WAFでCustom Ruleを作成します。

Create Ruleボタンを押して以下のように設定します。

アップロードされたファイルタイプがPDFの場合・・・を意味します。
以下のようにActionを指定しDeployを押せばルールはセット完了です。この場合PDFをアップロードしようとした場合のみ、Cloudflare所定のエラー画面がでます。

先ほどテストに用いたPDFとTXTのそれぞれ拡張子をzzzに変えてUploadします。PDFだけが止まるはずです。

管理画面では以下のように脅威が軽減されたことがわかります。



その他のルール

上記の例では単純にPDFのみを止めましたが、例えばコンテンツが疑わしい場合等様々なルールが準備されています。


https://developers.cloudflare.com/waf/about/content-scanning/example-rules/
にいくつかの設定サンプルがあります。例えばウイルススキャンと連携して怪しいファイルを止める設定は以下になります。

Discussion