Skip to content
KitploitKITPLOIT
उपकरणब्लॉग
जमा करें
उपकरणब्लॉग
जमा करें

हैकिंग, पेनटेस्ट और साइबर सुरक्षा उपकरण आपके सुरक्षा शस्त्रागार के लिए!

Kitploit हैकिंग, साइबर सुरक्षा और पेंटेस्टिंग टूल्स की एक निर्देशिका है। कमजोरियों को खोजने, सिस्टम का विश्लेषण करने, परीक्षण को स्वचालित करने और अपनी सुरक्षा को मजबूत करने के लिए नवीनतम प्रोजेक्ट अपडेट खोजें।

··फ़ीड·संपर्क·गोपनीयता·© 2026 Kitploit

टूल निर्देशिका

श्रेणियाँ

सभी श्रेणियाँ देखें
Loading categories
उपकरण/GitHubGitHub/squeeze440/obsidian-note-toolbar-poc
स्थैतिक विश्लेषणभेद्यता विश्लेषणकोड विश्लेषणशोषणवेब एप्लिकेशन शोषणपेपर और शोधलर्निंग और शिक्षापेलोड डेवलपमेंट
GitHub
squeeze440/obsidian-note-toolbar-poc

obsidian-note-toolbar-PoC

PoC — Note Toolbar for Obsidian में frontmatter-संचालित मनमाना JavaScript निष्पादन (GHSA-q8cw-3m8c-5pf2, CVE-2026-87002, CVSS 7.0)।

रिपॉजिटरी देखें
7 दिन पहलेअभी तक समीक्षित नहीं

सबसे लोकप्रिय

सभी देखें →

हमारे समुदाय द्वारा सबसे अधिक उपयोग किए जाने वाले उपकरण खोजें।

सभी उपकरण खोजें

हमारे उपकरणों का संग्रह ब्राउज़ करें

सभी उपकरण देखें →
साझा करें

Note Toolbar में {{prop_NAME}} → {{js:}} वेरिएबल चेन के माध्यम से Frontmatter-संचालित मनमाना कोड निष्पादन

CVE स्थिति: अनुरोध किया गया, असाइनमेंट लंबित। यह निष्कर्ष GHSA-q8cw-3m8c-5pf2 के रूप में प्रकाशित है। CVE असाइनमेंट पर इस रिपॉज़िटरी का नाम बदलकर CVE-YYYY-NNNNN-obsidian-note-toolbar-PoC कर दिया जाएगा और इस बैनर को CVE लिंक से बदल दिया जाएगा।

शोधकर्ताDostxodjayev Abdullox (@squeeze440)
सलाहGHSA-q8cw-3m8c-5pf2
CVSS 3.17.0 (उच्च)
कमज़ोरीCWE-94, CWE-1336

Note Toolbar में {{prop_NAME}} → {{js:}} वेरिएबल चेन के माध्यम से Frontmatter-संचालित मनमाना कोड निष्पादन

सारांश

Note Toolbar (Obsidian प्लगइन) के वेरिएबल-प्रतिस्थापन इंजन में अनुचित आउटपुट न्यूट्रलाइज़ेशन एक हमलावर को, जो किसी नोट के YAML frontmatter को नियंत्रित करता है (जैसे किसी सिंक/साझा किए गए वॉल्ट पर सहयोगी), पीड़ित की मशीन पर मनमाना कोड निष्पादन प्राप्त करने की अनुमति देता है, जब पीड़ित केवल नोट खोलता है, एक frontmatter प्रॉपर्टी में {{js: ...}} पेलोड इंजेक्ट करके जिसे कोई पूर्व-मौजूद, गैर-स्क्रिप्ट टूलबार आइटम लेबल/टूलटिप/लिंक {{prop_NAME}} के माध्यम से संदर्भित करता है।

उत्पाद

Note Toolbar (note-toolbar) — Obsidian कम्युनिटी प्लगइन रिपॉज़िटरी: https://github.com/chrisgurney/obsidian-note-toolbar

