ブランチ保護 (PACBTI) — 32 ビットモードのみ
IAR Embedded Workbench for Arm は、ブランチ保護をサポートしています。Armv8.1-Mのポインタ認証とブランチターゲット識別拡張(PACBTI)で、コアおよびデバイスでサポートしています。ブランチ保護を有効にするには、コンパイラオプション --branch protectionを使用します(‑‑branch_protection参照)。
注意
IDEでは、[プロジェクト]>[オプション]>[一般オプション]>[32ビット]>[ポインタ認証(PACBTI)]ページを使用して、ブランチ保護を有効にします。
PACBTI は、Return-Oriented Programming (ROP) と Jump-Oriented Programming (JOP)と呼ばれる2種類のセキュリティの弱点から保護します。これらの2つの攻撃は、ユーザーアプリケーションの既存の一部のコードを使用します。攻撃者は、スタックスマッシングなどを使用して、コールスタックのコントロールを乗っ取り、攻撃者が通常と識別している、既存の脆弱なコードの一部を指すために、スタックに保存されているポインタを上書きします。攻撃者は、操作権限を増やしシステムの完全制御を得るために、これを使用できます。
ポインタ認証は、ポインタの暗号署名を作成し、それはポインタから分離したレジスタに格納されます。リターンアドレスは、戻る前にこの署名を使用してその後認証されます。
2番目の攻撃タイプである、ジャンプ指向プログラミング(JOP)は同様のやり方で機能します。ROP攻撃では、攻撃者は使用するためにコードの一部でソフトウェアスタックをスキャンして、関数リターンで終了するシーケンスを検索します。一方、JOPは、関数ポインタなどの非直接ブランチのその他のフォームで終了するターゲットコードシーケンスを攻撃します。BL または B 命令は、エントリポインタとして定義したアドレスだけではなく、任意の実行可能なアドレスをターゲットにできるという事実を利用します。
JOP 攻撃を予防するには、命令セットにブランチターゲット識別命令(BTI)を含みます。関節ブランチのターゲットがBTI命令出ない場合、ブランチターゲット例外が生成されます。
注記
PACBTIは、よくある利用可能なソフトウェアのエラーを見つけるために設計されていますが、効果を発揮するには、優れたソフトウェア開発プラクティスが必要です。