GitHub Advisoryadvisory · PyPI
GHSA-3qxp-qjq7-w4hf CHECK-fail in tf.raw_ops.EncodePng
LOW
Official page ↗
- Aliases
- CVE-2021-29531
- Ecosystem
- PyPI
- Packages
- tensorflow, tensorflow-cpu, tensorflow-gpu
- Severity
- Low
- CVSS vector
- CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:L
- Weaknesses
- CWE-754
- Reviewed
- 2021-05-18
Affected packages
• PyPI tensorflow: < 2.1.4 → fixed in 2.1.4
• PyPI tensorflow: >= 2.2.0, < 2.2.3 → fixed in 2.2.3
• PyPI tensorflow: >= 2.3.0, < 2.3.3 → fixed in 2.3.3
• PyPI tensorflow: >= 2.4.0, < 2.4.2 → fixed in 2.4.2
• PyPI tensorflow-cpu: < 2.1.4 → fixed in 2.1.4
• PyPI tensorflow-cpu: >= 2.2.0, < 2.2.3 → fixed in 2.2.3
• PyPI tensorflow-cpu: >= 2.3.0, < 2.3.3 → fixed in 2.3.3
• PyPI tensorflow-cpu: >= 2.4.0, < 2.4.2 → fixed in 2.4.2
• PyPI tensorflow-gpu: < 2.1.4 → fixed in 2.1.4
• PyPI tensorflow-gpu: >= 2.2.0, < 2.2.3 → fixed in 2.2.3
• PyPI tensorflow-gpu: >= 2.3.0, < 2.3.3 → fixed in 2.3.3
• PyPI tensorflow-gpu: >= 2.4.0, < 2.4.2 → fixed in 2.4.2
Description
Impact
An attacker can trigger a `CHECK` fail in PNG encoding by providing an empty input tensor as the pixel data:
```python
import tensorflow as tf
image = tf.zeros([0, 0, 3])
image = tf.cast(image, dtype=tf.uint8)
tf.raw_ops.EncodePng(image=image)
```
This is because the implementation only validates that the total number of pixels in the image does not overflow. Thus, an attacker can send an empty matrix for encoding. However, if the tensor is empty, then the associated buffer is `nullptr`. Hence, when calling `png::WriteImageToBuffer`, the first argument (i.e., `image.flat().data()`) is `NULL`. This then triggers the `CHECK_NOTNULL` in the first line of `png::WriteImageToBuffer`.
```cc
template
bool WriteImageToBuffer(
const void* image, int width, int height, int row_bytes, int num_channels,
int channel_bits, int compression, T* png_string,
const std::vector >* metadata) {
CHECK_NOTNULL(image);
...
}
```
Since `image` is null, this results in `abort` being called after printing the stacktrace. Effectively, this allows an attacker to mount a denial of service attack.
Patches
We have patched the issue in GitHub commit 26eb323554ffccd173e8a79a8c05c15b685ae4d1.
The fix will be included in TensorFlow 2.5.0. We will also cherrypick this commit on TensorFlow 2.4.2, TensorFlow 2.3.3, TensorFlow 2.2.3 and TensorFlow 2.1.4, as these are also affected and still in supported range.
For more information
Please consult our security guide for more information regarding the security model and how to contact us with issues and questions.
Attribution
This vulnerability has been reported by Yakun Zhang and Ying Wang of Baidu X-Team.
Related
Alias · CVE (1)
- CVE-2021-29531 TensorFlow is an end-to-end open source platform for machine learning. vulnerability
Weakness · CWE (1)
- CWE-754 Improper Check for Unusual or Exceptional Conditions weakness
References
- https://github.com/tensorflow/tensorflow/security/advisories/GHSA-3qxp-qjq7-w4hf web
- https://nvd.nist.gov/vuln/detail/CVE-2021-29531 advisory
- https://github.com/tensorflow/tensorflow/commit/26eb323554ffccd173e8a79a8c05c15b685ae4d1 web
- https://github.com/pypa/advisory-database/tree/main/vulns/tensorflow-cpu/PYSEC-2021-459.yaml web
- https://github.com/pypa/advisory-database/tree/main/vulns/tensorflow-gpu/PYSEC-2021-657.yaml web
- https://github.com/pypa/advisory-database/tree/main/vulns/tensorflow/PYSEC-2021-168.yaml web
- https://github.com/tensorflow/tensorflow package