インターネットのハイテク金庫を想像してください。それらは暗号化ライブラリであり、パスワードをロックし、メッセージを暗号化し、身元を確認するソフトウェアツールです。これらなしでは、私たちのデジタル世界は丸裸になってしまいます。しかし、この論文は、たとえ最良の金庫であっても弱点が存在し、それらを作る人々(開発者)と、それらを作るために使われるツール(コンパイラ)が、十分な保護を行っていないと主張しています。
以下に、この論文の主要なポイントを簡単な比喩を用いて解説します。
1. 2 種類の泥棒
この論文は、攻撃者がこれらのデジタル金庫を破ろうとする 2 つの主要な方法を特定しています。
「ストップウォッチ泥棒」(サイドチャネル攻撃):
鍵を開けようとするのではなく、金庫の外に立って耳を澄ます泥棒を想像してください。彼らは、警備員が特定の鍵を試すとき、間違った鍵を試すときよりも、金庫の扉がカチッと閉まるまでにわずかに時間がかかることに気づきます。これらの微小な時間の差を計測することで、泥棒は決して鍵に触れることなく秘密のコードを突き止めることができます。
- 論文の指摘: 暗号化コードには、しばしば「秘密に依存する」ステップが含まれています。コードの実行時間が秘密のパスワードに基づいて異なる場合、ハッカーはストップウォッチを使ってそのパスワードを盗むことができます。
「コピー&ペーストハイジャッカー」(コード再利用攻撃):
書籍が乱雑で安全でない言語で書かれた図書館を想像してください。泥棒は床に穴(メモリエラー)を見つけ、床板を破壊する爆弾を落とします。床が壊れると、泥棒は新しい武器を作る必要はありません。すでに図書館の倉庫に置かれているハンマー、のこぎり、梯子を掴むだけです。彼らはこれらの既存のツールを「継ぎ接ぎ」して外へ登り、建物を乗っ取ります。
- 論文の指摘: 多くのライブラリは、メモリエラーを許容する C や C++ などの言語で書かれています。ハッカーはこれらのエラーを利用してプログラムの流れを乗っ取り、ライブラリ内部に既に存在する小さく無害なコードの断片を、大規模な攻撃を仕掛けるために利用します。
2. 金庫の現状
著者らは、数百万のウェブサイトで使用されている OpenSSL などの11 の人気のある暗号化ライブラリを調査し、それらがどの程度保護されているかを検証しました。
- 「ストップウォッチ」の問題: ほとんどの開発者はタイミング攻撃を知っており、何を実行しても正確に同じ時間がかかるようにコードを書くことで修正を試みています。しかし、この論文は、11 のライブラリのうち実際に 2 つのみが、最終製品が「ストップウォッチ」のトリックに耐えられるかを確認するためにテストを行っていることを発見しました。これは、料理人がスープを提供する前に味見をするものの、塩が実際に溶けているかを確認することを忘れているようなものです。
- 「コピー&ペースト」の問題: 開発者は、メモリエラーを止めるための標準的な安全ツール(「スタック・キャナリー」のような、トリップワイヤーのようなもの)を使用しています。これらは役立ちますが、完璧ではありません。この論文は、ほとんどのライブラリが利用可能な最強の安全設定を使用していないことを発見し、それらを高度なハイジャッキングに対して脆弱にしています。
3. 壊れた設計図(コンパイラの問題)
これが論文の主張の核心です。開発者はコード(設計図)を書きますが、コンパイラは、その設計図を実際の稼働する機械語に翻訳する機械です。
- 対立: コンパイラは、コードを高速かつ効率的にするように設計されています。彼らは、物語を短くするために「無駄」を切り取りたいと願う、非常に熱心な編集者のようなものです。
- 過ち: 時折、コンパイラが切り取る「無駄」は、実際にはセキュリティ対策です。例えば、開発者はプロセスが同じ時間がかかるように(ストップウォッチ泥棒を防ぐために)追加のコードを書きます。コンパイラは、この追加コードが不要な無駄だと考え、それを削除します。結果は?コードは再び高速になりますが、セキュリティの穴が戻ってしまいます。
4. 仕事のための新しいツール(セキュアコンパイル)
この論文は、速度と同じくらいセキュリティを理解する新しい種類の「編集者」またはコンパイラが必要だと提案しています。彼らは 4 つの異なる実験的なツールをテストしました。
- 「ガーディアン」(SecComp): このツールは、開発者がコードの特定の部分を「触るな」とマークすることを可能にします。これにより、コンパイラはセキュリティ対策を維持することを強制されます。欠点:まだ無料で使用できません。
- 「シャッフルャー」(マルチコンパイラ/MCR): このツールは、コードを取り、プログラムをビルドするたびに家具を並べ替えます。毎日ハンマーとノコギリを異なる部屋に移動させるようなものです。泥棒が侵入しても、レイアウトが変わっているため、必要なツールを見つけることができません。欠点:「ストップウォッチ泥棒」を防ぐために使用すると、プログラムの速度が大幅に低下します。
- 「建築家」(SecDivCon): このツールは、最初からセキュリティ規則を焼き付けてコードを構築し、最終製品が高速かつ安全であることを保証します。欠点:構築に非常に時間がかかり、小さく特定のタスクに対してのみよく機能します。
- 「リニアライザー」(PCFL): このツールは、乱雑なコードを自動的に書き直し、タイミングを計ることが不可能な、まっすぐで予測可能なラインに変換します。欠点:「コピー&ペーストハイジャッカー」攻撃は防げません。
5. 最終判決
この論文は、私たちが現在速度と安全性の間の狭間で立ち往生していると結論付けています。
- 開発者は手動で安全なコードを書こうとしていますが、しばしば的を外しています。
- コンパイラは速度に焦点を置きすぎ、誤ってセキュリティ機能を削除してしまいます。
- 現在のツールは、遅すぎるか、複雑すぎるか、あるいはすべての種類の攻撃をカバーしていません。
解決策: 著者らは、3 者間の取り組みを呼びかけています。
- コンパイラメーカーは、開発者が「遅く見えても、このセキュリティ機能を削除しないでください」と言えるように、より多くの制御を提供する必要があります。
- セキュアコンパイラメーカーは、片方だけでなく、タイミング攻撃とハイジャッキング攻撃の両方を同時に処理するツールを構築する必要があります。
- ライブラリ開発者は、希望に頼るのをやめ、これらの新しいより安全なコンパイルツールを使い始め、金庫が本当にロックされていることを確認する必要があります。
要約すれば:私たちは安全な金庫の設計図を持っていますが、それらを作る機械は角を切りすぎることに熱心すぎます。私たちは、機械に速度と同じくらい安全性を優先させるよう教える必要があります。
技術概要:サイドチャネル攻撃およびコード再利用攻撃に対する暗号ライブラリの保護
問題定義
暗号ライブラリはサイバーセキュリティの基盤であるが、サイドチャネル攻撃(特にタイミング攻撃)とコード再利用攻撃(Return-Oriented Programming など)という 2 つの主要な攻撃クラスに対して依然として脆弱である。
- タイミング・サイドチャネル攻撃: これらの攻撃は、秘密依存の分岐、メモリアドレス指定、または可変遅延命令によって引き起こされる実行時間のばらつきを悪用する。物理的なサイドチャネルとは異なり、タイミング攻撃にはデバイスへの物理的なアクセスは不要である。本論文は、開発者がしばしば手動で「定数時間」プログラミングを実装している一方で、汎用コンパイラ(GCC や LLVM など)がコード生成中にこれらの保護を最適化によって除去したり、タイミング漏洩を導入したりする可能性があり、ソースレベルの緩和策が無効化されることを指摘している。
- コード再利用攻撃: これらの攻撃は、メモリ破損脆弱性(バッファオーバーフローなど)を利用して制御フローを乗っ取る。攻撃者は、ライブラリまたはリンクされたライブラリから既存のコード断片(「ガジェット」)を組み合わせ、悪意のあるペイロードを実行する。多くの人気のある暗号ライブラリは、安全性よりも効率性を優先する汎用コンパイラに依存する安全性の低い言語(C/C++)で記述されており、制御フローの乗っ取りに対して脆弱なままとなっている。
現在の緩和策は断片的である。開発者は、タイミング攻撃に対しては手動のソースコード修正に、コード再利用攻撃に対しては標準的なコンパイラフラグ(スタックキャナリーや ASLR など)に依存している。しかし、これらの対策はしばしば不十分である。手動の修正はエラーを起こしやすく、最適化によって容易に破綻する一方、標準的なコンパイラフラグ(例:-fstack-protector)は、Jump-Oriented Programming (JOP) や微細なコード再利用攻撃のような高度な攻撃に対する保護を保証しない。さらに、ソースレベルの緩和策がコンパイルプロセスを生き延びることを保証するバイナリレベルの検証が欠如している。
手法
著者らは、BearSSL、Botan、cryptlib、Crypto++、GnuTLS、LibreSSL、Libgcrypt、libsodium、Mbed TLS、OpenSSL、wolfTLS という 11 の人気のあるオープンソース暗号ライブラリについて包括的な分析を行った。
緩和策の実証的分析:
- 著者らは、Ubuntu 18.04 を実行する Intel Core i7 システム上で GCC 7.5.0 および Clang 10.0.1 を使用してこれらのライブラリをコンパイルした。
- バッファオーバーフローチェック(
-DFORTIFY_SOURCE)、スタックキャナリー(-fstack-protector-strong)、位置独立実行(-fPIE)などのセキュリティ対策の存在を特定するために、デフォルトのコンパイルフラグを分析した。
- これらの知見を、コンパイル後のタイミングテストに関する既存の文献(特に Jancar ら [4])と照合した。
セキュアコンパイルアプローチの評価:
本論文は、特定されたギャップに対処するために、LLVM インフラストラクチャに統合されているか、または互換性のある 4 つの特定のセキュアコンパイルツールを調査する。
- SecComp (Vu ら [12]): 「不透明な観測(opaque observations)」(ソースコード注釈)を使用して、コンパイラが定数時間特性を保持することを強制する。
- Multicompiler (MCR) [13]: コード再利用攻撃を妨げるために、多様なコードバリエーション(スタック配置、関数順序、レジスタ使用)を生成するプログラムランダム化ツールである。
- SecDivCon [5]: セキュリティポリシー(秘密変数対公開変数)を定義することで、多様化された定数リソースコードを生成する制約ベースのコンパイラバックエンドである。
- Partial Control-Flow Linearization (PCFL) [14]: LLVM 13 を使用して、非定数時間プログラムを自動的に定数時間同等物に変換する。
主要な貢献
- 脆弱性評価: この研究は、ほとんどの暗号ライブラリがスタックキャナリーを実装している一方で、コード再利用攻撃に対する包括的なコンパイラベースの緩和策を有効にしているライブラリはごくわずかであることを明らかにしている(テストされた構成では
libsodium だけがデフォルトで -fPIE を使用している)。重要なのは、11 のライブラリの中で 2 つだけが開発プロセスの一環として定数時間テストを実行しており、コンパイルされたバイナリがタイミング漏洩から自由であることを保証する広範な欠如を示していることである。
- コンパイルギャップの特定: 著者らは、汎用コンパイラがしばしばセキュリティ目標と対立することを示している。最適化フラグは手動の定数時間緩和策を誤って除去する可能性があり、標準的なセキュリティフラグはすべての攻撃ベクトルを網羅していない(例:スタックキャナリーは JOP に対して無効である)。
- セキュアコンパイルの調査: 本論文は、既存のセキュアコンパイルツールの比較分析を提供し、タイミングサイドチャネル(TSC)およびコード再利用攻撃(CRA)の緩和能力、可用性、パフォーマンスオーバーヘッド(実行時間およびコンパイル時間)によって分類している。
- 提案される方向性: 著者らは、手動のソースコード修正からセキュアコンパイルプロセスへの負担の移行を通じて、暗号ライブラリのセキュリティを改善するためのロードマップを概説している。
結果
- ライブラリの現状: ほとんどのライブラリは、バイナリレベルで検証されていない手動の定数時間実装に依存している。スタックキャナリーは広く使用されているが、洗練されたコード再利用攻撃に対しては不十分である。
libsodium だけが実行可能ファイルに対して位置独立実行(PIE)を有効にしており、cryptlib だけが -DFORTIFY_SOURCE フラグを使用している。
- ツールのパフォーマンス:
- SecComp: オーバーヘッドが低く定数時間特性を保持するが、手動の注釈が必要であり、公開されていない。コード再利用攻撃には対処しない。
- MCR: ランダム化によるコード再利用攻撃に対して効果的であり、コンパイルオーバーヘッドは低い。しかし、タイミングサイドチャネルの緩和に使用されると、実行時間のオーバーヘッドが高くなる(最大 8 倍)。
- SecDivCon: タイミング攻撃に対する強力な保証と微細な多様化を提供するが、コンパイル時間が長く、小さな関数および特定のアーキテクチャ(MIPS/ARM)に限定される。
- PCFL: 低コンパイルオーバーヘッドで自動的に定数時間コードを生成するが、実行時間のオーバーヘッドが高く、コード再利用攻撃には対処しない。
意義と主張
本論文は、暗号ライブラリを現代の脅威から保護するために、手動のソースコード緩和策と汎用コンパイラへの現在の依存関係は不十分であると主張する。著者らは以下を主張する。
- セキュリティは後付けではならない: コンパイルプロセスは、セキュリティ特性がしばしば失われる重要な段階である。セキュリティ要件とコード効率の間のギャップを埋めるためには、セキュアコンパイルアプローチが必要である。
- 統合されたソリューションの必要性: 既存の単一のツールが、タイミングとコード再利用の両方の問題を効率的に解決するものはない。著者らは、将来の開発が以下の点に焦点を当てるべきであると提案する。
- コンパイラ開発者: 最適化を制御してセキュリティ特性を保持し、汎用コンパイラに定数時間保持を統合すること。
- セキュアコンパイラ開発者: 単一のベクトルに焦点を当てるのではなく、複数の緩和策(タイミングと制御フロー)を組み合わせたツールの作成。
- ライブラリ開発者: セキュアコンパイルアプローチに適応し、ビルドスキームに追加の保護オプションを有効にすること。
本論文は、暗号ライブラリのセキュリティを向上させるには、アドホックな手動修正から、セキュアコンパイル、バイナリレベルの検証、および複数の攻撃者モデルを同時に処理できるツールを組み込んだ開発プロセスへの体系的な移行が必要であると結論づけている。
毎週最高の computer science 論文をお届け。
スタンフォード、ケンブリッジ、フランス科学アカデミーの研究者に信頼されています。
受信トレイを確認して登録を完了してください。
問題が発生しました。もう一度お試しください。
スパムなし、いつでも解除可能。
週刊ダイジェスト — 最新の研究をわかりやすく。登録