परीक्षण किया गया संस्करण

v1.34.12 (कमिट 520271c3027eb6da38bab10a686b21e14c664c13, 2026-07-29), Linux पर Obsidian डेस्कटॉप 1.13.4 के विरुद्ध।

अनुमानित CVSS v3.1

7.0 (उच्च) — CVSS:3.1/AV:L/AC:H/PR:N/UI:R/S:U/C:H/I:H/A:H

  • AV:L — कमज़ोर घटक (प्लगइन का JS मूल्यांकनकर्ता, जो Obsidian के Electron रेंडरर के अंदर चलता है) नेटवर्क-फेसिंग नहीं है; पेलोड स्थानीय वॉल्ट/फ़ाइल सामग्री के रूप में पहुँचता है जिसे पीड़ित जिस भी माध्यम से उपयोग करता है (Git, Syncthing, Obsidian Sync, साझा फ़ोल्डर) उसके द्वारा सिंक किया जाता है, जो इस परिवार के पूर्व निष्कर्षों (जैसे obsidian-syncthing-integration, obsidian-codescript-toolkit) के अनुरूप है।
  • AC:H — शोषण उन स्थितियों पर निर्भर करता है जो हमलावर के नियंत्रण से बाहर हैं और पीड़ित के इंस्टॉल पर पहले से मौजूद होनी चाहिए: (1) प्लगइन की "Scripting" सेटिंग पहले से सक्षम होनी चाहिए (डिफ़ॉल्ट रूप से बंद), और (2) पीड़ित ने पहले से ही एक टूलबार आइटम कॉन्फ़िगर किया होना चाहिए जिसका लेबल, टूलटिप, या लिंक किसी frontmatter कुंजी के लिए एक बेयर {{prop_NAME}} संदर्भ हो। दोनों यथार्थवादी, प्रलेखित उपयोग पैटर्न हैं, लेकिन कोई भी डिफ़ॉल्ट नहीं है।
  • PR:N — हमलावर को पीड़ित के सिस्टम तक पहुँच की आवश्यकता नहीं है, केवल हमलावर-नियंत्रित frontmatter के साथ पीड़ित के वॉल्ट में एक नोट डालने की क्षमता चाहिए।
  • UI:R — पीड़ित को विशिष्ट नोट खोलना/देखना चाहिए; टूलबार आइटम पर क्लिक की आवश्यकता नहीं है, टूलबार स्वचालित रूप से रेंडर होता है।
  • S:U, C:H/I:H/A:H — कोड पूर्ण Node.js पहुँच (require('child_process'), फ़ाइलसिस्टम, आदि) के साथ Obsidian चलाने वाले स्थानीय उपयोगकर्ता खाते के रूप में निष्पादित होता है।

विवरण

Note Toolbar एक प्रलेखित {{prop_NAME}} वेरिएबल का समर्थन करता है जो किसी नोट के frontmatter मान को टूलबार आइटम के लेबल, टूलटिप, या लिंक में प्रतिस्थापित करता है (skills/note-toolbar-variables/SKILL.md, विकी Variables.md)। यह एक {{js: <expr>}} वेरिएबल का भी समर्थन करता है जो "Scripting" प्लगइन सेटिंग सक्षम होने पर अभिव्यक्ति को लाइव JavaScript के रूप में मूल्यांकित करता है।

बग src/Toolbar/VariableResolver.ts::replaceVars() में संचालन के क्रम में है:

  1. पंक्तियाँ 74–92: {{prop_KEY}} प्लेसहोल्डर को वर्तमान नोट के frontmatter[KEY] के कच्चे मान से प्रतिस्थापित किया जाता है — बिना शर्त, scriptingEnabled सेटिंग की परवाह किए बिना, और उस frontmatter मान के स्रोत की परवाह किए बिना।
  2. पंक्तियाँ 94–104 (if (this.ntb.settings.scriptingEnabled) के अंदर): फ़ंक्शन तब पहले से प्रतिस्थापित स्ट्रिंग s पर s.trim().startsWith('{{js:') की जाँच करता है, और यदि सत्य है, तो {{js:/}} रैपर को हटा देता है और शेष को मूल्यांकन के लिए JavaScriptAdapter.use() को पास कर देता है।

