Skip to content

Bump Avro to 1.11.4 — CVE-2024-47561#247

Merged
abhisheknath2011 merged 3 commits into
linkedin:openhouse-1.2.0from
abhisheknath2011:avro_upgrade
Jun 15, 2026
Merged

Bump Avro to 1.11.4 — CVE-2024-47561#247
abhisheknath2011 merged 3 commits into
linkedin:openhouse-1.2.0from
abhisheknath2011:avro_upgrade

Conversation

@abhisheknath2011

@abhisheknath2011 abhisheknath2011 commented Jun 15, 2026

Copy link
Copy Markdown
Member

Summary

Bumps the root Avro pin in versions.props from 1.11.1 → 1.11.4 to address CVE-2024-47561 (https://www.cve.org/CVERecord?id=CVE-2024-47561) in the Apache Avro Java SDK.

org.slf4j:* = 1.7.36
com.palantir.tritium:* = 0.17.0
-org.apache.avro:avro = 1.11.1
+org.apache.avro:avro = 1.11.4
org.apache.calcite:* = 1.10.0

Why

Apache Avro versions ≤ 1.11.3 are affected by CVE-2024-47561 — a critical-severity deserialization vulnerability in the Avro Java SDK schema parser that allows arbitrary code execution via a maliciously crafted Avro schema. The fix lands in upstream Apache Avro 1.11.4.

Why 1.11.4 (and not 1.11.5)

We evaluated 1.11.5 (the latest patch in the 1.11.x line) and chose to stay on 1.11.4 for this PR.
Reason:

  • The only Avro code-level CVE in this round (CVE-2024-47561) is already fully fixed in 1.11.4.
  • 1.11.5 is also flagged for CVE-2025-52999 (https://www.cve.org/CVERecord?id=CVE-2025-52999) — a transitive jackson-core stack-overflow vulnerability on deeply nested JSON, fixed in jackson-core 2.15.0+. This CVE affects 1.11.4 and 1.11.5 equally because Avro 1.11.x ships with a pre-2.15.0 jackson-core.
  • Bumping Avro to 1.11.5 does not fix CVE-2025-52999. It needs a separate jackson-core upgrade track (and likely also raising the existing OpenHouse force on jackson-bom:2.13.4 → 2.15.0+).

Net: jumping to 1.11.5 for this PR would add no additional security coverage. We land 1.11.4 here and track CVE-2025-52999 as a separate jackson upgrade.

Impact analysis

This PR is step 1 of the publish chain (root-cause fix in the LinkedIn iceberg fork). Subsequent PRs in openhouse and li-openhouse will bump iceberg coordinates and the product-spec to pick up the new Avro transitively.

What changes (transitively)

org.apache.avro:avro is used as a regular classpath dep throughout iceberg-core / iceberg-spark / iceberg-mr / iceberg-flink / iceberg-hive-runtime. The Palantir versions.props plugin propagates this single pin to every org.apache.avro:avro resolution across all modules — no module-level edits required.

I greped the rest of the repo for additional pins; the other org.apache.avro references are exclusion / shading / compile-only declarations (no version coordinate), so this one-line change covers the whole fork.

Risk — LOW

1.11.4 is a patch within the 1.11.x line. Going from 1.11.1 → 1.11.4:

  • No public API changes vs 1.11.1 / 1.11.3 — patch releases only.
  • Binary-compatible with the rest of the transitive closure (Iceberg, Parquet, Spark).
  • No wire/file format changes — Avro container and RPC formats unchanged.
  • No Iceberg manifest read/write behavior changes expected.

1.11.4 is already widely deployed at LinkedIn (per the LinkedIn Avro details dashboard), confirming the 1.11.x patch line is production-stable.

Diff between 1.11.1/1.11.3 and 1.11.4

┌──────────────────────┬────────────────────────────────────────────────────────────────┐
│        Aspect        │                     1.11.1/1.11.3 → 1.11.4                     │
├──────────────────────┼────────────────────────────────────────────────────────────────┤
│ Security             │ CVE-2024-47561 fix — schema-parser deserialization RCE patched │
├──────────────────────┼────────────────────────────────────────────────────────────────┤
│ API surface          │ None (patch release)                                           │
├──────────────────────┼────────────────────────────────────────────────────────────────┤
│ Binary compatibility │ Preserved                                                      │
├──────────────────────┼────────────────────────────────────────────────────────────────┤
│ Wire / file format   │ Unchanged                                                      │
└──────────────────────┴────────────────────────────────────────────────────────────────┘

Known residual exposure (out of scope here)

  • CVE-2025-52999 (jackson-core stack overflow on deeply nested JSON) — not fixed by this PR. This can be tracked separately as a jackson upgrade.

Additional changes

Avro 1.11.1 -> 1.11.4 changes the return type of
Conversion.toEnumSymbol(T, Schema, LogicalType) from raw GenericEnumSymbol
to parameterized GenericEnumSymbol<?>. This propagates through
org.apache.iceberg.avro.UUIDConversion, which inherits (not overrides) the
method, and revapi flags it as java.method.returnTypeTypeParametersChanged.

The change is binary-compatible (Java generics are erased at the bytecode
level; the class-file signature is unchanged); only the source-level
signature changed. Accept the break with a justification so the build can
proceed.

Revapi acceptance

Avro 1.11.1 → 1.11.4 refines the return type of
Conversion<T>.toEnumSymbol(T, Schema, LogicalType) from raw GenericEnumSymbol
to GenericEnumSymbol<?>. This propagates up through org.apache.iceberg.avro.UUIDConversion
(which inherits, not overrides, the method) and revapi flags it as
java.method.returnTypeTypeParametersChanged.

The change is binary-compatible — Java generics are erased at the bytecode level,
so the class-file signature is unchanged. Only the source-level signature gains the
<?> wildcard.

Accepted in .palantir/revapi.yml with an explicit justification:

    - code: "java.method.returnTypeTypeParametersChanged"
      old: "method org.apache.avro.generic.GenericEnumSymbol org.apache.avro.Conversion<T>::toEnumSymbol(T, org.apache.avro.Schema, org.apache.avro.LogicalType) @ org.apache.iceberg.avro.UUIDConversion"
      new: "method org.apache.avro.generic.GenericEnumSymbol<?> org.apache.avro.Conversion<T>::toEnumSymbol(T, org.apache.avro.Schema, org.apache.avro.LogicalType) @ org.apache.iceberg.avro.UUIDConversion"
      justification: "Avro 1.11.1 -> 1.11.4 (CVE-2024-47561): generic-type-parameter refinement on inherited Avro method (GenericEnumSymbol -> GenericEnumSymbol<?>). Binary-compatible via type erasure; only the source-level signature changed. Iceberg's UUIDConversion does not override this method."

This was the only revapi break reported across 227 tasks. No other API or behavioral changes.

Verification

  • versions.props updated and staged.
  • CI build green across all iceberg modules.
  • ./gradlew :iceberg-core:dependencyInsight --dependency org.apache.avro:avro reports 1.11.4 (and not 1.11.1).
  • Avro manifest read/write integration tests pass.

@github-actions github-actions Bot added the BUILD label Jun 15, 2026
@abhisheknath2011 abhisheknath2011 merged commit f250453 into linkedin:openhouse-1.2.0 Jun 15, 2026
19 checks passed
abhisheknath2011 added a commit to linkedin/openhouse that referenced this pull request Jun 16, 2026
## Summary
Bump Avro to 1.11.4 — CVE-2024-47561 (OpenHouse OSS)

Companion to the merged iceberg-fork PRs (linkedin/iceberg#247 →
`1.2.0.18`, linkedin/iceberg#248 → `1.5.2.14`). Propagates Avro 1.11.4
into OpenHouse OSS on both the 1.2 and 1.5 codepaths.

### Why

Apache Avro ≤ 1.11.3 is affected by
**[CVE-2024-47561](https://www.cve.org/CVERecord?id=CVE-2024-47561)** —
a critical-severity deserialization RCE in the schema parser. Fixed in
upstream Avro 1.11.4.

### Why 1.11.4 (not 1.11.5)

1.11.5 is also flagged for **CVE-2025-52999** (a transitive
`jackson-core` stack-overflow on deeply nested JSON, fixed in
`jackson-core 2.15.0+`). That CVE affects both 1.11.4 and 1.11.5 equally
— bumping to 1.11.5 does not fix it. CVE-2025-52999 is tracked
separately as a jackson upgrade.

<!--- HINT: Replace #nnn with corresponding Issue number, if you are
fixing an existing issue -->

[Issue](https://github.com/linkedin/openhouse/issues/#nnn)] Briefly
discuss the summary of the changes made in this
pull request in 2-3 lines.

## Changes

- [ ] Client-facing API Changes
- [ ] Internal API Changes
- [ ] Bug Fixes
- [ ] New Features
- [ ] Performance Improvements
- [ ] Code Style
- [ ] Refactoring
- [ ] Documentation
- [ ] Tests
- [x] Upgrade

### Change details

```diff
-  iceberg_1_2_version = "1.2.0.17"
-  iceberg_1_5_version = "1.5.2.11"
+  iceberg_1_2_version = "1.2.0.18"
+  iceberg_1_5_version = "1.5.2.14"

         force 'com.google.guava:guava:33.5.0-jre'
+        force 'org.apache.avro:avro:1.11.4' // CVE-2024-47561; outranks strict transitive pin via iceberg-core
```

The force lifts the server-side Avro resolution to 1.11.4 directly, in
addition to picking it up transitively via the new iceberg coordinates.
Both paths land at the same result.

What does NOT change

- OSS client uber-JARs (spark-runtime, spark-3.5-runtime, java-runtime,
java-1.5-runtime) bundle zero Avro entries — Spark runtimes explicitly
exclude org.apache.avro:avro and the Java clients don't pull it. No
shadowJar change needed; the fix is purely server-side.
- DALI uniformity is preserved (no API change).

Risk — LOW

1.11.4 is a patch release within the 1.11.x line. No public API changes
vs 1.11.1 / 1.11.3, binary-compatible with Iceberg / Parquet / Spark, no
wire / file format changes.

For all the boxes checked, please include additional details of the
changes made in this pull request.

## Testing Done
<!--- Check any relevant boxes with "x" -->

- [x] Manually Tested on local docker setup. Please include commands
ran, and their output.
- [ ] Added new tests for the changes made.
- [ ] Updated existing tests to reflect the changes made.
- [ ] No tests added or updated. Please explain why. If unsure, please
feel free to ask for help.
- [ ] Some other form of testing like staging or soak time in
production. Please explain.

For all the boxes checked, include a detailed description of the testing
done for the changes made in this pull request.
Local docker testing:
```
anath1@anath1-mn4233 openhouse % curl "${curlArgs[@]}" -XPOST http://localhost:8000/v1/databases/d1/tables/ \
--data-raw '{
  "tableId": "t11",
  "databaseId": "d1",
  "baseTableVersion": "INITIAL_VERSION",
  "clusterId": "LocalHadoopCluster",
  "schema": "{\"type\": \"struct\", \"fields\": [{\"id\": 1,\"required\": true,\"name\": \"id\",\"type\": \"string\"},{\"id\": 2,\"required\": true,\"name\": \"name\",\"type\": \"string\"},{\"id\": 3,\"required\": true,\"name\": \"ts\",\"type\": \"timestamp\"}]}",
  "timePartitioning": {
    "columnName": "ts",
    "granularity": "HOUR"
  },
  "clustering": [
    {
      "columnName": "name"
    }
  ],
  "tableProperties": {
    "key": "value"
  }
}' | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  2305    0  1730  100   575   1674    556  0:00:01  0:00:01 --:--:--  2231
{
  "tableId": "t11",
  "databaseId": "d1",
  "clusterId": "LocalHadoopCluster",
  "tableUri": "LocalHadoopCluster.d1.t11",
  "tableUUID": "f9d434b9-52c4-44a9-bf56-8c8b48e6597d",
  "tableLocation": "hdfs://namenode:9000/data/openhouse/d1/t11-f9d434b9-52c4-44a9-bf56-8c8b48e6597d/00000-9dcfaf86-d7c3-4874-bbcd-6d46d3f52b8f.metadata.json",
  "tableVersion": "INITIAL_VERSION",
  "tableCreator": "DUMMY_ANONYMOUS_USER",
  "schema": "{\"type\":\"struct\",\"schema-id\":0,\"fields\":[{\"id\":1,\"name\":\"id\",\"required\":true,\"type\":\"string\"},{\"id\":2,\"name\":\"name\",\"required\":true,\"type\":\"string\"},{\"id\":3,\"name\":\"ts\",\"required\":true,\"type\":\"timestamp\"}]}",
  "lastModifiedTime": 1781640450045,
  "creationTime": 1781640450045,
  "tableProperties": {
    "write.parquet.compression-codec": "zstd",
    "policies": "",
    "write.metadata.delete-after-commit.enabled": "true",
    "openhouse.isTableReplicated": "false",
    "openhouse.clusterId": "LocalHadoopCluster",
    "openhouse.tableId": "t11",
    "openhouse.lastModifiedTime": "1781640450045",
    "openhouse.tableVersion": "INITIAL_VERSION",
    "write.format.default": "orc",
    "openhouse.creationTime": "1781640450045",
    "openhouse.tableUri": "LocalHadoopCluster.d1.t11",
    "write.metadata.previous-versions-max": "28",
    "openhouse.databaseId": "d1",
    "openhouse.tableType": "PRIMARY_TABLE",
    "openhouse.tableLocation": "/data/openhouse/d1/t11-f9d434b9-52c4-44a9-bf56-8c8b48e6597d/00000-9dcfaf86-d7c3-4874-bbcd-6d46d3f52b8f.metadata.json",
    "openhouse.tableUUID": "f9d434b9-52c4-44a9-bf56-8c8b48e6597d",
    "key": "value",
    "openhouse.tableCreator": "DUMMY_ANONYMOUS_USER"
  },
  "timePartitioning": {
    "columnName": "ts",
    "granularity": "HOUR"
  },
  "clustering": [
    {
      "columnName": "name",
      "transform": null
    }
  ],
  "policies": null,
  "tableType": "PRIMARY_TABLE",
  "sortOrder": "{\"order-id\":0,\"fields\":[]}"
}
anath1@anath1-mn4233 openhouse % curl "${curlArgs[@]}" -XGET http://localhost:8000/v1/databases/d1/tables/t11 | jq
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  1730    0  1730    0     0   6998      0 --:--:-- --:--:-- --:--:--  7004
{
  "tableId": "t11",
  "databaseId": "d1",
  "clusterId": "LocalHadoopCluster",
  "tableUri": "LocalHadoopCluster.d1.t11",
  "tableUUID": "f9d434b9-52c4-44a9-bf56-8c8b48e6597d",
  "tableLocation": "hdfs://namenode:9000/data/openhouse/d1/t11-f9d434b9-52c4-44a9-bf56-8c8b48e6597d/00000-9dcfaf86-d7c3-4874-bbcd-6d46d3f52b8f.metadata.json",
  "tableVersion": "INITIAL_VERSION",
  "tableCreator": "DUMMY_ANONYMOUS_USER",
  "schema": "{\"type\":\"struct\",\"schema-id\":0,\"fields\":[{\"id\":1,\"name\":\"id\",\"required\":true,\"type\":\"string\"},{\"id\":2,\"name\":\"name\",\"required\":true,\"type\":\"string\"},{\"id\":3,\"name\":\"ts\",\"required\":true,\"type\":\"timestamp\"}]}",
  "lastModifiedTime": 1781640450045,
  "creationTime": 1781640450045,
  "tableProperties": {
    "write.parquet.compression-codec": "zstd",
    "policies": "",
    "write.metadata.delete-after-commit.enabled": "true",
    "openhouse.isTableReplicated": "false",
    "openhouse.clusterId": "LocalHadoopCluster",
    "openhouse.tableId": "t11",
    "openhouse.lastModifiedTime": "1781640450045",
    "openhouse.tableVersion": "INITIAL_VERSION",
    "write.format.default": "orc",
    "openhouse.creationTime": "1781640450045",
    "openhouse.tableUri": "LocalHadoopCluster.d1.t11",
    "write.metadata.previous-versions-max": "28",
    "openhouse.databaseId": "d1",
    "openhouse.tableType": "PRIMARY_TABLE",
    "openhouse.tableLocation": "/data/openhouse/d1/t11-f9d434b9-52c4-44a9-bf56-8c8b48e6597d/00000-9dcfaf86-d7c3-4874-bbcd-6d46d3f52b8f.metadata.json",
    "openhouse.tableUUID": "f9d434b9-52c4-44a9-bf56-8c8b48e6597d",
    "key": "value",
    "openhouse.tableCreator": "DUMMY_ANONYMOUS_USER"
  },
  "timePartitioning": {
    "columnName": "ts",
    "granularity": "HOUR"
  },
  "clustering": [
    {
      "columnName": "name",
      "transform": null
    }
  ],
  "policies": null,
  "tableType": "PRIMARY_TABLE",
  "sortOrder": "{\"order-id\":0,\"fields\":[]}"
}
```

# Additional Information

- [ ] Breaking Changes
- [ ] Deprecations
- [ ] Large PR broken into smaller PRs, and PR plan linked in the
description.

Related PRs:
- iceberg fork PR (1.2.0): linkedin/iceberg#247 (merged → 1.2.0.18)
- iceberg fork PR (1.5.2): linkedin/iceberg#248 (merged → 1.5.2.14)

For all the boxes checked, include additional details of the changes
made in this pull request.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants