CVE-2026-97577 PUBLISHED

media: verisilicon: rockchip: reject AV1 frames exceeding the tile capacity

Assigner: Linux
Reserved: 24.09.2026 Published: 25.09.2026 Updated: 25.09.2026

In the Linux kernel, the following vulnerability has been resolved:

media: verisilicon: rockchip: reject AV1 frames exceeding the tile capacity

rockchip_vpu981_av1_dec_set_tile_info() indexes the tile group entry array by tile1 * tile_cols + tile0, reading up to tile_cols * tile_rows entries, lays out one descriptor per tile in the AV1_MAX_TILES tile_info buffer, and programs the real tile_cols / tile_rows into the hardware.

The tile group entry control is a dynamic array sized to the number of entries userspace submitted, independent of tile_cols / tile_rows, so a frame that claims more tiles than entries reads past the array. A frame that claims more than AV1_MAX_TILES tiles also leaves the hardware programmed for more tiles than the descriptor buffer holds.

Reject both in prepare_run(): tile_cols * tile_rows must not exceed the submitted entry count or AV1_MAX_TILES. The entry count is read via v4l2_ctrl_find() (ctrl->elems). This mirrors the bound the mediatek AV1 decoder already enforces.

Metrics

CVSS Vector: CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:H/A:H
CVSS Score: 7.8

AV:L - The malformed tile_cols/tile_rows and TILE_GROUP_ENTRY data are supplied by a local process through V4L2 request ioctls (VIDIOC_S_EXT_CTRLS + MEDIA_REQUEST_IOC_QUEUE) on the vpu981 /dev/videoN decoder, reaching rockchip_vpu981_av1_dec_run() -> set_tile_info(); no network protocol carries the input. AC:L - validate_av1_frame() never bounds tile_cols/tile_rows (u8, up to 255), so setting tile_colstile_rows above 128 makes set_tile_info() deterministically write 16 bytes per tile past the 2KB AV1_TILE_INFO_SIZE buffer, with no race and no outside condition. PR:L - No capability check guards the stateless decoder's controls or request queue; the attacker only needs open access to the /dev/videoN node, which desktop udev grants to the logged-in seat user (uaccess) or the video group, i.e. an ordinary local user. UI:N - The attacker builds the AV1 frame and tile group entry controls and queues the decode request themselves; no other user has to act. S:U - The corruption is of kernel memory adjacent to the tile_info coherent buffer, and the resulting impact stays within the kernel's own authority; no VM, IOMMU or sandbox boundary is crossed. C:H - set_tile_info() reads group_entry[tile_id] past the dynamic TILE_GROUP_ENTRY array and width/height_in_sbs_minus_1[] past 64 entries; this out-of-bounds heap read is not strictly bounded to a few bytes, and the write primitive enables further disclosure. I:H - The loop writes tile_colstile_rows*16 bytes (up to ~1MB) into a 2KB dma_alloc_coherent buffer, with attacker-controlled tile_offset/tile_size and tile width/height bytes, giving an out-of-bounds kernel memory write of attacker-controlled data and length. A:H - A large overflow past the tile_info allocation corrupts adjacent kernel memory or faults on an unmapped guard page, causing a kernel oops or panic that the attacker can repeat at will.

Product Status

Vendor Linux
Product Linux
Versions Default: unaffected
  • affected from 727a400686a2c0d25015c9e44916a59b72882f83 to 40029f7f35397853f8711d6fce1d90a4c7a01f8c (excl.)
  • affected from 727a400686a2c0d25015c9e44916a59b72882f83 to a41babf528f70c9a82ed31cfb5fe19065910f7f0 (excl.)
  • affected from 727a400686a2c0d25015c9e44916a59b72882f83 to fd965369220cc160bb20a24991790814bfbab401 (excl.)
  • affected from 727a400686a2c0d25015c9e44916a59b72882f83 to 367db8b23c26a913d76ed70457bbcd781c422b49 (excl.)
Vendor Linux
Product Linux
Versions Default: affected
  • Version 6.5 is affected
  • unaffected from 0 to 6.5 (excl.)
  • unaffected from 6.12.111 to 6.12.* (incl.)
  • unaffected from 6.18.53 to 6.18.* (incl.)
  • unaffected from 7.2.7 to 7.2.* (incl.)
  • unaffected from 7.3-rc3 to * (incl.)

References