Googleはこのほど、「Google Online Security Blog: Hardening cellular basebands in Android」において、ベースバンドチップのファームウェアの脆弱性を改善するため、2つのサニタイザ(不具合の原因となる処理を除去するツール)の使用方法を紹介した。ベースバンドチップは4Gや5Gなどの無線通信を処理する半導体で、Androidデバイスではオペレーティングとは別にベースバンドチップを制御するファームウェアが動作している。近年のセキュリティ研究により、このファームウェアにリモートコード実行(RCE: Remote Code Execution)の脆弱性などが発見されており、有効な対策が求められていた。
サイタイザ「Integer Overflow Sanitizer」と「BoundsSanitizer」の概要
Googleはコンパイラフロントエンド「Clang」のツールチェーンによって提供されるサニタイザの「UndefinedBehaviorSanitizer(UBSan)」に含まれる「Integer Overflow Sanitizer(IntSan)」および、「BoundsSanitizer(BoundSan)」について解説している。
Integer Overflow Sanitizer - 符号付きおよび符号なし整数のオーバーフローを検出する。オーバーフローを検出すると実行を中断(abort)する。意図的または問題のないオーバフローの検出を防ぐため、コードにリファクタリングとアノテーションを必要とすることがある。この機能により意図しない動作(配列のインデックスのオーバーフローなど)を検出することができる。
BoundsSanitizer - 一部の配列のアクセスに対して境界チェックを行う処理を挿入する。コンパイル時にアクセスが安全であることを証明できず、かつ実行時に配列のサイズがわかっていて検証できる場合に機能する。この機能により問題が検出された場合は、それが脆弱性でないことがわかっていても不具合であると評価できるため、解決することが望まれる。
サニタイザを利用するメリット
Googleによると、これらサニタイザには測定可能なほどのパフォーマンスのオーバーヘッドが存在するという。Googleは過去にこのオーバーヘッドを1%未満に削減したことがあるが、それでも動作に影響を与える可能性があるため、サニタイザの使用時にはオーバーヘッドに注意する必要があるとしている。
また、サニタイザの導入が望まれる開発においては、メモリの安全性を実現するためにRustなどのメモリセーフなプログラミング言語へ移行することが推奨されている。Androidにおいても一部ですでに採用されており、既存のC言語のコードと相互に関数呼び出しができるため、すべてをRustで書き直す必要はない。Rustへ移行する必要があるのは信頼できないデータを処理する複雑なパーサなどで、移行を一部だけに制限または優先して行うことが推奨されている。
高度な処理を行うオペレーティングシステムへの攻撃は、脅威アクターにとって高いハードルとなる。そのため、脅威アクターはより手頃な標的としてベースバンドチップのファームウェアなどの下位レベルのコンポーネントを狙うことがある。そのため、Googleは脅威アクタの攻撃対象領域に含まれる製品を開発するメーカーに対し、脆弱性を軽減する最新の技術を積極的に導入することを推奨している。