This is an automated email from the ASF dual-hosted git repository. jleroux pushed a commit to branch release22.01 in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
commit 8c2d759847a7b22cb355a2621eb520d043591e4f Author: Jacques Le Roux <jacques.le.r...@les7arts.com> AuthorDate: Fri Feb 4 04:30:13 2022 +0100 Fixed: Remote Code Execution (File Upload) Vulnerability (OFBIZ-11948) Lion Tree <liontree0...@gmail.com> has reported us that "CVE-2020-1938 is not fully fixed". Though it was fixed by OFBIZ-11407, it still possible for an authenticated user to upload a webshell included in an image using one of the upload possibilities in OFBiz. That is not new and covered by OFBIZ-12080 "Secure the uploads", but was still incomplete. This enforces the secured uploads by * checking in SecuredUpload::isValidImageFile that a webshell is not embedded in an image. * Keeping only "<%" as a denied token for JSP webshells, instead of currently "<%@ page" * Adds "application/text/x-ruby" to SecuredUpload::isExecutable Also * Adds "<jsp", and "<?" for PHP. Even if OFBiz does not use PHP at all, it's often installed on servers. * Removes "import=\"java" and "runtime.getruntime().exec(". They are no longer useful since "<%" and "<jsp" block them. * Remove php token since I'll put "<?" in. * Adds "#!", rather than adding other shebangs like perl,python and ruby This will make deniedWebShellTokens more understandable. But I'm conscious that despite SecuredUpload::isExecutableI I still need to better handle encoded webshells. I'll do that soon in a second approach. I'll also certainly more prune PHP related tokens. Thanks: Lion Tree for report --- framework/security/config/security.properties | 6 +++--- .../src/main/java/org/apache/ofbiz/security/SecuredUpload.java | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/framework/security/config/security.properties b/framework/security/config/security.properties index 5816f0c..9eccffb 100644 --- a/framework/security/config/security.properties +++ b/framework/security/config/security.properties @@ -238,9 +238,9 @@ allowAllUploads= #-- eg: https://www.acunetix.com/blog/articles/detection-prevention-introduction-web-shells-part-5/ #-- "freemarker" should be OK, should not be used in Freemarker templates, not part of the syntax. #-- Else "template.utility.Execute" is a good replacement but not as much catching, who knows... -deniedWebShellTokens=freemarker,import=\"java,runtime.getruntime().exec(,<%@ page,<script,<body>,<form,php,\ - javascript,%eval,@eval,import os,passthru,exec,shell_exec,assert,str_rot13,system,phpinfo,base64_decode,chmod,mkdir,\ - fopen,fclose,new file,import,upload,getfilename,download,getoutputstring,readfile +deniedWebShellTokens=<%,<jsp:,<?,#!,freemarker,<script,javascript,%eval,@eval,<body>,<form,\ + import os,passthru,exec,shell_exec,assert,str_rot13,system,base64_decode,chmod,mkdir,\ + fopen,fclose,new file,import,upload,getfilename,download,getoutputstring,readfile #-- Popup last-visited time from database after user has logged in. #-- So users can know of any unauthorised access to their accounts. diff --git a/framework/security/src/main/java/org/apache/ofbiz/security/SecuredUpload.java b/framework/security/src/main/java/org/apache/ofbiz/security/SecuredUpload.java index 038733d..0f09496 100644 --- a/framework/security/src/main/java/org/apache/ofbiz/security/SecuredUpload.java +++ b/framework/security/src/main/java/org/apache/ofbiz/security/SecuredUpload.java @@ -244,7 +244,8 @@ public class SecuredUpload { || imageFormat.equals(ImageFormats.GIF) || imageFormat.equals(ImageFormats.TIFF) || imageFormat.equals(ImageFormats.JPEG)) - && imageMadeSafe(fileName); + && imageMadeSafe(fileName) + && isValidTextFile(fileName); } /** @@ -418,6 +419,7 @@ public class SecuredUpload { if ("application/x-elf".equals(mimeType) || "application/x-sh".equals(mimeType) || "application/text/x-perl".equals(mimeType) + || "application/text/x-ruby".equals(mimeType) || "application/text/x-python".equals(mimeType)) { Debug.logError("The file" + fileName + " is a Linux executable, for security reason it's not accepted :", MODULE); return true;