
前回の記事では「セキュリティ対策における障壁」を取り上げました。
今回の記事では、組込み機器におけるセキュリティ対策について述べていきます。
組込み機器のセキュリティ対策はむずかしい?
組込み機器と情報通信機器の比較
下記は、組込み機器と情報通信機器を比較した表です。それぞれの特徴を確認してみてください。
組込み機器 | 情報通信機器 | |
ユーザーインターフェース | 限定的な操作 | 豊富な操作が可能 |
ソフトウェア | RTOS・専用アプリケーション | 汎用OS・アプリケーション |
ハードウェア | マイコン~プロセッサ メモリは潤沢ではない |
ハイエンドプロセッサ 大容量メモリ |
稼働 | 長期的・連続的な運用 | ユーザによる限定的な稼働 |
表の内容からも分かるように、PCやスマートフォンなどの情報通信機器と一般的な組込みデバイスではさまざまな違いがあります。
これらの違いによって組込みデバイスのセキュリティ対策が難化している中、ネットワークを介した攻撃が激化していることは大きな問題です。
組込みデバイスにおけるセキュリティ対策の進め方
組込みデバイスのセキュリティ対策を進める際は、2段階でアプローチするのがよいでしょう。
まず最初に、どの脅威に対応する必要があるかを考えます。そして次に、どのようにな対策を実装するかを考えていきます。
memcmpについて
memcmpの注意点
memcmpはメモリを比較する関数として広く知られていますが、セキュリティ面で問題があることはご存じでしょうか。
まずは、下記のような検討事項が思いつくかもしれません。
- 引数のサイズ(n)によっては該当領域のReadでオーバランが発生する?
- 複数のスレッドからリエントラントできる?
- 呼び出しコンテキストのスタックは足りる?
- 標準ライブラリをリンクすることで想定以上のメモリを消費する?
しかし、上記だけではなく、特に知っておいていただきたい注意点があります。
JM ProjectのLinux Programmer’s Manualによると、memcmpに関する注意点として下記の記載があります。
暗号化された秘密などセキュリティ的に重要なデータの比較には memcmp() を使用しないこと。 必要な CPU 時間は値が等しいバイトの量に依存するからである。 その代わり、 一定時間で比較を実行する関数が必要である。 いくつかのオペレーティングシステムでは (例えば NetBSD の consttime_memequal() などの) 関数が提供されているが、 このような関数は POSIX では規定されていない。 Linux では、 このような関数自体を実装する必要があるかもしれない。
引用:JM Project「Linux Programmer’s Manual (3) MEMCMP」
つまり、暗号化された秘密などの重要なデータの比較にはそもそもmemcmpを使用できないということです。必要なCPU時間は値が等しいバイトの量に依存してしまい、サイドチャネルアタック攻撃(暗号を処理するハードウェアを外部から観測し、内部の秘匿情報を取得しようとする非破壊型の攻撃)を受けやすくなります。
例えば、入力されたパスワードが正しいかどうかを検証する際にmemcmpを使用すると、パスワードの合っている長さに比例してその応答時間が長くなります。
処理をするアルゴリズム自体が直接攻撃を受けるのではなく、その処理に伴って発生する現象を手がかりに攻撃されてしまうのです。
サイドチャネルアタック攻撃対策とメモリ比較
それでは、サイドチャネルアタック攻撃を防ぎながらメモリを比較するにはどうすればよいのでしょうか。
上記のような攻撃を防ぐために、一定時間で比較を実行するconsttime_memequal関数はありますが、POSIXでは規定されていないためLinuxで使用する場合は関数自体を実装しなければならない可能性があります。
そこで、現実的な対策として「usleep(random() % 10); /* 0~9μs停止 */」のように関数に追記し、memcmp後にランダム時間を設けるのがよいでしょう。
- consttime_memequal関数を使用→POSIXでは規定されていないため、関数の実装面が課題
- 「usleep(random() % 10); /* 0~9μs停止 */」のように、関数に対策を追記→ひと手間で脅威に対応
そうすることで、先ほどの例で挙げた「パスワードの合っている長さに比例してその応答時間が長くなる」状態を防ぎ、システムの処理時間の差異によって認証情報を推測されるリスクを抑えられます。
このように、攻撃の原理を理解し、対応するためのひと手間を加えることで脅威に対応していくことが重要です。
次の記事では、セキュア通信をコンパクトに実現する方法を考えていきます。