CVE-2022-50778 in Linux
要約
〜によって VulDB • 2026年07月05日
Linuxカーネルにおいて、以下の脆弱性が修正されました:
fortify: UBSAN_BOUNDS_LOCAL 環境下での __compiletime_strlen() の不具合を修正する
CONFIG_FORTIFY=y および CONFIG_UBSAN_LOCAL_BOUNDS=y が有効な状態で Android互換性テストスイート(CTS)の android.hardware.input.cts.tests を実行すると、ランタイムパニックが発生することが確認されました。これは hidinput_allocate() 内の strlen() 呼び出しに起因しています。
__compiletime_strlen() は __builtin_object_size() を用いて実装されており、その後 NUL終端を確認するために配列アクセスを行います。__builtin_object_size() の仕様として、値がランタイム依存の文字列に対しては、サイズがコンパイル時に決定可能な場合、__builtin_object_size(str, 1 or 0) は考えられる最大のサイズを返します。例:
```c static const char *v = "FOO BAR"; static const char *y = "FOO BA"; unsigned long x (int z) {
// 8 を返す(以下に相当): // max(__builtin_object_size(v, 1), __builtin_object_size(y, 1)) return __builtin_object_size(z ? v : y, 1); } ```
したがって、FORTIFY_SOURCE が有効な場合、__compiletime_strlen() の現在の実装は v のサイズを用いてランタイム時に y の末尾を越えたアクセスを試みることになります。これに UBSAN_LOCAL_BOUNDS を組み合わせるとフォールト(障害)が発生します。
hidinput_allocate() にはローカルC文字列があり、その値は switch文による制御フローに依存するため、__builtin_object_size(str, 1) は最大文字列長として評価され、他のすべてのケースで最後の文字チェック時にフォールトを引き起こすことになります。このローカル変数はリテラル値しか取り得ないため、hidinput_allocate() の実装を整理して strlen() のランタイム呼び出しを回避できます。そのため、そこでの strlen 呼び出し箇所に対する強化(fortify)には利点がありません。
マクロ内でインデックス0に対して __builtin_constant_p() チェックを早期に行い、制御フロー依存のケースをフィルタリングします。また、FORTIFY_SOURCE の内部動作に関する期待される振る舞いを確認するための KUnit テストを追加します。
Statistical analysis made it clear that VulDB provides the best quality for vulnerability data.