メモリ安全性(Memory Safety)とメモリ安全言語
1. 概要
定義: メモリ安全性(Memory Safety)とは、プログラムが実行中に割り当てられたメモリ領域の空間的境界(spatial)と時間的有効期間(temporal)を超えてメモリにアクセスしないことを保証する性質である。メモリ安全なプログラムは、有効に割り当てられ、まだ解放されておらず、型に適合する領域のみを読み書きする。
C と C++ はポインタ算術と手動メモリ管理により高性能とハードウェアの直接制御を提供する代わりに、プログラマが境界検査と寿命管理の責任を全面的に負う。問題は、人間がこの責任を完全に果たすことが事実上不可能である点にある。バッファの末尾を一バイト超えて書く(off-by-one)、あるいは既に解放したポインタを再び参照する(use-after-free)といった誤りは、コードレビューやテストを通過して運用環境まで生き残る。こうした残存欠陥は単なるバグにとどまらず、攻撃者がプログラムの制御フローを奪うリモートコード実行(RCE)の出発点となる。
この問題が産業全体の課題へと格上げされた理由は、統計が圧倒的だからである。Microsoft は自社製品で毎年報告される脆弱性(CVE)の約70% がメモリ安全性の問題であると明らかにし、Google も Chromium と Android で同様の比率を繰り返し確認している。すなわちメモリ安全性は数多ある脆弱性類型の一つではなく、深刻度の高い脆弱性の構造的源泉である。個別の欠陥を修正する方式では際限なく再発するため、「脆弱性を源泉から除去する(eliminate at the source)」という取り組みへと転換されつつある。
メモリ安全性を論じる際に前提とすべき特徴は三つである。第一に、それは二分法的保証である — 一か所でも安全でなければ、その隙間からプロセスメモリ全体が露出しうるため、「90% 安全」は事実上安全でないに近い。第二に、性能との本源的な緊張がある — 境界・寿命の検査は何らかの形で費用を要するため、解法ごとにその費用をどこ(ランタイム・コンパイル時・ハードウェア)へ移すかが分かれる。第三に、レガシー依存が大きい — 世界の中核インフラが C/C++ で書かれているため、解法は「新たに作る法」だけでなく「既存を補強する法」まで包含してこそ現実性を持つ。
メモリ安全性は、機能要件ではなく非機能的なセキュリティ品質属性である点で扱いが特に厄介である。利用者が見る機能には現れないため優先順位から外れやすいが、ひとたび破られれば全体システムの信頼性を崩す。メモリ安全性がとりわけ重い課題である理由は、その欠陥が静かに潜伏するからである。機能的バグは誤った画面や例外として即座に露わになるが、メモリ安全性違反は普段は正常に動作し、特定の入力・タイミングでのみ壊れる。境界を一バイト超えた書き込みは隣接変数を微細に汚染し、その結果はまったく別のコード経路で遅れて噴出する。この非局所性(non-locality)のためにデバッグが極度に難しく、テストカバレッジが高くても見落としやすい。まさにこの特性が「人間の注意力に頼る」取り組みの限界を規定する。
その転換は 2022〜2024 年の間に政府・標準レベルの勧告として公式化された。米国 NSA の「Software Memory Safety」情報誌(2022)、CISA・NSA・FBI と国際パートナーの「The Case for Memory Safe Roadmaps」(2023)、ホワイトハウス国家サイバー局長室(ONCD)の「Back to the Building Blocks」(2024)が相次いでメモリ安全言語への転換を勧告した。技術士の観点でこの主題の本質は「バグをより上手く捕らえる法」ではなく、言語・ランタイム・ハードウェア・組織政策を貫くソフトウェアサプライチェーン全般の設計パラダイム転換にある。
2. メモリ安全性違反の構造と類型
メモリ安全性違反を理解するには、まず二つの軸に分けて見る必要がある。空間的安全性は「許された範囲内をアクセスしているか」の問題であり、時間的安全性は「まだ有効な時点でアクセスしているか」の問題である。バッファオーバーフローが前者の代表なら、use-after-free は後者の代表である。二つの軸が交差しながら実際の脆弱性類型が派生する。
この区分が重要な理由は、二つの安全性が互いに独立であり、一方だけを守っても完全ではないからである。境界検査(空間的)をいくら徹底しても、既に解放されたポインタを使う時間的違反は防げず、逆に寿命を完璧に管理してもインデックス範囲を超えれば空間的違反が発生する。したがって「メモリ安全」という保証は二つの軸を同時に満たすときのみ成立し、いかなる解法も両側面をどう共に扱うかで評価しなければならない。
flowchart TD
MS["メモリ安全性違反"]
MS --> SP["空間的違反(境界超過)"]
MS --> TP["時間的違反(寿命違反)"]
SP --> OF["バッファオーバー/アンダーフロー"]
SP --> OOB["範囲外読み/書き(OOB)"]
SP --> TC["型混同(type confusion)"]
TP --> UAF["解放後使用(use-after-free)"]
TP --> DF["二重解放(double free)"]
TP --> UI["未初期化使用(uninitialized read)"]
OF --> EXP["制御フロー奪取・情報漏えい"]
OOB --> EXP
TC --> EXP
UAF --> EXP
DF --> EXP
UI --> EXP
上の構造図で核心は、一見異なる複数の脆弱性類型が結局一つの結果(攻撃者によるメモリの任意読み書き)へ収束する点である。言い換えれば、攻撃者はこのうちどれか一類型でも成立させれば同一の攻撃力を手にする。防御が一類型だけを防いでも意味がなく、二つの安全性軸をともに封鎖する包括的保証が必要な構造的理由がここにある。空間的違反は配列やバッファの境界を守れないときに生じる。たとえば長さ検査なしに strcpy で長い文字列を短いスタックバッファへ複写すると、隣接する戻りアドレスを上書きし、関数の復帰時点で攻撃者が指定したコードへジャンプさせうる。これが 1988 年のモリスワーム以来、半世紀近く繰り返される古典的なスタックオーバーフローである。
空間的違反が特に危険なのは、データと制御情報が同じメモリ空間に入り混じっているからである。スタックには局所変数だけでなく関数の戻りアドレスと保存レジスタがともに置かれ、ヒープにはユーザデータとアロケータのメタデータが隣接する。境界を越える書き込みがこの制御情報に触れた瞬間、単純なデータ破損がそのままプログラムフローの奪取へ飛躍する。メモリレイアウトが攻撃面を決めるというこの事実が、レイアウトを無作為化したり分離したりする各種緩和技術の出発点である。
時間的違反は寿命(lifetime)管理の失敗から来る。use-after-free は free() で返却したメモリを指すポインタ(dangling pointer)をそのまま再び使う場合である。解放されたチャンクが別のオブジェクトへ再割り当てされた後に過去のポインタでアクセスすると、攻撃者は一つのオブジェクトのポインタで別のオブジェクトの内容を操作しうる。ウェブブラウザのようにオブジェクト寿命が複雑に絡み合う大規模プログラムで use-after-free が特に致命的な理由がここにある。次の表は主要な類型とともに典型的原因と影響を整理したものである。
| 類型 | 分類 | 典型的原因 | 主な影響 |
|---|---|---|---|
| スタック/ヒープバッファオーバーフロー | 空間的 | 長さ検査欠落、off-by-one | 制御フロー奪取、RCE |
| 範囲外読み(OOB read) | 空間的 | インデックス検証欠落 | 情報漏えい(例: Heartbleed) |
| 解放後使用(UAF) | 時間的 | dangling pointer 再参照 | オブジェクト操作、RCE |
| 二重解放(double free) | 時間的 | 重複 free、所有権混同 |
ヒープメタデータ汚染 |
| 型混同 | 空間/型 | 誤ったキャスト | 任意読み書き |
| 未初期化メモリ使用 | 時間的 | 初期化欠落 | 情報漏えい、非決定的動作 |
表が示すとおり、影響の様相は異なるが根は同じである。いずれも「メモリを見るポインタが実際のオブジェクトの境界・寿命と食い違う」ことに由来する。したがって根本対策も類型別のパッチではなく、ポインタとオブジェクトの整合を言語やハードウェアが強制する方向へ集まる。
一方、未初期化メモリの使用は目立ちにくいが情報漏えいの静かな通路である。割り当てだけして初期化しないバッファをそのまま外部へ送り出すと、以前にその場所にあった別のデータ(例: 暗号鍵の残滓)がともに漏れうる。決定的な結果でないためテストで再現しにくいのも特徴である。
これらの類型が抽象的な危険でないことは実際の大型事故が立証する。2014 年の OpenSSL の Heartbleed(CVE-2014-0160)は、長さフィールドを検証しなかった範囲外読み(OOB read)一つでサーバメモリの秘密鍵・セッションまで漏えいさせ、世界の HTTPS インフラの再発行を促した。2017 年の Windows SMB の EternalBlue は、バッファオーバーフロー系の欠陥を悪用して WannaCry・NotPetya ランサムウェア大流行の通路となった。両事件はいずれも「メモリ一行の境界の誤り」が国家・産業単位の被害へ増幅された事例であり、メモリ安全性がなぜ個別のバグではなくシステムリスクとして扱われるべきかを示す。
3. エクスプロイトのメカニズムと緩和技術
メモリ欠陥が直ちに攻撃成功を意味するわけではない。脆弱性(vulnerability)と実際の悪用(exploit)の間には複数の段階があり、防御はその合間に障壁を築く。攻撃者は欠陥を用いて(1)コードやポインタを上書きし、(2)防御技術を迂回し、(3)実際の悪性動作を実行する段階を踏む。防御側は各段階に緩和技術を配置して攻撃の費用を高める。この「費用上昇」の観点が、なぜ緩和だけでは十分でないかを説明する核心の枠組みである。以下は典型的なエクスプロイトチェーンと、それに対応する緩和層を示す詳細アーキテクチャである。
flowchart LR
subgraph ATK["エクスプロイトチェーン"]
V["メモリ欠陥発見"] --> OW["メモリ任意書き込み確保"]
OW --> HJ["制御フロー奪取"]
HJ --> PAY["ペイロード実行(ROP・シェルコード)"]
end
subgraph DEF["緩和層(多層防御)"]
C1["スタックカナリア(Canary)"]
C2["DEP・NX(実行防止)"]
C3["ASLR(アドレス無作為化)"]
C4["CFI(制御フロー完全性)"]
end
OW -. "検知" .-> C1
PAY -. "遮断" .-> C2
HJ -. "攪乱" .-> C3
HJ -. "検証" .-> C4
たとえば典型的なスタックオーバーフローでは、長さ検査のない複写が 64 バイトのバッファへ 128 バイトを書き込み、隣接する保存された戻りアドレスを上書きし、関数が復帰する瞬間に攻撃者が仕込んだアドレスへ分岐する。緩和技術はこのチェーンの各環を断とうとする。このチェーンで緩和技術は、攻撃を源泉から遮断するのではなく費用を高める確率的な防壁である。スタックカナリアは戻りアドレスの前に任意値を置き、オーバーフローでその値が変わると関数復帰前に中断させる。DEP/NX はデータ領域を実行不可と標示し、スタックへ注入したシェルコードの直接実行を阻む。すると攻撃者は既存のコード片(gadget)を継ぎ合わせる ROP(Return-Oriented Programming) で迂回し、これに対し再び ASLR がアドレスを無作為化してガジェット位置の予測を難しくした。
問題はこの攻防が終わらない点にある。ASLR は情報漏えい(OOB read)でアドレスが漏れれば無力化され、CFI は性能費用と迂回技術のため完全ではない。すなわち緩和技術は事後的・確率的であり、攻撃者が一つの強力な任意読み書き原始演算(primitive)を確保すれば順次崩れうる。実際に Pwn2Own のようなハッキング大会では、これらの緩和をすべて備えた最新のブラウザでも、メモリ欠陥一つから出発したエクスプロイトチェーンで繰り返し突破される。この限界が「欠陥を初めから作らない」言語・ハードウェアレベルの取り組みへの転換を正当化する。
一方、欠陥を事前に発見するテスト技法も緩和体系の一軸である。カバレッジ基盤のファジング(fuzzing)は無作為・変異入力を大量に注入して異常経路を探索し、ここに AddressSanitizer(ASan) のような動的分析器を結合すると、オーバーフロー・UAF が実際のクラッシュとして即座に露わになる。Google の OSS-Fuzz はこの組み合わせで主要なオープンソースから数万件の欠陥を自動発見した。ただしファジングは到達した経路の欠陥のみを見つけるため、完全性を保証できない — テストで欠陥を減らせても「無し」を証明できないという点が、安全言語への移行を補完材ではなく根本策とする理由である。
4. メモリ安全性確保のアプローチ比較
先の緩和技法が攻撃を「難しく」するなら、安全性確保のアプローチは欠陥そのものを「不可能に」することを志向する。メモリ安全性を確保する道は大きく三系統である。第一はランタイム検査型の安全言語で、Java・C#・Go・Python のようにガベージコレクタ(GC)が寿命を自動管理し、すべての配列アクセスに境界検査を入れる。生産性と安全性は高いが、GC による遅延(latency)とメモリオーバーヘッドがあり、OS カーネルやリアルタイムシステムには不向きなことがある。GC は「いつメモリを回収するか」をランタイムが追跡して dangling pointer を源泉から無くすが、その追跡費用と予測不能な回収停止(stop-the-world)がトレードオフである。金融取引やゲームサーバのように末尾遅延(tail latency)が重要な領域で GC チューニングが常時の課題となる理由がここにある。
第二はコンパイル時検証型の安全言語である Rust である。GC なしに、Rust は所有権(ownership)・借用(borrowing)・寿命(lifetime)の規則をコンパイラが静的に検証する借用検査器(borrow checker)により、値ごとに所有者は一つであり、可変参照と不変参照が同時に存在できないという規則を強制する。これにより use-after-free とデータ競合(data race)をランタイム費用なしに源泉から遮断する。ただし所有権モデルを外れねばならない低水準コードは unsafe ブロックで明示的に分離し、検証責任を狭める。
Rust の安全性は「不可能をコンパイルエラーに変える」ところにある。たとえばコレクションを走査する間に同じコレクションを変更しようとすると、他の言語ではランタイムに反復子無効化(iterator invalidation)へつながるコードが、Rust では可変・不変参照の共存禁止の規則に触れてコンパイル自体が失敗する。このように欠陥が生産へ到達する前に開発段階で濾過されるため、安全性の責任が人間の注意力からツールの保証へ移る。これが Rust が「zero-cost abstraction」と呼ばれる理由である — 安全性の代価をランタイム性能ではなくコンパイル時間と設計制約で支払うからである。
第三はハードウェア支援の安全性である。既存の C/C++ 資産を書き直さずに安全性を補強する取り組みで、Arm のメモリタギング拡張(MTE)と CHERI/Morello が代表的である。次の表は三つの取り組みを基準別に比較する。
| 基準 | ランタイム検査(Java・Go) | コンパイル時(Rust) | ハードウェア支援(MTE・CHERI) |
|---|---|---|---|
| 安全性保証の時点 | 実行中 | コンパイル時 | 実行中(HW強制) |
| 性能オーバーヘッド | GC・検査費用 | ほぼ無し | 小〜中(設計別に相違) |
| 既存 C/C++ の再利用 | 困難(書き直し) | 困難(書き直し) | 容易(再コンパイル・補強) |
| 学習・移行費用 | 低〜中 | 高(所有権) | 中(ツールチェーン・HW) |
| 適用領域 | アプリ・サーバ | システム・カーネル・アプリ | レガシー補強 |
表の比較で重要なのは差が生じる理由である。Rust の性能オーバーヘッドがほぼ無いのは、安全性検査をランタイムではなくコンパイル時点へ移したからであり、その代価として開発者が所有権規則を習得する学習費用が高い。逆にハードウェア支援方式がレガシー補強に有利なのは、ソースの書き直しなしに再コンパイルだけでポインタにタグを付けて検証できるからであり、その代価として専用の CPU 機能とメモリタグ保存のオーバーヘッドが必要である。いずれか一つが絶対的優位なのではなく、対象システムの性能予算・レガシー規模・チーム能力に応じて戦略的に組み合わせるのが現実的な解法である。
実務では一つのシステム内でも取り組みが混合される。たとえば性能が極限の暗号・ネットワークコアは Rust で書き直し、膨大なレガシー C ライブラリは MTE で補強し、上位のビジネスロジックは GC 言語に置く層別の差等適用が可能である。このとき要となるのは、互いに異なる安全性保証を持つモジュールが接する境界(FFI, foreign function interface)である。安全言語が非安全コードを呼び出した瞬間に保証が切れるため、境界を最小化し、その地点を集中的に検証・文書化することが全体の安全性を左右する。
5. 深化: 政策・ハードウェア・産業適用の動向
メモリ安全性はもはや開発チーム内部の品質問題ではなく、政策・ハードウェア・産業がともに動くエコシステム転換の軸となった。最近 3 年間、メモリ安全性は技術論を超えて国家政策と規制の領域へ入ってきた。2024 年 2 月にホワイトハウス ONCD が発表した「Back to the Building Blocks」報告書は、ソフトウェア製造者がメモリ安全言語を採用して「脆弱性の類型全体を除去する」ことを勧告し、メモリ非安全言語の例として C・C++ を、安全言語の例として Rust を提示した。これはそれに先立つ CISA・NSA・FBI と国際パートナーの「The Case for Memory Safe Roadmaps」(2023)が製造者へ既存製品のメモリ安全ロードマップの策定を求めた流れとつながる。2024 年 6 月に CISA らが発表した「Exploring Memory Safety in Critical Open Source Projects」は、中核のオープンソース 172 個を分析し、過半が依然 C/C++ で書かれており、安全言語で書かれたプロジェクトも非安全な依存を通じて露出しうることを指摘した。(具体的な施行・強制の水準は変動しうるため、原文の確認が必要である。)
ハードウェア面の流れも明瞭である。Arm のメモリタギング拡張(MTE)は、物理メモリを 16 バイト単位(granule)に分け、各単位に 4 ビットのタグを付与し、ポインタにも同じタグを載せてアクセス時にタグ一致をハードウェアが検査する「錠と鍵」方式である。タグが食い違えば空間・時間の違反を即座に検知する。Google は Android で MTE を活用して出荷前に相当数のメモリバグを捕らえたと報告した(ベンダ側の数値ゆえ解釈に留意)。より根本的な取り組みである CHERI は、Arm の実験プラットフォーム Morello で評価され、通常のポインタを偽造不可能なハードウェア能力(capability)へ置き換えて境界・権限をポインタ自体へ刻む。
このハードウェア補強はソフトウェア転換の空白を埋める役割を果たす。安全言語への書き直しは数年を要するが、その間もレガシーは攻撃に晒されている。MTE のようなハードウェア機能はこの「転換期リスク」を既存のバイナリへそのまま適用して緩和するという点で、ソフトウェアの取り組みと競合ではなく時間軸で相互補完する。
二つのハードウェアの取り組みの哲学の違いも味わう価値がある。MTE は確率的・漸進的である — 4 ビットのタグは 16 通りしかなく偶然一致する確率が残るが、ソース修正なしに再コンパイルだけで広範に適用でき、「レガシーを今補強する」実用的目標に合う。一方 CHERI は決定論的・根本的である — 能力基盤で境界を源泉封鎖するが、ABI とポインタ表現を変えるため、エコシステム全般の再設計が必要である。この対比はセキュリティが常に「完結性」と「採用可能性」の間の均衡であることを示し、当面は二つの取り組みが相互補完的に共存する可能性を示唆する。
産業適用の事例は「全部書き直し」ではなく「新規コードから安全に」という戦略を示す。Google は Android で新たに書くコードに Rust を優先適用する政策へ転換した後、新規コードのメモリ安全脆弱性の比重が大きく減ったと発表した。核心の洞察は、脆弱性が大半新規コードと最近の変更分に集中するため、数十年来のレガシーを全部移植しなくとも新規コードの言語だけ変えれば全体の脆弱性曲線を折れるという点である。Microsoft(Windows カーネル一部への Rust 導入)、AWS(Firecracker など)、Linux カーネル(Rust for Linux)も同じ漸進的転換の経路を辿っている。
この戦略が効果的なのには定量的な根拠がある。欠陥の発生密度はコードの「年齢」に反比例する傾向があり、古く安定したコードは既に数多のバグが濾過された一方、新たに追加されたコードに欠陥が偏る。したがって新規コードにのみ安全言語を適用しても、時間が経つほど全体のコードベースで安全でないコードの比重と新規脆弱性がともに減少する。全面書き直しという非現実的な目標なしにリスク曲線を折れるというこの洞察が、実用的な転換戦略の理論的土台である。
国内(韓国)の文脈でもこの流れは次第に反映されている。公共・金融の中核システムの相当数が C/C++ 基盤のレガシーと組み込みファームウェアで構成されており、ソフトウェアサプライチェーンセキュリティ(SBOM の義務化、セキュリティ弱点診断など)の強化と相まって、メモリ安全性は中長期の品質・セキュリティ指標として浮上している。ただし安全言語への転換は人材の熟練度と検証体系に裏打ちされねばならないため、国内の組織は全面転換よりも新規モジュール・高リスク構成要素の選別適用と、静的分析・ファジングの内在化を優先するのが合理的である。
6. 考慮事項および示唆点
メモリ安全性は単一のツール導入で終わる課題ではなく、技術士の観点から多年にわたる転換ロードマップとトレードオフ管理を要する戦略的課題である。以下の考慮事項は技術選択を超えて、組織の投資・ガバナンス・サプライチェーン戦略へ拡張される。
- 漸進的転換戦略(全面書き直しの回避): 数百万行のレガシーを一度に移植するのは費用・リスクが過度である。取るべき現実的な道は、新規・高変更のモジュールから Rust などの安全言語で書き、境界地点(FFI)を明確に管理するストラングラー(strangler)方式である。組織は製品別のメモリ安全ロードマップと KPI(新規コードの安全言語比重など)を設定すべきである。
- 性能・生産性トレードオフの定量管理: GC 言語の遅延、Rust の学習曲線、ハードウェア方式のタグオーバーヘッドはそれぞれ異なる費用を課す。遅延に敏感なカーネル・リアルタイム領域、生産性が重要な業務アプリ、レガシー補強が急ぐ領域を区分して取り組みを差等適用し、ベンチマークで費用を数値化して意思決定すべきである。
- サプライチェーン・依存の観点への拡張: 自社コードを安全言語へ変えても、C/C++ のライブラリ・依存に欠陥があれば露出する。SBOM(ソフトウェア部品表)で依存の言語・安全性を可視化し、安全言語バインディングやサンドボックス化で非安全な依存を隔離する戦略が並行されねばならない。
- 多層防御との並行(完全転換以前): 転換には時間がかかるため、その期間中は ASLR・CFI・スタックカナリア・MTE のような緩和技術と、ファジング(fuzzing)・静的分析(SAST)・AddressSanitizer 基盤のテストを並行して残存リスクを管理すべきである。安全言語の導入は緩和技法を代替するものではなく、その負担を源泉から減らすものである。
- 人材・組織能力と規制対応: 所有権モデルなど新たなパラダイムは教育・採用の費用を伴う。同時に政府調達・セキュリティ認証がメモリ安全ロードマップを求める趨勢ゆえ、規制対応と能力の内在化を同時課題として束ね、中長期計画へ反映すべきである。
- 測定可能な目標とガバナンス: 「メモリ安全を志向する」という宣言だけでは転換は進まない。ONCD 報告書が強調するとおり測定可能性(measurability)が核心であり、新規コードの安全言語比重、メモリ安全 CVE の推移、安全・非安全の境界(FFI)の数といった指標を定義して経営報告体系へ含めてこそ、転換が組織次元で追跡・管理される。
- AI コード生成時代の留意点: 生成 AI が大量のコードを吐き出す環境では、学習データに含まれる膨大な C/C++ の慣用句ゆえに非安全なパターンが再生産される危険がある。AI が生成したコードも同一の静的分析・ファジング・言語政策の統制下へ置き、生産性向上が安全性後退へつながらないようガードレールを設計すべきである。
参考資料
- The White House ONCD, "Back to the Building Blocks: A Path Toward Secure and Measurable Software" (2024): https://www.whitehouse.gov/oncd/briefing-room/2024/02/26/press-release-technical-report/
- CISA/NSA/FBI et al., "The Case for Memory Safe Roadmaps" (2023): https://www.cisa.gov/resources-tools/resources/case-memory-safe-roadmaps
- NSA, "Software Memory Safety" (2022): https://media.defense.gov/2022/Nov/10/2003112742/-1/-1/0/CSI_SOFTWARE_MEMORY_SAFETY.PDF
- Arm, "Memory Tagging Extension (MTE)": https://developer.arm.com/documentation/108035/latest/
- CHERI / Morello project (University of Cambridge): https://www.cl.cam.ac.uk/research/security/ctsrd/cheri/
一言まとめ: メモリ安全性はポインタがオブジェクトの境界・寿命と食い違わないことを保証する性質であり、深刻な脆弱性の約 70% を占める源泉問題で、ランタイム検査(Java・Go)・コンパイル時検証(Rust)・ハードウェア支援(MTE・CHERI)を状況に応じて組み合わせる漸進的転換が核心戦略である。