HTTPと硬直化 (ossification) の問題

「硬直化(ossification)」はあまり聞き慣れない言葉だが、インターネットやWebの通信において問題となってきています。

新しい機能の展開を阻害するこの問題は、HTTPにおけても問題になっておりましたが、HTTPの標準化を行うIETFで動きがありました。

IETFのHTTP WGではオープンレターとして「HTTP and Web Application Firewalls: Managing Ossification Risk」を公開し、WAFベンダと連携してこの問題に取り組んでいく意思が示されています。

この事に関して簡単に説明していきます

目次

硬直化(ossification) とは

「硬直化(ossification)」とは、インターネット上のアプリケーションやネットワーク装置などによってプロトコルの新しいバージョンや新しい拡張仕様の通信が正しく中継されず阻害されることです。ここでいうネットワーク装置は L3~L7で、たとえばロードバランサやプロキシ、ファイアフォール、WAFなどのセキュリティ製品などなどです。

実際、プロトコルとして拡張が許可されているはずなのに、不正な挙動となり通信を阻害してしまう環境がみつかります。TLS1.3やTCP Fast Openといったプロトコルは、標準課程の中で正しく通信が中継されない(フォールバックされない)環境などが見つかりました。

詳細は下記を参考に

HTTPにおける 硬直化(ossification)

HTTPもプロトコルの改善・拡張が日々行われております。わかりやすいところで、HTTPヘッダはベンダー独自にも、標準仕様としても新しいものが増えております。

そのため、HTTPにおいても硬直化(ossification)の問題は発生しており、新しいヘッダがWAFなどによりブロックされるなどの例が知られています。

  • Sec-Metadataヘッダでヘッダ値として「target=」を含めたらファイアフォールによってブロックされた (Issueリンク)
  • Cache-Controlで許可された値以外をブロックするという、OWASPでのルール (リンク)
  • Structured Field Valuesという仕様に基づいて、ヘッダ値に記号文字を入れたところ正しく通信できなかった (リンク)

このように、新しく拡張しようとして正しく機能しない部分は"錆びついた"とも表現されます。そのために、拡張性が維持できるように、錆びつかないようにグリス(GREASE)する試みが進んでいます。

グリス (GREASE)の例

TLS1.3のデプロイ時に発見された拡張性が正しく動作しない問題に対して、GREASE(RFC8701)という仕組みが考案されました。実装がサポートしてない未知の拡張仕様が正しく無視されるように、未知の予約された拡張番号を送ります。

例えば、cipher suitesおよびALPN識別子として下記の値を送信します(別のフィールドには別のGrease用の値が予約されています)

{0x0A,0x0A}
{0x1A,0x1A}
{0x2A,0x2A}
{0x3A,0x3A}
...
{0xFA,0xFA}

こうすることで、この未知の値を受け取った実装が正しく無視することを確認できます。また、通信が阻害されてしまう場合は、その事に気づくことができ、修正するように促すことが出来ます。このように、拡張性が錆びつかないようにグリスするということです。

HTTPにおけるGREASE

先に述べたように、HTTPでも硬直化(ossification)が問題になっています。HTTPもGREASEしようというながれになりました。HTTPの拡張性を維持するため、メッセージを受け取った相手が未知の値を正しく無視し通信を阻害しないことを確認できるようにします。

HTTP/2のGREASEについては以前紹介したとおりです。
asnokaze.hatenablog.com

今回IETFのHTTP WGから、「HTTP and Web Application Firewalls: Managing Ossification Risk」というオープンレターと「Greasing HTTP」という提案仕様が提出されています。

HTTP and Web Application Firewalls: Managing Ossification Risk」はWAFベンダーに対して、プロトコルの発展と硬直化(ossification)の問題を説明しています。セキュリティ上、未知の機能をブロックしたいということに関しても理解を示した上で、そのうえで、Greaseのために議論の場(メーリングリスト)を用意し、協力していく意思を示しています。

Greasing HTTP」という提案では、新しい拡張について適切な通知期間を設け、その後デプロイ出来るようにするというGreasingのプロセスについて述べています。

例えば、Greasing送信者、受信者、調停者を設け、適切なGREASE(ヘッダ名・ヘッダ値)を十分な量流すといったようなことが述べられています。

まだまだ提案ですのでこれから動きがあるところだと思います。