This is an automated email from the ASF dual-hosted git repository. jleroux pushed a commit to branch release18.12 in repository https://gitbox.apache.org/repos/asf/ofbiz-framework.git
The following commit(s) were added to refs/heads/release18.12 by this push: new b159dff Fixed: Secure the uploads (OFBIZ-12080) b159dff is described below commit b159dffb15c36daa2d3d1f3a622734c681a0c21e Author: Jacques Le Roux <jacques.le.r...@les7arts.com> AuthorDate: Mon Dec 14 12:46:32 2020 +0100 Fixed: Secure the uploads (OFBIZ-12080) Prevents too long filenames as recommended by OWASP. Based on https://security.stackexchange.com/questions/46484/denial-of-service-when-uploading-a-file#answer-46495 I decided to not limit sizes of files. Anyway we know it's only post-auth... --- .../org/apache/ofbiz/security/SecuredUpload.java | 56 +++++++++++++--------- 1 file changed, 33 insertions(+), 23 deletions(-) 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 0751067..a8321dc 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 @@ -93,51 +93,61 @@ public class SecuredUpload { private static final String MODULE = SecuredUpload.class.getName(); /** - * @param fileTocheck + * @param fileToCheck * @param fileType * @return true if the file is valid * @throws IOException * @throws ImageReadException */ - public static boolean isValidFile(String fileTocheck, String fileType, Delegator delegator) throws IOException, ImageReadException { + public static boolean isValidFile(String fileToCheck, String fileType, Delegator delegator) throws IOException, ImageReadException { if (("true".equalsIgnoreCase(EntityUtilProperties.getPropertyValue("security", "allowAllUploads", delegator)))) { return true; } - if (isExecutable(fileTocheck)) { + if (org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS) { + if (fileToCheck.length() > 259) { + return false; + } + } else { + if (fileToCheck.length() > 4096) { + return false; + } + } + + if (isExecutable(fileToCheck)) { return false; } switch (fileType) { case "Image": - if (isValidImageFile(fileTocheck)) { + if (isValidImageFile(fileToCheck)) { return true; } break; case "ImageAndSvg": - if (isValidImageIncludingSvgFile(fileTocheck)) { + if (isValidImageIncludingSvgFile(fileToCheck)) { return true; } break; case "PDF": - if (isValidPdfFile(fileTocheck)) { + if (isValidPdfFile(fileToCheck)) { return true; } break; case "Compressed": - if (isValidCompressedFile(fileTocheck, delegator)) { + if (isValidCompressedFile(fileToCheck, delegator)) { return true; } break; case "AllButCompressed": - if (isValidTextFile(fileTocheck) - || isValidImageIncludingSvgFile(fileTocheck) - || isValidPdfFile(fileTocheck)) { + if (isValidTextFile(fileToCheck) + || isValidImageIncludingSvgFile(fileToCheck) + || isValidPdfFile(fileToCheck)) { return true; } break; @@ -146,37 +156,37 @@ public class SecuredUpload { // The philosophy for isValidTextFile() is that // we can't presume of all possible text contents used for attacks with payloads // At least there is an easy way to prevent them in isValidTextFile - if (isValidTextFile(fileTocheck)) { + if (isValidTextFile(fileToCheck)) { return true; } break; case "Audio": - if (isValidAudioFile(fileTocheck)) { + if (isValidAudioFile(fileToCheck)) { return true; } break; case "Video": - if (isValidVideoFile(fileTocheck)) { + if (isValidVideoFile(fileToCheck)) { return true; } break; default: // All - if (isValidTextFile(fileTocheck) - || isValidImageIncludingSvgFile(fileTocheck) - || isValidCompressedFile(fileTocheck, delegator) - || isValidAudioFile(fileTocheck) - || isValidVideoFile(fileTocheck) - || isValidPdfFile(fileTocheck)) { + if (isValidTextFile(fileToCheck) + || isValidImageIncludingSvgFile(fileToCheck) + || isValidCompressedFile(fileToCheck, delegator) + || isValidAudioFile(fileToCheck) + || isValidVideoFile(fileToCheck) + || isValidPdfFile(fileToCheck)) { return true; } break; } - Debug.logError("File :" + fileTocheck + ", can't be uploaded for security reason", MODULE); - File badFile = new File(fileTocheck); + Debug.logError("File :" + fileToCheck + ", can't be uploaded for security reason", MODULE); + File badFile = new File(fileToCheck); if (!badFile.delete()) { - Debug.logError("File :" + fileTocheck + ", couldn't be deleted", MODULE); + Debug.logError("File :" + fileToCheck + ", couldn't be deleted", MODULE); } return false; } @@ -596,7 +606,7 @@ public class SecuredUpload { || content.toLowerCase().contains("fopen") || content.toLowerCase().contains("fclose") || content.toLowerCase().contains("readfile")); - // TODO.... to be continued with known webshell contents... a complete allow list is impossible anyway + // TODO.... to be continued with known webshell contents... a complete allow list is impossible anyway... // eg: https://www.acunetix.com/blog/articles/detection-prevention-introduction-web-shells-part-5/ } }