DragonFlyBSD Kernel Audit
DF-0888 / build.log
← back to finding ↓ download raw
BUILD_EXIT=0
-rwxr-xr-x  1 maxx  maxx  9152 Jul  5 18:57 harness
-rwxr-xr-x  1 maxx  maxx  8472 Jul  5 18:57 trigger
=== harness run ===
== DF-0888 deterministic arithmetic harness ==
block_size      = 4096 bytes
NINDR(fs)       = 1024  (max indirect-block pointers per block)
triple-indirect capacity (NINDR^3 blocks) = 1073741824
triple-indirect max file bytes            = 4402345721856 (~4.0 TiB)
on-disk i_size  = 6597069766656 (~6.0 TiB)
ftruncate length= 5497558138880 (~5.0 TiB)

ext2_ind_truncate arithmetic (lines 310-313):
  lastblock        = 1342177279
  lastiblock[SINGLE] = 1342177267
  lastiblock[DOUBLE] = 1342176243
  lastiblock[TRIPLE] = 1341127667
  NINDR^3 (max TRIPLE indices) = 1073741824
  lastiblock[TRIPLE] > NINDR^3 ?  YES -> OOB

lastiblock[TRIPLE] >= 0 -> stays huge positive (NOT normalized to -1)

Assuming i_block[14] (i_ib[TRIPLE]) is non-zero -> ext2_indirtrunc(level=TRIPLE)

ext2_indirtrunc(level=TRIPLE, lastbn=lastiblock[TRIPLE]):
  factor (NINDR^2)              = 1048576
  last = lastbn / factor        = 1278
  NINDR(fs)                     = 1024
  NINDR(fs)-1 (max valid index) = 1023
  last > NINDR-1 ?              = YES -> OOB index

  bzero start: &bap[1279]  (bap has 1024 entries, valid idx 0..1023)
  start OOB ?                   = YES
  bzero len = (NINDR-(last+1))*4 = 18446744073709550596 bytes (size_t)
  len underflow ?               = YES -> ~2^64 byte bzero (heap OOB write)
  bp->b_data buffer size        = 4096 bytes (fs->e2fs_bsize)

== RESULT: BUG CONFIRMED -- OOB heap bzero in ext2_indirtrunc ==
HARNESS_EXIT=2