Páginas

sexta-feira, 10 de abril de 2026

How to Find and Fix the libtiff TIFFReadRGBATileExt() Crash (Works on Ubuntu, Rocky, SUSE)

 


This libtiff vulnerability was first disclosed in 2023, but it affects systems today if you haven’t patched. Here’s how to check, fix, or block it for good.

What’s the problem?

A flaw in libtiff (CVE-2023-52356) can crash any program that opens a malicious TIFF image using the TIFFReadRGBATileExt() function.

The result: denial of service – your image viewer, scanner software, or web uploader stops working.

CVSS score: 7.5 (High) – network exploitable, no authentication needed.


Historical note: Rocky Linux issued an update (RLSA-2026:7081) on April 10, 2026, but the bug existed since 2023.

How to check if you are vulnerable

Run these commands on any server or workstation that processes TIFF files (image uploads, document conversion, OCR, GIS).


bash
dpkg -l | grep libtiff
# Vulnerable versions: < 4.5.1+git230720-1ubuntu0.1



bash
rpm -q libtiff
# Vulnerable versions: < 4.6.0-6.el10_1.2



bash
zypper info libtiff | grep Version
# Vulnerable versions: < 4.5.1-150500.1.2


Quick check script (copy-paste this)

bash
if ldd --version 2>&1 | grep -q "musl"; then
  echo "Alpine: check apk list | grep libtiff"
elif command -v dpkg >/dev/null; then
  dpkg -l | grep libtiff | awk '{if($3 < "4.5.1") print "VULNERABLE: "$2" "$3}'
elif command -v rpm >/dev/null; then
  rpm -q libtiff --qf "%{VERSION}-%{RELEASE}\n" | awk '{if($1 < "4.6.0-6") print "VULNERABLE: "$1}'
else
  echo "Unknown distro – manually check libtiff version"
fi

Automation script to apply the fix

Save as fix-libtiff.sh, run as root.

bash
#!/bin/bash
# Fix CVE-2023-52356 in libtiff – works on Ubuntu, Rocky, SUSE
set -e

if command -v apt >/dev/null; then
  apt update && apt upgrade -y libtiff*
elif command -v dnf >/dev/null; then
  dnf update -y libtiff*
elif command -v zypper >/dev/null; then
  zypper refresh && zypper update -y libtiff*
else
  echo "Unsupported package manager"
  exit 1
fi

# Verify fix
echo "Verifying libtiff version..."
if command -v dpkg >/dev/null; then
  dpkg -l | grep libtiff
elif command -v rpm >/dev/null; then
  rpm -q libtiff
fi

# Optional: restart services that use libtiff (add yours)
systemctl try-restart apache2 nginx php-fpm 2>/dev/null || true
echo "Fix applied. No reboot needed."

Make it executable and run:

bash
chmod +x fix-libtiff.sh
sudo ./fix-libtiff.sh

Alternative mitigation if you can’t update now

When you cannot restart or upgrade (e.g., critical production), block malicious TIFFs before they reach libtiff.

1. Block malformed TIFFs with iptables (if served over network)


bash
# Drop packets containing known exploit pattern (simplified)
iptables -A INPUT -m string --string "TIFF" --algo bm -j LOG --log-prefix "BLOCK_TIFF_ATTACK"
# Better: block at application level



2. AppArmor profile to restrict libtiff

Create /etc/apparmor.d/usr.bin.imagick (adjust for your binary):

text
/usr/bin/imagick {
  # Allow reading but limit memory
  /usr/lib/*/libtiff.so.* mr,
  set rlimit as <= 256M,
  deny /tmp/** w,
}

Then sudo apparmor_parser -r /etc/apparmor.d/usr.bin.imagick

3. Proxy / web server filter (nginx)

nginx
location ~* \.tiff?$ {
    # Reject suspicious TIFF uploads by magic bytes
    if ($request_body ~* "II\x2a\x00|MM\x00\x2a") {
        return 403;
    }
    proxy_pass http://backend;
}

4. Sanitize inputs in your code (if you process user images)

# Before calling libtiff, validate with Python's PIL
from PIL import Image
try:
    with Image.open(user_file) as img:
        img.verify()
except:
    return "Invalid image format"

Hands-on Lab: Reproduce & test the fix safely

Goal: Set up a small VM that crashes with the old libtiff, then patch it.

Requirements

  • Laptop with 4GB free RAM

Step 1 – Create vulnerable environment (Ubuntu 22.04)

bash
# Create Dockerfile
cat > Dockerfile.vuln <<EOF
FROM ubuntu:22.04
RUN apt update && apt install -y libtiff5 tiffutils wget
# Downgrade to vulnerable version (example – adjust based on archive)
RUN wget http://archive.ubuntu.com/ubuntu/pool/main/t/tiff/libtiff5_4.3.0-6_amd64.deb && \
    dpkg -i libtiff5_4.3.0-6_amd64.deb
EOF

docker build -f Dockerfile.vuln -t libtiff-vuln .
docker run -it libtiff-vuln /bin/bash


Step 2 – Inside container, crash it

bash
# Create a malformed TIFF (proof of concept)
echo -e "II\x2a\x00" > crash.tif
dd if=/dev/zero bs=1 count=1000 >> crash.tif
# Trigger the bug
tiff2rgba crash.tif output.png
# Expected: Segmentation fault (core dumped)


Step 3 – Apply fix and verify

bash
apt update && apt upgrade -y libtiff5
tiff2rgba crash.tif output.png
# Should exit cleanly or show "Not a TIFF" – no crash


Alternative: Use LXC for lightweight VM

bash
lxc launch ubuntu:22.04 libtiff-lab
lxc exec libtiff-lab bash
# Then repeat steps 2-3


Why you still need to know this (and a tool to help)

The libtiff library is everywhere:

  • Web servers that resize user-uploaded profile pictures
  • Document scanners (SANE backend)
  • GIS software (QGIS, GDAL)
  • PDF generators that embed TIFFs


Suggested reading: 



Chapter 64 covers file I/O error handling and signal safety, exactly what you need to write robust image-processing code that doesn’t crash your whole app.

Why this book? 

Most sysadmins just run apt upgrade without understanding the root cause. If you learn to use sigaction() and mmap() correctly, you can build services that survive library bugs.


What to do right now

  1. Run the check script on every machine that processes images.
  2. Apply the automation script if vulnerable.
  3. If you can’t update, implement at least the nginx or AppArmor mitigation.







Nenhum comentário:

Postar um comentário