
攻撃者は、アニメーションタイムラインにおけるuse-after-free(解放後使用)脆弱性を悪用して、コンテンツプロセスでのコード実行を達成することができました。この脆弱性が実環境で悪用されているとの報告を受けています。この脆弱性は、Firefox < 131.0.2、Firefox ESR < 128.3.1、Firefox ESR < 115.16.1、Thunderbird < 131.0.1、Thunderbird < 128.3.1、Thunderbird < 115.16.0 に影響します。
クレジット: Fireship
「use-after-free」(解放後使用)脆弱性は、プログラムが解放(割り当て解除)された後も、メモリへのポインタ(または参照)を使用し続ける場合に発生する、メモリ破壊の問題の一種です。これは危険な状態です。なぜなら、問題のメモリはもはやプログラムによって所有されておらず、別の目的のために再割り当てされたり、プログラムの他の部分によって変更されたりする可能性があるためです。プログラムがこの解放されたメモリを使用し続けると、クラッシュ、データ破壊、攻撃者による悪用など、予測不可能な動作を引き起こす可能性があります。
メモリの割り当てと解放:
malloc() や new などの関数を使用)、使い終わったら解放します(例: free() や delete を使用)。問題:
影響:
C言語での簡略化した例を考えてみましょう:
#include <stdlib.h>
#include <stdio.h>
int main() {
int *ptr = (int *)malloc(sizeof(int)); // Allocate memory
*ptr = 42; // Use the allocated memory
free(ptr); // Free the memory
// Use the pointer after freeing the memory (use-after-free)
printf("%d\n", *ptr); // Undefined behavior, potential crash or exploit
return 0;
}
この例では:
free(ptr) で解放されます。ptr は使用され続けます(printf() 文で逆参照されます)。これは未定義の動作を引き起こします。メモリは再割り当てされている可能性があり、それにアクセスするとクラッシュ、あるいはより危険なシナリオではプログラムの悪用につながる可能性があります。攻撃者はメモリ管理を注意深く操作することで、use-after-free脆弱性を悪用できます。攻撃者がこの脆弱性を悪用する可能性がある方法は次のとおりです:
use-after-free脆弱性を防ぐために、開発者は以下のことを行えます:
NULL に設定する: これにより、解放されたポインタが誤って使用された場合に、無効なメモリにアクセスするのではなく、プログラムがより予測どおりにクラッシュするか、制御された方法で動作することが保証されます。std::shared_ptr、std::unique_ptr)を使用するとメモリを自動的に管理でき、手動によるメモリ管理の誤りを減らすことができます。この特定のケースでは、ウェブページ内のアニメーションのタイミング制御を担当するCSSアニメーションタイムラインが、他のブラウザコンポーネントと相互作用する際に、アニメーションのタイムラインに関連付けられたオブジェクトが解放されたにもかかわらず、ブラウザがそれを使用し続けました。
CSSアニメーションタイムラインは、レンダリングエンジン、DOM(Document Object Model)、JavaScript実行環境など、ブラウザエンジンの多くの異なる部分と相互作用する複雑なシステムです。アニメーションに関連付けられたオブジェクトのライフサイクル管理(特に動的に更新または削除される場合)は厄介なものであり、メモリ管理における小さなミスでもuse-after-freeバグにつながる可能性があります。
CVE-2024-9680の場合、タイムラインオブジェクトが適切に追跡されず、使用中に解放されたようです。攻撃者が、慎重にタイミングを合わせたアニメーション更新または操作でこのバグを繰り返しトリガーできれば、この脆弱性を悪用できる可能性があります。
この仮説的な例には、複雑なCSSアニメーションのセットを含むウェブページを作成し、JavaScriptを介してそれらを動的に操作してuse-after-free状態をトリガーすることが含まれるかもしれません。
<!DOCTYPE html>
<html>
<head>
<style>
@keyframes exampleAnimation {
from { opacity: 0; }
to { opacity: 1; }
}
.animate {
animation: exampleAnimation 5s infinite;
}
</style>
</head>
<body>
<div id="targetElement" class="animate">Animating Element</div>
<script>
// Example setup: A function that continuously creates and destroys animations
// The goal here is to simulate rapid, repeated manipulations of the CSS animation timeline
function triggerVulnerability() {
const target = document.getElementById('targetElement');
// Create an animation, then remove it quickly in a loop
let i = 0;
const interval = setInterval(() => {
i++;
if (i % 2 === 0) {
target.classList.add('animate');
} else {
target.classList.remove('animate');
}
// Potentially causing a race condition or triggering the vulnerability
if (i > 1000) {
clearInterval(interval);
}
}, 1); // Rapid manipulation of the animation state
}
// Simulating dynamic DOM manipulation and timeline interaction
triggerVulnerability();
</script>
</body>
</html>
exampleAnimation)を定義します。triggerVulnerability())は、要素のanimateクラスの追加と削除を迅速に繰り返し、ブラウザのアニメーションタイムラインを繰り返し更新させるとともに、オブジェクトの作成と破棄を短時間に連続して管理することをブラウザに強制する可能性があります。