[LyX/2.5.x] Hardening case 00c - arbitrary command execution via graphics filename extension

Richard Kimberly Heck <[email protected]>
Newsgroups gmane.editors.lyx.cvs
Message-ID <[email protected]>
commit 2a8d12ac5478f060836af4e7a866ae32d6b86d92
Author: Pavel Sanda <[email protected]>
Date:   Mon Jun 8 15:43:34 2026 +0200

    Hardening case 00c - arbitrary command execution via graphics filename extension
    
    build_script() in GraphicsConverter takes the extension from the user-supplied
    graphics filename and embeds it in temp paths interpolated into an os.system()
    call in the generated Python conversion script. A hostile extension carrying
    shell metacharacters injects arbitrary commands.
    
    Fires on .lyx load (the referenced graphics file must exist on disk).
    
    Tier 00 hotfix: strip everything but [A-Za-z0-9_-] from the extension.
    Tier 01 DiD will land in master (argv-form Python).
    
    Assisted-by: Claude Opus 4.7
---
 src/graphics/GraphicsConverter.cpp | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/src/graphics/GraphicsConverter.cpp b/src/graphics/GraphicsConverter.cpp
index 0436f4c634..47c1445a0d 100644
--- a/src/graphics/GraphicsConverter.cpp
+++ b/src/graphics/GraphicsConverter.cpp
@@ -25,6 +25,8 @@
 #include "support/TempFile.h"
 
 #include <sstream>
+#include <algorithm>
+#include <cctype>
 #include <fstream>
 
 using namespace std;
@@ -301,7 +303,12 @@ static void build_script(string const & doc_fname,
 		theConverters().getPath(from_format, to_format);
 
 	// Create a temporary base file-name for all intermediate steps.
-	string const from_ext = getExtension(from_file);
+	// The extension string is user-controlled. Avoid metacharacters
+	// to prevent havoc down the pipeline.
+	string from_ext = getExtension(from_file);
+	from_ext.erase(remove_if(from_ext.begin(), from_ext.end(),
+		[](unsigned char c){ return !(isalnum(c) || c == '_' || c == '-'); }),
+		from_ext.end());
 	TempFile tempfile(addExtension("gconvertXXXXXX", from_ext));
 	tempfile.setAutoRemove(false);
 	string outfile = tempfile.name().toFilesystemEncoding();
-- 
lyx-cvs mailing list
[email protected]
https://lists.lyx.org/mailman/listinfo/lyx-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.