CVE-2022-3509
High · 7.5CVSS
7.5
EPSS
0.9%
Published
Dec 12, 2022
CISA due date
—
Cloudanix analysis
A bug in a widely used data-handling library lets attackers send specially formatted data that can make affected programs become unresponsive.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Low
- Impact
- Denial Of Service
- Component
- Library
- Class
- Denial of service
- Remediation
- Upgrade
- Effort
- Medium
- Patch risk
- Low
What it actually does
Parsing of specially crafted textformat inputs containing multiple non-repeated embedded messages with repeated or unknown fields triggers repeated mutable-to-immutable conversions in protobuf-java core and lite, producing extended garbage collection pauses that result in denial of service.
Why it matters to the business
Attackers can remotely disrupt availability of any service that parses untrusted protobuf textformat data, causing outages or degraded performance until the process is restarted or the garbage collector recovers.
How an attack unfolds
An attacker sends a crafted textformat payload over the network to any exposed protobuf-java parser; the input triggers repeated object conversions that consume CPU and memory during garbage collection, leading to service unresponsiveness.
How to fix it
Upgrade protocolbuffers/protobuf (GIT) to commit a3888f53317a8018e7a439bac4abeb8f3425d5e9 or later; for Maven/Gradle users, update protobuf-java and protobuf-java-util to 3.21.7, 3.20.3, 3.19.6, or 3.16.3.
How to confirm the fix worked
Confirm the protobuf-java dependency version is at or above one of the fixed releases; re-test parsing of the original malicious textformat payload to verify that excessive GC pauses no longer occur.
Typical attack path
- Identify a network-accessible endpoint that accepts protobuf textformat input
- Craft a message containing multiple non-repeated embedded messages with repeated or unknown fields
- Transmit the payload to the target parser
- Observe prolonged garbage collection pauses that render the service unavailable
How to detect it
Monitor application logs for repeated garbage collection warnings or unusually long GC pause times during protobuf textformat parsing; correlate with inbound requests containing protobuf content-type or textformat payloads.
What your security team should do
- Immediately update all protobuf-java usages to a fixed version
- Add dependency scanning to CI pipelines to block vulnerable protobuf releases
- Review any custom textformat parsers for similar conversion patterns
The record
A parsing issue similar to CVE-2022-3171, but with textformat in protobuf-java core and lite versions prior to 3.21.7, 3.20.3, 3.19.6 and 3.16.3 can lead to a denial of service attack. Inputs containing multiple instances of non-repeated embedded messages with repeated or unknown fields causes objects to be converted back-n-forth between mutable and immutable forms, resulting in potentially long garbage collection pauses. We recommend updating to the versions mentioned above.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| Maven | com.google.protobuf:protobuf-java | 0 | 3.16.3 |
| Maven | com.google.protobuf:protobuf-java | 3.0.0 | 3.16.3 |
| Maven | com.google.protobuf:protobuf-java | 3.17.0 | 3.19.6 |
| Maven | com.google.protobuf:protobuf-java | 3.20.0 | 3.20.3 |
| Maven | com.google.protobuf:protobuf-java | 3.21.0 | 3.21.7 |
| Maven | com.google.protobuf:protobuf-javalite | 0 | 3.16.3 |
| Maven | com.google.protobuf:protobuf-javalite | 3.0.0 | 3.16.3 |
| Maven | com.google.protobuf:protobuf-javalite | 3.17.0 | 3.19.6 |
| Maven | com.google.protobuf:protobuf-javalite | 3.20.0 | 3.20.3 |
| Maven | com.google.protobuf:protobuf-javalite | 3.21.0 | 3.21.7 |
| 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 | dotty | 0 | 3.4.0-r0 |
| Chainguard | druid | 0 | 0 |
| Chainguard | druid-compat | 0 | 0 |
| Chainguard | emsdk | 0 | 5.0.0-r1 |
| Chainguard | hadoop-client-modules | 0 | 3.3.6-r8 |
| 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-3.5.0-compat | 0 | 0 |
| 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 | trino | 0 | 439-r0 |
| Chainguard | trino-config | 0 | 439-r0 |
| Chainguard | trino-oci-entrypoint | 0 | 439-r0 |
| Chainguard | trino-plugin-accumulo | 0 | 439-r0 |
| Chainguard | trino-plugin-ai-functions | 0 | 439-r0 |
| Chainguard | trino-plugin-atop | 0 | 439-r0 |
| Chainguard | trino-plugin-bigquery | 0 | 439-r0 |
| Chainguard | trino-plugin-blackhole | 0 | 439-r0 |
| Chainguard | trino-plugin-cassandra | 0 | 439-r0 |
| Chainguard | trino-plugin-clickhouse | 0 | 439-r0 |
| Chainguard | trino-plugin-delta-lake | 0 | 439-r0 |
| Chainguard | trino-plugin-druid | 0 | 439-r0 |
| Chainguard | trino-plugin-duckdb | 0 | 439-r0 |
| Chainguard | trino-plugin-elasticsearch | 0 | 439-r0 |
| Chainguard | trino-plugin-example-http | 0 | 439-r0 |
| Chainguard | trino-plugin-exasol | 0 | 439-r0 |
| Chainguard | trino-plugin-exchange-filesystem | 0 | 439-r0 |
| Chainguard | trino-plugin-exchange-hdfs | 0 | 439-r0 |
| Chainguard | trino-plugin-faker | 0 | 439-r0 |
| Chainguard | trino-plugin-functions-python | 0 | 439-r0 |
| Chainguard | trino-plugin-geospatial | 0 | 439-r0 |
| Chainguard | trino-plugin-google-sheets | 0 | 439-r0 |
| Chainguard | trino-plugin-hive | 0 | 439-r0 |
| Chainguard | trino-plugin-http-event-listener | 0 | 439-r0 |
| Chainguard | trino-plugin-http-server-event-listener | 0 | 439-r0 |
| Chainguard | trino-plugin-hudi | 0 | 439-r0 |
| Chainguard | trino-plugin-iceberg | 0 | 439-r0 |
| Chainguard | trino-plugin-ignite | 0 | 439-r0 |
| Chainguard | trino-plugin-jmx | 0 | 439-r0 |
| Chainguard | trino-plugin-kafka | 0 | 439-r0 |
| Chainguard | trino-plugin-kafka-event-listener | 0 | 439-r0 |
| Chainguard | trino-plugin-kinesis | 0 | 439-r0 |
| Chainguard | trino-plugin-kudu | 0 | 439-r0 |
| Chainguard | trino-plugin-lakehouse | 0 | 439-r0 |
| Chainguard | trino-plugin-ldap-group-provider | 0 | 439-r0 |
| Chainguard | trino-plugin-local-file | 0 | 439-r0 |
| Chainguard | trino-plugin-loki | 0 | 439-r0 |
| Chainguard | trino-plugin-mariadb | 0 | 439-r0 |
| Chainguard | trino-plugin-memory | 0 | 439-r0 |
| Chainguard | trino-plugin-ml | 0 | 439-r0 |
| Chainguard | trino-plugin-mongodb | 0 | 439-r0 |
| Chainguard | trino-plugin-mysql | 0 | 439-r0 |
| Chainguard | trino-plugin-mysql-event-listener | 0 | 439-r0 |
| Chainguard | trino-plugin-opa | 0 | 439-r0 |
| Chainguard | trino-plugin-openlineage | 0 | 439-r0 |
| Chainguard | trino-plugin-opensearch | 0 | 439-r0 |
| Chainguard | trino-plugin-oracle | 0 | 439-r0 |
| Chainguard | trino-plugin-password-authenticators | 0 | 439-r0 |
| Chainguard | trino-plugin-phoenix5 | 0 | 439-r0 |
| Chainguard | trino-plugin-pinot | 0 | 439-r0 |
| Chainguard | trino-plugin-postgresql | 0 | 439-r0 |
| Chainguard | trino-plugin-prometheus | 0 | 439-r0 |
| Chainguard | trino-plugin-ranger | 0 | 439-r0 |
| Chainguard | trino-plugin-raptor-legacy | 0 | 439-r0 |
| Chainguard | trino-plugin-redis | 0 | 439-r0 |
| Chainguard | trino-plugin-redshift | 0 | 439-r0 |
| Chainguard | trino-plugin-resource-group-managers | 0 | 439-r0 |
| Chainguard | trino-plugin-session-property-managers | 0 | 439-r0 |
| Chainguard | trino-plugin-singlestore | 0 | 439-r0 |
| Chainguard | trino-plugin-snowflake | 0 | 439-r0 |
| Chainguard | trino-plugin-spooling-filesystem | 0 | 439-r0 |
| Chainguard | trino-plugin-sqlserver | 0 | 439-r0 |
| Chainguard | trino-plugin-teradata-functions | 0 | 439-r0 |
| Chainguard | trino-plugin-thrift | 0 | 439-r0 |
| Chainguard | trino-plugin-tpcds | 0 | 439-r0 |
| Chainguard | trino-plugin-tpch | 0 | 439-r0 |
| Chainguard | trino-plugin-vertica | 0 | 439-r0 |
| Debian:11 | protobuf | 0 | No fix |
| Debian:12 | protobuf | 0 | 3.21.9-3 |
| Debian:13 | protobuf | 0 | 3.21.9-3 |
| Ubuntu:Pro:14.04:LTS | protobuf | 0 | No fix |
| Ubuntu:Pro:16.04:LTS | protobuf | 0 | No fix |
| Wolfi | apache-nifi | 0 | 2.6.0-r2 |
| Wolfi | apache-nifi-compat | 0 | 2.6.0-r2 |
| Wolfi | apache-nifi-toolkit | 0 | 2.6.0-r2 |
| Wolfi | dotty | 0 | 3.4.0-r0 |
| Wolfi | druid | 0 | 0 |
| Wolfi | druid-compat | 0 | 0 |
| Wolfi | spark-3.5 | 0 | 3.5.7-r2 |
| Wolfi | spark-3.5-scala-2.12-compat | 0 | 3.5.7-r2 |
| Wolfi | spark-3.5-scala-2.12-iamguarded-compat | 0 | 3.5.7-r2 |
| Wolfi | spark-3.5-scala-2.13-compat | 0 | 3.5.7-r2 |
| Wolfi | trino | 0 | 439-r0 |
| Wolfi | trino-config | 0 | 439-r0 |
| Wolfi | trino-oci-entrypoint | 0 | 439-r0 |
| Wolfi | trino-plugin-accumulo | 0 | 439-r0 |
| Wolfi | trino-plugin-ai-functions | 0 | 439-r0 |
| Wolfi | trino-plugin-atop | 0 | 439-r0 |
| Wolfi | trino-plugin-bigquery | 0 | 439-r0 |
| Wolfi | trino-plugin-blackhole | 0 | 439-r0 |
| Wolfi | trino-plugin-cassandra | 0 | 439-r0 |
| Wolfi | trino-plugin-clickhouse | 0 | 439-r0 |
| Wolfi | trino-plugin-delta-lake | 0 | 439-r0 |
| Wolfi | trino-plugin-druid | 0 | 439-r0 |
| Wolfi | trino-plugin-duckdb | 0 | 439-r0 |
| Wolfi | trino-plugin-elasticsearch | 0 | 439-r0 |
| Wolfi | trino-plugin-example-http | 0 | 439-r0 |
| Wolfi | trino-plugin-exasol | 0 | 439-r0 |
| Wolfi | trino-plugin-exchange-filesystem | 0 | 439-r0 |
| Wolfi | trino-plugin-exchange-hdfs | 0 | 439-r0 |
| Wolfi | trino-plugin-faker | 0 | 439-r0 |
| Wolfi | trino-plugin-functions-python | 0 | 439-r0 |
| Wolfi | trino-plugin-geospatial | 0 | 439-r0 |
| Wolfi | trino-plugin-google-sheets | 0 | 439-r0 |
| Wolfi | trino-plugin-hive | 0 | 439-r0 |
| Wolfi | trino-plugin-http-event-listener | 0 | 439-r0 |
| Wolfi | trino-plugin-http-server-event-listener | 0 | 439-r0 |
| Wolfi | trino-plugin-hudi | 0 | 439-r0 |
| Wolfi | trino-plugin-iceberg | 0 | 439-r0 |
| Wolfi | trino-plugin-ignite | 0 | 439-r0 |
| Wolfi | trino-plugin-jmx | 0 | 439-r0 |
| Wolfi | trino-plugin-kafka | 0 | 439-r0 |
| Wolfi | trino-plugin-kafka-event-listener | 0 | 439-r0 |
| Wolfi | trino-plugin-kinesis | 0 | 439-r0 |
| Wolfi | trino-plugin-kudu | 0 | 439-r0 |
| Wolfi | trino-plugin-lakehouse | 0 | 439-r0 |
| Wolfi | trino-plugin-ldap-group-provider | 0 | 439-r0 |
| Wolfi | trino-plugin-local-file | 0 | 439-r0 |
| Wolfi | trino-plugin-loki | 0 | 439-r0 |
| Wolfi | trino-plugin-mariadb | 0 | 439-r0 |
| Wolfi | trino-plugin-memory | 0 | 439-r0 |
| Wolfi | trino-plugin-ml | 0 | 439-r0 |
| Wolfi | trino-plugin-mongodb | 0 | 439-r0 |
| Wolfi | trino-plugin-mysql | 0 | 439-r0 |
| Wolfi | trino-plugin-mysql-event-listener | 0 | 439-r0 |
| Wolfi | trino-plugin-opa | 0 | 439-r0 |
| Wolfi | trino-plugin-openlineage | 0 | 439-r0 |
| Wolfi | trino-plugin-opensearch | 0 | 439-r0 |
| Wolfi | trino-plugin-oracle | 0 | 439-r0 |
| Wolfi | trino-plugin-password-authenticators | 0 | 439-r0 |
| Wolfi | trino-plugin-phoenix5 | 0 | 439-r0 |
| Wolfi | trino-plugin-pinot | 0 | 439-r0 |
| Wolfi | trino-plugin-postgresql | 0 | 439-r0 |
| Wolfi | trino-plugin-prometheus | 0 | 439-r0 |
| Wolfi | trino-plugin-ranger | 0 | 439-r0 |
| Wolfi | trino-plugin-raptor-legacy | 0 | 439-r0 |
| Wolfi | trino-plugin-redis | 0 | 439-r0 |
| Wolfi | trino-plugin-redshift | 0 | 439-r0 |
| Wolfi | trino-plugin-resource-group-managers | 0 | 439-r0 |
| Wolfi | trino-plugin-session-property-managers | 0 | 439-r0 |
| Wolfi | trino-plugin-singlestore | 0 | 439-r0 |
| Wolfi | trino-plugin-snowflake | 0 | 439-r0 |
| Wolfi | trino-plugin-spooling-filesystem | 0 | 439-r0 |
| Wolfi | trino-plugin-sqlserver | 0 | 439-r0 |
| Wolfi | trino-plugin-teradata-functions | 0 | 439-r0 |
| Wolfi | trino-plugin-thrift | 0 | 439-r0 |
| Wolfi | trino-plugin-tpcds | 0 | 439-r0 |
| Wolfi | trino-plugin-tpch | 0 | 439-r0 |
| Wolfi | trino-plugin-vertica | 0 | 439-r0 |
| maven | com.google.protobuf/protobuf-java | 3.0.0 | 3.16.3 |
| maven | com.google.protobuf/protobuf-java | 3.16.0 | 3.16.3 |
| maven | com.google.protobuf/protobuf-java | 3.17.0 | 3.19.6 |
| maven | com.google.protobuf/protobuf-java | 3.19.0 | 3.19.6 |
| maven | com.google.protobuf/protobuf-java | 3.20.0 | 3.20.3 |
| maven | com.google.protobuf/protobuf-java | 3.21.0 | 3.21.7 |
| maven | com.google.protobuf/protobuf-javalite | 3.0.0 | 3.16.3 |
| maven | com.google.protobuf/protobuf-javalite | 3.17.0 | 3.19.6 |
| maven | com.google.protobuf/protobuf-javalite | 3.20.0 | 3.20.3 |
| maven | com.google.protobuf/protobuf-javalite | 3.21.0 | 3.21.7 |
Related vulnerabilities
- CVE-2024-7254 protobuf-java has potential Denial of Service issue Also affects com.google.protobuf:protobuf-java
- CVE-2022-3510 A parsing issue similar to CVE-2022-3171, but with Message-Type Extensions in… Also affects com.google.protobuf:protobuf-java
- CVE-2022-3171 A parsing issue with binary data in protobuf-java core and lite versions prior to 3.21.7… Also affects com.google.protobuf:protobuf-java
- CVE-2021-22570 Nullptr dereference when a null char is present in a proto symbol. Also affects com.google.protobuf:protobuf-java
- CVE-2021-22569 An issue in protobuf-java allowed the interleaving of com.google.protobuf.UnknownFieldSet… Also affects com.google.protobuf:protobuf-java
- CVE-2026-22732 When applications specify HTTP response headers for servlet applications using Spring… Also affects apache-nifi
- CVE-2026-24281 Hostname verification in Apache ZooKeeper ZKTrustManager falls back to reverse DNS (PTR)… Also affects apache-nifi
- CVE-2026-24308 Improper handling of configuration values in ZKConfig in Apache ZooKeeper 3.8.5 and 3.9.4… Also affects apache-nifi