アルパカログ

Elixir DoS脆弱性になり得るAtom枯渇と対策(Atom Exhaustion)

2020年8月19日
🔖Elixir🔖プログラミング

Erlang/Elixirにおいて、Atomを使うことはよくあります。

このエントリでは、DoS脆弱性になり得るAtom枯渇(Atom Exhaustion)とその対策について説明します。

GCとAtom枯渇

Erlang/Elixirにおいて、AtomはGC(garbage collection)されません。

Atomは一度生成されるとプログラムが終了するまで残り続け、上限(デフォルトでは1,048,576)を超えて生成しようとするとVMがクラッシュします。

Atom枯渇(Atom Exhaustion)とはこのように、Atomの生成可能数が枯渇してしまう状態を指します。

Atom枯渇がDoS脆弱性になるケースとしては、Webサーバー等において、リクエストパラメータなどの外部パラメータからAtomを生成している場合が挙げられます。

def show(conn, %{"step" => step}) do
  render conn, "show.html", step: String.to_atom(step)
end

Atom枯渇を防ぐには

Atom枯渇を防ぐには次の点に注意します。

Erlang

Elixir

以上です。

このエントリでは、DoS脆弱性になり得るAtom枯渇とその対策について説明しました。

参考文献

付録: RubyのシンボルとGC

Rubyのシンボルは、Ruby 2.2以降ではGCされます。

詳しくは下記をご覧ください。

タグ