Erlang/Elixirにおいて、Atomを使うことはよくあります。
このエントリでは、DoS脆弱性になり得るAtom枯渇(Atom Exhaustion)とその対策について説明します。
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枯渇を防ぐには次の点に注意します。
-
list_to_atom/1
の代わりにlist_to_existing_atom/1
を使用する -
binary_to_atom/1,2
の代わりにbinary_to_existing_atom/1,2
を使用する - 信頼できない入力に対して
binary_to_term/2
を呼ぶときはsafe
オプションを使用する(*1) - 信頼できない入力に対して
file:consult/1
やfile:path_consult/2
を使用しない(*1)
-
String.to_atom/1
の代わりにString.to_existing_atom/1
を使用する -
List.to_atom/1
の代わりにList.to_existing_atom/1
を使用する -
Module.concat/1,2
の代わりにModule.safe_concat/1,2
を使用する - 次のようなinterpolation(補間)によるAtom生成を使用しない
-
:"new_atom_#{index}"
-
:'new_atom_#{index}'
-
~w[row_#{index} column_#{index}]a
-
- 信頼できない入力に対して
:erlang.binary_to_term/2
を呼ぶときはsafe
オプションを使用する(*1) - 1: Serialisation and deserialisation を参照
以上です。
このエントリでは、DoS脆弱性になり得るAtom枯渇とその対策について説明しました。
Rubyのシンボルは、Ruby 2.2以降ではGCされます。
詳しくは下記をご覧ください。
コメントを送る
コメントはブログオーナーのみ閲覧できます