⬢ DragonFlyBSD Kernel Audit
DF-3693 / analysis.txt
← back to finding ↓ download raw
DF-3693 supporting evidence: struct sizes compiled on the guest (cc 8.3,
DragonFly 6.5-DEVELOPMENT) from the packed definitions in
/usr/src/sys/dev/disk/nata/ata-raid.h:

$ ./layout2
sizeof adaptec=8704 magic_3@8448 configs@64 cfg0.total_disks@64 cfg0.type@73 cfg0.stripe_shift@92 cfg0.sectors@88 cfg0.magic_0@68 gen@4
sizeof promise=2048 raid@512 raid.integrity@512 raid.disk_number@517 raid.disk_sectors@532 raid.generation@540 raid.status@542 raid.type@543 raid.total_disks@544 raid.stripe_shift@545 raid.array_width@546 raid.total_sectors@548 raid.disk@564 checksum@2044
sizeof hptv2=512

=> kmalloc'd hptv2 buffer: 512 bytes
=> write length passed to ata_raid_rw: sizeof(struct promise_raid_conf) = 2048 bytes
=> OOB read span persisted to disk: 2048 - 512 = 1536 bytes of adjacent kernel heap

Parser gating (sys/dev/disk/nata/ata-raid.c):
1407 ata_raid_read_metadata(...)
1414     if (devclass == pci_devclass || devclass == atapci_devclass) {
1415         switch (pci_get_vendor(GRANDPARENT(device_get_parent(subdisk)))) {
1416         case ATA_HIGHPOINT_ID:
1417             if (ata_raid_hptv3_read_meta(subdisk, ata_raid_arrays))
1418                 return 0;
1419             if (ata_raid_hptv2_read_meta(subdisk, ata_raid_arrays))
1420                 return 0;

=> HPTv2 format requires a HighPoint PCI vendor; this guest (Intel PIIX3)
   cannot instantiate AR_F_HPTV2_RAID, so the writeback path cannot be
   exercised on this hardware. Source analysis stands on its own.

Writeback triggers:
  912  ata_raid_config_changed(rdp, writeback)
  977      if (rdp->status != status) { writeback = 1; ...
  997      if (writeback) ata_raid_write_metadata(rdp);
 1487      switch (rdp->format) {
 1492          case AR_F_HPTV3_RAID:
 1493          case AR_F_HPTV2_RAID:
 1498              return ata_raid_hptv2_write_meta(rdp);
 4179          ata_raid_config_changed(ars->raid[volume], 1);   /* subdisk detach */