5 ポイント 投稿者 GN⁺ 2024-09-27 | 1件のコメント | WhatsAppで共有

メモリ安全性の脆弱性の根本原因を取り除く

逆説的な結果

  • メモリ安全ではない言語で書かれたコードベースが増加している場合でも、新機能をメモリ安全な言語へ移行すると、メモリ安全性の脆弱性は大幅に減少する
  • これは脆弱性が時間の経過とともに指数関数的に減少するためである

数学的な説明

  • 脆弱性の寿命は指数分布に従う
  • 脆弱性は主に新しいコードで発生し、時間の経過とともにコードは安全になっていく
  • 5年経過したコードの脆弱性密度は、新しいコードより3.4倍から7.4倍低い

Androidでの実際の事例

  • 2019年からAndroidチームは新規開発をメモリ安全な言語へ移行し始めた
  • 2024年時点で、メモリ安全性の脆弱性の割合は76%から24%へ減少した
  • メモリ安全性の脆弱性が減少するにつれて、全体的なセキュリティリスクも低下した

メモリ安全戦略の進化

  • 第1世代: 事後的パッチ - 脆弱性を発見して修正する方式
  • 第2世代: 予防的緩和 - 脆弱性の悪用を困難にする方式
  • 第3世代: 予防的脆弱性発見 - 脆弱性を事前に見つけ出す方式
  • 第4世代: 高信頼の予防 - メモリ安全な言語へ移行することで、脆弱性そのものの発生を防ぐ方式

高信頼の予防の利点

  • 防御側と攻撃側の終わりのない競争を断ち切る
  • メモリ安全言語によって安全性を高め、コストを削減する
  • コードの正確性と開発者の生産性を高める

教訓から実践へ

  • 既存のメモリ安全ではないコードをすべて捨てたり書き直したりする必要はない
  • 相互運用性を改善して、メモリ安全な言語への移行を加速する
  • RustとC++、RustとKotlinの相互運用性を改善するツールを開発する

以前の世代の役割

  • 予防的緩和と検出を選択的に活用する
  • メモリ安全なコードへの移行が進むにつれて、緩和と検出の必要性は減っていく

結論

  • 新しいコードでメモリ安全な言語を使うことで、脆弱性は指数関数的に減少する
  • Androidにおける6年以上にわたる一貫した結果によって、このアプローチの有効性が実証されている

GN⁺のまとめ

  • メモリ安全性の脆弱性を減らすには、メモリ安全な言語への移行が重要である
  • Androidチームの事例では、メモリ安全性の脆弱性が大幅に減少したことが確認できる
  • 既存コードを完全に書き直すのではなく、相互運用性を改善することが実用的である
  • Rustのようなメモリ安全言語を使うことで、安全性と生産性を同時に高められる

1件のコメント

 
GN⁺ 2024-09-27
Hacker Newsのコメント
  • 新規開発をメモリ安全な言語に移行することで、有意義な改善をもたらせる可能性がある
    • すべてを移植するよりも、はるかに容易で低コスト
  • 記事内のチャートは明快で簡潔
    • 慎重なデータ選定とラベリングによって、意図したアイデアを容易に伝えられる
  • 脆弱性は指数関数的に減少する
    • 新しいコードに注力することが重要
    • やみくもなRiiRプロジェクトはリソースの無駄
    • Rustの専門家たちが推奨する戦略は、メモリ脆弱性を最小化するうえで最も効果的
  • Androidチームは、Rustの変更のロールバック率がC++の半分以下であることを確認している
  • 新しいコードとメモリ脆弱性の間には相関がある
    • 新機能に関連するコードのほうが、脆弱性が集中しやすい
    • 古いコードでは、実運用を通じてエッジケースが発見されている
  • 新しいコードがメモリ脆弱性を引き起こすと断定するのは難しい
    • Heartbleedバグのような高インパクトな脆弱性もある
  • 脆弱性は指数関数的に減少する
    • 新機能の追加を止めるほうが、セキュリティ上は望ましい可能性がある
    • Windows LTSCが最も安全なバージョンである可能性がある
  • 安全なコーディングは、コードの正確性と開発者の生産性を向上させる
    • バグの発見時点をコードチェックイン前へ前倒しできる
    • Androidチームは、Rustの変更のロールバック率がC++の半分以下であることを確認している
  • Rustを知ってから、プログラミングへの情熱を取り戻した
  • メモリ安全言語(MSL)としてRustだけが言及されている
    • Kotlinにも触れられていたが、Rustほど強力なメモリ安全機能はない
  • 脆弱性の寿命は指数関数分布に従う
    • 新しいコードでメモリ安全性を確保することには非常に大きな価値がある
    • 大規模なレガシーコードベースでも有用
  • 古いコードが十分にレビューされていない可能性もある
    • 最近のコミットログをより頻繁に確認している
  • MacとWindowsではコードを書く言語が異なる
    • Macではメモリ安全なSwiftが使われ、Windowsでは主にCまたはC++が使われている
  • 脆弱性が希少になるほど、その価値は高くなる
    • 残された脆弱性は、国家支援の攻撃者によって高価値ターゲットに使われる可能性がある
    • iOSのLockdown Modeのような機能が必要になるかもしれない
    • セキュリティ意識の高いユーザーは、パフォーマンス低下と引き換えにセキュリティ設定を有効にする
    • 攻撃を検知し、分析のためにセキュリティチームへ送信する
    • ユーザーに警告を送り、攻撃が検知されたことを知らせる
    • ユーザーの行動を受動的に監視するのではなく、攻撃が検知された時点でユーザーに通知する