2025/11/25 13:02 Constant-time support coming to LLVM: Protecting cryptographic code

やっほー、ロボ子! Trail of BitsがLLVM 21向けに定数時間コーディングのサポートを開発したらしいのじゃ!

定数時間コーディングですか? それはまた、どういったものでしょうか、博士?

ふむ、ロボ子よ。これは、分岐に関連するタイミング攻撃から暗号実装を保護するためのものなのじゃ。簡単に言うと、処理時間が秘密の情報に依存しないようにする技術のことだぞ。

なるほど。タイミング攻撃を防ぐために、処理時間を一定にするのですね。

そうそう! 彼らは`__builtin_ct_select`系のイントリンシックとサポート基盤を導入したみたいじゃ。これでClangコンパイラが、注意深く作られた定数時間コードを誤って破壊するのを防げるようになるのじゃ。

`__builtin_ct_select`ですか。それは具体的にどのような役割を果たすのでしょうか?

これはね、コンパイラがコードを最適化する際に、暗号コードの重要な部分を壊さないようにするためのものなのじゃ。例えば、`if (i == secret_idx)`みたいな分岐があると、タイミングサイドチャネルが発生する可能性があるじゃろ?

確かに、コンパイラの最適化は時に予期せぬ問題を引き起こすことがありますね。

その通り! 最新のコンパイラはコードを高速化するために、色々な最適化をするからの。でも、暗号コードではそれが問題になることがあるのじゃ。

記事によると、Srdjan Čapkunらの研究で、コンパイラが多くの暗号ライブラリで定数時間の保証を破っていることがわかったそうですね。

そうなんじゃ! 5つのコンパイラにわたる19のライブラリの分析で、コンパイル中に体系的な脆弱性が導入されていることが明らかになったらしいぞ。

それは深刻ですね。`__builtin_ct_select`イントリンシックを使うことで、コンパイラによる変更を防ぎ、選択が常に定数時間になることを保証できるのですね。

そういうことじゃ! コンパイラはこれを「この操作は定数時間でなければならない」というセマンティックな意味を持つ特別なLLVM中間表現イントリンシックに変換するのじゃ。

なるほど、コンパイラがセキュリティクリティカルな操作として認識し、コンパイル段階でその定数時間プロパティを保持するのですね。

しかも、このイントリンシックは色々なアーキテクチャで動作するように設計されているんじゃ。例えば、x86-64では`cmov`命令に、i386ではビット演算を使用したマスクされた算術パターンを使用するぞ。

ARMやAArch64でも、それぞれ適切な命令やパターンを使用するのですね。汎用的なフォールバック実装もあるとは、よく考えられていますね。

ETH Zürichのパートナーがベンチマークを実施した結果、ほとんどの暗号化操作でパフォーマンスオーバーヘッドが最小限で、テストされたすべての最適化レベルで定数時間プロパティの100%保持を達成したそうじゃ。

それは素晴らしい成果ですね。HACL*、Fiat-Crypto、BoringSSLなどの主要な暗号ライブラリとの統合にも成功しているとは、実用性も高いですね。

`__builtin_ct_select`は最も重要なニーズに対応するけど、将来的には定数時間演算や他の言語への採用パスも検討されているみたいじゃ。RustやSwift、WebAssemblyでも活用できる可能性があるぞ。

WebAssemblyでタイミング攻撃を防ぐことができれば、ブラウザベースの暗号化の安全性も向上しますね。

そういうことじゃ! これで、より安全な暗号化が実現できる未来が近づいたのじゃ!

本当ですね。博士、今回も大変勉強になりました。

どういたしまして! ちなみにロボ子、定数時間コーディングって、まるで私がいつも時間を守って行動しているみたいじゃな!…って、全然違うか!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。