
MCP ffmpeg हेल्पर में OS कमांड इंजेक्शन के लिए एडवाइज़री और प्रूफ-ऑफ-कॉन्सेप्ट, जिसमें रूट-कॉज़ विश्लेषण, डिटेक्टर मार्गदर्शन और एक अनफिक्स्ड npm पैकेज के लिए शमन उपाय शामिल हैं।
runFFmpegCommand MCP टूल पैरामीटर से निर्मित एक स्ट्रिंग को spawn(…, { shell: true }) को भेजता है, इसलिए options, format, codec, pixelFormat या extraOptions में शेल मेटाकैरेक्टर सर्वर चलाने वाले होस्ट पर निष्पादित हो जाते हैं।
⚠ कोई फिक्स्ड संस्करण मौजूद नहीं है
2026-08-22 तक नवीनतम npm रिलीज़ 0.2.1 है, जो प्रभावित संस्करण है, और सिंक अभी भी रिपॉज़िटरी की डिफ़ॉल्ट ब्रांच पर मौजूद है। अपग्रेड करने के लिए कुछ भी नहीं है। उपयोगकर्ता इस बीच क्या कर सकते हैं, इसके लिए शमन देखें।
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 |
केवल 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, , या में शेल मेटाकैरेक्टर हों।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।
aws-mcp-server)उसी शोध अभियान की संबंधित एडवाइज़रीज़: CVE-2026-52616, CVE-2026-52618।
MIT — LICENSE देखें।
| 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 = 7.8 उच्च (stdio ट्रांसपोर्ट)। AV:N → 9.8 गंभीर यदि सर्वर नेटवर्क ट्रांसपोर्ट में लपेटा गया है। |
| रिपोर्टकर्ता | s1ko (github.com/s1ko, [email protected]) |
| CVE आवंटन | 2026-07-13, MITRE CNA-LR |
options |
extract_audio | format |
create_video_from_images | codec, pixelFormat, extraOptions |
codecpixelFormatextraOptions| दिनांक | घटना |
|---|
| 2026-05-29 | प्रकाशित टारबॉल की सोर्स समीक्षा द्वारा भेद्यता की पहचान की गई |
| 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 नवीनतम अभी भी 0.2.1 है; यह लेख प्रकाशित हुआ |