コンパイラのスイッチ切り替えひとつでセキュリティを強化:ポインタ認証および分岐ターゲット識別の実現

November 10, 2023

 

Armエコシステムにとって、ポインタ認証(PAC)と分岐ターゲット識別(BTI)が必須のセキュリティ技術である背景と理由について解説します。

著:Nicolas Devillard(Arm アーキテクチャ&テクノロジーグループ セキュリティアーキテクト)

私たちの日常生活のあらゆる場面では、テクノロジーがますます浸透しています。データポイントとコネクティビティの拡大により、デジタルソリューションは人々の暮らしを一変させているものの、これと同時に複雑化も進んでいます。こうしたソリューションのセキュリティを管理することは、Armのコンピューティング・アーキテクトにとっての優先事項であり、業界全体の姿勢にも反映されています。PSA Certifiedの2023年「セキュリティレポート」によると、テクノロジーの意思決定者の75%は、セキュリティをビジネスの優先事項と考えています。

 

包括的なセキュリティ戦略

シリコンパートナー、ソフトウェアパートナーとの協力を通じて、Armは現在、セキュリティのベストプラクティスとテクノロジーを進化させるべく、包括的な戦略に取り組んでいます。ソフトウェアのセキュリティに関しては、最近のアーキテクチャ・リリースを通じ、メモリ関連のさまざまなセキュリティの脆弱性に取り組んできました。2019年には、Armv8.5命令セットの一環として、メモリタギング拡張機能(MTE)を導入しました。このほか、以下の技術も導入しました。

  • Armv8.3-A:ポインタ認証(PAC)
  • Armv8.5-A:分岐ターゲット識別(BTI)
  • Armv8.1-M:PACBTIの統合サポート

上記の技術はいずれも、ソフトウェアの信頼性強化を念頭に設計されており、深刻なセキュリティバグ全体の過半数を占める、メモリの安全性違反やメモリ破損といった、特定のクラスのセキュリティ脆弱性の軽減に寄与します。

 

Renesasの新型マイクロコントローラーがPACBTIを採用

Renesasは2023年10月31日、Arm史上最高のパフォーマンスとセキュリティを誇るCortex-MプロセッサーのCortex-M85を初めて採用したマイクロコントローラー(MCU)のRA8シリーズを発表しました。このRA8シリーズはArm Heliumテクノロジーを採用することで、DSPとMLのパフォーマンスを強化しており、イノベーション指向の企業はセキュリティを犠牲にすることなく、AIの機会に取り組むことが可能です。

RenesasのIoTプラットフォーム事業部バイスプレジデントであるDaryl Khoo氏は、次のように述べています。「Arm Cortex-M85とHeliumテクノロジーをRA8シリーズに実装したことで、AI実装などの高負荷ユースケースに要求されるパフォーマンスの向上を達成できたことを嬉しく思います。これに加えて、PACBTIと最新のRSIP-E51A統合型セキュリティ・エンジンは、PSA Certifiedのレベル3 RoTコンポーネント認証を想定しており、ロータッチの改ざん防止機能を開発者に提供することで、さまざまな業界の製品の必須コンポーネントとなっている、複雑なアプリケーションのセキュリティを保護できます」

ArmアーキテクチャとRenesasのセキュリティIPによるパフォーマンスとセキュリティの強化機能の数々に加えて、今回のRA8シリーズは、PACBTIのセキュリティ拡張機能を採用した、初の市販Cortex-Mベース・シリコンとなっています。

 

PACBTIの詳細

本稿で詳細に取り上げるメリットとして、PACとBTIを使用すれば、ソフトウェア基盤のコードに一切触れることなく、セキュリティ・エクスプロイトを軽減できるため、アプリケーションのセキュリティを防御するソフトウェア開発者にとっては貴重なツールとなります。PACとBTIの2つの技術は、エコシステム全体のセキュリティにとっても不可欠な存在であり、各種センサー、スマートフォン、スーパーコンピュータなど、テクノロジー市場のあらゆる要素を網羅するArm IPで幅広く利用可能です。

 