चूँकि चरण 1 चरण 2 से पहले चलता है और s को यथास्थान फिर से लिखता है, एक frontmatter मान जो स्वयं {{js: से शुरू होता है और }} पर समाप्त होता है, "प्रदर्शित पाठ" से "निष्पादित स्क्रिप्ट" में पदोन्नत हो जाता है — भले ही टूलबार आइटम कभी स्क्रिप्ट आइटम के रूप में लिखा ही नहीं गया था। टूलबार आइटम के स्वामी ने केवल {{prop_status}} टाइप किया था; निष्पादन योग्य पेलोड पूरी तरह से नोट के अपने frontmatter से आता है।

JavaScriptAdapter.evaluate() (src/Adapters/JavaScriptAdapter.ts:143-205) अभिव्यक्ति को एक वास्तविक, अनसैंडबॉक्स्ड AsyncFunction के साथ चलाता है:

root@kitploit:~
src/Adapters/Adapter.ts:11
protected static readonly AsyncFunction = (Object.getPrototypeOf(async function(){}) as { constructor: typeof Function }).constructor;

src/Adapters/JavaScriptAdapter.ts:164
const func = new JavaScriptAdapter.AsyncFunction("input", expression);
...
result = await Promise.resolve((func as (...args: unknown[]) => unknown)(args));

यह JS इंजन का वास्तविक AsyncFunction कंस्ट्रक्टर है, कोई इंटरप्रेटर/सैंडबॉक्स नहीं — Obsidian के Electron रेंडरर के अंदर इसके पास पूर्ण require()/Node.js पहुँच है, जिसकी पुष्टि नीचे PoC में require('child_process').execSync(...) के माध्यम से की गई है।

