公開日:2020/11/25 最終更新日:2020/11/25
JVNTA#94494000
改ざんチェックのない CBC モードで暗号化された実行ファイルにおいて任意のコードを埋め込まれる問題
NTT、兵庫県立大学および NEC の研究チームにより、改ざんチェックが行われずに CBC モードによって暗号化されているバイナリ実行ファイルに任意コードを埋め込まれる問題が発見されました。この問題は研究チームにより ACNS 2020 において公表されました。
共通鍵暗号のブロック暗号において、暗号方式によらず以下のいずれかのモードを利用しており、且つ改ざんチェック機能のないシステムやアプリケーション
- CBC モード
- CFB モード
例えば、特定のファイル暗号ソフトウェアや OpenSSL コマンドなど、改ざんチェックのないソフトにより暗号化されたファイル、またはディスク暗号ソフトウェアにより暗号化されたディスクなどが影響を受ける可能性があります。
CBC モードについて
CBC モードは、共通鍵暗号のうちブロック暗号 (AES や 3DES など) でよく使われている暗号モードで、分割されたブロックを暗号化する際に、一つ前の暗号文ブロックと XOR 演算を行ってから暗号化する方式です。1ブロック目は前のブロックが存在しないため、IV (Initialization Vector)と呼ばれる値を用いて XOR 演算を行います。
本記事では、平文のブロックを (M1, M2, ..., Mn) 、暗号文のブロックを (C1, C2, ..., Cn)、AES や DES などのブロック暗号を Ek として表します。
改ざんチェックのないCBCモードに対する攻撃の原理
CBC モードの、前のブロックの暗号文と XOR を行うという特性を利用することで、一定の条件下で平文ブロックを任意の値に変更することが可能です。前提条件:
① 攻撃者は、暗号化される直前の値 (X) と暗号文 (Y) のペア1ブロック分(Y = EK(X)となる1組のペア)を知っている
② 攻撃者は、暗号文にアクセスし更新することができる
1. 任意の平文ブロックの作成
上図において、M2 をターゲットとする場合を例とします。このとき、M2 を求める式は以下のようになります。C1 ⊕ X = M2
ここで、前提条件②により暗号文を任意の値にできる場合、C1 を (X ⊕ Mtarget) に変更することで、元の M2 の値は以下のようにコントロールすることができます。
(X ⊕ Mtarget) ⊕ X = Mtarget
ただし、C1 の値が変更されるため、M1 の値は予測できない値となります。
次に、C4 を Y に置き換えることで、対応する X を作り出すことができるため、同様に C3 を (X ⊕ Mtarget2) に置き換えると M4 の値を任意値に変更することができます。ただし M3 の値は予期しない値となります。
このように、1組の Y = EK(X) となる X と Y のペアが判明していると、鍵を知らない攻撃者でも1ブロックおきに任意の値に平文をコントロールすることが可能となります(ただし、1ブロックおきに壊れたブロックが発生します)。
便宜上、本手法を「CBC 改ざん攻撃」と呼びます。
2. バイナリ実行ファイルにおける攻撃
バイナリ実行ファイルは、対応する CPU アーキテクチャごとに、ヘッダーとして概ね固定された値を持っています。この値をもとに算出した X を利用することで、攻撃者はバイナリファイルの実行内容を知らなくても CBC 改ざん攻撃を適用することができます。CBC 改ざん攻撃を利用し、実行ファイルの特定の位置にシェルコードを埋め込まれることで、本来のコードの代わりに任意のコードが実行される可能性があります。コントロールされるブロックは1ブロックおきですが、jump 命令と組み合わせた特殊なコード (参考: Bletsch et al., 2011; Carlini and Wagner, 2014) を挿入することで、1ブロックよりも長いコードを実行することが可能となります。この攻撃を成功させるには最初のシェルコードのブロックが適切な位置に挿入される必要がありますが、本研究により、攻撃者は無視できない確率で、攻撃コードを埋め込める可能性があることがわかっています。
攻撃コードは適切な箇所に挿入される必要があり、攻撃者は2-10 ~ 2-18程度の確率で挿入個所を推測する必要がありますが、攻撃が成功した場合には以下のような影響があります。
- 改ざんされたことに気づかずに実行ファイルを復号して実行した場合、ファイルを実行する権限において、予期しないアプリケーションの実行や、開放したポートからの任意コマンドの待ち受けなど、任意のコードを介してあらゆる操作が実行される可能性があります
アプリケーション・システムが実施できる対策
① 対策として、アプリケーション側で「改ざん検知機能を付ける」ことが有効です。具体的には暗号化/復号時に以下の対策を行うことで攻撃を防ぐことが可能です。・暗号化時
暗号化時と異なる鍵 K' を用い、以下のように (C || IV) の MAC 値 T をとることで、安全な改ざん検知の値を算出できます。
T = MAC (K', C || IV)
なお、電子政府推奨の暗号リストによると MAC のアルゴリズムは CMAC と HMAC が推奨されています。
この際の、(C || IV, T) を暗号文として保持しておきます。
・復号時
復号の際には、T = MAC (K', C||IV) を再度計算して、保存してある T と一致しているか確認します。計算した T が一致している場合のみ復号を行い平文を求めます。攻撃者により C が改ざんされていると、計算した T の値と保存しているTの値が異なるため改ざんを検知でき、攻撃を防ぐことができます。攻撃者は K' を知らないため、改ざんした C' に対する正しい MAC 値 T = MAC (K', C'||IV) を計算することができません。この対策を行うことで理論的安全性が保証されます。
② 暗号前後でメッセージの長さが同一でなければならないような制約や仕様がある場合には、XTS モードを利用することが有効策となります。
ユーザが実施できる対策
利用するアプリケーションが CBC モードを利用しており、改ざんチェック機能が付いていない場合でも、オプションにより暗号方式やモードを選択できる場合があります。この場合は、CBC や CFB 以外のモードを選択することが有効です。
ベンダ | ステータス | ステータス 最終更新日 |
ベンダの告知ページ |
---|---|---|---|
オリンパス株式会社 | 該当製品無し | 2020/11/25 | |
サイボウズ株式会社 | 該当製品無し | 2020/11/25 | |
ジェイティ エンジニアリング株式会社 | 該当製品無し | 2020/11/25 | |
株式会社 スマート・ソリューション・テクノロジー | 該当製品無し | 2020/11/25 | |
横河計測株式会社 | 該当製品無し | 2020/11/25 |
本文書は、NTT 技術企画部門の藤田倫太朗氏、兵庫県立大学 暗号・情報セキュリティ研究グループの五十部孝典氏、NEC セキュリティ研究所の峯松一彦氏、および JPCERT/CC が共同で執筆しました。