第一に、メモリ破損に関連する共通のリスクとは

実行プログラムのポインタが破損すると、ルートの変更により、ガジェットなど、他のソフトウェアが実行されることがあります。ガジェットとはソフトウェアの一種であり、その実行機能は、デバイスやシステムに損害を加えようとする攻撃者の目論見を後押しします。具体的な機能としては、任意のファイルやメモリの場所の読み取り、ソケットのオープン、別のプロセスのスポーン、特権の昇格が考えられます。攻撃者はこれらの機能を組み合わせることで、既存のソフトウェアを再利用して悪意のある攻撃を実行できます。ガジェットは、ありとあらゆるプログラムやライブラリに見受けられます。そして、より高度なリモート攻撃をマシンに行わせる足がかりとして使用されるのが一般的です。

 

リターン指向プログラミングとジャンプ指向プログラミング、そしてガジェットとの関連性

リターン指向プログラミング(ROP)とジャンプ指向プログラミング(JOP)は、メモリ破損を利用し、プログラムの実行を使用可能なガジェットにリダイレクトする2つの攻撃手法です。ROP攻撃では、ソフトウェア・スタックをスキャンすることで、新たなプログラムの構成で連結可能なガジェットを探します。一方、JOP攻撃は、関数ポインタやcase文のような、他の形式の間接(絶対)分岐で終わるシーケンスを標的としており、攻撃者はこれを乗っ取ることで、ガジェットを連結させることが可能です。

 

PACの特徴と攻撃に対する防御のメカニズム

PACとは、使用前のアドレスへの変更がないことを検証し、ROPを阻止するための防御メカニズムです。Cortex-Aでは64ビット、Cortex-Mでは32ビットのポインタの戻りアドレスの最上位ビット(上位ビット)に認証コードを挿入するため、Armの命令セットアーキテクチャ(ISA)には新たな命令が追加されています。そして、関数から戻るためのアドレスを使用する前に、認証コードをチェックします。その結果、攻撃者は認証コードやアドレスを変更することも、戻りアドレスをスタック内の別の戻りアドレスに置き換えることも不可能になります。というのも、任意のコード実行へとつながることはなく、プログラムを停止させる例外がトリガーされるからです。

 

BTIの特長

BTIとは、JOPを阻止するための防御メカニズムです。BTIの全体的な目的は、本来想定されるターゲットの場所だけに分岐を制限することで、さまざまな「分岐」を対象に、より強力なセキュリティを保証することです。この結果、攻撃者にとっては、プログラムの制御フローの不正操作が困難になります。分岐の悪用に際しては、ジャンプポインタを変更することで、任意のコードを実行させます。これにより、実行スレッドはコード内の別の場所、一般的には理想的なガジェットへのジャンプを強制されます。BTIでは、Armの命令セットアーキテクチャ(ISA)に分岐ターゲットのコンセプトを追加しており、分岐ターゲットではない命令に分岐した場合、例外が発生します。攻撃者がメモリ破損を目論む場合、分岐は無効な場所にリダイレクトされ、実行は停止されます。

 

PACBTIの保護レベル

PACとBTIでは、戻りアドレスと分岐アドレスに厳格なコントロールを追加できるため、使用可能なROPとJOPのガジェットの数は大幅に減少します。国家安全保障局(NSA)は、PACとBTIを活用したLinuxディストリビューションで、使用可能なガジェットが50倍削減されたことを特定しました。一方、Armの独自調査によると、(Arm Cortex-A CPUによる)glibcで使用可能なガジェットの数は、PACとBTIのアクティベーション後は97%以上削減されました。


 

PACBTI Infographic

出典: Applying these techniques to real code

 

PACBTIの活用方法

