
CVE-2024-9680 का शैक्षणिक विश्लेषण, जो Firefox के CSS Animation Timeline में एक use-after-free भेद्यता है, जिसमें विस्तृत शोषण तंत्र और अवधारणात्मक कोड उदाहरण शामिल हैं।
एक हमलावर एनिमेशन टाइमलाइन में उपयोग-पश्चात-मुक्त (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
एक "उपयोग-पश्चात-मुक्त" कमजोरी एक प्रकार की मेमोरी भ्रष्टाचार समस्या है जो तब होती है जब कोई प्रोग्राम मेमोरी को मुक्त (डीलोकेट) करने के बाद भी उस मेमोरी के लिए पॉइंटर (या संदर्भ) का उपयोग जारी रखता है। यह एक खतरनाक स्थिति है क्योंकि प्रश्नगत मेमोरी अब प्रोग्राम के स्वामित्व में नहीं है, जिसका अर्थ है कि इसे किसी अन्य उद्देश्य के लिए पुन: असाइन किया जा सकता है या प्रोग्राम के अन्य भागों द्वारा बदला जा सकता है। यदि प्रोग्राम इस मुक्त मेमोरी का उपयोग जारी रखता है, तो यह अप्रत्याशित व्यवहार, जिसमें क्रैश, डेटा भ्रष्टाचार, या हमलावरों द्वारा शोषण शामिल है, का कारण बन सकता है।
मेमोरी आवंटन और डीलोकेशन:
malloc() या new जैसे फ़ंक्शन के साथ) और जब वे इसका उपयोग पूरा कर लेते हैं तो इसे मुक्त कर देते हैं (जैसे, free() या delete के साथ)।समस्या:
परिणाम:
एक सरलीकृत उदाहरण पर विचार करें:
#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() स्टेटमेंट में डीरेफरेंस किया गया), जो अपरिभाषित व्यवहार की ओर ले जाता है। मेमोरी पुन: असाइन की जा सकती है, और इसे एक्सेस करने से क्रैश हो सकता है या, अधिक खतरनाक परिदृश्य में, प्रोग्राम का शोषण हो सकता है।हमलावर मेमोरी प्रबंधन में सावधानीपूर्वक हेरफेर करके उपयोग-पश्चात-मुक्त कमजोरियों का शोषण कर सकते हैं। यहाँ बताया गया है कि एक हमलावर इस कमजोरी का संभावित रूप से कैसे उपयोग कर सकता है:
उपयोग-पश्चात-मुक्त कमजोरियों को रोकने के लिए, डेवलपर्स यह कर सकते हैं:
NULL पर सेट करें: इससे यह सुनिश्चित होता है कि यदि गलती से मुक्त करने के बाद किसी पॉइंटर का उपयोग किया जाता है, तो प्रोग्राम अधिक पूर्वानुमानित रूप से क्रैश होगा या नियंत्रित तरीके से व्यवहार करेगा, बजाय अमान्य मेमोरी तक पहुँचने के।std::shared_ptr, std::unique_ptr) का उपयोग करने से स्वचालित रूप से मेमोरी प्रबंधन में मदद मिल सकती है, जिससे मैन्युअल मेमोरी कुप्रबंधन की संभावना कम हो जाती है।इस विशिष्ट मामले में, CSS एनिमेशन टाइमलाइन—जो वेब पेज में एनिमेशन के समय को नियंत्रित करने के लिए जिम्मेदार है—अन्य ब्राउज़र घटकों के साथ इस तरह से बातचीत कर रही थी कि एनिमेशन की टाइमलाइन से बंधी एक वस्तु मुक्त हो गई, लेकिन ब्राउज़र ने इसका उपयोग जारी रखा।
CSS एनिमेशन टाइमलाइन एक जटिल प्रणाली है जो ब्राउज़र इंजन के कई विभिन्न भागों, जैसे रेंडरिंग इंजन, DOM (डॉक्यूमेंट ऑब्जेक्ट मॉडल), और जावास्क्रिप्ट निष्पादन वातावरण के साथ बातचीत करती है। एनिमेशन से बंधी वस्तुओं के जीवनचक्र का प्रबंधन करना—विशेषकर जब वे गतिशील रूप से अपडेट या हटाई जाती हैं—मुश्किल है, और मेमोरी प्रबंधन में छोटी सी गलती भी उपयोग-पश्चात-मुक्त बग का कारण बन सकती है।
CVE-2024-9680 के मामले में, ऐसा प्रतीत होता है कि टाइमलाइन ऑब्जेक्ट को ठीक से ट्रैक नहीं किया गया था, इसलिए इसे उपयोग में रहते हुए मुक्त कर दिया गया। यदि कोई हमलावर सावधानीपूर्वक समयबद्ध एनिमेशन अपडेट या हेरफेर के साथ इस बग को बार-बार ट्रिगर कर सकता है, तो वे संभावित रूप से कमजोरी का शोषण कर सकते हैं।
इस काल्पनिक उदाहरण में जटिल CSS एनिमेशन का एक सेट वाला एक वेबपेज बनाना और उपयोग-पश्चात-मुक्त स्थिति को ट्रिगर करने के लिए जावास्क्रिप्ट के माध्यम से उनमें गतिशील रूप से हेरफेर करना शामिल हो सकता है।
<!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 क्लास को जोड़ता और हटाता है, जिससे ब्राउज़र की एनिमेशन टाइमलाइन बार-बार अपडेट होती है और संभावित रूप से ब्राउज़र को तेजी से ऑब्जेक्ट निर्माण और विनाश का प्रबंधन करने के लिए मजबूर करती है।