महत्वपूर्ण रूप से, JS एडाप्टर बिल्ट-इन है और इसके लिए किसी साथी प्लगइन की आवश्यकता नहीं है (src/Adapters/AdapterManager.ts:59: adapter = this.js; // built-in, doesn't rely on plugin), Dataview/Templater/JS-Engine वेरिएबल प्रीफ़िक्स के विपरीत जिनके लिए उन प्लगइन्स को इंस्टॉल करना आवश्यक है। केवल प्लगइन का अपना "Scripting" टॉगल (scriptingEnabled, डिफ़ॉल्ट false, src/Settings/NoteToolbarSettings.ts:300) इसे नियंत्रित करता है।

अंत में, प्रतिस्थापन को ट्रिगर करने वाला रेंडर पथ स्वचालित है, क्लिक-गेटेड नहीं: ToolbarRenderer.ts::renderLItems() हर बार जब किसी नोट के लिए टूलबार रेंडर होता है — यानी नोट खोलने/देखने पर — this.ntb.vars.resolveText(toolbar, file) (src/Toolbar/ToolbarRenderer.ts:418) को कॉल करता है, जो replaceVars() के माध्यम से प्रत्येक आइटम के लेबल और टूलटिप को हल करता है। प्रभावित टूलबार आइटम पर क्लिक की आवश्यकता नहीं है।

टूलबार-से-नोट असाइनमेंट स्वयं frontmatter-संचालित है (toolbarProp सेटिंग, डिफ़ॉल्ट कुंजी notetoolbar, src/Settings/NoteToolbarSettings.ts:317), इसलिए एक सिंक किया गया नोट चुन सकता है कि उस पर कौन सा टूलबार रेंडर होगा — लेकिन यदि पीड़ित पहले से ही एक डिफ़ॉल्ट टूलबार या फ़ोल्डर मैपिंग का उपयोग करता है जिसमें कमज़ोर आइटम शामिल है तो शोषण के लिए यह आवश्यक नहीं है।

यह उस जोखिम से अलग है जिसे मेंटेनर का अपना SECURITY.md प्रलेखित करता है ("User scripts... executes JavaScript provided by the user... intentional and by design") — वह वर्णन करता है कि एक उपयोगकर्ता जानबूझकर एक {{js:}} टूलबार आइटम लिखता है, या जानबूझकर एक साझा टूलबार कॉन्फ़िग आयात करता है जिसमें एक शामिल है। यहाँ, कॉन्फ़िगरर के दृष्टिकोण से टूलबार आइटम बिल्कुल भी स्क्रिप्ट आइटम नहीं है (यह एक सादा प्रॉपर्टी-डिस्प्ले लेबल है), और निष्पादन योग्य पेलोड सामान्य नोट सामग्री/frontmatter के माध्यम से आता है — अन्य Obsidian सिंक/कॉन्फ़िग कोड-निष्पादन निष्कर्षों (obsidian-syncthing-integration, obsidian-codescript-toolkit) के समान अविश्वसनीय-वॉल्ट-सामग्री खतरा मॉडल।

प्रमाण अवधारणा

वास्तविक Obsidian 1.13.4 डेस्कटॉप इंस्टेंस (Xvfb + fluxbox) के विरुद्ध गतिशील रूप से सत्यापित, वास्तविक बिल्ट प्लगइन (main.js जो ऑडिट किए गए स्रोत से बनाया गया) लोड करके, न कि बेयर-फ़ंक्शन निष्कर्षण।

  1. वॉल्ट PoCVault/ में Project Alpha.md:

    root@kitploit:~
    ---
    status: "{{js: require('child_process').execSync('id > /tmp/ntb_poc_proof.txt; date >> /tmp/ntb_poc_proof.txt; whoami >> /tmp/ntb_poc_proof.txt'); return 'ok';}}"
    notetoolbar: Toolbar
    ---
    
  2. Note Toolbar प्लगइन इंस्टॉल, कम्युनिटी प्लगइन्स ट्रस्टेड, प्लगइन के अपने Settings UI के माध्यम से "Toolbar" नाम का एक टूलबार बनाया गया जिसमें एक आइटम है जिसका Label फ़ील्ड {{prop_status}} है (एक सादा प्रॉपर्टी-डिस्प्ले लेबल — कभी स्क्रिप्ट आइटम के रूप में कॉन्फ़िगर नहीं किया गया)।

  3. प्लगइन सेटिंग Scripting चालू (पीड़ित ऑप्ट-इन, डिफ़ॉल्ट रूप से बंद)।

  4. बस Project Alpha.md खोलना/देखना — टूलबार आइटम पर कोई क्लिक नहीं — टूलबार ok दिखाते हुए रेंडर होता है (JS अभिव्यक्ति का रिटर्न मान), और इंजेक्ट किए गए शेल कमांड वास्तव में निष्पादित होते हैं:

    टर्मिनल प्रमाण (~/engagements/obsidian-note-toolbar/evidence/02_terminal_proof_of_execution.png):

    root@kitploit:~
    $ cat /tmp/ntb_poc_proof.txt
    uid=1000(kali) gid=1000(kali) groups=1000(kali),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),100(users),105(docker),992(kvm)
    Fri Jul 31 09:31:33 PM +05 2026
    kali
    

    Obsidian स्क्रीनशॉट जो कच्चा frontmatter पेलोड और रेंडर किया गया ok टूलबार दिखाता है (~/engagements/obsidian-note-toolbar/evidence/01_obsidian_toolbar_rce_trigger.png)।

    स्रोत नोट ~/engagements/obsidian-note-toolbar/evidence/poc_note_frontmatter.md पर संरक्षित।

प्रभाव

