From 93e7d6bdbf366180bf402591b0feab72b2f568e3 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Tue, 2 Jan 2024 06:11:03 -0500 Subject: [PATCH 1/3] Prevent arbitrary file writes with malicious resource names. (#3484) * refactor: rename sanitize function * fix: expose getDir * fix: safe handling of untrusted resource names - fixes: GHSA-2hqv-2xv4-5h5w * test: sample file for GHSA-2hqv-2xv4-5h5w * refactor: avoid detection of absolute files for resource check * chore: enable info mode on gradle * test: skip test on windows * chore: debug windows handling * fix: normalize entry with file separators * fix: normalize filepath after cleansing * chore: Android paths are not OS specific * refactor: use java.nio for path traversal checking * chore: align path separator on Windows for Zip files * chore: rework towards basic directory traversal * chore: remove '--info' on build.yml --- .../main/java/brut/androlib/ApkBuilder.java | 2 +- .../brut/androlib/res/ResourcesDecoder.java | 10 +-- .../androlib/res/decoder/ResFileDecoder.java | 10 ++- .../ResourceDirectoryTraversalTest.java | 65 ++++++++++++++++++ .../util/UnknownDirectoryTraversalTest.java | 12 ++-- .../arbitrary-write/GHSA-2hqv-2xv4-5h5w.apk | Bin 0 -> 50799 bytes .../src/main/java/brut/directory/DirUtil.java | 2 +- .../java/brut/directory/FileDirectory.java | 2 +- .../main/java/brut/directory/ZipUtils.java | 4 +- .../src/main/java/brut/util/BrutIO.java | 13 +++- 10 files changed, 100 insertions(+), 20 deletions(-) create mode 100644 brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceDirectoryTraversalTest.java create mode 100644 brut.apktool/apktool-lib/src/test/resources/decode/arbitrary-write/GHSA-2hqv-2xv4-5h5w.apk diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkBuilder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkBuilder.java index 39eecdb6..34febb7f 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkBuilder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/ApkBuilder.java @@ -482,7 +482,7 @@ public class ApkBuilder { File inputFile; try { - inputFile = new File(unknownFileDir, BrutIO.sanitizeUnknownFile(unknownFileDir, unknownFileInfo.getKey())); + inputFile = new File(unknownFileDir, BrutIO.sanitizeFilepath(unknownFileDir, unknownFileInfo.getKey())); } catch (RootUnknownFileException | InvalidUnknownFileException | TraversalUnknownFileException exception) { LOGGER.warning(String.format("Skipping file %s (%s)", unknownFileInfo.getKey(), exception.getMessage())); continue; diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/ResourcesDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/ResourcesDecoder.java index a9507b6b..7ee7f77e 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/ResourcesDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/ResourcesDecoder.java @@ -154,12 +154,12 @@ public class ResourcesDecoder { decoders.setDecoder("xml", new XmlPullStreamDecoder(axmlParser, getResXmlSerializer())); ResFileDecoder fileDecoder = new ResFileDecoder(decoders); - Directory in, out; + Directory in, out, outRes; try { out = new FileDirectory(outDir); in = mApkInfo.getApkFile().getDirectory(); - out = out.createDir("res"); + outRes = out.createDir("res"); } catch (DirectoryException ex) { throw new AndrolibException(ex); } @@ -169,14 +169,14 @@ public class ResourcesDecoder { LOGGER.info("Decoding file-resources..."); for (ResResource res : pkg.listFiles()) { - fileDecoder.decode(res, in, out, mResFileMapping); + fileDecoder.decode(res, in, outRes, mResFileMapping); } LOGGER.info("Decoding values */* XMLs..."); for (ResValuesFile valuesFile : pkg.listValuesFiles()) { - generateValuesFile(valuesFile, out, xmlSerializer); + generateValuesFile(valuesFile, outRes, xmlSerializer); } - generatePublicXml(pkg, out, xmlSerializer); + generatePublicXml(pkg, outRes, xmlSerializer); } AndrolibException decodeError = axmlParser.getFirstError(); diff --git a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java index 9bab7c98..979d89a8 100644 --- a/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java +++ b/brut.apktool/apktool-lib/src/main/java/brut/androlib/res/decoder/ResFileDecoder.java @@ -25,6 +25,7 @@ import brut.androlib.res.data.value.ResFileValue; import brut.directory.DirUtil; import brut.directory.Directory; import brut.directory.DirectoryException; +import brut.util.BrutIO; import java.io.*; import java.util.Map; @@ -44,8 +45,15 @@ public class ResFileDecoder { ResFileValue fileValue = (ResFileValue) res.getValue(); String inFilePath = fileValue.toString(); String inFileName = fileValue.getStrippedPath(); - String outResName = res.getFilePath(); String typeName = res.getResSpec().getType().getName(); + String outResName = res.getFilePath(); + + if (BrutIO.detectPossibleDirectoryTraversal(outResName)) { + outResName = inFileName; + LOGGER.warning(String.format( + "Potentially malicious file path: %s, using instead %s", res.getFilePath(), outResName + )); + } String ext = null; String outFileName; diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceDirectoryTraversalTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceDirectoryTraversalTest.java new file mode 100644 index 00000000..7d308db5 --- /dev/null +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/decode/ResourceDirectoryTraversalTest.java @@ -0,0 +1,65 @@ +/* + * Copyright (C) 2010 Ryszard Wiśniewski + * Copyright (C) 2010 Connor Tumbleson + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package brut.androlib.decode; + +import brut.androlib.ApkDecoder; +import brut.androlib.BaseTest; +import brut.androlib.Config; +import brut.androlib.TestUtils; +import brut.common.BrutException; +import brut.directory.ExtFile; +import brut.util.OS; +import brut.util.OSDetection; +import org.junit.AfterClass; +import org.junit.Assume; +import org.junit.BeforeClass; +import org.junit.Test; + +import java.io.File; +import java.io.IOException; + +import static org.junit.Assert.assertTrue; + +public class ResourceDirectoryTraversalTest extends BaseTest { + + @BeforeClass + public static void beforeClass() throws Exception { + TestUtils.cleanFrameworkFile(); + sTmpDir = new ExtFile(OS.createTempDirectory()); + TestUtils.copyResourceDir(ResourceDirectoryTraversalTest.class, "decode/arbitrary-write/", sTmpDir); + Assume.assumeFalse(OSDetection.isWindows()); + } + + @AfterClass + public static void afterClass() throws BrutException { + OS.rmdir(sTmpDir); + } + + @Test + public void checkIfMaliciousRawFileIsDisassembledProperly() throws BrutException, IOException { + String apk = "GHSA-2hqv-2xv4-5h5w.apk"; + + Config config = Config.getDefaultConfig(); + config.forceDelete = true; + ApkDecoder apkDecoder = new ApkDecoder(config, new File(sTmpDir + File.separator + apk)); + File outDir = new File(sTmpDir + File.separator + apk + ".out"); + apkDecoder.decode(outDir); + + File pocTestFile = new File(outDir,"res/raw/poc"); + assertTrue(pocTestFile.exists()); + } +} diff --git a/brut.apktool/apktool-lib/src/test/java/brut/androlib/util/UnknownDirectoryTraversalTest.java b/brut.apktool/apktool-lib/src/test/java/brut/androlib/util/UnknownDirectoryTraversalTest.java index ad22e9d0..269b3fc0 100644 --- a/brut.apktool/apktool-lib/src/test/java/brut/androlib/util/UnknownDirectoryTraversalTest.java +++ b/brut.apktool/apktool-lib/src/test/java/brut/androlib/util/UnknownDirectoryTraversalTest.java @@ -51,7 +51,7 @@ public class UnknownDirectoryTraversalTest extends BaseTest { @Test public void validFileTest() throws IOException, BrutException { - String validFilename = BrutIO.sanitizeUnknownFile(sTmpDir, "file"); + String validFilename = BrutIO.sanitizeFilepath(sTmpDir, "file"); assertEquals(validFilename, "file"); File validFile = new File(sTmpDir, validFilename); @@ -60,18 +60,18 @@ public class UnknownDirectoryTraversalTest extends BaseTest { @Test(expected = TraversalUnknownFileException.class) public void invalidBackwardFileTest() throws IOException, BrutException { - BrutIO.sanitizeUnknownFile(sTmpDir, "../file"); + BrutIO.sanitizeFilepath(sTmpDir, "../file"); } @Test(expected = RootUnknownFileException.class) public void invalidRootFileTest() throws IOException, BrutException { String rootLocation = OSDetection.isWindows() ? "C:/" : File.separator; - BrutIO.sanitizeUnknownFile(sTmpDir, rootLocation + "file"); + BrutIO.sanitizeFilepath(sTmpDir, rootLocation + "file"); } @Test(expected = InvalidUnknownFileException.class) public void noFilePassedTest() throws IOException, BrutException { - BrutIO.sanitizeUnknownFile(sTmpDir, ""); + BrutIO.sanitizeFilepath(sTmpDir, ""); } @Test(expected = TraversalUnknownFileException.class) @@ -83,12 +83,12 @@ public class UnknownDirectoryTraversalTest extends BaseTest { invalidPath = "..\\..\\app.exe"; } - BrutIO.sanitizeUnknownFile(sTmpDir, invalidPath); + BrutIO.sanitizeFilepath(sTmpDir, invalidPath); } @Test public void validDirectoryFileTest() throws IOException, BrutException { - String validFilename = BrutIO.sanitizeUnknownFile(sTmpDir, "dir" + File.separator + "file"); + String validFilename = BrutIO.sanitizeFilepath(sTmpDir, "dir" + File.separator + "file"); assertEquals("dir" + File.separator + "file", validFilename); } } diff --git a/brut.apktool/apktool-lib/src/test/resources/decode/arbitrary-write/GHSA-2hqv-2xv4-5h5w.apk b/brut.apktool/apktool-lib/src/test/resources/decode/arbitrary-write/GHSA-2hqv-2xv4-5h5w.apk new file mode 100644 index 0000000000000000000000000000000000000000..cc177ce33c28626331f17297a20b6ed35bad93c4 GIT binary patch literal 50799 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 Date: Wed, 6 Dec 2023 06:46:56 -0500 Subject: [PATCH 2/3] build: start new dev cycle (2.9.2-SNAPSHOT) --- build.gradle.kts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 806a9be3..7984dec1 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import java.io.ByteArrayOutputStream -val version = "2.9.1" -val suffix = "" +val version = "2.9.2" +val suffix = "SNAPSHOT" // Strings embedded into the build. var gitRevision by extra("") From 841db5061afdb50c010bb79240bfe67c567873b6 Mon Sep 17 00:00:00 2001 From: Connor Tumbleson Date: Fri, 5 Jan 2024 06:29:04 -0500 Subject: [PATCH 3/3] build: version bump (2.9.2) --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index 7984dec1..297463b2 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,7 @@ import java.io.ByteArrayOutputStream val version = "2.9.2" -val suffix = "SNAPSHOT" +val suffix = "" // Strings embedded into the build. var gitRevision by extra("")