最新版Armv9アーキテクチャなど、最近のアーキテクチャでは、Arm ISAの一部としてPACとBTIが追加されています。こうした命令は、コードのコンパイル時にバイナリに自動追加されるため、使用可能なガジェットのコレクションにはなりません。すべての開発者に求められるのは、ビルド命令のセキュリティ保護を有効にすることです。

 

PACBTIの命令をサポートするプロセッサー

Armv9-A CPUの全製品は、PACとBTIをプロセッサーに組み込んでおり、いずれのセキュリティ機能も、アップデートと改良を定期的に実施しています。一例として、Cortex-A CPUの最新のv9世代では、Armv9 CPU設計でセキュリティ機能をアクティベートする際に、パフォーマンスを向上させる最新アルゴリズムのQARMA3 PACを導入しました。Cortex-Mプロセッサーでは、Cortex-M85がPACとBTIの命令をサポートします。

 

Cortex-A/Cortex-MによるPACBTIの違い

Cortex-AのOSとアプリケーションは、大規模なエコシステムの構成要素であり、PACやBTIなどのセキュリティ機能をすべてのバイナリに導入する際は、入念に注意する必要があります。正しいオプションですべてを再コンパイルするだけでは不十分で、以下の要素を考慮する必要があります。

  • OSがサポートの対象である必要があります。
  • マニュアル記述のアセンブラ・ルーティンとBTI対応コードを混在させる際には、特に注意が必要です。

Cortex-Mプロセッサー搭載デバイスの場合、ファームウェアはゼロからコンパイルされることが多いため、問題は少ない傾向にあり、PACおよびBTIに適合したフルソフトウェア・スタックを生成しやすくなります。

最新のCortex-Mプロセッサーは、パフォーマンスに関してアプリケーションCPUとの溝を縮めています。ですから、CPU指向の脅威と同程度の注目を集めているのも驚きではありません。

 

PACBTIの命令をサポートするコンパイラ

コンパイラとツールチェーン技術を組み合わせたLLVMは、LLVMバージョン8のリリースされた2018年以降、Cortex-A CPU設計全体でPACとBTIをサポートしています。一方、GCCは、さまざまなプログラミング言語をサポートするため、GNUプロジェクトによって作成された最適化コンパイラであり、2022年7月以降、Cortex-A CPU設計全体でPACとBTIをサポートしています(「-mbranch-protection=standard」を使用)。2023年4月には、GCCバージョン13.1がCortex-M85プロセッサーにPACとBTIのサポートを追加しました。Cortex-M演算プラットフォームでは、Armコンパイラ6(AC6)がPACBTI命令をサポートし、IAR Embedded Workbench for ArmがArm Cortex-M85でPACBTIをサポートします。PACとBTIに対するハードウェア・サポートに関する詳細は、こちらのブログをご覧ください。

 

PACBTIをサポートするプログラミング言語

理論上は、LLVMやGCCのバックエンドを持つコンパイル言語であればサポート可能ですが、このことは、コンパイラがコンパイラ・インフラストラクチャにフックする場所に左右されます。C/C++によるPACとBTIのサポートは、両方のコンパイラスイートに採用されています。RustやGoなどの言語はすでに、実験機能としてPACとBTIのサポートに対応しています。RustによるPACとBTIの実験サポートに関する詳細は、こちらをご覧ください

 

PACBTIの命令をすでに使用している、実環境のプロジェクト例

GoogleのChromiumプロジェクトとJavaScript V8エンジンは現在、PACとBTIの命令がコンパイルされたArm64向けに配布されています。DebianやRedHatなど、一部のLinuxディストリビューションはすでに、互換バイナリの導入により、PACとBTIをサポートしています。一方、次期リリースで両方のセキュリティ機能を検討している企業も存在します。例えば、SUSEのTumbleweedプロジェクトは、PACとBTI、その他のArm固有の機能をサポートします。詳細については、下記リンクをご覧ください。

 

