新しいセキュリティー機能と安全性の向上
「Ubuntu 24.04 LTS」では安全性向上のため、新しいセキュリティー機能が導入されています。ここでは前LTSリリースの「Ubuntu 22.04 LTS」と比較し、「Ubuntu 24.04 LTS」で新たに導入されたセキュリティー機能を紹介します。
1. 非特権プロセスによるユーザー名前空間の利用制限
非特権プロセスによるユーザー名前空間(Unprivileged user namespace)は「Linux kernel」が提供している機能で、ユーザーが一般的に使用する多くのソフトウェアから利用されている機能です。サンドボックスでも利用されている
例えばブラウザーでサンドボックスを構築する際、非特権のユーザー名前空間が利用されています。信頼できるブラウザー自身がサンドボックスを構築し、そのサンドボックス内で信頼性の低いウェブコンテンツをレンダリングします。
このようにアプリは非特権のユーザー名前空間を活用することで権限を分離し、セキュリティー強度を向上させることができます。
攻撃対象になっている
しかし「Linux kernel」の脆弱性を悪用するために、このユーザー名前空間が不正に利用されてきた経緯があります。そこでこの種の攻撃に対し「Ubuntu」では、ユーザー名前空間の利用を制限する緩和策が導入されました。
Ubuntu 23.10で導入された
まずユーザー名前空間の利用を制限する緩和策は、「Ubuntu 23.10」で導入されました。「Ubuntu 23.10」では「Ubuntu」が正当なアプリであると判断したアプリにのみ、ユーザー名前空間の利用を許可する仕組みが導入されました。
Ubuntu 24.04 LTSで対応を改善
「Ubuntu 24.04 LTS」ではサードパーティー製のアプリ含めアプリの正当性を確認する作業が進められ、サポートするアプリの範囲が改善されました。また「Ubuntu 23.10」のようにユーザー名前空間の利用を制限する方法ではなく、アプリにはユーザー名前空間の利用を許容し、その中の権限に対して制限がかけられるようになりました。
つまり制限の粒度が変更され、以前の方法よりも適切に攻撃対象となるユーザー名前空間経由のカーネルインターフェースの悪用を緩和できるようになりました。
2. 実行可能ファイルのセキュリティー強化
ソフトウェアのビルドに使用する最近のツールチェインやコンパイラーでは、様々な防御メカニズムが備わっています。例えばコード再利用攻撃に対抗するブランチ保護といったモダンなCPUが提供する仕組みの活用に加え、バッファオーバーフローの可能性を検出及び回避する仕組みが備わっています。
GNU C Library
「GNU C library」は多くのアプリで利用される礎となるライブラリーの1つです。「GNU C library」ではバッファオーバーフローを実行時に検出する機能や、バッファオーバーフローから保護する機能、バッファオーバーフローが発生しうる特定のケースを検出する機能を備えています。
_FORTIFY_SOURCE
また特定の文字列操作に対してバッファオーバーフローを検出する「_FORTIFY_SOURCE」マクロが提供されています。「_FORTIFY_SOURCE」ではバッファオーバーフローをチェックするレベルを0〜3の間で指定できるようになっています。
昨今リリースされてきた「Ubuntu」ではこのレベルに「2」が指定されていました。
これにより「sprintf()」や「strcpy()」といった文字列操作を行う関数や、「printf()」のようにフォーマットを指定して文字列操作を行う関数でバッファオーバーフローを検出するようになっていました。
Ubuntu 24.04 LTSでさらなる強化
「Ubuntu 24.04 LTSで」では「_FORTIFY_SOURCE」のレベルが「3」に変更され、さらにセキュリティーが強化されました。これにより以下の関数を含むメモリー処理周りの危険な扱われ方も、検出できるようになりました。
- memmove()
- memcpy()
- snprintf()
- vsnprintf()
- strtok()
- strncat()
「Ubuntu 24.04 LTS」の「GCC」コンパイラーでは、この機能がデフォルトで有効になっています。
言い換えれば「Ubuntu 24.04 LTS」上でアプリをビルドすれば、この機能の恩恵に与れるようになります。
Armv8-Mアーキテクチャーのセキュリティー強化
次に「Armv8-M(arm64)」アーキテクチャーのセキュリティーが強化されました。このアーキテクチャーでは、ハードウェアベースのポインター認証の強制や、ブランチターゲットを識別する機能を提供しています。
ポインター認証は、攻撃者がスタック上に保持されているポインターを別の位置に変更する悪意あるスタックバッファーの改ざんを検出する機能です。
またブランチターゲットの識別は、間接的なブランチ命令や攻撃者がターゲットとするであろう位置の追跡に活用される機能です。
「GCC」コンパイラーには、これらの機能を有効にする「-mbranch-protection」オプションがあります。
「Ubuntu 24.04 LTS」の「dpkg」パッケージでは、「-mbranch-protection=standard」が指定されるようになり、この機能がデフォルトで有効になっています。
そのため「Ubuntu」公式リポジトリーから提供されるすべてのパッケージでこの機能が活用できるようになっています。
3. AppArmor
「AppArmor」はソフトウェアのアクセス制御を行うソフトウェアです。先ほど紹介した非特権プロセスによるユーザー名前空間に対する制限は、この「AppArmor」を通じて行われています。
「AppArmor」を活用することで管理者は、アプリがアクセス可能なシステムリソースを意図的に制限し、セキュリティー強度を向上させることができます。
AppArmor 4.0
「Ubuntu 24.04 LTS」には最新版の「AppArmor 4.0」が搭載されています。「AppArmor 4.0」ではセキュリティーポリシーが強化され、アプリがアクセス可能なネットワークリソースをネットワークアドレスやポートで指定できるなど、機能が強化されています。
従来よりもより高度で柔軟なセキュリティーポリシーを定義できるようになりました。
アクセス制御の強化
「AppArmor」は「Linux kernel」内でユーザー名前空間や「io_uring」サブシステムへのアクセスを仲介できるようになりました。いずれも悪意あるソフトウェアの攻撃対象になる機能です。
「AppArmor」によりそれらの攻撃を緩和することができます。
4. 古いTLSバージョンの無効化
「TLS」は認証及び暗号化通信に利用される仕組み(プロトコル)です。1999年に「TLS 1.0」が標準化され、その後時代と共に「TLS」はバージョンアップし、セキュリティー機能が強化されてきました。
古いバージョンの「TLS」は脆弱であり、使用が推奨されるものではありません。
古いバージョンは利用不可に
「Ubuntu 24.04 LTS」では、以下のバージョンは強制的に無効化されており、利用することはできません。- TLS 1.0
- TLS 1.1
- DTLS 1.0
これによりTLSダウングレード攻撃にも対抗できるようになりました。
5. Linux kernelのセキュリティー強化
「Ubuntu 22.04 LTS」ではリリース時に「Linux kernel 5.15」が採用されていました。「Linux kernel 5.15」ではコアスケジューリングやカーネルスタックのランダム化、非特権BPFの利用制限など、複数のセキュリティー機能が取り込まれています。
「Ubuntu 24.04 LTS」ではさらにセキュリティーが強化された「Linux kernel 6.8」が採用されています。
Intel shadow stackのサポート
モダンな「Intel CPU」は、特定の「ROP(Return-oriented programming)」攻撃に対抗する機能や、コールスタックを対象とした攻撃に対抗するセキュリティー機能が備わっています。「Intel shadow stack」は、CPUから直接変更できないスタックの復帰アドレスをコピーし、関数呼び出しから戻ってきた時にスタックの復帰アドレスとコピーしたスタックの復帰アドレスを比較して、改ざんされていないか検出する機能です。
改ざんされていればプロセスは終了させられます。
この機能は「Ubuntu 19.10」のコンパイラ及びユーザースペースのパッケージでサポートが有効になっています。
しかしカーネルやCライブラリーではこの機能がサポートされておらず、この機能を活用することができませんでした。
「Ubuntu 24.04 LTS」では、以下の環境変数を指定することで必要に応じてこの機能を有効化できるようになりました。
GLIBC_TUNABLES=glibc.cpu.hwcaps=SHSTK
AMD SEV-SNP と Intel TDX による仮想環境のセキュリティー強化
「AMD CPU」及び「Intel CPU」は仮想マシンのセキュリティーを強化する機能を備えています。それぞれ機能は「AMD SEV-SNP」や「Intel TDX」と呼ばれています。
この機能によりメモリーの暗号化や整合性の維持など、仮想マシンのセキュリティー強度を向上させることができます。
さてこの機能は「Linux kernel 5.19」でサポートされましたが、この機能を活用するには「Linux kernel」だけでなくゲスト側及びホスト側の双方で、ソフトウェアスタックの対応も必要になります。
「Ubuntu」ではゲスト側及びホスト側の双方でこの機能を活用できるよう、ソフトウェアスタックの対応もなされています。
コンパイル時の厳密な境界チェック
「Linux kernel」で「memcpy()」などメモリー周りの関数で、コンパイル時にバッファオーバーフローを検出する機能が強化されました。「FORTIFY_SOURCE」マクロにより、メモリーを別のバッファーにコピーする時など、メモリー周りの処理でコンパイル時にバッファオーバーフローのチェックが行われます。
問題が発見された場合は、コンパイルが中止されます。
この機能が「Linux kernel 5.19」で強化され、今まで複雑なパターンで適切に検出できていなかったケースでも検出できるよう、大幅にチェック機能が強化されました。