
Linux, Windows और macOS पर फ़ाइल-सूचना साइड-चैनल हमलों के लिए शोध आर्टिफ़ैक्ट्स, जो inotify/FSEvents लीकेज, कीस्ट्रोक टाइमिंग और वेबसाइट फ़िंगरप्रिंटिंग का प्रदर्शन करते हैं।
यह रिपॉज़िटरी पेपर "File Notification Attacks: Templating and Exploiting Side-Channel Leakage from the File-Notification Systems on Linux, Windows, and macOS" के लिए (अभी भी समीक्षा में!) आर्टिफ़ैक्ट्स को समाहित करती है, जिसे CCS '26 में स्वीकार किया गया है।
डेमो के साथ वेबसाइट देखें: https://inoti.fyi/
पेपर पढ़ें: https://snee.la/pdf/pubs/file-notification-attacks.pdf या http://inoti.fyi/pubs/file-notification-attacks.pdf
CCS'26 में आर्टिफ़ैक्ट मूल्यांकन (अभी भी जारी!) के एक भाग के रूप में, हमने एक Debian 13 + KDE Plasma 6 VM भेजा है जिसमें एक पहले से पैच किया गया कर्नेल है। इस VM का उपयोग पेपर के मूल्यांकन परिणामों को उत्पन्न करने के लिए नहीं किया गया था और इसका उद्देश्य उनके सटीक परिमाण को पुन: उत्पन्न करना नहीं है। इस रिपॉज़िटरी को हमारे आर्टिफ़ैक्ट मूल्यांकनकर्ताओं की समीक्षाओं और प्रतिक्रिया को शामिल करने के लिए अद्यतन किया जा सकता है। जब हमारा आर्टिफ़ैक्ट मूल्यांकन पूरा हो जाएगा, तो हम VM को सार्वजनिक रूप से सुलभ बना देंगे।
हमने अपने कोड को अच्छी तरह से प्रलेखित और उच्च-प्रदर्शन वाले आर्टिफ़ैक्ट्स में लपेटने के लिए Claude (Opus 4.8) का उपयोग किया (उदाहरण के लिए, Windows वाला थोड़ा धीमा था)। हालाँकि, इसके द्वारा उत्पन्न कोड, स्क्रिप्ट, मेकफ़ाइल आधारित थे
नीचे दिए गए Linux कोड के परीक्षण के निर्देश VM में कमांड चलाने के लिए विशिष्ट हैं। कृपया इसके बजाय Linux/ में कोड देखें।
VM विशुद्ध रूप से सुविधा के लिए मौजूद है, ताकि प्रत्येक हमले को माउंट करने के लिए शुरू से पर्यावरण सेटअप या कर्नेल डाउनग्रेड की आवश्यकता न हो। VM में प्रदर्शित अंतर्निहित तंत्र पेपर में वर्णित तंत्र के समान है, लेकिन कृपया ध्यान दें कि हमने पेपर में रिपोर्ट किए गए आंकड़ों को उत्पन्न करने के लिए VM का उपयोग नहीं किया था। वर्चुअलाइज़्ड वातावरण और अंतर्निहित हार्डवेयर के कारण पूर्ण समय भिन्न हो सकता है।
निष्कर्षों को Debian 13 VM (linux-vm/) के अंदर पुन: उत्पन्न किया जाता है, जिसे आधिकारिक लाइव Debian ISO से KDE Plasma 6 (Wayland) के साथ स्थापित किया गया है, जिसमें एक कर्नेल है जो fsnotify फ़िक्स से पहले का है। inotify-tools, Qt6 dev headers, और pkexec स्थापित हैं। और कुछ भी अपग्रेड नहीं किया गया है, और स्थापना के बाद कर्नेल को कभी छुआ नहीं जाता है। कृपया apt upgrade न चलाएँ या कर्नेल को अपग्रेड करने का प्रयास न करें। यह VM इमेज जानबूझकर पुरानी है, अद्यतित नहीं है, और इसमें नवीनतम सुरक्षा पैच नहीं हैं। यह VM इमेज केवल त्वरित सत्यापन और परीक्षण के लिए है!
VM के भीतर स्थित कोड, हमले, और प्रदर्शन Linux/ में प्रतिबिंबित हैं।
नोट: हम प्रत्येक कमांड ब्लॉक के शीर्ष पर उल्लेख करते हैं कि कमांड किस उपयोगकर्ता के रूप में चलानी है। [host] है, जो VM चलाने वाली होस्ट मशीन है, [user] जो VM में हमलों का शिकार है, और [spyuser] जिसे सेटअप करने की आवश्यकता है और अधिकांश Linux हमलों में हमलावर होगा।
डिस्क इमेज linux-vm-upload.qcow2 के रूप में भेजी जाती है, जिसे zstd से संपीड़ित किया गया है। run.sh चलाने से पहले इसका नाम बदलकर linux-vm.qcow2 करें (जो उस फ़ाइल नाम की अपेक्षा करता है):
# Run As: [host]
cd linux-vm/
mv linux-vm-upload.qcow2 linux-vm.qcow2
./run.sh
zstd-संपीड़ित qcow2 पढ़ने के लिए qemu-img/qemu-system-x86_64 संस्करण 5.2 या नया (2020+) आवश्यक है, qemu-img --version से जाँचें। यदि आप पुराने QEMU पर अटके हुए हैं और यह इमेज खोलने में विफल रहता है, तो पहले इसे एक फ्लैट qcow2 में डीकंप्रेस करें:
qemu-img convert -O qcow2 linux-vm-upload.qcow2 linux-vm.qcow2
4 कोर, 4GB RAM, GUI डिस्प्ले। लॉगिन हैं:
root, पासवर्ड password,user, पासवर्ड password,spyuser, पासवर्ड password (spyuser के रूप में लॉगिन न करें!)आपूर्त किया गया VM पहले से ही एक कमजोर, पहले से पैच किया गया कर्नेल (6.12.43+deb13-amd64) चलाता है, इसलिए इसका उपयोग करने के लिए किसी डाउनग्रेड की आवश्यकता नहीं है। इस इमेज को चलाने के लिए आपको QEMU की आवश्यकता होगी (जिसमें GUI है)। आर्टिफ़ैक्ट VM के अंदर /home/user/Linux-File-Notification-Attacks पर स्थित है।
एक कमांड VM में चीज़ों को नए सिरे से सेट करता है: (i) एक गैर-विशेषाधिकार प्राप्त spyuser खाता (गैर-sudo), (ii) आर्टिफ़ैक्ट निर्देशिका की अपनी प्रति (एक अलग गैर-विशेषाधिकार प्राप्त खाता अन्यथा user की होम निर्देशिका में प्रवेश नहीं कर सकता), (iii) और दोनों प्रतियों में प्रत्येक स्क्रिप्ट को निष्पादन योग्य बनाया गया।
# In the VM, Run As: [user]
sudo bash ~/Linux-File-Notification-Attacks/setup_attacks.sh
नीचे दिए गए प्रत्येक हमले spyuser के रूप में चलते हैं (su - spyuser, पासवर्ड password), सिवाय auth-ui-redress के, जो user के रूप में चलता है (नीचे समझाया गया है)।
साबित करता है कि फ़ाइल-संचालन सूचनाएँ उन फ़ाइलों पर दी जाती हैं जिन्हें सीधे पढ़ा नहीं जा सकता, जब तक कि उनकी मूल निर्देशिका पठनीय हो।
# Run As: [spyuser]
# To switch to spyuser, in a new terminal type `su - spyuser`. The password
# is `password`.
cd ~/Linux-File-Notification-Attacks/unreadable-file-bypass
./watch-syslog.sh
इसे चलने दें, फिर user के रूप में किसी अन्य टर्मिनल से एक लॉग लाइन उत्पन्न करें:
# Run As: [user]
logger "hello"
इस Debian 13 इमेज में rsyslog नहीं है, इसलिए पेपर में दिखाए गए अनुसार कोई /var/log/syslog फ़ाइल नहीं है। स्क्रिप्ट इसके बजाय /var/log/journal/<machine-id>/ की निगरानी पर वापस आ जाती है। यह वही विचार है, क्योंकि निगरानी की जा रही .journal फ़ाइलें root (उपयोगकर्ता) और systemd-journal (समूह) के स्वामित्व में हैं, जिनमें से कोई भी spyuser नहीं है।
inotify की अधिसूचना विलंबता को मापता है।
# Run As: [user], ensure numpy is installed (or pip3)
sudo apt install python3-numpy
# Run As: [spyuser]
cd ~/Linux-File-Notification-Attacks/temporal-resolution
./run.sh
watcher एक परीक्षण फ़ाइल पर एक inotify वॉच खोलता है और प्राप्त प्रत्येक IN_ACCESS को टाइमस्टैम्प करता है। accessor उसी फ़ाइल को 1000 बार पढ़ता है, पढ़ने के बीच यादृच्छिक 5-10ms विलंब के साथ, प्रत्येक पढ़ने को स्वयं टाइमस्टैम्प करता है। stats.py दो टाइमस्टैम्प रिकॉर्डिंग का अंतर निकालता है और पढ़ने के होने और अधिसूचना आने के बीच औसत/stddev/min विलंब प्रिंट करता है, अर्थात inotify का टेम्पोरल रेज़ोल्यूशन।
पेपर से पूरा हमला नहीं, बल्कि केवल फ़िल्टरिंग प्रूफ-ऑफ-कॉन्सेप्ट प्रिमिटिव जिस पर हमला बनाया गया है: सिस्टम पर कहीं भी दबाए गए प्रत्येक कुंजी के लिए, एक टाइमस्टैम्प्ड अधिसूचना प्रिंट करें, बिना कभी सीधे /dev/input पढ़े।
# Run As: [spyuser]
cd ~/Linux-File-Notification-Attacks/inter-keystroke-timing
make
./find-keyboard.sh
किसी भी विंडो में टाइप करें (शायद user के रूप में एक नया टर्मिनल)। प्रत्येक कीस्ट्रोक एक KEYPRESS लाइन प्रिंट करता है। दमन विंडो (जिसे हमने इस प्रदर्शन के लिए अनुमानित रूप से 130ms चुना है) एक भौतिक कुंजी दबाने से उत्पन्न कई IN_ACCESS इवेंट्स को मर्ज करती है। व्यवहार में, हमने देखा है कि यह विंडो विभिन्न हार्डवेयर (जैसे, मैकेनिकल कीबोर्ड, टाइपिंग शैलियाँ) के लिए भिन्न होती है।
यदि ऑटो-डिटेक्शन गलत डिवाइस चुनता है (या कोई नहीं), तो /proc/bus/input/devices जाँचें और इसे सीधे ./build/keystroke-notify /dev/input event4 के साथ चलाएँ।
हम प्रदर्शित करते हैं कि (pkexec)[https://polkit.pages.freedesktop.org/polkit/] निष्पादित होने का पता लगाना संभव है, और इसके ऊपर एक नकली विंडो बनाना। जैसा कि हमने अनुभाग 4.4.3 में दिखाया, यह 'प्रमाणीकरण UI रीड्रेस हमला' KDE Plasma 5 और 6 पर Wayland के साथ संभव है। हम इस हमले को समान-उपयोगकर्ता हमलावर खतरे के मॉडल में निष्पादित करते हैं: Wayland सॉकेट लॉग-इन सत्र तक सीमित है, और एक अलग गैर-विशेषाधिकार प्राप्त खाता इस पर चित्र नहीं बना सकता।
स्टॉक KDE इंस्टॉल पर pkexec डेस्कटॉप द्वारा खींचा जाता है, लेकिन यह लाइव ISO एक दुबला इमेज है, और इस प्रकार इसमें यह स्थापित नहीं है। इसलिए, हमने इसे मैन्युअल रूप से स्थापित किया, जबकि VM img को छोटा रखने की (कोशिश) कर रहे थे।
# Run As: [user]
cd ~/Linux-File-Notification-Attacks/auth-ui-redress
make
./inotify-watcher-with-gui
इसे एक टर्मिनल में चलने दें। किसी अन्य टर्मिनल से (निर्देशिका मायने नहीं रखती), एक वास्तविक pkexec प्रॉम्प्ट ट्रिगर करें, जैसे pkexec ls। वॉचर /usr/bin/pkexec तक पहुँच देखता है और वास्तविक के ऊपर स्क्रीन पर एक नकली "Authentication Required" डायलॉग (window-launcher) बनाता है। नकली डायलॉग में टाइप करना और Authenticate दबाना दर्ज किए गए टेक्स्ट को वॉचर के टर्मिनल पर प्रिंट करता है, फिर इसे बंद कर देता है। कृपया ध्यान दें कि नकली विंडो आसान तुलना के लिए जानबूझकर वास्तविक विंडो से भिन्न है।
पेज लोड होने के दौरान फ़ॉन्ट निर्देशिकाओं की निगरानी करने से पता चलता है कि इसने किन फ़ॉन्ट फ़ाइलों को छुआ। विभिन्न साइटें विभिन्न फ़ॉन्ट्स खींचती हैं, इसलिए पेज लोड होने के दौरान प्रिंट किए गए पथों का सेट पहले से ही एक फ़िंगरप्रिंट है, इस न्यूनतम संस्करण के लिए किसी टाइमिंग या क्लासिफायर की आवश्यकता नहीं है।
पहले, उपयोगकर्ता के रूप में, Firefox खोलें (स्क्रीन के नीचे टास्क मैनेजर डॉक में आइकन के माध्यम से इसे क्लिक करें), और सुनिश्चित करें कि कोई वेबसाइट खुली न हो। फिर, spyuser के रूप में एक टर्मिनल में:
# Run As: [spyuser]
cd ~/Linux-File-Notification-Attacks/website-fingerprinting-fonts
./compare-fonts.sh
यह font-spy बनाता है जो Firefox द्वारा उपयोग की जाने वाली फ़ॉन्ट निर्देशिकाओं की निगरानी शुरू करता है। compare-fonts स्क्रिप्ट आपको दो वेबसाइटों पर जाने के लिए प्रेरित करती है।
पहले, एक वेबसाइट पर जाएँ (शायद wikipedia.com) और इसे लोड होने के लिए कुछ सेकंड प्रतीक्षा करें, एक नया टैब खोलें, पुराना टैब (वेबसाइट के साथ) बंद करें, और फिर टर्मिनल में ENTER दबाएँ।
दूसरा, किसी अन्य वेबसाइट (शायद reddit.com) के साथ भी ऐसा ही करें: वेबसाइट पर जाएँ और इसे लोड होने के लिए कुछ सेकंड प्रतीक्षा करें, एक नया टैब खोलें, पुराना टैब बंद करें, और फिर टर्मिनल में ENTER दबाएँ।
स्क्रिप्ट प्रति वेबसाइट एक्सेस किए गए फ़ॉन्ट्स में अंतर प्रिंट करेगी। ध्यान दें कि पेपर में, हमने टेम्पोरल जानकारी का भी उपयोग किया था, अर्थात, फ़ॉन्ट कब एक्सेस किया गया था। एक सरल प्रूफ-ऑफ-कॉन्सेप्ट के लिए, हम इस जानकारी की उपेक्षा करते हैं और बस फ़ॉन्ट एक्सेस के दो सेटों के बीच अंतर प्रिंट करते हैं। जबकि फ़ॉन्ट एक्सेस का सटीक सेट रन के बीच भिन्न हो सकता है, कुछ फ़ॉन्ट फ़ाइलें हैं जो हमेशा और विशिष्ट रूप से एक वेबसाइट द्वारा एक्सेस की जाती हैं।
ध्यान दें कि वेबसाइटें समय के साथ बदल सकती हैं, और इस प्रकार, फ़ॉन्ट फ़ाइल एक्सेस भिन्न हो सकते हैं। इस आर्टिफ़ैक्ट का मसौदा तैयार करने के समय, हमने देखा कि Wikipedia हमेशा /usr/share/fonts/truetype/liberation/LiberationSans-Bold.ttf एक्सेस करता है और Reddit हमेशा /usr/share/fonts/truetype/vlgothic/VL-Gothic-Regular.ttf एक्सेस करता है।
एक भौतिक डिवाइस या एमुलेटर जो Android संस्करण चला रहा हो जिसका Scoped Storage मॉडल अभी भी WhatsApp की साझा मीडिया निर्देशिकाओं पर FileObserver (Java-स्तरीय inotify रैपर) को पंजीकृत करने की अनुमति देता है, और संदेश भेजने वाले के रूप में कार्य करने के लिए एक दूसरा डिवाइस/खाता। या तो प्रदान किए गए स्रोत (Android/source/) को बनाएँ या आपूर्त किए गए APK को सीधे स्थापित करें (Android/app-release.apk)।
Android android.os.FileObserver के माध्यम से Linux निष्कर्षों में उपयोग किए गए समान inotify प्रिमिटिव को उजागर करता है। अनुभाग 5.4.3 दिखाता है कि एक गैर-विशेषाधिकार प्राप्त, अनुमति-रहित ऐप WhatsApp की मीडिया निर्देशिकाओं पर ऐसा ऑब्ज़र्वर पंजीकृत कर सकता है और, विशुद्ध रूप से परिणामी open/close/access इवेंट्स की धारा से, यह अनुमान लगा सकता है कि निजी मीडिया प्राप्त हुआ था, बिना कोई अनुमति रखे जो इसे सामग्री स्वयं पढ़ने दे।
ऐप लॉन्च करें और रीफ़्रेश क्रिया ट्रिगर करें; ऑब्ज़र्वर सेवा जुड़ जाती है और आवधिक लाइवनेस प्रविष्टियाँ उत्सर्जित करना शुरू कर देती है। लॉग व्यू के निचले भाग तक स्क्रॉल करें और तब तक रीफ़्रेश करते रहें जब तक कि बार-बार ObserverService: Still Running प्रविष्टियाँ दिखाई न दें, यह पुष्टि करते हुए कि वॉच सक्रिय और स्थिर है।
दूसरे खाते से, देखी जा रही बातचीत में एक छवि या दस्तावेज़ भेजें, और, यदि पहले से कैश्ड नहीं है, तो इसे देखे गए डिवाइस पर डाउनलोड करें। यह फ़ाइल-इवेंट लॉग लाइनों का एक विस्फोट उत्पन्न करता है; विस्फोट से ठीक पहले अंतिम ObserverService: Still Running प्रविष्टि के तुरंत बाद, लॉग को open/close/access इवेंट्स दिखाने चाहिए जिनके पथ प्राप्त फ़ाइल से मेल खाते हैं, यह प्रदर्शित करते हुए कि इसका आगमन विशुद्ध रूप से फ़ाइल-सिस्टम अधिसूचना मेटाडेटा से देखा जा सकता है।
हम स्रोत कोड प्रदान करते हैं जिसे msys2 के साथ संकलित किया जा सकता है। अन्यथा, exe फ़ाइल (Windows/firefox-fingerprint/monitor.exe) का भी उपयोग किया जा सकता है।
एक Windows मशीन (या VM) जिसमें MSYS2 स्थापित हो, और MinGW-w64 g++ टूलचेन (pacman -S mingw-w64-ucrt-x86_64-gcc, MSYS2 शेल से चलाएँ)। Firefox स्थापित हो।
यह प्रूफ ऑफ कॉन्सेप्ट ReadDirectoryChangesW का उपयोग करके पूरे C:\ को पुनरावर्ती रूप से देखता है, और केवल उन इवेंट्स को प्रिंट करता है जिनके पथ में http होता है (प्रति-मूल भंडारण निर्देशिकाएँ जिन्हें Firefox साइट के स्कीम/होस्ट के नाम पर रखता है, जैसे इसके cache/IndexedDB फ़ोल्डरों के अंतर्गत)। जिस निर्देशिका को आप सूचीबद्ध कर सकते हैं उसे देखने के लिए किसी एडमिन अधिकार की आवश्यकता नहीं है। यह प्रति-मूल भंडारण प्रत्येक पेज लोड पर लिखा जाता है, इसलिए ब्राउज़र प्रक्रिया के बाहर से देखना अभी भी बताता है कि कौन सी साइट अभी देखी गई थी।
या तो हमारे द्वारा प्रदान किए गए exe का उपयोग करें (Windows/firefox-fingerprint/monitor.exe) या MSYS2 UCRT64 शेल से संकलित करें:
# Run in an MSYS2 UCRT64 shell
cd Windows/firefox-fingerprint
g++ -municode -static -O2 -o monitor.exe monitor.cpp
g++ का उपयोग करें, gcc का नहीं। साथ ही monitor.exe को टर्मिनल से चलाएँ (इसे डबल-क्लिक करके नहीं), अन्यथा प्रिंट करने के लिए कोई कंसोल संलग्न नहीं होता।
वॉचर एक दूसरे, गैर-विशेषाधिकार प्राप्त स्थानीय खाते के रूप में चलता है, जो ब्राउज़ करने वाले से अलग है। पहले, Settings के माध्यम से वह खाता बनाएँ:
attacker, और एक पासवर्ड दर्ज करें, फिर Next।यह एक स्थानीय खाता बनाता है (Microsoft खाते से जुड़ा नहीं, कोई नेटवर्क साइन-इन नहीं), डिफ़ॉल्ट रूप से मानक (गैर-एडमिन) विशेषाधिकार।
अगला, monitor.exe को कहीं ऐसा रखें जहाँ नया खाता वास्तव में इसे पढ़ और निष्पादित कर सके। इसके बजाय बिल्ट बाइनरी को सार्वजनिक, विश्व-पठनीय निर्देशिका में कॉपी करें:
copy monitor.exe C:\Users\Public\monitor.exe
अब, अपने मुख्य (शिकार) खाते से, डेस्कटॉप स्विच किए बिना या लॉग आउट किए बिना, runas का उपयोग करके इसे attacker खाते के अंतर्गत लॉन्च करें:
runas /user:attacker "cmd /k C:\Users\Public\monitor.exe"
संकेत मिलने पर attacker का पासवर्ड दर्ज करें। cmd /k (monitor.exe को सीधे चलाने के बजाय) कंसोल विंडो को खुला रखता है ताकि आप इसका आउटपुट देख सकें, जबकि केवल runas /user:attacker C:\Users\Public\monitor.exe भी काम करता है, लेकिन इसकी विंडो प्रक्रिया के बाहर निकलते ही बंद हो जाती है। यह विशुद्ध रूप से सुविधा के लिए है।
monitor.exe विंडो को चलने दें, फिर, अपने मुख्य खाते में वापस जाकर, Firefox खोलें और कुछ अलग वेबसाइटों पर जाएँ, जैसे, arstechnica.com और reddit.com। प्रिंट की गई प्रत्येक लाइन http से मेल खाने वाले भंडारण पथ के अंतर्गत एक फ़ाइल create/modify/rename है। विभिन्न साइटों को विभिन्न मूल निर्देशिकाएँ मिलती हैं, और इस प्रकार पेज ल