This is an automated email from the ASF dual-hosted git repository. xxyu pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/kylin.git
The following commit(s) were added to refs/heads/main by this push: new 45341307d5 vuln-fix: Temporary File Information Disclosure 45341307d5 is described below commit 45341307d573c181fa343a34e95fc76b89a5e0ba Author: Jonathan Leitschuh <jonathan.leitsc...@gmail.com> AuthorDate: Fri Nov 18 22:53:02 2022 +0000 vuln-fix: Temporary File Information Disclosure This fixes temporary file information disclosure vulnerability due to the use of the vulnerable `File.createTempFile()` method. The vulnerability is fixed by using the `Files.createTempFile()` method which sets the correct posix permissions. Weakness: CWE-377: Insecure Temporary File Severity: Medium CVSSS: 5.5 Detection: CodeQL & OpenRewrite (https://public.moderne.io/recipes/org.openrewrite.java.security.SecureTempFileCreation) Reported-by: Jonathan Leitschuh <jonathan.leitsc...@gmail.com> Signed-off-by: Jonathan Leitschuh <jonathan.leitsc...@gmail.com> Bug-tracker: https://github.com/JLLeitschuh/security-research/issues/18 Co-authored-by: Moderne <t...@moderne.io> --- .../java/org/apache/kylin/engine/mr/common/AbstractHadoopJob.java | 3 ++- .../main/java/org/apache/kylin/engine/mr/common/CubeStatsReader.java | 3 ++- .../org/apache/kylin/common/persistence/AutoDeleteDirectory.java | 3 ++- .../java/org/apache/kylin/common/persistence/FileResourceStore.java | 3 ++- .../main/java/org/apache/kylin/common/persistence/ResourceStore.java | 3 ++- .../src/test/java/org/apache/kylin/common/util/SSHClientTest.java | 3 ++- .../src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java | 3 ++- .../src/test/java/org/apache/kylin/measure/topn/TopNCounterTest.java | 3 ++- core-metadata/src/test/java/org/apache/kylin/source/H2Database.java | 3 ++- .../org/apache/kylin/engine/spark/job/NSparkMergeStatisticsStep.java | 3 ++- .../src/test/java/org/apache/kylin/engine/spark/NSparkBasicTest.java | 3 ++- .../main/java/org/apache/kylin/query/schema/OLAPSchemaFactory.java | 3 ++- .../java/org/apache/kylin/tool/extractor/AbstractInfoExtractor.java | 3 ++- tool/src/test/java/org/apache/kylin/tool/KylinConfigCLITest.java | 5 +++-- 14 files changed, 29 insertions(+), 15 deletions(-) diff --git a/build-engine/src/main/java/org/apache/kylin/engine/mr/common/AbstractHadoopJob.java b/build-engine/src/main/java/org/apache/kylin/engine/mr/common/AbstractHadoopJob.java index fd4d4133bd..e2f7e0b5f6 100644 --- a/build-engine/src/main/java/org/apache/kylin/engine/mr/common/AbstractHadoopJob.java +++ b/build-engine/src/main/java/org/apache/kylin/engine/mr/common/AbstractHadoopJob.java @@ -29,6 +29,7 @@ import static org.apache.kylin.engine.mr.common.JobRelatedMetaUtil.collectCubeMe import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.util.HashMap; import java.util.LinkedHashSet; import java.util.List; @@ -595,7 +596,7 @@ public abstract class AbstractHadoopJob extends Configured implements Tool { protected void dumpKylinPropsAndMetadata(String prj, Set<String> dumpList, KylinConfig kylinConfig, Configuration conf) throws IOException { - File tmp = File.createTempFile("kylin_job_meta", ""); + File tmp = Files.createTempFile("kylin_job_meta", "").toFile(); FileUtils.forceDelete(tmp); // we need a directory, so delete the file first File metaDir = new File(tmp, "meta"); diff --git a/build-engine/src/main/java/org/apache/kylin/engine/mr/common/CubeStatsReader.java b/build-engine/src/main/java/org/apache/kylin/engine/mr/common/CubeStatsReader.java index 14f0cbf0ae..ae06fa8bd9 100644 --- a/build-engine/src/main/java/org/apache/kylin/engine/mr/common/CubeStatsReader.java +++ b/build-engine/src/main/java/org/apache/kylin/engine/mr/common/CubeStatsReader.java @@ -26,6 +26,7 @@ import java.io.InputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.text.DecimalFormat; import java.text.DecimalFormatSymbols; import java.util.ArrayList; @@ -156,7 +157,7 @@ public class CubeStatsReader { } private File writeTmpSeqFile(InputStream inputStream) throws IOException { - File tempFile = File.createTempFile("kylin_stats_tmp", ".seq"); + File tempFile = Files.createTempFile("kylin_stats_tmp", ".seq").toFile(); FileOutputStream out = null; try { out = new FileOutputStream(tempFile); diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/AutoDeleteDirectory.java b/core-common/src/main/java/org/apache/kylin/common/persistence/AutoDeleteDirectory.java index a496ba8d3f..8ce05f8e95 100644 --- a/core-common/src/main/java/org/apache/kylin/common/persistence/AutoDeleteDirectory.java +++ b/core-common/src/main/java/org/apache/kylin/common/persistence/AutoDeleteDirectory.java @@ -21,6 +21,7 @@ package org.apache.kylin.common.persistence; import java.io.Closeable; import java.io.File; import java.io.IOException; +import java.nio.file.Files; public class AutoDeleteDirectory implements Closeable { @@ -31,7 +32,7 @@ public class AutoDeleteDirectory implements Closeable { } public AutoDeleteDirectory(String prefix, String suffix) { try { - tempFile = File.createTempFile(prefix, suffix); + tempFile = Files.createTempFile(prefix, suffix).toFile(); org.apache.commons.io.FileUtils.forceDelete(tempFile); // we need a directory, so delete the file first tempFile.mkdirs(); } catch (IOException e) { diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java b/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java index 75c625bdd0..8ab9b6a99e 100644 --- a/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java +++ b/core-common/src/main/java/org/apache/kylin/common/persistence/FileResourceStore.java @@ -24,6 +24,7 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Files; import java.util.Collection; import org.apache.commons.io.FileUtils; @@ -130,7 +131,7 @@ public class FileResourceStore extends ResourceStore { if (--failPutResourceCountDown == 0) throw new IOException("for test"); - File tmp = File.createTempFile("kylin-fileresource-", ".tmp"); + File tmp = Files.createTempFile("kylin-fileresource-", ".tmp").toFile(); try { try (FileOutputStream out = new FileOutputStream(tmp); DataOutputStream dout = new DataOutputStream(out)) { diff --git a/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java b/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java index 65d4f59f2d..0a332bb9bb 100644 --- a/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java +++ b/core-common/src/main/java/org/apache/kylin/common/persistence/ResourceStore.java @@ -24,6 +24,7 @@ import java.io.DataOutputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.util.ArrayList; import java.util.Collection; import java.util.LinkedHashMap; @@ -787,7 +788,7 @@ abstract public class ResourceStore { boolean loadContent, Visitor visitor) throws IOException; public static String dumpResources(KylinConfig kylinConfig, Collection<String> dumpList) throws IOException { - File tmp = File.createTempFile("kylin_job_meta", ""); + File tmp = Files.createTempFile("kylin_job_meta", "").toFile(); FileUtils.forceDelete(tmp); // we need a directory, so delete the file first File metaDir = new File(tmp, "meta"); diff --git a/core-common/src/test/java/org/apache/kylin/common/util/SSHClientTest.java b/core-common/src/test/java/org/apache/kylin/common/util/SSHClientTest.java index f93a0e3bfa..4a3d475f48 100644 --- a/core-common/src/test/java/org/apache/kylin/common/util/SSHClientTest.java +++ b/core-common/src/test/java/org/apache/kylin/common/util/SSHClientTest.java @@ -23,6 +23,7 @@ import static org.junit.Assert.assertEquals; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; import org.apache.commons.io.FileUtils; import org.apache.kylin.common.KylinConfig; @@ -81,7 +82,7 @@ public class SSHClientTest extends LocalFileMetadataTestCase { return; SSHClient ssh = new SSHClient(this.hostname, this.port, this.username, this.password); - File tmpFile = File.createTempFile("test_scp", "", new File("/tmp")); + File tmpFile = Files.createTempFile(new File("/tmp").toPath(), "test_scp", "").toFile(); tmpFile.deleteOnExit(); FileUtils.write(tmpFile, "test_scp", Charset.defaultCharset()); ssh.scpFileToRemote(tmpFile.getAbsolutePath(), "/tmp"); diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java b/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java index ff66805e56..aba0d2fc28 100644 --- a/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java +++ b/core-cube/src/main/java/org/apache/kylin/gridtable/GTAggregateScanner.java @@ -30,6 +30,7 @@ import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.nio.ByteBuffer; +import java.nio.file.Files; import java.util.Arrays; import java.util.Comparator; import java.util.Iterator; @@ -666,7 +667,7 @@ public class GTAggregateScanner implements IGTScanner, IGTBypassChecker { DataInputStream dis; public Dump(SortedMap<byte[], MeasureAggregator[]> buffMap, long estMemSize) throws IOException { - this.dumpedFile = File.createTempFile("KYLIN_SPILL_", ".tmp"); + this.dumpedFile = Files.createTempFile("KYLIN_SPILL_", ".tmp").toFile(); this.buffMap = buffMap; this.estMemSize = estMemSize; } diff --git a/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterTest.java b/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterTest.java index 817f27aea4..7247da9540 100644 --- a/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterTest.java +++ b/core-metadata/src/test/java/org/apache/kylin/measure/topn/TopNCounterTest.java @@ -27,6 +27,7 @@ import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.Writer; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; import java.util.Collections; import java.util.Comparator; import java.util.List; @@ -76,7 +77,7 @@ public class TopNCounterTest { ZipfDistribution zipf = new ZipfDistribution(KEY_SPACE, 0.5); int keyIndex; - File tempFile = File.createTempFile("ZipfDistribution", ".txt"); + File tempFile = Files.createTempFile("ZipfDistribution", ".txt").toFile(); if (tempFile.exists()) FileUtils.forceDelete(tempFile); diff --git a/core-metadata/src/test/java/org/apache/kylin/source/H2Database.java b/core-metadata/src/test/java/org/apache/kylin/source/H2Database.java index bec7434d1d..16fd9fa193 100644 --- a/core-metadata/src/test/java/org/apache/kylin/source/H2Database.java +++ b/core-metadata/src/test/java/org/apache/kylin/source/H2Database.java @@ -29,6 +29,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.sql.Connection; import java.sql.SQLException; import java.sql.Statement; @@ -93,7 +94,7 @@ public class H2Database { File tempFile = null; try { - tempFile = File.createTempFile("tmp_h2", ".csv"); + tempFile = Files.createTempFile("tmp_h2", ".csv").toFile(); FileOutputStream tempFileStream = new FileOutputStream(tempFile); String path = path(tableDesc); InputStream csvStream = metaMgr.getStore().getResource(path).content(); diff --git a/kylin-spark-project/kylin-spark-engine/src/main/java/org/apache/kylin/engine/spark/job/NSparkMergeStatisticsStep.java b/kylin-spark-project/kylin-spark-engine/src/main/java/org/apache/kylin/engine/spark/job/NSparkMergeStatisticsStep.java index 1884cd48f2..024cacdd90 100644 --- a/kylin-spark-project/kylin-spark-engine/src/main/java/org/apache/kylin/engine/spark/job/NSparkMergeStatisticsStep.java +++ b/kylin-spark-project/kylin-spark-engine/src/main/java/org/apache/kylin/engine/spark/job/NSparkMergeStatisticsStep.java @@ -52,6 +52,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; +import java.nio.file.Files; import java.util.List; import java.util.Map; @@ -94,7 +95,7 @@ public class NSparkMergeStatisticsStep extends NSparkExecutable { File tempFile = null; FileOutputStream tempFileStream = null; try { - tempFile = File.createTempFile(segmentId, ".seq"); + tempFile = Files.createTempFile(segmentId, ".seq").toFile(); tempFileStream = new FileOutputStream(tempFile); org.apache.commons.io.IOUtils.copy(is, tempFileStream); } finally { diff --git a/kylin-spark-project/kylin-spark-engine/src/test/java/org/apache/kylin/engine/spark/NSparkBasicTest.java b/kylin-spark-project/kylin-spark-engine/src/test/java/org/apache/kylin/engine/spark/NSparkBasicTest.java index c1cf6a4c40..ebfae7a286 100644 --- a/kylin-spark-project/kylin-spark-engine/src/test/java/org/apache/kylin/engine/spark/NSparkBasicTest.java +++ b/kylin-spark-project/kylin-spark-engine/src/test/java/org/apache/kylin/engine/spark/NSparkBasicTest.java @@ -31,6 +31,7 @@ import org.junit.Test; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; import java.util.List; @Ignore("convenient trial tool for dev") @@ -39,7 +40,7 @@ public class NSparkBasicTest extends LocalWithSparkSessionTest { @Test public void testToRdd() throws IOException { final String dataJson = "0,1,2,1000\n0,1,2,1\n3,4,5,2"; - File dataFile = File.createTempFile("tmp", ".csv"); + File dataFile = Files.createTempFile("tmp", ".csv").toFile(); dataFile.deleteOnExit(); FileUtils.writeStringToFile(dataFile, dataJson, Charset.defaultCharset()); diff --git a/query/src/main/java/org/apache/kylin/query/schema/OLAPSchemaFactory.java b/query/src/main/java/org/apache/kylin/query/schema/OLAPSchemaFactory.java index 534b02f5a4..7c1c370890 100644 --- a/query/src/main/java/org/apache/kylin/query/schema/OLAPSchemaFactory.java +++ b/query/src/main/java/org/apache/kylin/query/schema/OLAPSchemaFactory.java @@ -20,6 +20,7 @@ package org.apache.kylin.query.schema; import java.io.File; import java.io.IOException; +import java.nio.file.Files; import java.util.Collection; import java.util.HashMap; import java.util.Locale; @@ -119,7 +120,7 @@ public class OLAPSchemaFactory implements SchemaFactory { String jsonContent = out.toString(); File file = cachedJsons.get(jsonContent); if (file == null) { - file = File.createTempFile("olap_model_", ".json"); + file = Files.createTempFile("olap_model_", ".json").toFile(); file.deleteOnExit(); FileUtils.writeStringToFile(file, jsonContent); diff --git a/tool/src/main/java/org/apache/kylin/tool/extractor/AbstractInfoExtractor.java b/tool/src/main/java/org/apache/kylin/tool/extractor/AbstractInfoExtractor.java index 845a182ab1..3a8025fcf4 100644 --- a/tool/src/main/java/org/apache/kylin/tool/extractor/AbstractInfoExtractor.java +++ b/tool/src/main/java/org/apache/kylin/tool/extractor/AbstractInfoExtractor.java @@ -22,6 +22,7 @@ package org.apache.kylin.tool.extractor; import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.Files; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; @@ -122,7 +123,7 @@ public abstract class AbstractInfoExtractor extends AbstractApplication { // compress to zip package if (shouldCompress) { - File tempZipFile = File.createTempFile(packageType + "_", ".zip"); + File tempZipFile = Files.createTempFile(packageType + "_", ".zip").toFile(); File tempZipDir = new File(exportDest + packageName + "/"); FileUtils.forceMkdir(tempZipDir); for (File file : exportDir.listFiles()) { diff --git a/tool/src/test/java/org/apache/kylin/tool/KylinConfigCLITest.java b/tool/src/test/java/org/apache/kylin/tool/KylinConfigCLITest.java index e28e567cd1..5977fc9478 100644 --- a/tool/src/test/java/org/apache/kylin/tool/KylinConfigCLITest.java +++ b/tool/src/test/java/org/apache/kylin/tool/KylinConfigCLITest.java @@ -25,6 +25,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.nio.charset.Charset; +import java.nio.file.Files; import org.apache.commons.io.FileUtils; import org.apache.kylin.common.util.LocalFileMetadataTestCase; @@ -36,7 +37,7 @@ public class KylinConfigCLITest extends LocalFileMetadataTestCase { @Test public void testGetProperty() throws IOException { PrintStream o = System.out; - File f = File.createTempFile("cfg", ".tmp"); + File f = Files.createTempFile("cfg", ".tmp").toFile(); PrintStream tmpOut = new PrintStream(new FileOutputStream(f), false, "UTF-8"); System.setOut(tmpOut); KylinConfigCLI.main(new String[] { "kylin.storage.url" }); @@ -51,7 +52,7 @@ public class KylinConfigCLITest extends LocalFileMetadataTestCase { @Test public void testGetPrefix() throws IOException { PrintStream o = System.out; - File f = File.createTempFile("cfg", ".tmp"); + File f = Files.createTempFile("cfg", ".tmp").toFile(); PrintStream tmpOut = new PrintStream(new FileOutputStream(f), false, "UTF-8"); System.setOut(tmpOut); KylinConfigCLI.main(new String[] { "kylin.cube.engine." });