Cloudanix VulnDB

CVE-2020-8908

Low · 3.3

CVSS

3.3

EPSS

0.9%

Published

Dec 10, 2020

CISA due date

—

Cloudanix analysis

Schedule a fix SSVC: Track

Some applications may create temporary folders that other users on the same computer can read, potentially exposing sensitive data saved there.

Exploit Available Chainable
Exploitation
Local Privilege
Attacker needs
Local User
Complexity
Low
Impact
Data Exposure
Component
Library
Class
Information Disclosure
Remediation
Upgrade
Effort
Medium
Patch risk
Medium

What it actually does

CVE-2020-8908 is a local information disclosure weakness in Google Guava's com.google.common.io.Files.createTempDir() API. On Unix-like systems, temporary directories created by this API can be world-readable by default, meaning another local user or process on the same machine may be able to list or read files placed in that directory. The flaw does not provide remote code execution, privilege escalation, or direct integrity impact by itself, but it can expose sensitive temporary data such as tokens, intermediate files, uploaded content, serialized objects, logs, or application-generated secrets if an affected application writes them into the insecure directory. The vulnerable API is deprecated in Guava 30.0 and later; safer alternatives include java.nio.file.Files.createTempDirectory(), which creates directories with restrictive permissions, or platform-specific secure cache APIs on Android.

Why it matters to the business

The primary business risk is accidental exposure of sensitive application data to another user or compromised process on the same system. This can matter most on shared servers, build systems, CI/CD runners, multi-user Unix hosts, developer workstations, container hosts with weak isolation, or systems where untrusted local users can execute code. The CVSS and EPSS values indicate relatively low widespread exploitation likelihood compared with remotely exploitable vulnerabilities, and it is not listed in CISA KEV, but exploit code or exploitation techniques are available and the issue has been public for years, so affected legacy dependencies should still be remediated during dependency hygiene and hardening efforts.

How an attack unfolds

An attacker first needs local access to the same operating system instance where an affected Java application runs, either through a legitimate low-privileged account, a compromised service account, a malicious local process, or access to a shared build or runtime host. The attacker identifies that the application uses Guava's Files.createTempDir() and creates temporary directories under a shared location such as /tmp. Because the created directory may be world-readable on Unix-like systems, the attacker monitors temporary directory creation, lists accessible directories, and attempts to read files written there before the application deletes them. If the application stores sensitive data in those temporary files, the attacker can collect credentials, tokens, user content, configuration fragments, or other confidential data. Exploitation is opportunistic and timing-dependent, but straightforward once local access and knowledge of the temporary file location exist.

How to fix it

Upgrade or refactor affected code so it no longer uses com.google.common.io.Files.createTempDir(). For Java 7 and later, migrate to java.nio.file.Files.createTempDirectory(), which creates directories with restrictive permissions such as owner-only access on supported platforms. For Android, use platform-provided APIs such as context.getCacheDir(). If immediate code changes are not possible, configure the Java runtime's java.io.tmpdir property to point to a directory with appropriately restrictive permissions, ensure the parent temporary directory is not shared with untrusted users, and explicitly set permissions to 0700 on created directories before writing sensitive data. Use fixed versions where applicable: quarkusio/quarkus fixed in commit 60a549cadba9f9e10583b4348b5102e8b4087aa7, google/guava fixed in commit fec0dbc4634006a6162cfd4d0d09c962073ddf40, and Debian 9 pidgin fixed in 2.12.0-1+deb9u1. Also ensure transitive dependencies do not reintroduce vulnerable Guava usage.

How to confirm the fix worked

Confirm remediation through both dependency and behavior checks. Use software composition analysis, build manifests, Maven or Gradle dependency trees, SBOMs, and source searches to identify any remaining use of com.google.common.io.Files.createTempDir(). Verify that Guava versions in use are updated and that application code has migrated to java.nio.file.Files.createTempDirectory() or another secure platform API. On Unix-like systems, run the application in a test environment and inspect created temporary directories with ls -ld to confirm permissions are owner-only, typically drwx------ or mode 0700. Validate that java.io.tmpdir, if customized, points to a directory not readable by untrusted users. For packaged products, confirm installed package versions match or exceed the fixed versions provided by the vendor or distribution.

Typical attack path

  1. Obtain local shell, process execution, or another foothold on the same Unix-like host as the affected Java application.
  2. Identify that the target application includes a vulnerable Guava version or calls com.google.common.io.Files.createTempDir().
  3. Monitor shared temporary locations such as /tmp for newly created application temporary directories.
  4. Check directory permissions and identify directories that are world-readable or listable.
  5. Read or copy sensitive files written by the application into the insecure temporary directory before cleanup occurs.
  6. Use the disclosed data for follow-on access, credential theft, session hijacking, or reconnaissance, depending on the data exposed.

