【入門編】HTTP/2実装におけるメモリ枯渇攻撃(DoS)の防御 – HTTPプロトコル・通信規格実践ガイド

みなさん、こんにちは!技術メディア編集部の主筆ライターです。

日頃何気なく使っているWebブラウザ。アドレスバーにURLを入力すれば、一瞬で綺麗な画像やテキストが表示されますよね。「どうやってこんなにたくさんのデータが同時に届いているんだろう?」と、裏側のネットワークの世界にワクワクしたことはありませんか?

今回は、そんな高速なWebの裏側を支える「HTTP/2」の、ちょっとダークで、でもインフラエンジニアにとっては絶対に避けて通れない「メモリ枯渇攻撃と、そのスマートな防御策」についてお話しします。

難しそうなセキュリティの話に聞こえるかもしれませんが、身近な「郵便配達」に例えながら一歩ずつ優しく紐解いていきますので、どうぞリラックスして最後までお付き合いくださいね!

—

1. 郵便受けをパンクさせろ? HTTP/2が抱える「便利さの裏側」

HTTP/2の最大の特徴といえば、なんといっても「マルチプレクシング(多重化)」です。

昔のHTTP/1.1という時代は、いわば「1通ずつしか手紙を送れない郵便配達員」でした。大きなWebページを表示するには、HTML、CSS、画像、JavaScript…と、何通もの手紙を順番待ちさせながら届けていたのです。これでは時間がかかりますよね。

そこでHTTP/2では、「1本の道路(TCPコネクション)を行き交うバイク便の荷台を細かく仕切って、たくさんの荷物を一度に運ぼうぜ!」という画期的な仕組み(ストリーム)が導入されました。

しかし、ここに落とし穴がありました。
悪意ある攻撃者は、この「一度にたくさん受け取れる便利さ」を逆手に取ったのです。

大量の「空っぽの手紙」でサーバーを窒息させる

攻撃者は、サーバーに対して「新しい荷台(ストリーム)を作ってくれ!」というリクエストを、一瞬のうちに何万通も送りつけます。

サーバーは「おっ、たくさんお客さんが来たな! それぞれ専用のメモ用紙を用意しなきゃ!」と、せっせとメモリ(記憶領域)を割り当てます。しかし、送られてくるのは空っぽの要求ばかり。あっという間にサーバーのメモリーが満杯になり、本当のユーザーのアクセスまで受け付けなくなってしまう(メモリ枯渇によるDoS攻撃)のです。

これが、HTTP/2の裏側で密かに狙われる恐怖のシナリオです。

—

2. 巨大な「めんどくさい手紙(ヘッダー)」にも要注意

もう一つ、攻撃に使われやすいのが「ヘッダー圧縮(HPACK)」という技術です。

HTTP通信では、ブラウザの種類やクッキーなど、細かいメタデータ(ヘッダー)を毎回やり取りします。HTTP/2はこのヘッダーを小さく圧縮して送るため、とても効率的なのですが、ここにも罠があります。

「ものすごく圧縮率が高くて、解凍すると地球の裏側まで届きそうなほど巨大になるデータ」を送りつけられたらどうなるでしょうか?
サーバーはそれを一生懸命「元の巨大なサイズ」に復元しようとして、メモリをガリガリと食いつぶしてしまいます。いわゆる「BOM(爆弾)データ」のようなものです。

では、私たちのインフラを守るエンジニアたちは、このずる賢い攻撃をどうやって防いでいるのでしょうか? 次の章で具体的な対策を覗いてみましょう!

—

3. サーバーを守る「お互いのルール(制限事項)」

現実世界でも、郵便局や役所の窓口には「一度に受け付けられる書類の枚数」や「持ち込める荷物の大きさ」に制限がありますよね。それと同じように、HTTP/2の世界でもサーバー側に「ここまでしか許しませんよ」というガードレール(制限事項)を設ける必要があります。

代表的な防御パラメーターを、Nginx(世界中で使われている人気のWebサーバー)の設定を例に見てみましょう。
難しそうに見えますが、日本語のコメントを読めば「あ、こういうことね!」とすぐに分かりますよ。

NginxにおけるHTTP/2の安全性を高める設定例
http {
# 1. 同時に開けるストリーム(荷台)の数に上限を設ける
# 「1つのコネクションにつき、最大で100個までしか同時にやり取りしません!」
http2_max_concurrent_streams 100;

# 2. 受信できるヘッダーブロックの最大サイズを制限する
# 「デコード(解凍)したときにメモリが爆発しないよう、最大でも512KBまでね!」
http2_max_header_size 512k;

# 3. 届いたリクエストを処理するバッファのサイズを指定
http2_chunk_size 8k;
}

このように、「無限に受け付けるのではなく、あらかじめ天井(上限)を決めておく」ことが、インフラを守る上での最大の鉄則になります。もし攻撃者がこの上限を超えるリクエストを送ってきたら、サーバーは「おっと、ルール違反ですよ」と冷静にそのストリームを遮断(キャンセル)するのです。

—

4. まとめ:安全で快適なハイウェイを作るために

今回は、HTTP/2の便利な仕組みの裏に潜む「メモリ枯渇攻撃」と、それを防ぐための制限事項について解説しました。

  • HTTP/2は一度にたくさんのデータをやり取りできて便利!
  • でも、その仕組みを悪用して「無限にメモリを使わせようとする悪い奴ら」がいる。
  • だからこそ、エンジニアは「同時ストリーム数」や「ヘッダーの最大サイズ」にしっかり制限(ガードレール)を設けてサーバーを守っている。

ネットワークやプロトコルの世界は、ただ速さを追求するだけではなく、「いかに安全で安定した道路にするか」という攻防の歴史でもあります。

「なんだか裏側の仕組みが少し見えて面白くなってきたかも!」と感じてもらえたなら、インフラエンジニアとしての第一歩は大成功です。
それでは、また次回の技術散歩でお会いしましょう!

コメント

タイトルとURLをコピーしました