
MCP ffmpeg हेल्पर में OS कमांड इंजेक्शन के लिए एडवाइज़री और प्रूफ-ऑफ-कॉन्सेप्ट, जिसमें रूट-कॉज़ विश्लेषण, डिटेक्टर मार्गदर्शन और एक अनफिक्स्ड npm पैकेज के लिए शमन उपाय शामिल हैं।
runFFmpegCommand MCP टूल पैरामीटर से बनी एक स्ट्रिंग को
spawn(…, { shell: true }) में पास करता है, इसलिए options, format,
codec, pixelFormat या extraOptions में मौजूद शेल मेटाकैरेक्टर सर्वर चलाने वाले होस्ट पर निष्पादित होते हैं।
⚠ कोई फ़िक्स्ड वर्ज़न मौजूद नहीं है
2026-08-22 तक नवीनतम npm रिलीज़ 0.2.1 है, जो प्रभावित वर्ज़न है, और सिंक अभी भी रिपॉज़िटरी की डिफ़ॉल्ट ब्रांच पर मौजूद है। अपग्रेड करने के लिए कुछ नहीं है। इस बीच उपयोगकर्ता क्या कर सकते हैं, यह जानने के लिए Mitigation देखें।
| CVE | CVE-2026-52617 |
| CWE | CWE-78 (OS कमांड में उपयोग किए जाने वाले विशेष तत्वों का अनुचित निष्प्रभावीकरण) |
| पैकेज | @sworddut/mcp-ffmpeg-helper (npm) |
| प्रभावित | 0.2.1 और पहले — सभी प्रकाशित वर्ज़न |
| फ़िक्स्ड इन | कोई नहीं |
| CVSS v3.1 | AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H = 8.4 High (stdio ट्रांसपोर्ट)। यदि सर्वर को नेटवर्क ट्रांसपोर्ट में लपेटा जाए तो AV:N → 9.8 Critical। |
| रिपोर्ट किया गया | s1ko (github.com/s1ko, [email protected]) |
| CVE आवंटित | 2026-07-13, MITRE CNA-LR |
MCP टूल आर्ग्युमेंट्स हमलावर से प्रभावित होते हैं। ये एक LLM द्वारा उस
सामग्री से उत्पन्न होते हैं जिसे एजेंट प्रोसेस करता है — दस्तावेज़, वेब पेज, टूल आउटपुट — इसलिए
अप्रत्यक्ष प्रॉम्प्ट इंजेक्शन हमलावर को उन मानों पर नियंत्रण देता है जो एक टूल
हैंडलर प्राप्त करता है। कोई भी हैंडलर जो उन मानों में से किसी को शेल में फ़ीड करता है, उस प्रभाव को
MCP सर्वर चलाने वाले होस्ट पर कोड निष्पादन में बदल देता है। यह
पूर्ववर्ती मामले aws-mcp-server / CVE-2026-5058 के समान मॉडल है।
मीडिया-कन्वर्ज़न सर्वर इसके लिए विशेष रूप से स्वाभाविक लक्ष्य है: जिन फ़ाइलों को इसे प्रोसेस करने के लिए कहा जाता है, वे ठीक वही अविश्वसनीय सामग्री हैं जो एक एजेंट कहीं और से उठाता है।
src/utils/ffmpeg.ts — कमांड को एक स्ट्रिंग के रूप में जोड़ा जाता है और शेल
स्पष्ट रूप से सक्षम किया जाता है:
function runProcess(command: string, args: string[], useShell = false) {
const child = spawn(command, args, { shell: useShell, windowsHide: true });
…
}
export async function runFFmpegCommand(command: string): Promise<string> {
const { stdout, stderr, code } = await runProcess(`ffmpeg ${command}`, [], true);
…
}
spawn("ffmpeg " + command, [], { shell: true }) पूरी स्ट्रिंग को
/bin/sh -c के माध्यम से चलाता है। कॉलर ने command में जो कुछ भी योगदान दिया है, वह सब शेल सिंटैक्स है।
src/tools/handlers.ts तीन टूल्स से उस हेल्पर तक पहुँचता है, ऐसे पैरामीटर इंटरपोलेट करते हुए जिनकी सामग्री के लिए कभी सत्यापन नहीं किया जाता:
| टूल | इंजेक्टेबल पैरामीटर |
|---|---|
convert_video | options |
extract_audio | format |
create_video_from_images | codec, pixelFormat, extraOptions |
केवल inputPath और outputPath की ही बिल्कुल जाँच की जाती है, और Zod स्कीमा केवल टाइप (z.string()) का सत्यापन करते हैं, सामग्री का कभी नहीं — इसलिए मेटाकैरेक्टर सीधे पार हो जाते हैं।
options को ; touch /tmp/marker ; पर सेट करके किया गया convert_video कॉल यह उत्पन्न करता है:
/bin/sh -c "ffmpeg -i /tmp/in.mp4 ; touch /tmp/marker ; /tmp/out.mp4"
poc/driver.mjs stdio के माध्यम से MCP से बात करता है: यह सर्वर को प्रारंभ करता है, इंजेक्ट किए गए options मान के साथ convert_video के लिए एक tools/call जारी करता है, और एक मार्कर फ़ाइल की जाँच करता है। पेलोड एक सौम्य touch है।
npm pack @sworddut/[email protected]
tar xf sworddut-mcp-ffmpeg-helper-0.2.1.tgz && cd package && npm install
node ../poc/driver.mjs
प्रभावित संस्करण पर अपेक्षित:
==== POC RESULT (@sworddut/mcp-ffmpeg-helper) ====
marker /tmp/PWNED_ffmpeg created: true
verdict: CONFIRMED — command injection executed
ffmpeg को इंस्टॉल करने की आवश्यकता नहीं है — इंजेक्ट किया गया कमांड उसी
/bin/sh -c स्ट्रिंग में चलता है, चाहे अग्रणी बाइनरी रिज़ॉल्व हो या न हो।
2026-06-01 को एक पृथक कंटेनर में सत्यापित, 2026-06-13 को पुनः सत्यापित, और
2026-08-22 को डिफ़ॉल्ट ब्रांच पर सिंक की पुनः पुष्टि की गई। इसे केवल उसी
इन्फ्रास्ट्रक्चर के विरुद्ध चलाएँ जिसका परीक्षण करने के लिए आप अधिकृत हैं।
ffmpeg कमांड लाइन जिसमें ;, &&, ||, |, बैकटिक या $( हो।
इस सर्वर से वैध ffmpeg इनवोकेशन में ये नहीं होते।sh -c प्रोसेस जिसकी कमांड लाइन ffmpeg से शुरू होती है और किसी
विभाजक के बाद दूसरा कमांड होता है — यह एक प्रोसेस-ट्री सिग्नल (auditd, eBPF,
Falco, EDR) है जो एप्लिकेशन लॉगिंग पर निर्भर नहीं करता।ffmpeg और ffprobe अपेक्षित
हैं; कोई शेल, इंटरप्रेटर या नेटवर्क क्लाइंट नहीं।Running FFmpeg command: ffmpeg <command> के रूप में लॉग करता है, जो कि
इंजेक्ट किया गया मान पहचानने की सबसे सस्ती जगह है यदि लॉग संग्रहित किए जाते हों।options, format, codec, pixelFormat या
extraOptions में शेल मेटाकैरेक्टर होते हैं।MITRE ATT&CK T1059.004 Command and Scripting Interpreter: Unix Shell।
कोई पैच किया गया रिलीज़ मौजूद नहीं है, इसलिए विकल्प कंटेनमेंट और हटाना हैं:
runFFmpegCommand तक पहुँचने से पहले अस्वीकार कर दिए जाएँ।अपस्ट्रीम फ़िक्स यह है कि shell: true हटा दिया जाए और ffmpeg को एक
आर्ग्युमेंट वेक्टर पास किया जाए — spawn("ffmpeg", ["-i", inputPath, …]) —
उस ऐरे को फ्री-फ़ॉर्म स्ट्रिंग्स के बजाय अनुमत-सूचीबद्ध format, codec और
pixelFormat मानों से बनाकर। सामग्री सत्यापन, केवल Zod प्रकार सत्यापन नहीं,
अंतर्निहित आवश्यकता है।
NIST SP 800-53r5 SI-10; OWASP ASVS v4 §5.3.8; CWE-78 शमन M1 और M2।
| तिथि | घटना |
|---|---|
| 2026-05-29 | प्रकाशित tarball की स्रोत समीक्षा द्वारा भेद्यता की पहचान |
| 2026-06-01 | एक पृथक कंटेनर में MCP stdio पर गतिशील रूप से सत्यापित |
| 2026-06-13 | दूसरे होस्ट पर पुनः सत्यापित; रिपॉज़िटरी में Private Vulnerability Reporting सक्षम नहीं है, और package.json के repository/bugs/homepage फ़ील्ड github.com/yourusername टेम्पलेट पर छोड़े गए हैं, जिससे कोई प्रलेखित सुरक्षा संपर्क नहीं है |
| 2026-07-13 | MITRE CNA-LR द्वारा CVE-2026-52617 आवंटित, s1ko को खोजकर्ता के रूप में श्रेय |
| 2026-08-22 | डिफ़ॉल्ट ब्रांच पर सिंक की पुनः पुष्टि; npm latest अभी भी 0.2.1; यह लेख प्रकाशित |
aws-mcp-server)उसी शोध दौर से सहयोगी एडवाइज़री: CVE-2026-52616, CVE-2026-52618।
MIT — देखें LICENSE।