旧式プロセッサーで同じコードを実行する必要がある場合

PACとBTIの命令(PAC、PACBTI、AUT)は、NOP(無演算)分野の一部です。NOP命令を認識しない旧式プロセッサーの場合、PACとBTIの命令は引き続き動作するものの、セキュリティ上のメリットは得られません。

 

PACBTIがパフォーマンスとコードサイズに及ぼす影響

一部の標準的なベンチマークは、すでにRenesasのCortex-M85 RA8D1により実行されています。結果は下表をご覧ください。

コンパイラ:Armコンパイラ6.20、-mbranch-protection=standard

Coremark

 

 No PacBTI

 With PacBTI

 Compiler
 Optimization level

 Code size
 (bytes)

 perf (coremark/Mhz)

 Code size
 (bytes)

 perf (coremark/Mhz)

 Os

 27568

 4.143

 31824

 3.860

 Ofast

 37160

 5.496

 40900

 5.236

 Omax

 37848

 6.194

 40756

 6.133

 

AudioMark

 

 No PacBTI

 With PacBTI

 Compiler
 Optimization level

 Code size
 (bytes)

 perf (audiomark/Mhz)

 Code size
 (bytes)

 perf (audiomark/Mhz)

 Os

 70616

 3.874

 77072

 3.923

 Ofast

 88472

 3.835

 94440

 3.887

 Omax

 86456

 3.864

 90376

 3.859

 

EEBMC Consumer CJPECG (compressor)

 

 No PacBTI

 With PacBTI

 Compiler
 Optimization level

 Code size
 (bytes)

 perf (audiomark/Mhz)

 Code size
 (bytes)

 perf (audiomark/Mhz)

 Os

 44670

 49.23

 51016

 48.94

 Ofast

 63942

 50.4

 69984

 50.15

 Omax

 69438

 61.35

 74160

 61.72

 

予想通り、PACは、ポインタ認証が行われる瞬間の出来事であるため、関数呼び出しに影響を及ぼします。デジタル信号処理(DSP)や行列計算に大半の時間を費やす高演算負荷のファームウェアの場合、影響は最小限です。パフォーマンスへの影響はほとんどなく、その影響は、コンパイラの最適化によって軽減できるため、コードサイズが増加しても同等のパフォーマンスが得られます。

 

Armが実現する、安全でセキュアなデジタル体験

データセンター、コンシューマー向けテクノロジー、組み込み製品など、攻撃者がリモートまたはローカルでデバイスを悪用する方法を排除するため、Armはさらなる組み込みセキュリティ機能を導入し続けています。PACとBTIを通じ、ROPやJOPのタイプの攻撃に対する保護機能を組み込むことで、既存のコードの安全性とセキュリティは大幅に向上します。Armv8/Armv9アーキテクチャは、Armエコシステム全体で採用されており、世界のデジタルセキュリティがArmを基盤とすることで、PACとBTIは、セキュリティのメリットを大規模に実現できます。

Armについて

Armは、業界最高の性能と電力効率に優れたコンピューティング・プラットフォームであり、コネクテッドな世界における人口の100%に貢献する比類のないスケールを備えています。Armは、演算に対する飽くなき需要に応えるため、世界をリードするテクノロジー企業に先進的なソリューションを提供し、各社がAIによるかつてない体験や能力を解き放つことができるよう支援しています。世界最大のコンピューティング・エコシステムと2,000万人のソフトウェア開発者とともに、私たちはArm上で築くAIの未来を形作っていきます。

全ての情報は現状のまま提供されており、内容について表明および保証を行うものではありません。本資料は、内容を改変せず、出典を明記した上で自由に共有いただけます。ArmはArm Limited(またはその子会社や関連会社)の登録商標です。その他のブランドあるいは製品名は全て、それぞれの権利者の所有物です。©1995-2024 Arm Limited.