How to detect it

There are no universal network indicators or reliable log strings that prove exploitation, because the issue is a local file-permission exposure and successful access may look like ordinary file reads. To assess possible prior exploitation, review host audit logs, EDR telemetry, Linux auditd records, shell history, process execution logs, and file access monitoring for low-privileged users or unexpected processes listing or reading application-created temporary directories. Focus on shared Unix-like systems and time windows when affected applications created temporary files. Look for commands such as ls, find, cat, cp, grep, tar, or rsync accessing application temporary directories under /tmp or the configured java.io.tmpdir path. If auditd or EDR file telemetry is available, correlate directory creation events by Java processes with subsequent read or copy events by unrelated users or processes. Also inspect application logs for temporary file paths, then check whether those paths had world-readable permissions at creation time. Source and dependency scanning can identify exposure, but confirming exploitation generally requires file access telemetry or forensic artifacts showing unauthorized reads.

  • com.google.common.io.Files.createTempDir(
  • com.google.common.io.Files.createTempDir()
  • java.io.tmpdir
  • /tmp/
  • drwxr-xr-x
  • drwxrwxr-x
  • Files.createTempDir
  • java.nio.file.Files.createTempDirectory

What your security team should do

  • Prioritize remediation on shared Unix-like systems, CI/CD runners, developer workstations, bastion hosts, and any application servers where untrusted or lower-privileged local users can execute code.
  • Search source code and dependencies for com.google.common.io.Files.createTempDir() and replace it with java.nio.file.Files.createTempDirectory() or secure platform-specific APIs.
  • Use SCA tooling and SBOM review to identify applications that include vulnerable Guava versions or downstream products known to have been affected.
  • Harden temporary directory configuration by setting java.io.tmpdir to an application-specific directory with 0700 permissions where practical.
  • Avoid writing secrets, credentials, private keys, session tokens, or sensitive user data to temporary directories unless permissions are explicitly controlled and cleanup is reliable.
  • Add regression tests that assert secure permissions on application-created temporary directories.
  • Review local access controls on systems running affected applications, because exploitation requires local access or execution on the same host.
  • Treat any evidence of local reads from application temporary directories as potential data exposure and investigate what data was present during the access window.

The record

A temp directory creation vulnerability exists in all versions of Guava, allowing an attacker with access to the machine to potentially access data in a temporary directory created by the Guava API com.google.common.io.Files.createTempDir(). By default, on unix-like systems, the created directory is world-readable (readable by an attacker with access to the system). The method in question has been marked @Deprecated in versions 30.0 and later and should not be used. For Android developers, we recommend choosing a temporary directory API provided by Android, such as context.getCacheDir(). For other Java developers, we recommend migrating to the Java 7 API java.nio.file.Files.createTempDirectory() which explicitly configures permissions of 700, or configuring the Java runtime's java.io.tmpdir system property to point to a location whose permissions are appropriately configured.

Affected packages

Ecosystem Package Introduced Fixed
Maven com.google.guava:guava 0 32.0.0-android
Chainguard apache-nifi 0 1.26.0-r2
Chainguard apache-nifi 0 2.6.0-r2
Chainguard apache-nifi-compat 0 2.6.0-r2
Chainguard apache-nifi-toolkit 0 2.6.0-r2
Chainguard cassandra-4.0 0 0
Chainguard cassandra-4.0-compat 0 0
Chainguard cassandra-4.0-iamguarded-compat 0 0
Chainguard cassandra-4.1 0 0
Chainguard cassandra-4.1-compat 0 0
Chainguard cassandra-4.1-iamguarded-compat 0 0
Chainguard cassandra-fips-4.0 0 0
Chainguard cassandra-fips-4.0-compat 0 0
Chainguard cassandra-fips-4.1-compat 0 4.1.7-r6
Chainguard cassandra-reaper 0 4.0.1-r1
Chainguard cassandra-reaper-jre-bcfips 0 3.7.1-r1
Chainguard debezium-connector-spanner-3.0 0 3.0.4-r2
Chainguard druid-compat 0 34.0.0-r6
Chainguard elasticsearch-7 0 7.17.14-r2
Chainguard elasticsearch-7 0 0
Chainguard elasticsearch-7-bitnami 0 0
Chainguard elasticsearch-7-iamguarded 0 0
Chainguard flyway 0 11.15.0-r1
Chainguard gradle-8 0 8.2.1-r1
Chainguard grpc-java-fips-1.56.0 0 0
Chainguard grpc-java-fips-1.56.0-m2 0 0
Chainguard hadoop-client-modules 0 3.3.6-r8
Chainguard keycloak 0 0
Chainguard keycloak-bitnami-compat 0 0
Chainguard keycloak-bitnami-fips 0 0
Chainguard keycloak-compat 0 0
Chainguard keycloak-fips 0 0
Chainguard keycloak-fips-bitnami-compat 0 0
Chainguard keycloak-fips-policy-140-2 0 0
Chainguard keycloak-fips-policy-140-3 0 0
Chainguard keycloak-iamguarded-compat 0 0
Chainguard keycloak-iamguarded-fips 0 0
Chainguard maven 0 3.9.3-r1
Chainguard maven-stage0 0 3.9.12-r0
Chainguard spark-3.5 0 3.5.7-r2
Chainguard spark-3.5-scala-2.12-compat 0 3.5.7-r2
Chainguard spark-3.5-scala-2.12-iamguarded-compat 0 3.5.7-r2
Chainguard spark-3.5-scala-2.13-compat 0 3.5.7-r2
Chainguard spark-fips-3.5 0 3.5.4-r17
Chainguard spark-fips-3.5-scala-2.12-compat 0 3.5.4-r17
Chainguard spark-fips-3.5-scala-2.13-compat 0 3.5.4-r17
Chainguard spdx-tools-java 0 1.1.8-r1
Chainguard trino 0 439-r0
Chainguard trino 0 478-r2
Chainguard trino-config 0 439-r0
Chainguard trino-config 0 478-r2
Chainguard trino-oci-entrypoint 0 439-r0
Chainguard trino-oci-entrypoint 0 478-r2
Chainguard trino-plugin-accumulo 0 439-r0
Chainguard trino-plugin-ai-functions 0 478-r2
Chainguard trino-plugin-atop 0 439-r0
Chainguard trino-plugin-bigquery 0 439-r0
Chainguard trino-plugin-bigquery 0 478-r2
Chainguard trino-plugin-blackhole 0 439-r0
Chainguard trino-plugin-blackhole 0 478-r2
Chainguard trino-plugin-cassandra 0 439-r0
Chainguard trino-plugin-cassandra 0 478-r2
Chainguard trino-plugin-clickhouse 0 439-r0
Chainguard trino-plugin-delta-lake 0 439-r0
Chainguard trino-plugin-delta-lake 0 478-r2
Chainguard trino-plugin-druid 0 439-r0
Chainguard trino-plugin-druid 0 478-r2
Chainguard trino-plugin-duckdb 0 478-r2
Chainguard trino-plugin-elasticsearch 0 439-r0
Chainguard trino-plugin-elasticsearch 0 478-r2
Chainguard trino-plugin-example-http 0 439-r0
Chainguard trino-plugin-exasol 0 478-r2
Chainguard trino-plugin-exchange-filesystem 0 439-r0
Chainguard trino-plugin-exchange-filesystem 0 478-r2
Chainguard trino-plugin-exchange-hdfs 0 439-r0
Chainguard trino-plugin-exchange-hdfs 0 478-r2
Chainguard trino-plugin-faker 0 478-r2
Chainguard trino-plugin-functions-python 0 478-r2
Chainguard trino-plugin-geospatial 0 439-r0
Chainguard trino-plugin-geospatial 0 478-r2
Chainguard trino-plugin-google-sheets 0 439-r0
Chainguard trino-plugin-google-sheets 0 478-r2
Chainguard trino-plugin-hive 0 439-r0
Chainguard trino-plugin-hive 0 478-r2
Chainguard trino-plugin-http-event-listener 0 439-r0
Chainguard trino-plugin-http-event-listener 0 478-r2
Chainguard trino-plugin-hudi 0 439-r0
Chainguard trino-plugin-hudi 0 478-r2
Chainguard trino-plugin-iceberg 0 439-r0
Chainguard trino-plugin-iceberg 0 478-r2
Chainguard trino-plugin-ignite 0 439-r0
Chainguard trino-plugin-ignite 0 478-r2
Chainguard trino-plugin-jmx 0 439-r0
Chainguard trino-plugin-jmx 0 478-r2
Chainguard trino-plugin-kafka 0 439-r0
Chainguard trino-plugin-kafka 0 478-r2
Chainguard trino-plugin-kafka-event-listener 0 478-r2
Chainguard trino-plugin-kinesis 0 439-r0
Chainguard trino-plugin-kudu 0 439-r0
Chainguard trino-plugin-lakehouse 0 478-r2
Chainguard trino-plugin-ldap-group-provider 0 478-r2
Chainguard trino-plugin-local-file 0 439-r0
Chainguard trino-plugin-loki 0 478-r2
Chainguard trino-plugin-mariadb 0 439-r0
Chainguard trino-plugin-mariadb 0 478-r2
Chainguard trino-plugin-memory 0 439-r0
Chainguard trino-plugin-memory 0 478-r2
Chainguard trino-plugin-ml 0 439-r0
Chainguard trino-plugin-ml 0 478-r2
Chainguard trino-plugin-mongodb 0 439-r0
Chainguard trino-plugin-mongodb 0 478-r2
Chainguard trino-plugin-mysql 0 439-r0
Chainguard trino-plugin-mysql 0 478-r2
Chainguard trino-plugin-mysql-event-listener 0 439-r0
Chainguard trino-plugin-mysql-event-listener 0 478-r2
Chainguard trino-plugin-opa 0 478-r2
Chainguard trino-plugin-openlineage 0 478-r2
Chainguard trino-plugin-opensearch 0 478-r2
Chainguard trino-plugin-oracle 0 439-r0
Chainguard trino-plugin-oracle 0 478-r2
Chainguard trino-plugin-password-authenticators 0 439-r0
Chainguard trino-plugin-password-authenticators 0 478-r2
Chainguard trino-plugin-pinot 0 439-r0
Chainguard trino-plugin-pinot 0 478-r2
Chainguard trino-plugin-postgresql 0 439-r0
Chainguard trino-plugin-postgresql 0 478-r2
Chainguard trino-plugin-prometheus 0 439-r0
Chainguard trino-plugin-prometheus 0 478-r2
Chainguard trino-plugin-ranger 0 478-r2
Chainguard trino-plugin-raptor-legacy 0 439-r0
Chainguard trino-plugin-redis 0 439-r0
Chainguard trino-plugin-redis 0 478-r2
Chainguard trino-plugin-redshift 0 439-r0
Chainguard trino-plugin-redshift 0 478-r2
Chainguard trino-plugin-resource-group-managers 0 439-r0
Chainguard trino-plugin-resource-group-managers 0 478-r2
Chainguard trino-plugin-session-property-managers 0 439-r0
Chainguard trino-plugin-session-property-managers 0 478-r2
Chainguard trino-plugin-singlestore 0 439-r0
Chainguard trino-plugin-singlestore 0 478-r2
Chainguard trino-plugin-snowflake 0 478-r2
Chainguard trino-plugin-spooling-filesystem 0 478-r2
Chainguard trino-plugin-sqlserver 0 439-r0
Chainguard trino-plugin-sqlserver 0 478-r2
Chainguard trino-plugin-teradata-functions 0 439-r0
Chainguard trino-plugin-teradata-functions 0 478-r2
Chainguard trino-plugin-thrift 0 439-r0
Chainguard trino-plugin-thrift 0 478-r2
Chainguard trino-plugin-tpcds 0 439-r0
Chainguard trino-plugin-tpcds 0 478-r2
Chainguard trino-plugin-tpch 0 439-r0
Chainguard trino-plugin-tpch 0 478-r2
Chainguard trino-plugin-vertica 0 478-r2
Debian:11 guava-libraries 0 No fix
Debian:12 guava-libraries 0 No fix
Debian:13 guava-libraries 0 32.0.1-1
Mageia:7 guava 0 25.0-2.1.mga7
Mageia:9 guava 0 32.0.1-1.mga9
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-cli 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-commons 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-core-client 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-dto 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-hornetq-protocol 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-hqclient-protocol 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-jdbc-store 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-jms-client 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-jms-server 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-journal 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-ra 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-selector 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-server 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-service-extensions 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-activemq-artemis-tools 0 0:2.9.0-9.redhat_00019.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-bouncycastle 0 0:1.68.0-1.redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-bouncycastle-mail 0 0:1.68.0-1.redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-bouncycastle-pkix 0 0:1.68.0-1.redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-bouncycastle-prov 0 0:1.68.0-1.redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-guava 0 0:30.1.0-1.redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-guava-failureaccess 0 0:1.0.1-1.redhat_00002.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-guava-libraries 0 0:30.1.0-1.redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-hal-console 0 0:3.2.13-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-common-api 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-common-impl 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-common-spi 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-core-api 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-core-impl 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-deployers-common 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-jdbc 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-ironjacamar-validator 0 0:1.4.27-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-ejb-client 0 0:4.0.39-1.SP1_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-logmanager 0 0:2.1.18-1.Final_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-remoting 0 0:5.0.20-2.SP1_redhat_00001.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-server-migration 0 0:1.7.2-5.Final_redhat_00006.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-server-migration-cli 0 0:1.7.2-5.Final_redhat_00006.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-server-migration-core 0 0:1.7.2-5.Final_redhat_00006.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-server-migration-eap6.4 0 0:1.7.2-5.Final_redhat_00006.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-server-migration-eap6.4-to-eap7.3 0 0:1.7.2-5.Final_redhat_00006.1.el6eap
Red Hat:jboss_enterprise_application_platform:7.3::el6 eap7-jboss-server-migration-eap7.0 0 0:1.7.2-5.Final_redhat_00006.1.el6eap

Related vulnerabilities