[
https://issues.apache.org/jira/browse/AVRO-4295?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Ismaël Mejía updated AVRO-4295:
-------------------------------
Description:
A bytes or string value is encoded as a length prefix followed by that many
bytes of data, and an array or map block is encoded as an element count
followed by that many items. A malicious or truncated input can declare a very
large length or count while carrying little or no actual data, causing a large
allocation before the shortfall is noticed. When the source can report how many
bytes remain, reject a declared length (or a collection block count) that
exceeds the bytes actually available before allocating for it. Companion to
AVRO-4241 (Java).
BinaryDecoder.RemainingBytes() reports the bytes still readable for a seekable
stream; ReadBytes/ReadString and DefaultReader.ReadArray/ReadMap consult it via
MinBytesPerElement(). EnsureCollectionAvailable tracks the cumulative count and
enforces the limits, and the schema-resolution Skip path for arrays and maps is
bounded the same way. Negative and out-of-range counts are rejected before the
int cast.
Zero-byte elements (null, or a record with only zero-byte fields) consume no
input, so the available-bytes check cannot bound their count: a tiny payload
such as {"type":"array","items":"null"} declaring a block count of 200,000,000
would otherwise drive an unbounded allocation. In addition to the
available-bytes check this therefore caps the cumulative count of zero-byte
elements (default 10,000,000), applies a structural cap to every collection
(Integer.MAX_VALUE - 8) for readers that cannot report bytes remaining, and
bounds the array/map skip paths. When set, the AVRO_MAX_COLLECTION_ITEMS
environment variable caps both limits.
was:A bytes or string value is encoded as a length prefix followed by that
many bytes of data. A malicious or truncated input can declare a very large
length while carrying little or no actual data, causing a large buffer to be
allocated before the shortfall is noticed. When the source can report how many
bytes remain, reject a declared length that exceeds the bytes actually
available before allocating for it. Companion to AVRO-4241 (Java).
Summary: [csharp] Bound allocation when decoding length-prefixed values
and collections (was: [csharp] Validate available bytes before allocating for
length-prefixed values)
> [csharp] Bound allocation when decoding length-prefixed values and collections
> ------------------------------------------------------------------------------
>
> Key: AVRO-4295
> URL: https://issues.apache.org/jira/browse/AVRO-4295
> Project: Apache Avro
> Issue Type: Sub-task
> Components: csharp
> Affects Versions: 1.11.5, 1.12.1
> Reporter: Ismaël Mejía
> Assignee: Ismaël Mejía
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.13.0, 1.11.6, 1.12.2
>
> Time Spent: 1.5h
> Remaining Estimate: 0h
>
> A bytes or string value is encoded as a length prefix followed by that many
> bytes of data, and an array or map block is encoded as an element count
> followed by that many items. A malicious or truncated input can declare a
> very large length or count while carrying little or no actual data, causing a
> large allocation before the shortfall is noticed. When the source can report
> how many bytes remain, reject a declared length (or a collection block count)
> that exceeds the bytes actually available before allocating for it. Companion
> to AVRO-4241 (Java).
> BinaryDecoder.RemainingBytes() reports the bytes still readable for a
> seekable stream; ReadBytes/ReadString and DefaultReader.ReadArray/ReadMap
> consult it via MinBytesPerElement(). EnsureCollectionAvailable tracks the
> cumulative count and enforces the limits, and the schema-resolution Skip path
> for arrays and maps is bounded the same way. Negative and out-of-range counts
> are rejected before the int cast.
> Zero-byte elements (null, or a record with only zero-byte fields) consume no
> input, so the available-bytes check cannot bound their count: a tiny payload
> such as {"type":"array","items":"null"} declaring a block count of
> 200,000,000 would otherwise drive an unbounded allocation. In addition to the
> available-bytes check this therefore caps the cumulative count of zero-byte
> elements (default 10,000,000), applies a structural cap to every collection
> (Integer.MAX_VALUE - 8) for readers that cannot report bytes remaining, and
> bounds the array/map skip paths. When set, the AVRO_MAX_COLLECTION_ITEMS
> environment variable caps both limits.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)