Obsidian चलाने वाले स्थानीय उपयोगकर्ता के रूप में पूर्ण मनमाना कोड निष्पादन, केवल एक नोट खोलने से ट्रिगर होता है — कोई क्लिक नहीं, कोई स्पष्ट "run script" क्रिया नहीं, कोई डायलॉग नहीं। टीम/साझा-वॉल्ट वर्कफ़्लो (Obsidian Sync, Git-बैक्ड वॉल्ट, Syncthing, Google Drive, आदि) में, कोई भी योगदानकर्ता जो किसी नोट के frontmatter को संपादित कर सकता है, हर उस अन्य सहयोगी पर RCE प्राप्त कर सकता है जिसके पास Note Toolbar की Scripting सेटिंग सक्षम है और कोई भी टूलबार आइटम जो नोट प्रॉपर्टी प्रदर्शित करता है।

कमज़ोरियाँ (CWE)

  • CWE-94: कोड के जनरेशन का अनुचित नियंत्रण ('Code Injection') — अविश्वसनीय frontmatter डेटा को एक स्ट्रिंग में संयोजित किया जाता है जिसे बाद में निष्पादन योग्य स्क्रिप्ट निर्देश के रूप में व्याख्यायित किया जाता है।
  • CWE-1336: टेम्पलेट इंजन में प्रयुक्त विशेष तत्वों का अनुचित न्यूट्रलाइज़ेशन — {{...}} टेम्पलेट/वेरिएबल सिंटैक्स हमलावर-नियंत्रित प्रतिस्थापन मानों को न्यूट्रलाइज़ नहीं करता जिनमें स्वयं आगे के टेम्पलेट निर्देश होते हैं।

उपचार

VariableResolver.replaceVars() में, स्क्रिप्टिंग-प्रीफ़िक्स जाँचें ({{js:, {{dv:, {{jse:, <%/{{tp:) को मूल, प्रतिस्थापन-पूर्व स्ट्रिंग के विरुद्ध मूल्यांकित किया जाना चाहिए, न कि {{prop_*}}/{{note_title}}/आदि प्रतिस्थापन चलने के बाद की स्ट्रिंग के विरुद्ध — यानी पहले से निर्धारित करें कि टूलबार आइटम स्वयं स्क्रिप्ट निर्देश के रूप में लिखा गया था या नहीं, और कभी भी किसी प्रतिस्थापित frontmatter मान को उस रूप में पुनः-व्याख्यायित न होने दें। ठोस रूप से: PROP/SELECTION/NOTE_TITLE/आदि प्रतिस्थापन ब्लॉक से पहले hasVars-शैली स्क्रिप्टिंग-प्रीफ़िक्स जाँच करें, और प्रतिस्थापन के बाद स्ट्रिंग पर startsWith('{{js:'/'{{dv:'/...) की पुनः-जाँच छोड़ दें। गहराई में रक्षा के रूप में, frontmatter से आने वाले मानों को भी एस्केप/न्यूट्रलाइज़ किया जा सकता है ताकि वे कभी {{...}} व्याकरण में पुनः प्रवेश न कर सकें।

श्रेय

Dostxodjayev Abdullox

रिपोर्टिंग चैनल

इस रिपॉज़िटरी का SECURITY.md पुष्टि करता है कि GitHub निजी कमज़ोरी रिपोर्टिंग सक्षम है और यह पसंदीदा चैनल है ("GitHub private vulnerability reporting: use the 'Report a vulnerability' button under the Security tab of this repo"), GitHub खाते के बिना रिपोर्टरों के लिए Google Form फ़ॉलबैक के साथ। स्वतंत्र रूप से पुनः-सत्यापित: gh api repos/chrisgurney/obsidian-note-toolbar/private-vulnerability-reporting --jq .enabled → true, और gh api repos/chrisgurney/obsidian-note-toolbar/security-advisories --jq 'length' → 0 (कोई पूर्व सलाह नहीं, कोई डुप्लिकेट-जोखिम नहीं)।

टूल डाउनलोड करें